| Index: src/engine/Utils.cpp |
| =================================================================== |
| new file mode 100644 |
| --- /dev/null |
| +++ b/src/engine/Utils.cpp |
| @@ -0,0 +1,40 @@ |
| +#include "stdafx.h" |
| +#include "Utils.h" |
| + |
| +namespace |
| +{ |
| + static std::wstring appDataPath; |
| + |
| + bool IsWindowsVistaOrLater() |
| + { |
| + OSVERSIONINFOEX osvi; |
| + ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); |
| + osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); |
| + GetVersionEx(reinterpret_cast<LPOSVERSIONINFO>(&osvi)); |
| + return osvi.dwMajorVersion >= 6; |
| + } |
| +} |
| + |
| +std::wstring GetAppDataPath() |
| +{ |
| + if (appDataPath.empty()) |
| + { |
| + if (IsWindowsVistaOrLater()) |
| + { |
| + WCHAR* pathBuffer; |
| + if (FAILED(SHGetKnownFolderPath(FOLDERID_LocalAppDataLow, 0, 0, &pathBuffer))) |
| + throw std::runtime_error("Unable to find app data directory"); |
| + appDataPath.assign(pathBuffer); |
| + CoTaskMemFree(pathBuffer); |
| + } |
| + else |
| + { |
| + std::auto_ptr<wchar_t> pathBuffer(new wchar_t[MAX_PATH]); |
| + if (!SHGetSpecialFolderPath(0, pathBuffer.get(), CSIDL_LOCAL_APPDATA, true)) |
| + throw std::runtime_error("Unable to find app data directory"); |
| + appDataPath.assign(pathBuffer.get()); |
| + } |
| + appDataPath += L"\\AdblockPlus"; |
| + } |
| + return appDataPath; |
| +} |