Merge pull request #8672 from JosJuice/wii-setting-backup
Back up Wii setting.txt and SYSCONF while emulating
This commit is contained in:
commit
0461170363
|
@ -322,6 +322,13 @@ bool SplitPath(std::string_view full_path, std::string* path, std::string* filen
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string PathToFileName(std::string_view path)
|
||||||
|
{
|
||||||
|
std::string file_name, extension;
|
||||||
|
SplitPath(path, nullptr, &file_name, &extension);
|
||||||
|
return file_name + extension;
|
||||||
|
}
|
||||||
|
|
||||||
void BuildCompleteFilename(std::string& complete_filename, std::string_view path,
|
void BuildCompleteFilename(std::string& complete_filename, std::string_view path,
|
||||||
std::string_view filename)
|
std::string_view filename)
|
||||||
{
|
{
|
||||||
|
|
|
@ -159,6 +159,8 @@ std::string JoinStrings(const std::vector<std::string>& strings, const std::stri
|
||||||
bool SplitPath(std::string_view full_path, std::string* path, std::string* filename,
|
bool SplitPath(std::string_view full_path, std::string* path, std::string* filename,
|
||||||
std::string* extension);
|
std::string* extension);
|
||||||
|
|
||||||
|
std::string PathToFileName(std::string_view path);
|
||||||
|
|
||||||
void BuildCompleteFilename(std::string& complete_filename, std::string_view path,
|
void BuildCompleteFilename(std::string& complete_filename, std::string_view path,
|
||||||
std::string_view filename);
|
std::string_view filename);
|
||||||
|
|
||||||
|
|
|
@ -45,6 +45,7 @@
|
||||||
#include "Core/Movie.h"
|
#include "Core/Movie.h"
|
||||||
#include "Core/NetPlayProto.h"
|
#include "Core/NetPlayProto.h"
|
||||||
#include "Core/PowerPC/PowerPC.h"
|
#include "Core/PowerPC/PowerPC.h"
|
||||||
|
#include "Core/WiiRoot.h"
|
||||||
|
|
||||||
#include "DiscIO/Enums.h"
|
#include "DiscIO/Enums.h"
|
||||||
|
|
||||||
|
@ -439,7 +440,10 @@ bool BootCore(std::unique_ptr<BootParameters> boot, const WindowSystemInfo& wsi)
|
||||||
|
|
||||||
// Ensure any new settings are written to the SYSCONF
|
// Ensure any new settings are written to the SYSCONF
|
||||||
if (StartUp.bWii)
|
if (StartUp.bWii)
|
||||||
|
{
|
||||||
|
Core::BackupWiiSettings();
|
||||||
ConfigLoaders::SaveToSYSCONF(Config::LayerType::Meta);
|
ConfigLoaders::SaveToSYSCONF(Config::LayerType::Meta);
|
||||||
|
}
|
||||||
|
|
||||||
const bool load_ipl = !StartUp.bWii && !StartUp.bHLE_BS2 &&
|
const bool load_ipl = !StartUp.bWii && !StartUp.bHLE_BS2 &&
|
||||||
std::holds_alternative<BootParameters::Disc>(boot->parameters);
|
std::holds_alternative<BootParameters::Disc>(boot->parameters);
|
||||||
|
@ -487,6 +491,7 @@ static void RestoreSYSCONF()
|
||||||
|
|
||||||
void RestoreConfig()
|
void RestoreConfig()
|
||||||
{
|
{
|
||||||
|
Core::RestoreWiiSettings(Core::RestoreReason::EmulationEnd);
|
||||||
RestoreSYSCONF();
|
RestoreSYSCONF();
|
||||||
Config::ClearCurrentRunLayer();
|
Config::ClearCurrentRunLayer();
|
||||||
Config::RemoveLayer(Config::LayerType::Movie);
|
Config::RemoveLayer(Config::LayerType::Movie);
|
||||||
|
|
|
@ -16,6 +16,8 @@
|
||||||
#include "Common/FileUtil.h"
|
#include "Common/FileUtil.h"
|
||||||
#include "Common/Logging/Log.h"
|
#include "Common/Logging/Log.h"
|
||||||
#include "Common/NandPaths.h"
|
#include "Common/NandPaths.h"
|
||||||
|
#include "Common/StringUtil.h"
|
||||||
|
#include "Core/CommonTitles.h"
|
||||||
#include "Core/ConfigManager.h"
|
#include "Core/ConfigManager.h"
|
||||||
#include "Core/HW/WiiSave.h"
|
#include "Core/HW/WiiSave.h"
|
||||||
#include "Core/IOS/ES/ES.h"
|
#include "Core/IOS/ES/ES.h"
|
||||||
|
@ -32,6 +34,38 @@ namespace FS = IOS::HLE::FS;
|
||||||
|
|
||||||
static std::string s_temp_wii_root;
|
static std::string s_temp_wii_root;
|
||||||
|
|
||||||
|
static bool CopyBackupFile(const std::string& path_from, const std::string& path_to)
|
||||||
|
{
|
||||||
|
if (!File::Exists(path_from))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return File::Copy(path_from, path_to);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void DeleteBackupFile(const std::string& file_name)
|
||||||
|
{
|
||||||
|
File::Delete(File::GetUserPath(D_BACKUP_IDX) + DIR_SEP + file_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void BackupFile(const std::string& path_in_nand)
|
||||||
|
{
|
||||||
|
const std::string file_name = PathToFileName(path_in_nand);
|
||||||
|
const std::string original_path = File::GetUserPath(D_WIIROOT_IDX) + DIR_SEP + path_in_nand;
|
||||||
|
const std::string backup_path = File::GetUserPath(D_BACKUP_IDX) + DIR_SEP + file_name;
|
||||||
|
|
||||||
|
CopyBackupFile(original_path, backup_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void RestoreFile(const std::string& path_in_nand)
|
||||||
|
{
|
||||||
|
const std::string file_name = PathToFileName(path_in_nand);
|
||||||
|
const std::string original_path = File::GetUserPath(D_WIIROOT_IDX) + DIR_SEP + path_in_nand;
|
||||||
|
const std::string backup_path = File::GetUserPath(D_BACKUP_IDX) + DIR_SEP + file_name;
|
||||||
|
|
||||||
|
if (CopyBackupFile(backup_path, original_path))
|
||||||
|
DeleteBackupFile(file_name);
|
||||||
|
}
|
||||||
|
|
||||||
static void CopySave(FS::FileSystem* source, FS::FileSystem* dest, const u64 title_id)
|
static void CopySave(FS::FileSystem* source, FS::FileSystem* dest, const u64 title_id)
|
||||||
{
|
{
|
||||||
dest->CreateFullPath(IOS::PID_KERNEL, IOS::PID_KERNEL, Common::GetTitleDataPath(title_id) + '/',
|
dest->CreateFullPath(IOS::PID_KERNEL, IOS::PID_KERNEL, Common::GetTitleDataPath(title_id) + '/',
|
||||||
|
@ -173,6 +207,29 @@ void ShutdownWiiRoot()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BackupWiiSettings()
|
||||||
|
{
|
||||||
|
// Back up files which Dolphin can modify at boot, so that we can preserve the original contents.
|
||||||
|
// For SYSCONF, the backup is only needed in case Dolphin crashes or otherwise exists unexpectedly
|
||||||
|
// during emulation, since the config system will restore the SYSCONF settings at emulation end.
|
||||||
|
// For setting.txt, there is no other code that restores the original values for us.
|
||||||
|
|
||||||
|
BackupFile(Common::GetTitleDataPath(Titles::SYSTEM_MENU) + "/" WII_SETTING);
|
||||||
|
BackupFile("/shared2/sys/SYSCONF");
|
||||||
|
}
|
||||||
|
|
||||||
|
void RestoreWiiSettings(RestoreReason reason)
|
||||||
|
{
|
||||||
|
RestoreFile(Common::GetTitleDataPath(Titles::SYSTEM_MENU) + "/" WII_SETTING);
|
||||||
|
|
||||||
|
// We must not restore the SYSCONF backup when ending emulation cleanly, since the user may have
|
||||||
|
// edited the SYSCONF file in the NAND using the emulated software (e.g. the Wii Menu settings).
|
||||||
|
if (reason == RestoreReason::CrashRecovery)
|
||||||
|
RestoreFile("/shared2/sys/SYSCONF");
|
||||||
|
else
|
||||||
|
DeleteBackupFile("SYSCONF");
|
||||||
|
}
|
||||||
|
|
||||||
/// Copy a directory from host_source_path (on the host FS) to nand_target_path on the NAND.
|
/// Copy a directory from host_source_path (on the host FS) to nand_target_path on the NAND.
|
||||||
///
|
///
|
||||||
/// Both paths should not have trailing slashes. To specify the NAND root, use "".
|
/// Both paths should not have trailing slashes. To specify the NAND root, use "".
|
||||||
|
|
|
@ -6,9 +6,18 @@
|
||||||
|
|
||||||
namespace Core
|
namespace Core
|
||||||
{
|
{
|
||||||
|
enum class RestoreReason
|
||||||
|
{
|
||||||
|
EmulationEnd,
|
||||||
|
CrashRecovery,
|
||||||
|
};
|
||||||
|
|
||||||
void InitializeWiiRoot(bool use_temporary);
|
void InitializeWiiRoot(bool use_temporary);
|
||||||
void ShutdownWiiRoot();
|
void ShutdownWiiRoot();
|
||||||
|
|
||||||
|
void BackupWiiSettings();
|
||||||
|
void RestoreWiiSettings(RestoreReason reason);
|
||||||
|
|
||||||
// Initialize or clean up the filesystem contents.
|
// Initialize or clean up the filesystem contents.
|
||||||
void InitializeWiiFileSystemContents();
|
void InitializeWiiFileSystemContents();
|
||||||
void CleanUpWiiFileSystemContents();
|
void CleanUpWiiFileSystemContents();
|
||||||
|
|
|
@ -119,12 +119,9 @@ void InterfacePane::CreateUI()
|
||||||
// List avalable themes
|
// List avalable themes
|
||||||
auto theme_search_results =
|
auto theme_search_results =
|
||||||
Common::DoFileSearch({File::GetUserPath(D_THEMES_IDX), File::GetSysDirectory() + THEMES_DIR});
|
Common::DoFileSearch({File::GetUserPath(D_THEMES_IDX), File::GetSysDirectory() + THEMES_DIR});
|
||||||
for (const std::string& filename : theme_search_results)
|
for (const std::string& path : theme_search_results)
|
||||||
{
|
{
|
||||||
std::string name, ext;
|
const QString qt_name = QString::fromStdString(PathToFileName(path));
|
||||||
SplitPath(filename, nullptr, &name, &ext);
|
|
||||||
name += ext;
|
|
||||||
QString qt_name = QString::fromStdString(name);
|
|
||||||
m_combobox_theme->addItem(qt_name);
|
m_combobox_theme->addItem(qt_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,12 +134,12 @@ void InterfacePane::CreateUI()
|
||||||
|
|
||||||
m_combobox_userstyle->addItem(tr("(None)"), QString{});
|
m_combobox_userstyle->addItem(tr("(None)"), QString{});
|
||||||
|
|
||||||
for (const std::string& filename : userstyle_search_results)
|
for (const std::string& path : userstyle_search_results)
|
||||||
{
|
{
|
||||||
std::string name, ext;
|
std::string name;
|
||||||
SplitPath(filename, nullptr, &name, &ext);
|
SplitPath(path, nullptr, &name, nullptr);
|
||||||
QString qt_name = QString::fromStdString(name);
|
const QString qt_name = QString::fromStdString(name);
|
||||||
m_combobox_userstyle->addItem(qt_name, QString::fromStdString(filename));
|
m_combobox_userstyle->addItem(qt_name, QString::fromStdString(path));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checkboxes
|
// Checkboxes
|
||||||
|
|
|
@ -97,11 +97,9 @@ GameFile::GameFile() = default;
|
||||||
|
|
||||||
GameFile::GameFile(std::string path) : m_file_path(std::move(path))
|
GameFile::GameFile(std::string path) : m_file_path(std::move(path))
|
||||||
{
|
{
|
||||||
{
|
m_file_name = PathToFileName(m_file_path);
|
||||||
std::string name, extension;
|
|
||||||
SplitPath(m_file_path, nullptr, &name, &extension);
|
|
||||||
m_file_name = name + extension;
|
|
||||||
|
|
||||||
|
{
|
||||||
std::unique_ptr<DiscIO::Volume> volume(DiscIO::CreateVolume(m_file_path));
|
std::unique_ptr<DiscIO::Volume> volume(DiscIO::CreateVolume(m_file_path));
|
||||||
if (volume != nullptr)
|
if (volume != nullptr)
|
||||||
{
|
{
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "Core/HW/Wiimote.h"
|
#include "Core/HW/Wiimote.h"
|
||||||
#include "Core/IOS/IOS.h"
|
#include "Core/IOS/IOS.h"
|
||||||
#include "Core/IOS/STM/STM.h"
|
#include "Core/IOS/STM/STM.h"
|
||||||
|
#include "Core/WiiRoot.h"
|
||||||
|
|
||||||
#include "InputCommon/GCAdapter.h"
|
#include "InputCommon/GCAdapter.h"
|
||||||
|
|
||||||
|
@ -88,6 +89,8 @@ static void InitCustomPaths()
|
||||||
|
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
|
Core::RestoreWiiSettings(Core::RestoreReason::CrashRecovery);
|
||||||
|
|
||||||
Config::Init();
|
Config::Init();
|
||||||
Config::AddConfigChangedCallback(InitCustomPaths);
|
Config::AddConfigChangedCallback(InitCustomPaths);
|
||||||
Config::AddLayer(ConfigLoaders::GenerateBaseConfigLoader());
|
Config::AddLayer(ConfigLoaders::GenerateBaseConfigLoader());
|
||||||
|
|
Loading…
Reference in New Issue