diff options
Diffstat (limited to 'indra')
-rw-r--r-- | indra/llvfs/lldir_win32.cpp | 63 | ||||
-rw-r--r-- | indra/test/CMakeLists.txt | 4 |
2 files changed, 57 insertions, 10 deletions
diff --git a/indra/llvfs/lldir_win32.cpp b/indra/llvfs/lldir_win32.cpp index ebc8fdca33..4d8aa0e189 100644 --- a/indra/llvfs/lldir_win32.cpp +++ b/indra/llvfs/lldir_win32.cpp @@ -31,7 +31,11 @@ #include "lldir_win32.h" #include "llerror.h" #include "llrand.h" // for gLindenLabRandomNumber -#include "shlobj.h" +#include <shlobj.h> +#include <Knownfolders.h> +#include <iostream> +#include <map> +#include <Objbase.h> // CoTaskMemFree() #include <direct.h> #include <errno.h> @@ -42,30 +46,59 @@ #define PACKVERSION(major,minor) MAKELONG(minor,major) DWORD GetDllVersion(LPCTSTR lpszDllName); +namespace { + +std::string getKnownFolderPath(const std::string& desc, REFKNOWNFOLDERID folderid) +{ + // https://msdn.microsoft.com/en-us/library/windows/desktop/bb762188(v=vs.85).aspx + PWSTR wstrptr = 0; + HRESULT result = SHGetKnownFolderPath( + folderid, + KF_FLAG_DEFAULT, // no flags + NULL, // current user, no impersonation + &wstrptr); + if (result == S_OK) + { + std::string utf8 = utf16str_to_utf8str(llutf16string(wstrptr)); + // have to free the returned pointer after copying its data + CoTaskMemFree(wstrptr); + return utf8; + } + + // gack, no logging yet! + // at least say something to a developer trying to debug this... + static std::map<HRESULT, const char*> codes + { + { E_FAIL, "E_FAIL; known folder does not have a path?" }, + { E_INVALIDARG, "E_INVALIDARG; not present on system?" } + }; + auto found = codes.find(result); + const char* text = (found == codes.end())? "unknown" : found->second; + std::cout << "*** SHGetKnownFolderPath(" << desc << ") failed with " + << result << " (" << text << ")\n"; + return {}; +} + +} // anonymous namespace + LLDir_Win32::LLDir_Win32() { mDirDelimiter = "\\"; - WCHAR w_str[MAX_PATH]; - // Application Data is where user settings go - SHGetSpecialFolderPath(NULL, w_str, CSIDL_APPDATA, TRUE); - - mOSUserDir = utf16str_to_utf8str(llutf16string(w_str)); + mOSUserDir = getKnownFolderPath("RoamingAppData", FOLDERID_RoamingAppData); // We want cache files to go on the local disk, even if the // user is on a network with a "roaming profile". // - // On XP this is: - // C:\Docments and Settings\James\Local Settings\Application Data // On Vista this is: // C:\Users\James\AppData\Local // // We used to store the cache in AppData\Roaming, and the installer // cleans up that version on upgrade. JC - SHGetSpecialFolderPath(NULL, w_str, CSIDL_LOCAL_APPDATA, TRUE); - mOSCacheDir = utf16str_to_utf8str(llutf16string(w_str)); + mOSCacheDir = getKnownFolderPath("LocalAppData", FOLDERID_LocalAppData); + WCHAR w_str[MAX_PATH]; if (GetTempPath(MAX_PATH, w_str)) { if (wcslen(w_str)) /* Flawfinder: ignore */ @@ -73,6 +106,16 @@ LLDir_Win32::LLDir_Win32() w_str[wcslen(w_str)-1] = '\0'; /* Flawfinder: ignore */ // remove trailing slash } mTempDir = utf16str_to_utf8str(llutf16string(w_str)); + + if (mOSUserDir.empty()) + { + mOSUserDir = mTempDir; + } + + if (mOSCacheDir.empty()) + { + mOSCacheDir = mTempDir; + } } else { diff --git a/indra/test/CMakeLists.txt b/indra/test/CMakeLists.txt index 8344cead57..3f12431acc 100644 --- a/indra/test/CMakeLists.txt +++ b/indra/test/CMakeLists.txt @@ -73,6 +73,9 @@ if (NOT WINDOWS) list(APPEND test_SOURCE_FILES llmessagetemplateparser_tut.cpp ) + set(EXTRA_WINDOWS_LIBRARIES "") +else (NOT WINDOWS) + set(EXTRA_WINDOWS_LIBRARIES ole32) endif (NOT WINDOWS) set_source_files_properties(${test_HEADER_FILES} @@ -96,6 +99,7 @@ target_link_libraries(lltest ${GOOGLEMOCK_LIBRARIES} ${PTHREAD_LIBRARY} ${WINDOWS_LIBRARIES} + ${EXTRA_WINDOWS_LIBRARIES} ${BOOST_PROGRAM_OPTIONS_LIBRARY} ${BOOST_REGEX_LIBRARY} ${BOOST_COROUTINE_LIBRARY} |