Skip to content

Commit 5247933

Browse files
committed
Add an Unload method.
1 parent c0ba7c8 commit 5247933

File tree

3 files changed

+83
-7
lines changed

3 files changed

+83
-7
lines changed

analytics/generate_windows_stubs.py

100644100755
Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,11 @@ def generate_function_pointers(header_file_path, output_h_path, output_c_path):
134134
f.write("\n\n// --- Dynamic Loader Declaration for Windows ---\n")
135135
f.write("#if defined(_WIN32)\n")
136136
f.write('#include <windows.h> // For HMODULE\n')
137-
f.write("void FirebaseAnalytics_LoadAnalyticsFunctions(HMODULE dll_handle);\n")
137+
f.write('// Load Google Analytics functions from the given DLL handle into function pointers.\n')
138+
f.write(f'// Returns the number of functions successfully loaded (out of {len(function_details_for_loader)}).\n')
139+
f.write("int FirebaseAnalytics_LoadAnalyticsFunctions(HMODULE dll_handle);\n\n")
140+
f.write('// Reset all function pointers back to stubs.\n')
141+
f.write("void FirebaseAnalytics_UnloadAnalyticsFunctions(void);\n\n")
138142
f.write("#endif // defined(_WIN32)\n")
139143
f.write("\n#ifdef __cplusplus\n")
140144
f.write("}\n")
@@ -156,9 +160,10 @@ def generate_function_pointers(header_file_path, output_h_path, output_c_path):
156160
f.write("\n\n// --- Dynamic Loader Function for Windows ---\n")
157161
loader_lines = [
158162
'#if defined(_WIN32)',
159-
'void FirebaseAnalytics_LoadAnalyticsFunctions(HMODULE dll_handle) {',
163+
'int FirebaseAnalytics_LoadAnalyticsFunctions(HMODULE dll_handle) {',
164+
' int count = 0;\n',
160165
' if (!dll_handle) {',
161-
' return;',
166+
' return count;',
162167
' }\n'
163168
]
164169
for name, ret_type, params in function_details_for_loader:
@@ -167,10 +172,16 @@ def generate_function_pointers(header_file_path, output_h_path, output_c_path):
167172
f' FARPROC proc_{name} = GetProcAddress(dll_handle, "{name}");',
168173
f' if (proc_{name}) {{',
169174
f' ptr_{name} = {pointer_type_cast}proc_{name};',
175+
f' count++;',
170176
f' }}'
171177
]
172178
loader_lines.extend(proc_check)
173-
loader_lines.append('\n}')
179+
loader_lines.append('\n return count;')
180+
loader_lines.append('}\n')
181+
loader_lines.append('void FirebaseAnalytics_UnloadAnalyticsFunctions(void) {')
182+
for name, ret_type, params in function_details_for_loader:
183+
loader_lines.append(f' ptr_{name} = &Stub_{name};');
184+
loader_lines.append('}\n')
174185
loader_lines.append('#endif // defined(_WIN32)\n')
175186
f.write('\n'.join(loader_lines))
176187

analytics/src/windows/analytics_dynamic.c

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -188,91 +188,105 @@ void (*ptr_GoogleAnalytics_SetAnalyticsCollectionEnabled)(bool enabled) =
188188

189189
// --- Dynamic Loader Function for Windows ---
190190
#if defined(_WIN32)
191-
void FirebaseAnalytics_LoadAnalyticsFunctions(HMODULE dll_handle) {
191+
int FirebaseAnalytics_LoadAnalyticsFunctions(HMODULE dll_handle) {
192+
int count = 0;
193+
192194
if (!dll_handle) {
193-
return;
195+
return count;
194196
}
195197

196198
FARPROC proc_GoogleAnalytics_Item_Create =
197199
GetProcAddress(dll_handle, "GoogleAnalytics_Item_Create");
198200
if (proc_GoogleAnalytics_Item_Create) {
199201
ptr_GoogleAnalytics_Item_Create =
200202
(GoogleAnalytics_Item * (*)()) proc_GoogleAnalytics_Item_Create;
203+
count++;
201204
}
202205
FARPROC proc_GoogleAnalytics_Item_InsertInt =
203206
GetProcAddress(dll_handle, "GoogleAnalytics_Item_InsertInt");
204207
if (proc_GoogleAnalytics_Item_InsertInt) {
205208
ptr_GoogleAnalytics_Item_InsertInt =
206209
(void (*)(GoogleAnalytics_Item* item, const char* key,
207210
int64_t value))proc_GoogleAnalytics_Item_InsertInt;
211+
count++;
208212
}
209213
FARPROC proc_GoogleAnalytics_Item_InsertDouble =
210214
GetProcAddress(dll_handle, "GoogleAnalytics_Item_InsertDouble");
211215
if (proc_GoogleAnalytics_Item_InsertDouble) {
212216
ptr_GoogleAnalytics_Item_InsertDouble =
213217
(void (*)(GoogleAnalytics_Item* item, const char* key,
214218
double value))proc_GoogleAnalytics_Item_InsertDouble;
219+
count++;
215220
}
216221
FARPROC proc_GoogleAnalytics_Item_InsertString =
217222
GetProcAddress(dll_handle, "GoogleAnalytics_Item_InsertString");
218223
if (proc_GoogleAnalytics_Item_InsertString) {
219224
ptr_GoogleAnalytics_Item_InsertString =
220225
(void (*)(GoogleAnalytics_Item* item, const char* key,
221226
const char* value))proc_GoogleAnalytics_Item_InsertString;
227+
count++;
222228
}
223229
FARPROC proc_GoogleAnalytics_Item_Destroy =
224230
GetProcAddress(dll_handle, "GoogleAnalytics_Item_Destroy");
225231
if (proc_GoogleAnalytics_Item_Destroy) {
226232
ptr_GoogleAnalytics_Item_Destroy =
227233
(void (*)(GoogleAnalytics_Item* item))proc_GoogleAnalytics_Item_Destroy;
234+
count++;
228235
}
229236
FARPROC proc_GoogleAnalytics_ItemVector_Create =
230237
GetProcAddress(dll_handle, "GoogleAnalytics_ItemVector_Create");
231238
if (proc_GoogleAnalytics_ItemVector_Create) {
232239
ptr_GoogleAnalytics_ItemVector_Create = (GoogleAnalytics_ItemVector * (*)())
233240
proc_GoogleAnalytics_ItemVector_Create;
241+
count++;
234242
}
235243
FARPROC proc_GoogleAnalytics_ItemVector_InsertItem =
236244
GetProcAddress(dll_handle, "GoogleAnalytics_ItemVector_InsertItem");
237245
if (proc_GoogleAnalytics_ItemVector_InsertItem) {
238246
ptr_GoogleAnalytics_ItemVector_InsertItem = (void (*)(
239247
GoogleAnalytics_ItemVector* item_vector,
240248
GoogleAnalytics_Item* item))proc_GoogleAnalytics_ItemVector_InsertItem;
249+
count++;
241250
}
242251
FARPROC proc_GoogleAnalytics_ItemVector_Destroy =
243252
GetProcAddress(dll_handle, "GoogleAnalytics_ItemVector_Destroy");
244253
if (proc_GoogleAnalytics_ItemVector_Destroy) {
245254
ptr_GoogleAnalytics_ItemVector_Destroy =
246255
(void (*)(GoogleAnalytics_ItemVector* item_vector))
247256
proc_GoogleAnalytics_ItemVector_Destroy;
257+
count++;
248258
}
249259
FARPROC proc_GoogleAnalytics_EventParameters_Create =
250260
GetProcAddress(dll_handle, "GoogleAnalytics_EventParameters_Create");
251261
if (proc_GoogleAnalytics_EventParameters_Create) {
252262
ptr_GoogleAnalytics_EventParameters_Create =
253263
(GoogleAnalytics_EventParameters * (*)())
254264
proc_GoogleAnalytics_EventParameters_Create;
265+
count++;
255266
}
256267
FARPROC proc_GoogleAnalytics_EventParameters_InsertInt =
257268
GetProcAddress(dll_handle, "GoogleAnalytics_EventParameters_InsertInt");
258269
if (proc_GoogleAnalytics_EventParameters_InsertInt) {
259270
ptr_GoogleAnalytics_EventParameters_InsertInt = (void (*)(
260271
GoogleAnalytics_EventParameters* event_parameter_map, const char* key,
261272
int64_t value))proc_GoogleAnalytics_EventParameters_InsertInt;
273+
count++;
262274
}
263275
FARPROC proc_GoogleAnalytics_EventParameters_InsertDouble = GetProcAddress(
264276
dll_handle, "GoogleAnalytics_EventParameters_InsertDouble");
265277
if (proc_GoogleAnalytics_EventParameters_InsertDouble) {
266278
ptr_GoogleAnalytics_EventParameters_InsertDouble = (void (*)(
267279
GoogleAnalytics_EventParameters* event_parameter_map, const char* key,
268280
double value))proc_GoogleAnalytics_EventParameters_InsertDouble;
281+
count++;
269282
}
270283
FARPROC proc_GoogleAnalytics_EventParameters_InsertString = GetProcAddress(
271284
dll_handle, "GoogleAnalytics_EventParameters_InsertString");
272285
if (proc_GoogleAnalytics_EventParameters_InsertString) {
273286
ptr_GoogleAnalytics_EventParameters_InsertString = (void (*)(
274287
GoogleAnalytics_EventParameters* event_parameter_map, const char* key,
275288
const char* value))proc_GoogleAnalytics_EventParameters_InsertString;
289+
count++;
276290
}
277291
FARPROC proc_GoogleAnalytics_EventParameters_InsertItemVector =
278292
GetProcAddress(dll_handle,
@@ -282,45 +296,90 @@ void FirebaseAnalytics_LoadAnalyticsFunctions(HMODULE dll_handle) {
282296
(void (*)(GoogleAnalytics_EventParameters* event_parameter_map,
283297
const char* key, GoogleAnalytics_ItemVector* value))
284298
proc_GoogleAnalytics_EventParameters_InsertItemVector;
299+
count++;
285300
}
286301
FARPROC proc_GoogleAnalytics_EventParameters_Destroy =
287302
GetProcAddress(dll_handle, "GoogleAnalytics_EventParameters_Destroy");
288303
if (proc_GoogleAnalytics_EventParameters_Destroy) {
289304
ptr_GoogleAnalytics_EventParameters_Destroy =
290305
(void (*)(GoogleAnalytics_EventParameters* event_parameter_map))
291306
proc_GoogleAnalytics_EventParameters_Destroy;
307+
count++;
292308
}
293309
FARPROC proc_GoogleAnalytics_LogEvent =
294310
GetProcAddress(dll_handle, "GoogleAnalytics_LogEvent");
295311
if (proc_GoogleAnalytics_LogEvent) {
296312
ptr_GoogleAnalytics_LogEvent = (void (*)(
297313
const char* name, GoogleAnalytics_EventParameters* parameters))
298314
proc_GoogleAnalytics_LogEvent;
315+
count++;
299316
}
300317
FARPROC proc_GoogleAnalytics_SetUserProperty =
301318
GetProcAddress(dll_handle, "GoogleAnalytics_SetUserProperty");
302319
if (proc_GoogleAnalytics_SetUserProperty) {
303320
ptr_GoogleAnalytics_SetUserProperty =
304321
(void (*)(const char* name,
305322
const char* value))proc_GoogleAnalytics_SetUserProperty;
323+
count++;
306324
}
307325
FARPROC proc_GoogleAnalytics_SetUserId =
308326
GetProcAddress(dll_handle, "GoogleAnalytics_SetUserId");
309327
if (proc_GoogleAnalytics_SetUserId) {
310328
ptr_GoogleAnalytics_SetUserId =
311329
(void (*)(const char* user_id))proc_GoogleAnalytics_SetUserId;
330+
count++;
312331
}
313332
FARPROC proc_GoogleAnalytics_ResetAnalyticsData =
314333
GetProcAddress(dll_handle, "GoogleAnalytics_ResetAnalyticsData");
315334
if (proc_GoogleAnalytics_ResetAnalyticsData) {
316335
ptr_GoogleAnalytics_ResetAnalyticsData =
317336
(void (*)())proc_GoogleAnalytics_ResetAnalyticsData;
337+
count++;
318338
}
319339
FARPROC proc_GoogleAnalytics_SetAnalyticsCollectionEnabled = GetProcAddress(
320340
dll_handle, "GoogleAnalytics_SetAnalyticsCollectionEnabled");
321341
if (proc_GoogleAnalytics_SetAnalyticsCollectionEnabled) {
322342
ptr_GoogleAnalytics_SetAnalyticsCollectionEnabled = (void (*)(
323343
bool enabled))proc_GoogleAnalytics_SetAnalyticsCollectionEnabled;
344+
count++;
324345
}
346+
347+
return count;
325348
}
349+
350+
void FirebaseAnalytics_UnloadAnalyticsFunctions(void) {
351+
ptr_GoogleAnalytics_Item_Create = &Stub_GoogleAnalytics_Item_Create;
352+
ptr_GoogleAnalytics_Item_InsertInt = &Stub_GoogleAnalytics_Item_InsertInt;
353+
ptr_GoogleAnalytics_Item_InsertDouble =
354+
&Stub_GoogleAnalytics_Item_InsertDouble;
355+
ptr_GoogleAnalytics_Item_InsertString =
356+
&Stub_GoogleAnalytics_Item_InsertString;
357+
ptr_GoogleAnalytics_Item_Destroy = &Stub_GoogleAnalytics_Item_Destroy;
358+
ptr_GoogleAnalytics_ItemVector_Create =
359+
&Stub_GoogleAnalytics_ItemVector_Create;
360+
ptr_GoogleAnalytics_ItemVector_InsertItem =
361+
&Stub_GoogleAnalytics_ItemVector_InsertItem;
362+
ptr_GoogleAnalytics_ItemVector_Destroy =
363+
&Stub_GoogleAnalytics_ItemVector_Destroy;
364+
ptr_GoogleAnalytics_EventParameters_Create =
365+
&Stub_GoogleAnalytics_EventParameters_Create;
366+
ptr_GoogleAnalytics_EventParameters_InsertInt =
367+
&Stub_GoogleAnalytics_EventParameters_InsertInt;
368+
ptr_GoogleAnalytics_EventParameters_InsertDouble =
369+
&Stub_GoogleAnalytics_EventParameters_InsertDouble;
370+
ptr_GoogleAnalytics_EventParameters_InsertString =
371+
&Stub_GoogleAnalytics_EventParameters_InsertString;
372+
ptr_GoogleAnalytics_EventParameters_InsertItemVector =
373+
&Stub_GoogleAnalytics_EventParameters_InsertItemVector;
374+
ptr_GoogleAnalytics_EventParameters_Destroy =
375+
&Stub_GoogleAnalytics_EventParameters_Destroy;
376+
ptr_GoogleAnalytics_LogEvent = &Stub_GoogleAnalytics_LogEvent;
377+
ptr_GoogleAnalytics_SetUserProperty = &Stub_GoogleAnalytics_SetUserProperty;
378+
ptr_GoogleAnalytics_SetUserId = &Stub_GoogleAnalytics_SetUserId;
379+
ptr_GoogleAnalytics_ResetAnalyticsData =
380+
&Stub_GoogleAnalytics_ResetAnalyticsData;
381+
ptr_GoogleAnalytics_SetAnalyticsCollectionEnabled =
382+
&Stub_GoogleAnalytics_SetAnalyticsCollectionEnabled;
383+
}
384+
326385
#endif // defined(_WIN32)

analytics/src/windows/analytics_dynamic.h

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,13 @@ extern void (*ptr_GoogleAnalytics_SetAnalyticsCollectionEnabled)(bool enabled);
112112
// --- Dynamic Loader Declaration for Windows ---
113113
#if defined(_WIN32)
114114
#include <windows.h> // For HMODULE
115-
void FirebaseAnalytics_LoadAnalyticsFunctions(HMODULE dll_handle);
115+
// Load Google Analytics functions from the given DLL handle into function
116+
// pointers. Returns the number of functions successfully loaded (out of 19).
117+
int FirebaseAnalytics_LoadAnalyticsFunctions(HMODULE dll_handle);
118+
119+
// Reset all function pointers back to stubs.
120+
void FirebaseAnalytics_UnloadAnalyticsFunctions(void);
121+
116122
#endif // defined(_WIN32)
117123

118124
#ifdef __cplusplus

0 commit comments

Comments
 (0)