From 0e9948f9d4717bbf316d9fd53fadda6ab8c5daa7 Mon Sep 17 00:00:00 2001 From: James Turner Date: Tue, 24 Mar 2015 11:08:36 -0500 Subject: [PATCH] Portability: Implemented Known Folders for Windows Patch from Scott (xDraconian) --- simgear/misc/path_test.cxx | 6 ++++- simgear/misc/sg_path.cxx | 52 ++++++++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 11 deletions(-) diff --git a/simgear/misc/path_test.cxx b/simgear/misc/path_test.cxx index 94f9eaad..61a9fba9 100644 --- a/simgear/misc/path_test.cxx +++ b/simgear/misc/path_test.cxx @@ -141,8 +141,12 @@ int main(int argc, char* argv[]) // add pc.add("/opt/local"); +#ifdef _WIN32 + COMPARE(pc.str(), std::string("/usr/local/include/;/opt/local")); +#else COMPARE(pc.str(), std::string("/usr/local/include/:/opt/local")); - +#endif + // concat SGPath pd = pb; pd.concat("-1"); diff --git a/simgear/misc/sg_path.cxx b/simgear/misc/sg_path.cxx index 7895e68c..1cfe465c 100644 --- a/simgear/misc/sg_path.cxx +++ b/simgear/misc/sg_path.cxx @@ -56,7 +56,8 @@ static const char sgSearchPathSep = ':'; #endif #ifdef _WIN32 -#include // for CSIDL +#include // for CSIDL +#include // for Standard Folder GUIDs static SGPath pathForCSIDL(int csidl, const SGPath& def) { @@ -80,6 +81,31 @@ static SGPath pathForCSIDL(int csidl, const SGPath& def) return def; } + +static SGPath pathForKnownFolder(REFKNOWNFOLDERID folderId, const SGPath& def) +{ + // system call will allocate dynamic memory... which we must release when done + wchar_t* localFolder = 0; + if (SHGetKnownFolderPath(folderId, KF_FLAG_DEFAULT_PATH, NULL, &localFolder) == S_OK) { + // copy into local memory + char path[MAX_PATH]; + size_t len; + if (wcstombs_s(&len, path, localFolder, MAX_PATH) != S_OK) { + path[0] = '\0'; + SG_LOG(SG_GENERAL, SG_WARN, "WCS to MBS failed"); + } + + SGPath folder_path = SGPath(path, def.getPermissionChecker()); + + // release dynamic memory + CoTaskMemFree(static_cast(localFolder)); + + return folder_path; + } + + return def; +} + #elif __APPLE__ // defined in CocoaHelpers.mm @@ -705,6 +731,16 @@ SGPath SGPath::standardLocation(StandardLocation type, const SGPath& def) case HOME: return home(def); #ifdef _WIN32 +# if (WINVER > 0x0501) + case DESKTOP: + return pathForKnownFolder(FOLDERID_Desktop, def); + case DOWNLOADS: + return pathForKnownFolder(FOLDERID_Downloads, def); + case DOCUMENTS: + return pathForKnownFolder(FOLDERID_Documents, def); + case PICTURES: + return pathForKnownFolder(FOLDERID_Pictures, def); +# else case DESKTOP: return pathForCSIDL(CSIDL_DESKTOPDIRECTORY, def); case DOWNLOADS: @@ -718,6 +754,7 @@ SGPath SGPath::standardLocation(StandardLocation type, const SGPath& def) return pathForCSIDL(CSIDL_MYDOCUMENTS, def); case PICTURES: return pathForCSIDL(CSIDL_MYPICTURES, def); +# endif #elif __APPLE__ // since this is C++, we can't include NSPathUtilities.h to access the enum // values, so hard-coding them here (they are stable, don't worry) @@ -756,20 +793,15 @@ SGPath SGPath::fromEnv(const char* name, const SGPath& def) return def; } -#ifdef _WIN32 //------------------------------------------------------------------------------ SGPath SGPath::home(const SGPath& def) { - // TODO - return def; -} +#ifdef _WIN32 + return fromEnv("USERPROFILE", def); #else -//------------------------------------------------------------------------------ -SGPath SGPath::home(const SGPath& def) -{ - return fromEnv("HOME", def); -} + return fromEnv("HOME", def); #endif +} //------------------------------------------------------------------------------ SGPath SGPath::desktop(const SGPath& def) -- 2.39.5