From 0a8246c676973790113abd36c3ac70bc334f53eb Mon Sep 17 00:00:00 2001 From: James Turner Date: Sun, 26 Jan 2014 16:03:31 +0000 Subject: [PATCH] Add desktop() accessor to SGPath (Windows-only for the moment) --- simgear/misc/sg_path.cxx | 57 ++++++++++++++++++++++++++++------------ simgear/misc/sg_path.hxx | 4 +++ 2 files changed, 44 insertions(+), 17 deletions(-) diff --git a/simgear/misc/sg_path.cxx b/simgear/misc/sg_path.cxx index 6c619452..adc4df5b 100644 --- a/simgear/misc/sg_path.cxx +++ b/simgear/misc/sg_path.cxx @@ -55,6 +55,34 @@ static const char sgSearchPathSep = ';'; static const char sgSearchPathSep = ':'; #endif +#ifdef _WIN32 + +#include // for CSIDL + +static SGPath pathForCSIDL(int csidl, const SGPath::PermissonChecker& checker) +{ + typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, LPSTR, int, BOOL); + static GetSpecialFolderPath SHGetSpecialFolderPath = NULL; + + // lazy open+resolve of shell32 + if (!SHGetSpecialFolderPath) { + HINSTANCE shellDll = ::LoadLibrary("shell32"); + SHGetSpecialFolderPath = (GetSpecialFolderPath) GetProcAddress(shellDll, "SHGetSpecialFolderPathA"); + } + + if (!SHGetSpecialFolderPath){ + return SGPath(); + } + + char path[MAX_PATH]; + if (SHGetSpecialFolderPath(0, path, csidl, false)) { + return SGPath(path, checker); + } + + return SGPath(); +} + +#endif // For windows, replace "\" by "/". void @@ -644,31 +672,26 @@ SGPath SGPath::home(const SGPath& def) #endif #ifdef _WIN32 - -#include // for CSIDL - //------------------------------------------------------------------------------ SGPath SGPath::desktop(const SGPath& def) { - typedef BOOL (WINAPI*GetSpecialFolderPath)(HWND, LPSTR, int, BOOL); - static GetSpecialFolderPath SHGetSpecialFolderPath = NULL; - - // lazy open+resolve of shell32 - if (!SHGetSpecialFolderPath) { - HINSTANCE shellDll = ::LoadLibrary("shell32"); - SHGetSpecialFolderPath = (GetSpecialFolderPath) GetProcAddress(shellDll, "SHGetSpecialFolderPathA"); + SGPath r = pathForCSIDL(CSIDL_DESKTOPDIRECTORY, def._permission_checker); + if (!r.isNull()) { + return r; } - if (!SHGetSpecialFolderPath){ - return def; - } + SG_LOG(SG_GENERAL, SG_ALERT, "SGPath::desktop() failed, bad" ); + return def; +} - char path[MAX_PATH]; - if (SHGetSpecialFolderPath(0, path, CSIDL_DESKTOPDIRECTORY, false)) { - return SGPath(path, def._permission_checker); +SGPath SGPath::documents(const SGPath& def) +{ + SGPath r = pathForCSIDL(CSIDL_MYDOCUMENTS, def._permission_checker); + if (!r.isNull()) { + return r; } - SG_LOG(SG_GENERAL, SG_ALERT, "SGPath::desktop() failed, bad" ); + SG_LOG(SG_GENERAL, SG_ALERT, "SGPath::documents() failed, bad" ); return def; } #elif __APPLE__ diff --git a/simgear/misc/sg_path.hxx b/simgear/misc/sg_path.hxx index 2261bef0..2cade320 100644 --- a/simgear/misc/sg_path.hxx +++ b/simgear/misc/sg_path.hxx @@ -276,6 +276,10 @@ public: */ static SGPath desktop(const SGPath& def = SGPath()); + /** + * Get path to the user's documents directory + */ + static SGPath documents(const SGPath& def = SGPath()); private: void fix(); -- 2.39.5