@@ -34,18 +34,69 @@ namespace firebase {
3434namespace analytics {
3535
3636#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 ;
3939static HMODULE g_analytics_dll = 0 ;
4040
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+
4195void SetAnalyticsLibraryPath (const char * path) {
42- if (g_analytics_dll_filename) {
43- delete g_analytics_dll_filename;
44- g_analytics_dll_filename = nullptr ;
45- }
4696 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;
49100 }
50101}
51102#endif
@@ -70,14 +121,11 @@ void Initialize(const App& app) {
70121
71122#if defined(_WIN32)
72123 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 ());
77125 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);
79127 } 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);
81129 }
82130 }
83131 FirebaseAnalytics_LoadAnalyticsFunctions (g_analytics_dll);
@@ -305,6 +353,7 @@ void ResetAnalyticsData() {
305353 FIREBASE_ASSERT_RETURN_VOID (internal::IsInitialized ());
306354
307355 GoogleAnalytics_ResetAnalyticsData ();
356+ g_fake_instance_id++;
308357}
309358
310359// --- Stub Implementations for Unsupported Features ---
@@ -318,13 +367,13 @@ void SetConsent(const std::map<ConsentType, ConsentStatus>& consent_settings) {
318367}
319368
320369void LogEvent (const char * name) {
321- LogEvent (name, nullptr , 0 );
370+ LogEvent (name, static_cast < const Parameter*>( nullptr ) , 0 );
322371}
323372
324373void LogEvent (const char * name, const char * parameter_name,
325374 const char * parameter_value) {
326375 if (parameter_name == nullptr ) {
327- LogEvent (name, nullptr , 0 );
376+ LogEvent (name, static_cast < const Parameter*>( nullptr ) , 0 );
328377 return ;
329378 }
330379 Parameter param (parameter_name, parameter_value);
@@ -334,7 +383,7 @@ void LogEvent(const char* name, const char* parameter_name,
334383void LogEvent (const char * name, const char * parameter_name,
335384 const double parameter_value) {
336385 if (parameter_name == nullptr ) {
337- LogEvent (name, nullptr , 0 );
386+ LogEvent (name, static_cast < const Parameter*>( nullptr ) , 0 );
338387 return ;
339388 }
340389 Parameter param (parameter_name, parameter_value);
@@ -344,7 +393,7 @@ void LogEvent(const char* name, const char* parameter_name,
344393void LogEvent (const char * name, const char * parameter_name,
345394 const int64_t parameter_value) {
346395 if (parameter_name == nullptr ) {
347- LogEvent (name, nullptr , 0 );
396+ LogEvent (name, static_cast < const Parameter*>( nullptr ) , 0 );
348397 return ;
349398 }
350399 Parameter param (parameter_name, parameter_value);
@@ -354,7 +403,7 @@ void LogEvent(const char* name, const char* parameter_name,
354403void LogEvent (const char * name, const char * parameter_name,
355404 const int parameter_value) {
356405 if (parameter_name == nullptr ) {
357- LogEvent (name, nullptr , 0 );
406+ LogEvent (name, static_cast < const Parameter*>( nullptr ) , 0 );
358407 return ;
359408 }
360409 Parameter param (parameter_name, static_cast <int64_t >(parameter_value));
0 commit comments