@@ -34,18 +34,69 @@ namespace firebase {
34
34
namespace analytics {
35
35
36
36
#if defined(_WIN32)
37
- #define ANALYTICS_DLL_DEFAULT_FILENAME " analytics_win.dll"
38
- const char * g_analytics_dll_filename = nullptr ;
37
+ #define ANALYTICS_DLL_DEFAULT_FILENAME L " analytics_win.dll"
38
+ std::wstring g_analytics_dll_filename = ANALYTICS_DLL_DEFAULT_FILENAME ;
39
39
static HMODULE g_analytics_dll = 0 ;
40
40
41
+ // Function to convert a UTF-8 string to a wide character (UTF-16) string.
42
+ std::wstring Utf8ToWide (const std::string& utf8String) {
43
+ if (utf8String.empty ()) {
44
+ return std::wstring ();
45
+ }
46
+
47
+ // First, determine the required buffer size.
48
+ int wideCharCount = MultiByteToWideChar (
49
+ CP_UTF8, // Source code page (UTF-8)
50
+ 0 , // Flags
51
+ utf8String.c_str (), // Source UTF-8 string
52
+ -1 , // -1 indicates the string is null-terminated
53
+ nullptr , // No buffer provided, we're calculating the size
54
+ 0 // Requesting the buffer size
55
+ );
56
+
57
+ if (wideCharCount == 0 ) {
58
+ // Handle error: GetLastError() can provide more details.
59
+ LogError (" Error determining buffer size for UTF-8 to wide char conversion." );
60
+ return std::wstring ();
61
+ }
62
+
63
+ // Allocate the wide character string.
64
+ std::wstring wideString (wideCharCount, 0 );
65
+
66
+ // Second, perform the actual conversion.
67
+ int result = MultiByteToWideChar (
68
+ CP_UTF8, // Source code page (UTF-8)
69
+ 0 , // Flags
70
+ utf8String.c_str (), // Source UTF-8 string
71
+ -1 , // -1 indicates the string is null-terminated
72
+ &wideString[0 ], // Pointer to the destination buffer
73
+ wideCharCount // The size of the destination buffer
74
+ );
75
+
76
+ if (result == 0 ) {
77
+ // Handle error: GetLastError() can provide more details.
78
+ LogError (" Error converting UTF-8 to wide char." );
79
+ return std::wstring ();
80
+ }
81
+
82
+ // The returned wideString from MultiByteToWideChar will be null-terminated,
83
+ // but std::wstring handles its own length. We might need to resize it
84
+ // to remove the extra null character included in the count if we passed -1.
85
+ size_t pos = wideString.find (L' \0 ' );
86
+ if (pos != std::wstring::npos) {
87
+ wideString.resize (pos);
88
+ }
89
+
90
+
91
+ return wideString;
92
+ }
93
+
94
+
41
95
void SetAnalyticsLibraryPath (const char * path) {
42
- if (g_analytics_dll_filename) {
43
- delete g_analytics_dll_filename;
44
- g_analytics_dll_filename = nullptr ;
45
- }
46
96
if (path) {
47
- g_analytics_dll_filename = new char [strlen (path)+1 ];
48
- strcpy (g_analytics_dll_filename, path);
97
+ g_analytics_dll_filename = Utf8ToWide (path);
98
+ } else {
99
+ g_analytics_dll_filename = ANALYTICS_DLL_DEFAULT_FILENAME;
49
100
}
50
101
}
51
102
#endif
@@ -70,14 +121,11 @@ void Initialize(const App& app) {
70
121
71
122
#if defined(_WIN32)
72
123
if (!g_analytics_dll) {
73
- const char * dll_filename = g_analytics_dll_filename;
74
- if (!dll_filename) dll_filename = ANALYTICS_DLL_DEFAULT_FILENAME;
75
- auto wFilename = toUtf16 (dll_filename);
76
- g_analytics_dll = LoadLibraryW (wFilename);
124
+ g_analytics_dll = LoadLibraryW (g_analytics_dll_filename.c_str ());
77
125
if (g_analytics_dll) {
78
- LogInfo (" Successfully loaded Analytics DLL %s " , g_analytics_dll_filename);
126
+ LogInfo (" Successfully loaded Analytics DLL %ls " , g_analytics_dll_filename);
79
127
} else {
80
- LogError (" Failed to load Analytics DLL %s " , g_analytics_dll_filename);
128
+ LogError (" Failed to load Analytics DLL %ls " , g_analytics_dll_filename);
81
129
}
82
130
}
83
131
FirebaseAnalytics_LoadAnalyticsFunctions (g_analytics_dll);
@@ -305,6 +353,7 @@ void ResetAnalyticsData() {
305
353
FIREBASE_ASSERT_RETURN_VOID (internal::IsInitialized ());
306
354
307
355
GoogleAnalytics_ResetAnalyticsData ();
356
+ g_fake_instance_id++;
308
357
}
309
358
310
359
// --- Stub Implementations for Unsupported Features ---
@@ -318,13 +367,13 @@ void SetConsent(const std::map<ConsentType, ConsentStatus>& consent_settings) {
318
367
}
319
368
320
369
void LogEvent (const char * name) {
321
- LogEvent (name, nullptr , 0 );
370
+ LogEvent (name, static_cast < const Parameter*>( nullptr ) , 0 );
322
371
}
323
372
324
373
void LogEvent (const char * name, const char * parameter_name,
325
374
const char * parameter_value) {
326
375
if (parameter_name == nullptr ) {
327
- LogEvent (name, nullptr , 0 );
376
+ LogEvent (name, static_cast < const Parameter*>( nullptr ) , 0 );
328
377
return ;
329
378
}
330
379
Parameter param (parameter_name, parameter_value);
@@ -334,7 +383,7 @@ void LogEvent(const char* name, const char* parameter_name,
334
383
void LogEvent (const char * name, const char * parameter_name,
335
384
const double parameter_value) {
336
385
if (parameter_name == nullptr ) {
337
- LogEvent (name, nullptr , 0 );
386
+ LogEvent (name, static_cast < const Parameter*>( nullptr ) , 0 );
338
387
return ;
339
388
}
340
389
Parameter param (parameter_name, parameter_value);
@@ -344,7 +393,7 @@ void LogEvent(const char* name, const char* parameter_name,
344
393
void LogEvent (const char * name, const char * parameter_name,
345
394
const int64_t parameter_value) {
346
395
if (parameter_name == nullptr ) {
347
- LogEvent (name, nullptr , 0 );
396
+ LogEvent (name, static_cast < const Parameter*>( nullptr ) , 0 );
348
397
return ;
349
398
}
350
399
Parameter param (parameter_name, parameter_value);
@@ -354,7 +403,7 @@ void LogEvent(const char* name, const char* parameter_name,
354
403
void LogEvent (const char * name, const char * parameter_name,
355
404
const int parameter_value) {
356
405
if (parameter_name == nullptr ) {
357
- LogEvent (name, nullptr , 0 );
406
+ LogEvent (name, static_cast < const Parameter*>( nullptr ) , 0 );
358
407
return ;
359
408
}
360
409
Parameter param (parameter_name, static_cast <int64_t >(parameter_value));
0 commit comments