Add desktop() accessor to SGPath

(Windows-only for the moment)
This commit is contained in:
James Turner
2014-01-26 16:03:31 +00:00
parent 172b8a032c
commit adec1c4507
2 changed files with 46 additions and 19 deletions

View File

@@ -55,6 +55,34 @@ static const char sgSearchPathSep = ';';
static const char sgSearchPathSep = ':';
#endif
#ifdef _WIN32
#include <ShlObj.h> // 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 <ShlObj.h> // 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 <CoreServices/CoreServices.h>

View File

@@ -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();