From e20dffab07bb9273fcbbca81a566381dd2bc40ee Mon Sep 17 00:00:00 2001 From: iphydf Date: Thu, 18 Aug 2016 10:40:21 +0100 Subject: [PATCH] chore: Make the windows code compatible with TCHAR. This adds support for multi-byte builds. Users building qTox in multi-byte instead of unicode mode would otherwise get compiler errors. This is one step in the direction of making qTox a library with the UI being just one application of it: it gives library users a choice of how they build it. --- src/platform/autorun_win.cpp | 41 ++++++++++++++++++++++++------------ 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/platform/autorun_win.cpp b/src/platform/autorun_win.cpp index 34049640f..e7a6e1b0f 100644 --- a/src/platform/autorun_win.cpp +++ b/src/platform/autorun_win.cpp @@ -24,35 +24,48 @@ #include #include +#ifdef UNICODE +/** + * tstring is either std::wstring or std::string, depending on whether the user + * is building a Unicode or Multi-Byte version of qTox. This makes the code + * easier to reuse and compatible with both setups. + */ +using tstring = std::wstring; +static inline tstring toTString(QString s) { return s.toStdWString(); } +#else +using tstring = std::string; +static inline tstring toTString(QString s) { return s.toStdString(); } +#endif + namespace Platform { - inline std::wstring currentCommandLine() + inline tstring currentCommandLine() { - return ("\"" + QApplication::applicationFilePath().replace('/', '\\') + "\" -p \"" + - Settings::getInstance().getCurrentProfile() + "\"").toStdWString(); + return toTString("\"" + QApplication::applicationFilePath().replace('/', '\\') + "\" -p \"" + + Settings::getInstance().getCurrentProfile() + "\""); } - inline std::wstring currentRegistryKeyName() + inline tstring currentRegistryKeyName() { - return (QString("qTox - ") + Settings::getInstance().getCurrentProfile()).toStdWString(); + return toTString("qTox - " + Settings::getInstance().getCurrentProfile()); } } bool Platform::setAutorun(bool on) { HKEY key = 0; - if (RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", - 0, KEY_ALL_ACCESS, &key) != ERROR_SUCCESS) + if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), + 0, KEY_ALL_ACCESS, &key) != ERROR_SUCCESS) return false; bool result = false; - std::wstring keyName = currentRegistryKeyName(); + tstring keyName = currentRegistryKeyName(); if (on) { - std::wstring path = currentCommandLine(); + tstring path = currentCommandLine(); result = RegSetValueEx(key, keyName.c_str(), 0, REG_SZ, (PBYTE)path.c_str(), - path.length() * sizeof(wchar_t)) == ERROR_SUCCESS; + path.length() * sizeof(TCHAR)) == ERROR_SUCCESS; } else result = RegDeleteValue(key, keyName.c_str()) == ERROR_SUCCESS; @@ -64,13 +77,13 @@ bool Platform::setAutorun(bool on) bool Platform::getAutorun() { HKEY key = 0; - if (RegOpenKeyEx(HKEY_CURRENT_USER, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", - 0, KEY_ALL_ACCESS, &key) != ERROR_SUCCESS) + if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), + 0, KEY_ALL_ACCESS, &key) != ERROR_SUCCESS) return false; - std::wstring keyName = currentRegistryKeyName();; + tstring keyName = currentRegistryKeyName(); - wchar_t path[MAX_PATH] = { 0 }; + TCHAR path[MAX_PATH] = { 0 }; DWORD length = sizeof(path); DWORD type = REG_SZ; bool result = false;