diff options
| author | comex <comexk@gmail.com> | 2014-11-17 20:59:14 -0500 |
|---|---|---|
| committer | comex <comexk@gmail.com> | 2015-05-28 19:14:42 -0400 |
| commit | dc91e8b60793276e83cc3c141dcdc551aa36d8ed (patch) | |
| tree | 9dedab7118f77e481459b4d48278cb618a70e892 /Source/Core/Common | |
| parent | f6c6822f71e795563e5eacdb28c2a740ca79b520 (diff) | |
Add a mode to use a dummy Wii NAND.
Eventually, netplay will be able to use the host's NAND, but this could
still be useful in some cases; for TAS it definitely makes sense to have
a way to avoid using any preexisting NAND.
In terms of implementation: remove D_WIIUSER_IDX, which was just WIIROOT
+ "/", as well as some other indices which are pointless to have as
separate variables rather than just using the actual path (fixed, since
they're actual Wii NAND paths) at the call site. Then split off
D_SESSION_WIIROOT_IDX, which can point to the dummy NAND directory, from
D_WIIROOT_IDX, which always points to the "real" one the user
configured.
Diffstat (limited to 'Source/Core/Common')
| -rw-r--r-- | Source/Core/Common/FileUtil.cpp | 38 | ||||
| -rw-r--r-- | Source/Core/Common/FileUtil.h | 10 | ||||
| -rw-r--r-- | Source/Core/Common/NandPaths.cpp | 54 | ||||
| -rw-r--r-- | Source/Core/Common/NandPaths.h | 3 | ||||
| -rw-r--r-- | Source/Core/Common/SysConf.cpp | 9 |
5 files changed, 87 insertions, 27 deletions
diff --git a/Source/Core/Common/FileUtil.cpp b/Source/Core/Common/FileUtil.cpp index 19269e88d3..925e3f1ed3 100644 --- a/Source/Core/Common/FileUtil.cpp +++ b/Source/Core/Common/FileUtil.cpp @@ -20,6 +20,7 @@ #include <commdlg.h> // for GetSaveFileName #include <direct.h> // getcwd #include <io.h> +#include <objbase.h> // guid stuff #include <shellapi.h> #include <windows.h> #else @@ -666,6 +667,32 @@ bool SetCurrentDir(const std::string &directory) return __chdir(directory.c_str()) == 0; } +std::string CreateTempDir() +{ +#ifdef _WIN32 + TCHAR temp[MAX_PATH]; + if (!GetTempPath(MAX_PATH, temp)) + return ""; + + GUID guid; + CoCreateGuid(&guid); + TCHAR tguid[40]; + StringFromGUID2(guid, tguid, 39); + tguid[39] = 0; + std::string dir = TStrToUTF8(temp) + "/" + TStrToUTF8(tguid); + if (!CreateDir(dir)) + return ""; + dir = ReplaceAll(dir, "\\", DIR_SEP); + return dir; +#else + const char* base = getenv("TMPDIR") ?: "/tmp"; + std::string path = std::string(base) + "/DolphinWii.XXXXXX"; + if (!mkdtemp(&path[0])) + return ""; + return path; +#endif +} + std::string GetTempFilenameForAtomicWrite(const std::string &path) { std::string abs = path; @@ -734,17 +761,9 @@ static void RebuildUserDirectories(unsigned int dir_index) { switch (dir_index) { - case D_WIIROOT_IDX: - s_user_paths[D_WIIUSER_IDX] = s_user_paths[D_WIIROOT_IDX] + DIR_SEP; - s_user_paths[D_WIISYSCONF_IDX] = s_user_paths[D_WIIUSER_IDX] + WII_SYSCONF_DIR + DIR_SEP; - s_user_paths[D_WIIWC24_IDX] = s_user_paths[D_WIIUSER_IDX] + WII_WC24CONF_DIR DIR_SEP; - s_user_paths[F_WIISYSCONF_IDX] = s_user_paths[D_WIISYSCONF_IDX] + WII_SYSCONF; - break; - case D_USER_IDX: s_user_paths[D_GCUSER_IDX] = s_user_paths[D_USER_IDX] + GC_USER_DIR DIR_SEP; s_user_paths[D_WIIROOT_IDX] = s_user_paths[D_USER_IDX] + WII_USER_DIR; - s_user_paths[D_WIIUSER_IDX] = s_user_paths[D_WIIROOT_IDX] + DIR_SEP; s_user_paths[D_CONFIG_IDX] = s_user_paths[D_USER_IDX] + CONFIG_DIR DIR_SEP; s_user_paths[D_GAMESETTINGS_IDX] = s_user_paths[D_USER_IDX] + GAMESETTINGS_DIR DIR_SEP; s_user_paths[D_MAPS_IDX] = s_user_paths[D_USER_IDX] + MAPS_DIR DIR_SEP; @@ -762,14 +781,11 @@ static void RebuildUserDirectories(unsigned int dir_index) s_user_paths[D_DUMPDSP_IDX] = s_user_paths[D_DUMP_IDX] + DUMP_DSP_DIR DIR_SEP; s_user_paths[D_LOGS_IDX] = s_user_paths[D_USER_IDX] + LOGS_DIR DIR_SEP; s_user_paths[D_MAILLOGS_IDX] = s_user_paths[D_LOGS_IDX] + MAIL_LOGS_DIR DIR_SEP; - s_user_paths[D_WIISYSCONF_IDX] = s_user_paths[D_WIIUSER_IDX] + WII_SYSCONF_DIR DIR_SEP; - s_user_paths[D_WIIWC24_IDX] = s_user_paths[D_WIIUSER_IDX] + WII_WC24CONF_DIR DIR_SEP; s_user_paths[D_THEMES_IDX] = s_user_paths[D_USER_IDX] + THEMES_DIR DIR_SEP; s_user_paths[F_DOLPHINCONFIG_IDX] = s_user_paths[D_CONFIG_IDX] + DOLPHIN_CONFIG; s_user_paths[F_DEBUGGERCONFIG_IDX] = s_user_paths[D_CONFIG_IDX] + DEBUGGER_CONFIG; s_user_paths[F_LOGGERCONFIG_IDX] = s_user_paths[D_CONFIG_IDX] + LOGGER_CONFIG; s_user_paths[F_MAINLOG_IDX] = s_user_paths[D_LOGS_IDX] + MAIN_LOG; - s_user_paths[F_WIISYSCONF_IDX] = s_user_paths[D_WIISYSCONF_IDX] + WII_SYSCONF; s_user_paths[F_RAMDUMP_IDX] = s_user_paths[D_DUMP_IDX] + RAM_DUMP; s_user_paths[F_ARAMDUMP_IDX] = s_user_paths[D_DUMP_IDX] + ARAM_DUMP; s_user_paths[F_FAKEVMEMDUMP_IDX] = s_user_paths[D_DUMP_IDX] + FAKEVMEM_DUMP; diff --git a/Source/Core/Common/FileUtil.h b/Source/Core/Common/FileUtil.h index 3ad7b08d5b..1337ee1670 100644 --- a/Source/Core/Common/FileUtil.h +++ b/Source/Core/Common/FileUtil.h @@ -20,8 +20,8 @@ enum { D_USER_IDX, D_GCUSER_IDX, - D_WIIROOT_IDX, - D_WIIUSER_IDX, + D_WIIROOT_IDX, // always points to User/Wii or global user-configured directory + D_SESSION_WIIROOT_IDX, // may point to minimal temporary directory for determinism D_CONFIG_IDX, // global settings D_GAMESETTINGS_IDX, // user-specified settings which override both the global and the default settings (per game) D_MAPS_IDX, @@ -39,14 +39,11 @@ enum { D_LOAD_IDX, D_LOGS_IDX, D_MAILLOGS_IDX, - D_WIISYSCONF_IDX, - D_WIIWC24_IDX, D_THEMES_IDX, F_DOLPHINCONFIG_IDX, F_DEBUGGERCONFIG_IDX, F_LOGGERCONFIG_IDX, F_MAINLOG_IDX, - F_WIISYSCONF_IDX, F_RAMDUMP_IDX, F_ARAMDUMP_IDX, F_FAKEVMEMDUMP_IDX, @@ -122,6 +119,9 @@ void CopyDir(const std::string &source_path, const std::string &dest_path); // Set the current directory to given directory bool SetCurrentDir(const std::string &directory); +// Creates and returns the path to a new temporary directory. +std::string CreateTempDir(); + // Get a filename that can hopefully be atomically renamed to the given path. std::string GetTempFilenameForAtomicWrite(const std::string &path); diff --git a/Source/Core/Common/NandPaths.cpp b/Source/Core/Common/NandPaths.cpp index c695d0744a..6037137410 100644 --- a/Source/Core/Common/NandPaths.cpp +++ b/Source/Core/Common/NandPaths.cpp @@ -7,6 +7,7 @@ #include <string> #include <utility> +#include "Common/CommonPaths.h" #include "Common/CommonTypes.h" #include "Common/FileUtil.h" #include "Common/NandPaths.h" @@ -15,17 +16,55 @@ namespace Common { +static std::string s_temp_wii_root; + +void InitializeWiiRoot(bool use_dummy) +{ + ShutdownWiiRoot(); + if (use_dummy) + { + s_temp_wii_root = File::CreateTempDir(); + if (s_temp_wii_root.empty()) + { + ERROR_LOG(WII_IPC_FILEIO, "Could not create temporary directory"); + return; + } + File::CopyDir(File::GetSysDirectory() + WII_USER_DIR, s_temp_wii_root); + WARN_LOG(WII_IPC_FILEIO, "Using temporary directory %s for minimal Wii FS", s_temp_wii_root.c_str()); + static bool s_registered; + if (!s_registered) + { + s_registered = true; + atexit(ShutdownWiiRoot); + } + File::SetUserPath(D_SESSION_WIIROOT_IDX, s_temp_wii_root); + } + else + { + File::SetUserPath(D_SESSION_WIIROOT_IDX, File::GetUserPath(D_WIIROOT_IDX)); + } +} + +void ShutdownWiiRoot() +{ + if (!s_temp_wii_root.empty()) + { + File::DeleteDirRecursively(s_temp_wii_root); + s_temp_wii_root.clear(); + } +} + std::string GetTicketFileName(u64 _titleID) { - return StringFromFormat("%sticket/%08x/%08x.tik", - File::GetUserPath(D_WIIUSER_IDX).c_str(), + return StringFromFormat("%s/ticket/%08x/%08x.tik", + File::GetUserPath(D_SESSION_WIIROOT_IDX).c_str(), (u32)(_titleID >> 32), (u32)_titleID); } std::string GetTitleDataPath(u64 _titleID) { - return StringFromFormat("%stitle/%08x/%08x/data/", - File::GetUserPath(D_WIIUSER_IDX).c_str(), + return StringFromFormat("%s/title/%08x/%08x/data/", + File::GetUserPath(D_SESSION_WIIROOT_IDX).c_str(), (u32)(_titleID >> 32), (u32)_titleID); } @@ -35,8 +74,8 @@ std::string GetTMDFileName(u64 _titleID) } std::string GetTitleContentPath(u64 _titleID) { - return StringFromFormat("%stitle/%08x/%08x/content/", - File::GetUserPath(D_WIIUSER_IDX).c_str(), + return StringFromFormat("%s/title/%08x/%08x/content/", + File::GetUserPath(D_SESSION_WIIROOT_IDX).c_str(), (u32)(_titleID >> 32), (u32)_titleID); } @@ -89,8 +128,7 @@ void ReadReplacements(replace_v& replacements) { replacements.clear(); const std::string replace_fname = "/sys/replace"; - std::string filename(File::GetUserPath(D_WIIROOT_IDX)); - filename += replace_fname; + std::string filename = File::GetUserPath(D_SESSION_WIIROOT_IDX) + replace_fname; if (!File::Exists(filename)) CreateReplacementFile(filename); diff --git a/Source/Core/Common/NandPaths.h b/Source/Core/Common/NandPaths.h index 4adfed131f..6a79abf3bf 100644 --- a/Source/Core/Common/NandPaths.h +++ b/Source/Core/Common/NandPaths.h @@ -18,6 +18,9 @@ namespace Common typedef std::pair<char, std::string> replace_t; typedef std::vector<replace_t> replace_v; + void InitializeWiiRoot(bool use_temporary); + void ShutdownWiiRoot(); + std::string GetTicketFileName(u64 _titleID); std::string GetTMDFileName(u64 _titleID); std::string GetTitleDataPath(u64 _titleID); diff --git a/Source/Core/Common/SysConf.cpp b/Source/Core/Common/SysConf.cpp index 94124c4957..a0d3aa1f04 100644 --- a/Source/Core/Common/SysConf.cpp +++ b/Source/Core/Common/SysConf.cpp @@ -8,6 +8,7 @@ #include <string> #include <vector> +#include "Common/CommonPaths.h" #include "Common/CommonTypes.h" #include "Common/FileUtil.h" #include "Common/SysConf.h" @@ -15,8 +16,7 @@ SysConf::SysConf() : m_IsValid(false) { - m_FilenameDefault = File::GetUserPath(F_WIISYSCONF_IDX); - m_IsValid = LoadFromFile(m_FilenameDefault); + UpdateLocation(); } SysConf::~SysConf() @@ -409,7 +409,10 @@ void SysConf::UpdateLocation() // Clear the old filename and set the default filename to the new user path // So that it can be generated if the file does not exist in the new location m_Filename.clear(); - m_FilenameDefault = File::GetUserPath(F_WIISYSCONF_IDX); + // Note: We don't use the dummy Wii root here (if in use) because this is + // all tied up with the configuration code. In the future this should + // probably just be synced with the other settings. + m_FilenameDefault = File::GetUserPath(D_WIIROOT_IDX) + DIR_SEP WII_SYSCONF_DIR DIR_SEP WII_SYSCONF; Reload(); } |
