Skip to content

Commit 3916cb5

Browse files
committed
Update desktop code to fix issues.
1 parent e66c912 commit 3916cb5

File tree

1 file changed

+68
-19
lines changed

1 file changed

+68
-19
lines changed

analytics/src/analytics_desktop.cc

Lines changed: 68 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,69 @@ namespace firebase {
3434
namespace 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;
3939
static 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+
4195
void 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

320369
void LogEvent(const char* name) {
321-
LogEvent(name, nullptr, 0);
370+
LogEvent(name, static_cast<const Parameter*>(nullptr), 0);
322371
}
323372

324373
void 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,
334383
void 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,
344393
void 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,
354403
void 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

Comments
 (0)