summaryrefslogtreecommitdiff
path: root/Source/Core/Common
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Core/Common')
-rw-r--r--Source/Core/Common/FileUtil.cpp38
-rw-r--r--Source/Core/Common/FileUtil.h10
-rw-r--r--Source/Core/Common/NandPaths.cpp54
-rw-r--r--Source/Core/Common/NandPaths.h3
-rw-r--r--Source/Core/Common/SysConf.cpp9
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();
}