From adec1c45073be313f83ecf51e02c05ddc14deba5 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 | 61 +++++++++++++++++++++++++++------------- simgear/misc/sg_path.hxx | 4 +++ 2 files changed, 46 insertions(+), 19 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,33 +672,28 @@ 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"); - } - - if (!SHGetSpecialFolderPath){ - return def; - } - - char path[MAX_PATH]; - if (SHGetSpecialFolderPath(0, path, CSIDL_DESKTOPDIRECTORY, false)) { - return SGPath(path, def._permission_checker); + SGPath r = pathForCSIDL(CSIDL_DESKTOPDIRECTORY, def._permission_checker); + if (!r.isNull()) { + return r; } SG_LOG(SG_GENERAL, SG_ALERT, "SGPath::desktop() failed, bad" ); return def; } + +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::documents() failed, bad" ); + return def; +} #elif __APPLE__ #include 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();