mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2026-01-18 09:53:18 -03:00
It was discovered that some titles rely on filesystem metadata to work properly. Currently, in master they either simply won't find their save files (for example Bolt) or will complain about the Wii system memory being corrupted (on first use or every time depending on the title). In order to even be able to keep track of file metadata, we first need to eliminate all direct accesses to the NAND and make all kinds of operations go through the filesystem code added in PR 6421. This commit starts the migration process by making SysConf use the new FS interface.
107 lines
3.3 KiB
C++
107 lines
3.3 KiB
C++
// Copyright 2016 Dolphin Emulator Project
|
|
// Licensed under GPLv2+
|
|
// Refer to the license.txt file included.
|
|
|
|
#include "Core/WiiRoot.h"
|
|
|
|
#include <string>
|
|
|
|
#include "Common/CommonPaths.h"
|
|
#include "Common/FileUtil.h"
|
|
#include "Common/Logging/Log.h"
|
|
#include "Common/NandPaths.h"
|
|
#include "Common/StringUtil.h"
|
|
#include "Common/SysConf.h"
|
|
#include "Core/ConfigManager.h"
|
|
#include "Core/IOS/IOS.h"
|
|
#include "Core/Movie.h"
|
|
#include "Core/NetPlayClient.h"
|
|
|
|
namespace Core
|
|
{
|
|
static std::string s_temp_wii_root;
|
|
|
|
static void InitializeDeterministicWiiSaves()
|
|
{
|
|
std::string save_path =
|
|
Common::GetTitleDataPath(SConfig::GetInstance().GetTitleID(), Common::FROM_SESSION_ROOT);
|
|
std::string user_save_path =
|
|
Common::GetTitleDataPath(SConfig::GetInstance().GetTitleID(), Common::FROM_CONFIGURED_ROOT);
|
|
if (Movie::IsRecordingInput())
|
|
{
|
|
if (NetPlay::IsNetPlayRunning() && !SConfig::GetInstance().bCopyWiiSaveNetplay)
|
|
{
|
|
Movie::SetClearSave(true);
|
|
}
|
|
else
|
|
{
|
|
// TODO: Check for the actual save data
|
|
Movie::SetClearSave(!File::Exists(user_save_path + "banner.bin"));
|
|
}
|
|
}
|
|
|
|
if ((NetPlay::IsNetPlayRunning() && SConfig::GetInstance().bCopyWiiSaveNetplay) ||
|
|
(Movie::IsMovieActive() && !Movie::IsStartingFromClearSave()))
|
|
{
|
|
// Copy the current user's save to the Blank NAND
|
|
if (File::Exists(user_save_path + "banner.bin"))
|
|
{
|
|
File::CopyDir(user_save_path, save_path);
|
|
}
|
|
}
|
|
}
|
|
|
|
void InitializeWiiRoot(bool use_temporary)
|
|
{
|
|
if (use_temporary)
|
|
{
|
|
s_temp_wii_root = File::CreateTempDir();
|
|
if (s_temp_wii_root.empty())
|
|
{
|
|
ERROR_LOG(IOS_FS, "Could not create temporary directory");
|
|
return;
|
|
}
|
|
File::CopyDir(File::GetSysDirectory() + WII_USER_DIR, s_temp_wii_root);
|
|
WARN_LOG(IOS_FS, "Using temporary directory %s for minimal Wii FS", s_temp_wii_root.c_str());
|
|
File::SetUserPath(D_SESSION_WIIROOT_IDX, s_temp_wii_root);
|
|
// Generate a SYSCONF with default settings for the temporary Wii NAND.
|
|
SysConf sysconf{IOS::HLE::Kernel{}.GetFS()};
|
|
sysconf.Save();
|
|
|
|
InitializeDeterministicWiiSaves();
|
|
}
|
|
else
|
|
{
|
|
File::SetUserPath(D_SESSION_WIIROOT_IDX, File::GetUserPath(D_WIIROOT_IDX));
|
|
}
|
|
}
|
|
|
|
void ShutdownWiiRoot()
|
|
{
|
|
if (!s_temp_wii_root.empty())
|
|
{
|
|
const u64 title_id = SConfig::GetInstance().GetTitleID();
|
|
std::string save_path = Common::GetTitleDataPath(title_id, Common::FROM_SESSION_ROOT);
|
|
std::string user_save_path = Common::GetTitleDataPath(title_id, Common::FROM_CONFIGURED_ROOT);
|
|
std::string user_backup_path = File::GetUserPath(D_BACKUP_IDX) +
|
|
StringFromFormat("%08x/%08x/", static_cast<u32>(title_id >> 32),
|
|
static_cast<u32>(title_id));
|
|
if (File::Exists(save_path + "banner.bin") && SConfig::GetInstance().bEnableMemcardSdWriting)
|
|
{
|
|
// Backup the existing save just in case it's still needed.
|
|
if (File::Exists(user_save_path + "banner.bin"))
|
|
{
|
|
if (File::Exists(user_backup_path))
|
|
File::DeleteDirRecursively(user_backup_path);
|
|
File::CopyDir(user_save_path, user_backup_path);
|
|
File::DeleteDirRecursively(user_save_path);
|
|
}
|
|
File::CopyDir(save_path, user_save_path);
|
|
File::DeleteDirRecursively(save_path);
|
|
}
|
|
File::DeleteDirRecursively(s_temp_wii_root);
|
|
s_temp_wii_root.clear();
|
|
}
|
|
}
|
|
}
|