| OLD | NEW | 
|   1 #include <memory> |   1 #include <memory> | 
|   2 #include <stdexcept> |   2 #include <stdexcept> | 
|   3  |   3  | 
|   4 #include <Windows.h> |   4 #include <Windows.h> | 
|   5 #include <ShlObj.h> |   5 #include <ShlObj.h> | 
|   6  |   6  | 
|   7 #include "Utils.h" |   7 #include "Utils.h" | 
|   8  |   8  | 
|   9 namespace |   9 namespace | 
|  10 { |  10 { | 
|  11   std::wstring appDataPath; |  11   std::wstring appDataPath; | 
|  12  |  12  | 
|  13   bool IsWindowsVistaOrLater() |  13   bool IsWindowsVistaOrLater() | 
|  14   { |  14   { | 
|  15     OSVERSIONINFOEX osvi; |  15     OSVERSIONINFOEX osvi; | 
|  16     ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); |  16     ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); | 
|  17     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); |  17     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); | 
|  18     GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvi)); |  18     GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvi)); | 
|  19     return osvi.dwMajorVersion >= 6; |  19     return osvi.dwMajorVersion >= 6; | 
|  20   } |  20   } | 
|  21 } |  21 } | 
|  22  |  22  | 
 |  23 std::string ToUtf8String(std::wstring str) | 
 |  24 { | 
 |  25   size_t length = str.size(); | 
 |  26   if (length == 0) | 
 |  27     return std::string(); | 
 |  28  | 
 |  29   DWORD utf8StringLength = WideCharToMultiByte(CP_UTF8, 0, str.c_str(), length, 
    0, 0, 0, 0); | 
 |  30   if (utf8StringLength == 0) | 
 |  31     throw std::runtime_error("Failed to determine the required buffer size"); | 
 |  32  | 
 |  33   std::string utf8String(utf8StringLength, '\0'); | 
 |  34   WideCharToMultiByte(CP_UTF8, 0, str.c_str(), length, &utf8String[0], utf8Strin
    gLength, 0, 0); | 
 |  35   return utf8String; | 
 |  36 } | 
 |  37  | 
|  23 std::wstring GetAppDataPath() |  38 std::wstring GetAppDataPath() | 
|  24 { |  39 { | 
|  25   if (appDataPath.empty()) |  40   if (appDataPath.empty()) | 
|  26   { |  41   { | 
|  27     if (IsWindowsVistaOrLater()) |  42     if (IsWindowsVistaOrLater()) | 
|  28     { |  43     { | 
|  29       WCHAR* pathBuffer; |  44       WCHAR* pathBuffer; | 
|  30       if (FAILED(SHGetKnownFolderPath(FOLDERID_LocalAppDataLow, 0, 0, &pathBuffe
    r))) |  45       if (FAILED(SHGetKnownFolderPath(FOLDERID_LocalAppDataLow, 0, 0, &pathBuffe
    r))) | 
|  31         throw std::runtime_error("Unable to find app data directory"); |  46         throw std::runtime_error("Unable to find app data directory"); | 
|  32       appDataPath.assign(pathBuffer); |  47       appDataPath.assign(pathBuffer); | 
|  33       CoTaskMemFree(pathBuffer); |  48       CoTaskMemFree(pathBuffer); | 
|  34     } |  49     } | 
|  35     else |  50     else | 
|  36     { |  51     { | 
|  37       std::auto_ptr<wchar_t> pathBuffer(new wchar_t[MAX_PATH]); |  52       std::auto_ptr<wchar_t> pathBuffer(new wchar_t[MAX_PATH]); | 
|  38       if (!SHGetSpecialFolderPath(0, pathBuffer.get(), CSIDL_LOCAL_APPDATA, true
    )) |  53       if (!SHGetSpecialFolderPath(0, pathBuffer.get(), CSIDL_LOCAL_APPDATA, true
    )) | 
|  39         throw std::runtime_error("Unable to find app data directory"); |  54         throw std::runtime_error("Unable to find app data directory"); | 
|  40       appDataPath.assign(pathBuffer.get()); |  55       appDataPath.assign(pathBuffer.get()); | 
|  41     } |  56     } | 
|  42     appDataPath += L"\\Adblock Plus for IE"; |  57     appDataPath += L"\\Adblock Plus for IE"; | 
|  43  |  58  | 
|  44     // Ignore errors here, this isn't a critical operation |  59     // Ignore errors here, this isn't a critical operation | 
|  45     ::CreateDirectoryW(appDataPath.c_str(), NULL); |  60     ::CreateDirectoryW(appDataPath.c_str(), NULL); | 
|  46   } |  61   } | 
|  47   return appDataPath; |  62   return appDataPath; | 
|  48 } |  63 } | 
| OLD | NEW |