From 4cd8ff35866124de531728ac55c89924d1ea70e0 Mon Sep 17 00:00:00 2001 From: Phillip Stephens Date: Wed, 2 Jun 2021 11:08:20 -0700 Subject: [PATCH] Fix windows --- Runtime/CMemoryCardSysWin.cpp | 122 +++++++++++++++++----------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/Runtime/CMemoryCardSysWin.cpp b/Runtime/CMemoryCardSysWin.cpp index 943d364cf..14071b34b 100644 --- a/Runtime/CMemoryCardSysWin.cpp +++ b/Runtime/CMemoryCardSysWin.cpp @@ -14,7 +14,58 @@ using namespace Windows::Storage; /* Partial path-selection logic from * https://github.com/dolphin-emu/dolphin/blob/master/Source/Core/UICommon/UICommon.cpp * Modified to not use dolphin-binary-relative paths. */ -kabufuda::SystemString CMemoryCardSys::ResolveDolphinCardPath(kabufuda::ECardSlot slot, bool dolphin) { +kabufuda::SystemString CMemoryCardSys::ResolveDolphinCardPath(kabufuda::ECardSlot slot) { + if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { +#if !WINDOWS_STORE + /* Detect where the User directory is. There are two different cases + * 1. HKCU\Software\Dolphin Emulator\UserConfigPath exists + * -> Use this as the user directory path + * 2. My Documents exists + * -> Use My Documents\Dolphin Emulator as the User directory path + */ + + /* Check our registry keys */ + HKEY hkey; + kabufuda::SystemChar configPath[MAX_PATH] = {0}; + if (RegOpenKeyEx(HKEY_CURRENT_USER, _SYS_STR("Software\\Dolphin Emulator"), 0, KEY_QUERY_VALUE, &hkey) == + ERROR_SUCCESS) { + DWORD size = MAX_PATH; + if (RegQueryValueEx(hkey, _SYS_STR("UserConfigPath"), nullptr, nullptr, (LPBYTE)configPath, &size) != + ERROR_SUCCESS) + configPath[0] = 0; + RegCloseKey(hkey); + } + + /* Get My Documents path in case we need it. */ + kabufuda::SystemChar my_documents[MAX_PATH]; + bool my_documents_found = + SUCCEEDED(SHGetFolderPath(nullptr, CSIDL_MYDOCUMENTS, nullptr, SHGFP_TYPE_CURRENT, my_documents)); + + kabufuda::SystemString path; + if (configPath[0]) /* Case 1 */ + path = configPath; + else if (my_documents_found) /* Case 2 */ + path = kabufuda::SystemString(my_documents) + _SYS_STR("/Dolphin Emulator"); + else /* Unable to find */ + return {}; +#else + StorageFolder ^ localFolder = ApplicationData::Current->LocalFolder; + kabufuda::SystemString path(localFolder->Path->Data()); +#endif + + path += fmt::format(FMT_STRING(_SYS_STR("/GC/MemoryCard{}.USA.raw")), + slot == kabufuda::ECardSlot::SlotA ? _SYS_STR('A') : _SYS_STR('B')); + + hecl::Sstat theStat; + if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) + return {}; + + return path; + } + return {}; +} + +kabufuda::SystemString CMemoryCardSys::_CreateDolphinCard(kabufuda::ECardSlot slot, bool dolphin) { if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { if (dolphin) { #if !WINDOWS_STORE @@ -54,13 +105,17 @@ kabufuda::SystemString CMemoryCardSys::ResolveDolphinCardPath(kabufuda::ECardSlo kabufuda::SystemString path(localFolder->Path->Data()); #endif - path += fmt::format(FMT_STRING(_SYS_STR("/GC/MemoryCard{}.USA.raw")), - slot == kabufuda::ECardSlot::SlotA ? _SYS_STR('A') : _SYS_STR('B')); - - hecl::Sstat theStat; - if (hecl::Stat(path.c_str(), &theStat) || !S_ISREG(theStat.st_mode)) + path += _SYS_STR("/GC"); + if (hecl::RecursiveMakeDir(path.c_str()) < 0) return {}; + path += fmt::format(FMT_STRING(_SYS_STR("/MemoryCard{}.USA.raw")), + slot == kabufuda::ECardSlot::SlotA ? _SYS_STR('A') : _SYS_STR('B')); + const auto fp = hecl::FopenUnique(path.c_str(), _SYS_STR("wb")); + if (fp == nullptr) { + return {}; + } + return path; } else { kabufuda::SystemString path = _GetDolphinCardPath(slot); @@ -79,59 +134,4 @@ kabufuda::SystemString CMemoryCardSys::ResolveDolphinCardPath(kabufuda::ECardSlo return {}; } -kabufuda::SystemString CMemoryCardSys::_CreateDolphinCard(kabufuda::ECardSlot slot) { - if (g_Main->IsUSA() && !g_Main->IsTrilogy()) { -#if !WINDOWS_STORE - /* Detect where the User directory is. There are two different cases - * 1. HKCU\Software\Dolphin Emulator\UserConfigPath exists - * -> Use this as the user directory path - * 2. My Documents exists - * -> Use My Documents\Dolphin Emulator as the User directory path - */ - - /* Check our registry keys */ - HKEY hkey; - kabufuda::SystemChar configPath[MAX_PATH] = {0}; - if (RegOpenKeyEx(HKEY_CURRENT_USER, _SYS_STR("Software\\Dolphin Emulator"), 0, KEY_QUERY_VALUE, &hkey) == - ERROR_SUCCESS) { - DWORD size = MAX_PATH; - if (RegQueryValueEx(hkey, _SYS_STR("UserConfigPath"), nullptr, nullptr, (LPBYTE)configPath, &size) != - ERROR_SUCCESS) - configPath[0] = 0; - RegCloseKey(hkey); - } - - /* Get My Documents path in case we need it. */ - kabufuda::SystemChar my_documents[MAX_PATH]; - bool my_documents_found = - SUCCEEDED(SHGetFolderPath(nullptr, CSIDL_MYDOCUMENTS, nullptr, SHGFP_TYPE_CURRENT, my_documents)); - - kabufuda::SystemString path; - if (configPath[0]) /* Case 1 */ - path = configPath; - else if (my_documents_found) /* Case 2 */ - path = kabufuda::SystemString(my_documents) + _SYS_STR("/Dolphin Emulator"); - else /* Unable to find */ - return {}; -#else - StorageFolder ^ localFolder = ApplicationData::Current->LocalFolder; - kabufuda::SystemString path(localFolder->Path->Data()); -#endif - - path += _SYS_STR("/GC"); - if (hecl::RecursiveMakeDir(path.c_str()) < 0) - return {}; - - path += fmt::format(FMT_STRING(_SYS_STR("/MemoryCard{}.USA.raw")), - slot == kabufuda::ECardSlot::SlotA ? _SYS_STR('A') : _SYS_STR('B')); - const auto fp = hecl::FopenUnique(path.c_str(), _SYS_STR("wb")); - if (fp == nullptr) { - return {}; - } - - return path; - } - return {}; -} - } // namespace metaforce