improve path finding logic

This commit is contained in:
Rudolf Polzer 2011-05-01 21:17:23 +02:00
parent 5f5eea8067
commit 5725b104cc

View File

@ -194,36 +194,24 @@ static HRESULT (WINAPI *qSHGetKnownFolderPath) (qREFKNOWNFOLDERID rfid, DWORD dw
#endif #endif
void HomePaths_Realise() void HomePaths_Realise()
{ {
do
{
const char* prefix = g_pGameDescription->getKeyValue("prefix");
if(!string_empty(prefix))
{
StringOutputStream path(256);
#if defined(__APPLE__) #if defined(__APPLE__)
const char* prefix = g_pGameDescription->getKeyValue("prefix");
if(!string_empty(prefix))
{
StringOutputStream path(256);
path << DirectoryCleaned(g_get_home_dir()) << "Library/Application Support" << (prefix+1) << "/";
if(!file_is_directory(path.c_str()))
{
path.clear(); path.clear();
path << DirectoryCleaned(g_get_home_dir()) << prefix << "/"; path << DirectoryCleaned(g_get_home_dir()) << "Library/Application Support" << (prefix+1) << "/";
} if(file_is_directory(path.c_str()))
g_qeglobals.m_userEnginePath = path.c_str();
Q_mkdir(g_qeglobals.m_userEnginePath.c_str());
}
else
#elif defined(POSIX)
const char* prefix = g_pGameDescription->getKeyValue("prefix");
if(!string_empty(prefix))
{ {
StringOutputStream path(256);
path << DirectoryCleaned(g_get_home_dir()) << prefix << "/";
g_qeglobals.m_userEnginePath = path.c_str(); g_qeglobals.m_userEnginePath = path.c_str();
Q_mkdir(g_qeglobals.m_userEnginePath.c_str()); break;
} }
else #endif
#elif defined(WIN32)
const char* prefix = g_pGameDescription->getKeyValue("prefix"); #if defined(WIN32)
if(!string_empty(prefix))
{
StringOutputStream path(256);
TCHAR mydocsdir[MAX_PATH + 1]; TCHAR mydocsdir[MAX_PATH + 1];
wchar_t *mydocsdirw; wchar_t *mydocsdirw;
HMODULE shfolder = LoadLibrary("shfolder.dll"); HMODULE shfolder = LoadLibrary("shfolder.dll");
@ -232,22 +220,27 @@ void HomePaths_Realise()
else else
qSHGetKnownFolderPath = NULL; qSHGetKnownFolderPath = NULL;
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED); CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
do
{
if(qSHGetKnownFolderPath && qSHGetKnownFolderPath(qFOLDERID_SavedGames, qKF_FLAG_CREATE | qKF_FLAG_NO_ALIAS, NULL, &mydocsdirw) == S_OK) if(qSHGetKnownFolderPath && qSHGetKnownFolderPath(qFOLDERID_SavedGames, qKF_FLAG_CREATE | qKF_FLAG_NO_ALIAS, NULL, &mydocsdirw) == S_OK)
{ {
memset(mydocsdir, 0, sizeof(mydocsdir)); memset(mydocsdir, 0, sizeof(mydocsdir));
wctombs(mydocsdir, mydocsdirw, sizeof(mydocsdir)-1); wctombs(mydocsdir, mydocsdirw, sizeof(mydocsdir)-1);
CoTaskMemFree(mydocsdirw); CoTaskMemFree(mydocsdirw);
path.clear();
path << DirectoryCleaned(mydocsdir) << (prefix+1) << "/"; path << DirectoryCleaned(mydocsdir) << (prefix+1) << "/";
if(file_is_directory(path.c_str())) if(file_is_directory(path.c_str()))
{ {
g_qeglobals.m_userEnginePath = path.c_str(); g_qeglobals.m_userEnginePath = path.c_str();
CoUninitialize();
FreeLibrary(shfolder);
break; break;
} }
} }
CoUninitialize();
if(shfolder)
FreeLibrary(shfolder);
if(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, mydocsdir)) if(SHGetFolderPath(NULL, CSIDL_PERSONAL, NULL, 0, mydocsdir))
{ {
path.clear();
path << DirectoryCleaned(mydocsdir) << "My Games/" << (prefix+1) << "/"; path << DirectoryCleaned(mydocsdir) << "My Games/" << (prefix+1) << "/";
// win32: only add it if it already exists // win32: only add it if it already exists
if(file_is_directory(path.c_str())) if(file_is_directory(path.c_str()))
@ -256,18 +249,21 @@ void HomePaths_Realise()
break; break;
} }
} }
#endif
#if defined(POSIX)
path.clear();
path << DirectoryCleaned(g_get_home_dir()) << prefix << "/";
g_qeglobals.m_userEnginePath = path.c_str();
break;
#endif
}
g_qeglobals.m_userEnginePath = EnginePath_get(); g_qeglobals.m_userEnginePath = EnginePath_get();
} }
while(0); while(0);
CoUninitialize();
if(shfolder) Q_mkdir(g_qeglobals.m_userEnginePath.c_str());
FreeLibrary(shfolder);
}
else
#endif
{
g_qeglobals.m_userEnginePath = EnginePath_get();
}
{ {
StringOutputStream path(256); StringOutputStream path(256);