mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2024-11-15 05:47:56 -07:00
Remove MAX_PATH limit from:
- GetTempFilenameForAtomicWrite - SetUserDirectory
This commit is contained in:
parent
b6545ea285
commit
3b21d32865
@ -639,19 +639,21 @@ std::string CreateTempDir()
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string GetTempFilenameForAtomicWrite(const std::string& path)
|
std::string GetTempFilenameForAtomicWrite(std::string path)
|
||||||
{
|
{
|
||||||
std::string abs = path;
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
TCHAR absbuf[MAX_PATH];
|
std::unique_ptr<TCHAR[], decltype(&std::free)> absbuf{
|
||||||
if (_tfullpath(absbuf, UTF8ToTStr(path).c_str(), MAX_PATH) != nullptr)
|
_tfullpath(nullptr, UTF8ToTStr(path).c_str(), 0), std::free};
|
||||||
abs = TStrToUTF8(absbuf);
|
if (absbuf != nullptr)
|
||||||
|
{
|
||||||
|
path = TStrToUTF8(absbuf.get());
|
||||||
|
}
|
||||||
#else
|
#else
|
||||||
char absbuf[PATH_MAX];
|
char absbuf[PATH_MAX];
|
||||||
if (realpath(path.c_str(), absbuf) != nullptr)
|
if (realpath(path.c_str(), absbuf) != nullptr)
|
||||||
abs = absbuf;
|
path = absbuf;
|
||||||
#endif
|
#endif
|
||||||
return abs + ".xxx";
|
return std::move(path) + ".xxx";
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(__APPLE__)
|
#if defined(__APPLE__)
|
||||||
|
@ -172,7 +172,7 @@ bool SetCurrentDir(const std::string& directory);
|
|||||||
std::string CreateTempDir();
|
std::string CreateTempDir();
|
||||||
|
|
||||||
// Get a filename that can hopefully be atomically renamed to the given path.
|
// Get a filename that can hopefully be atomically renamed to the given path.
|
||||||
std::string GetTempFilenameForAtomicWrite(const std::string& path);
|
std::string GetTempFilenameForAtomicWrite(std::string path);
|
||||||
|
|
||||||
// Gets a set user directory path
|
// Gets a set user directory path
|
||||||
// Don't call prior to setting the base user directory
|
// Don't call prior to setting the base user directory
|
||||||
|
@ -211,46 +211,57 @@ void SetUserDirectory(const std::string& custom_path)
|
|||||||
// -> Use GetExeDirectory()\User
|
// -> Use GetExeDirectory()\User
|
||||||
|
|
||||||
// Check our registry keys
|
// Check our registry keys
|
||||||
|
// TODO: Maybe use WIL when it's available?
|
||||||
HKEY hkey;
|
HKEY hkey;
|
||||||
DWORD local = 0;
|
DWORD local = 0;
|
||||||
TCHAR configPath[MAX_PATH] = {0};
|
std::unique_ptr<TCHAR[]> configPath;
|
||||||
if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Dolphin Emulator"), 0, KEY_QUERY_VALUE,
|
if (RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Dolphin Emulator"), 0, KEY_QUERY_VALUE,
|
||||||
&hkey) == ERROR_SUCCESS)
|
&hkey) == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
DWORD size = 4;
|
DWORD size = 4;
|
||||||
if (RegQueryValueEx(hkey, TEXT("LocalUserConfig"), nullptr, nullptr,
|
if (RegQueryValueEx(hkey, TEXT("LocalUserConfig"), nullptr, nullptr,
|
||||||
reinterpret_cast<LPBYTE>(&local), &size) != ERROR_SUCCESS)
|
reinterpret_cast<LPBYTE>(&local), &size) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
local = 0;
|
local = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
RegQueryValueEx(hkey, TEXT("UserConfigPath"), nullptr, nullptr, nullptr, &size);
|
||||||
|
configPath = std::make_unique<TCHAR[]>(size / sizeof(TCHAR));
|
||||||
|
if (RegQueryValueEx(hkey, TEXT("UserConfigPath"), nullptr, nullptr,
|
||||||
|
reinterpret_cast<LPBYTE>(configPath.get()), &size) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
configPath.reset();
|
||||||
|
}
|
||||||
|
|
||||||
size = MAX_PATH;
|
|
||||||
if (RegQueryValueEx(hkey, TEXT("UserConfigPath"), nullptr, nullptr, (LPBYTE)configPath,
|
|
||||||
&size) != ERROR_SUCCESS)
|
|
||||||
configPath[0] = 0;
|
|
||||||
RegCloseKey(hkey);
|
RegCloseKey(hkey);
|
||||||
}
|
}
|
||||||
|
|
||||||
local = local || File::Exists(File::GetExeDirectory() + DIR_SEP "portable.txt");
|
local = local != 0 || File::Exists(File::GetExeDirectory() + DIR_SEP "portable.txt");
|
||||||
|
|
||||||
// Get Program Files path in case we need it.
|
// Get Documents path in case we need it.
|
||||||
TCHAR my_documents[MAX_PATH];
|
// TODO: Maybe use WIL when it's available?
|
||||||
bool my_documents_found = SUCCEEDED(
|
PWSTR my_documents = nullptr;
|
||||||
SHGetFolderPath(nullptr, CSIDL_MYDOCUMENTS, nullptr, SHGFP_TYPE_CURRENT, my_documents));
|
bool my_documents_found =
|
||||||
|
SUCCEEDED(SHGetKnownFolderPath(FOLDERID_Documents, KF_FLAG_DEFAULT, nullptr, &my_documents));
|
||||||
|
|
||||||
if (local) // Case 1-2
|
if (local) // Case 1-2
|
||||||
user_path = File::GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP;
|
user_path = File::GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP;
|
||||||
else if (configPath[0]) // Case 3
|
else if (configPath) // Case 3
|
||||||
user_path = TStrToUTF8(configPath);
|
user_path = TStrToUTF8(configPath.get());
|
||||||
else if (my_documents_found) // Case 4
|
else if (my_documents_found) // Case 4
|
||||||
user_path = TStrToUTF8(my_documents) + DIR_SEP "Dolphin Emulator" DIR_SEP;
|
user_path = TStrToUTF8(my_documents) + DIR_SEP "Dolphin Emulator" DIR_SEP;
|
||||||
else // Case 5
|
else // Case 5
|
||||||
user_path = File::GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP;
|
user_path = File::GetExeDirectory() + DIR_SEP USERDATA_DIR DIR_SEP;
|
||||||
|
|
||||||
|
CoTaskMemFree(my_documents);
|
||||||
|
|
||||||
// Prettify the path: it will be displayed in some places, we don't want a mix
|
// Prettify the path: it will be displayed in some places, we don't want a mix
|
||||||
// of \ and /.
|
// of \ and /.
|
||||||
user_path = ReplaceAll(user_path, "\\", DIR_SEP);
|
user_path = ReplaceAll(std::move(user_path), "\\", DIR_SEP);
|
||||||
|
|
||||||
// Make sure it ends in DIR_SEP.
|
// Make sure it ends in DIR_SEP.
|
||||||
if (*user_path.rbegin() != DIR_SEP_CHR)
|
if (user_path.back() != DIR_SEP_CHR)
|
||||||
user_path += DIR_SEP;
|
user_path += DIR_SEP;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@ -325,7 +336,7 @@ void SetUserDirectory(const std::string& custom_path)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
File::SetUserPath(D_USER_IDX, user_path);
|
File::SetUserPath(D_USER_IDX, std::move(user_path));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SaveWiimoteSources()
|
void SaveWiimoteSources()
|
||||||
|
Loading…
Reference in New Issue
Block a user