From 8a7cef304ae7dd5b795e7b2b1dfea3d5c1034453 Mon Sep 17 00:00:00 2001 From: crueter Date: Fri, 7 Nov 2025 00:26:12 -0500 Subject: [PATCH] cleanup Signed-off-by: crueter --- src/common/fs/ryujinx_compat.h | 14 ++--- src/common/fs/symlink.cpp | 26 ++++++--- src/common/fs/symlink.h | 2 +- src/core/hle/service/acc/profile_manager.cpp | 3 - src/qt_common/qt_string_lookup.h | 6 ++ src/qt_common/util/content.h | 7 +-- src/qt_common/util/fs.cpp | 7 +-- src/yuzu/migration_worker.cpp | 37 +++++++----- src/yuzu/migration_worker.h | 22 +++---- src/yuzu/user_data_migration.cpp | 61 +++++--------------- src/yuzu/user_data_migration.h | 1 - 11 files changed, 82 insertions(+), 104 deletions(-) diff --git a/src/common/fs/ryujinx_compat.h b/src/common/fs/ryujinx_compat.h index 50dbf8a7a4..d243337791 100644 --- a/src/common/fs/ryujinx_compat.h +++ b/src/common/fs/ryujinx_compat.h @@ -9,17 +9,15 @@ namespace Common::FS { -namespace fs = std::filesystem; - constexpr const char IMEN_MAGIC[4] = {0x49, 0x4d, 0x45, 0x4e}; constexpr const char IMKV_MAGIC[4] = {0x49, 0x4d, 0x4b, 0x56}; constexpr const u8 IMEN_SIZE = 0x8c; -fs::path GetKvdbPath(); -fs::path GetKvdbPath(const fs::path &path); -fs::path GetRyuPathFromSavePath(const fs::path &path); -fs::path GetRyuSavePath(const u64 &save_id); -fs::path GetRyuSavePath(const fs::path &path, const u64 &save_id); +std::filesystem::path GetKvdbPath(); +std::filesystem::path GetKvdbPath(const std::filesystem::path &path); +std::filesystem::path GetRyuPathFromSavePath(const std::filesystem::path &path); +std::filesystem::path GetRyuSavePath(const u64 &save_id); +std::filesystem::path GetRyuSavePath(const std::filesystem::path &path, const u64 &save_id); enum class IMENReadResult { Nonexistent, // ryujinx not found @@ -38,6 +36,6 @@ struct IMEN static_assert(sizeof(IMEN) == 0x10, "IMEN has incorrect size."); -IMENReadResult ReadKvdb(const fs::path &path, std::vector &imens); +IMENReadResult ReadKvdb(const std::filesystem::path &path, std::vector &imens); } // namespace Common::FS diff --git a/src/common/fs/symlink.cpp b/src/common/fs/symlink.cpp index c1c64ba158..01be5e180a 100644 --- a/src/common/fs/symlink.cpp +++ b/src/common/fs/symlink.cpp @@ -4,8 +4,8 @@ #include "symlink.h" #ifdef _WIN32 -#include #include +#include #endif #include @@ -22,18 +22,30 @@ namespace fs = std::filesystem; // because of their security policy. // I don't know what kind of drugs the Windows developers have been on since NT started. +// Microsoft still has not implemented any of this in their std::filesystem implemenation, +// which ALSO means that it DOES NOT FOLLOW ANY DIRECTORY JUNCTIONS... AT ALL. +// Nor does any of their command line utilities or APIs. So you're quite literally +// on your own. + namespace Common::FS { -bool CreateSymlink(const fs::path &from, const fs::path &to) +bool CreateSymlink(fs::path from, fs::path to) { -#ifdef _WIN32 - const std::string command = fmt::format("mklink /J \"{}\" \"{}\"", to.string(), from.string()); - return system(command.c_str()) == 0; -#else + from.make_preferred(); + to.make_preferred(); + std::error_code ec; fs::create_directory_symlink(from, to, ec); - return !ec; +#ifdef _WIN32 + if (ec) { + const std::string command = fmt::format("mklink /J \"{}\" \"{}\"", + to.string(), + from.string()); + return system(command.c_str()) == 0; + } #endif + + return !ec; } bool IsSymlink(const fs::path &path) diff --git a/src/common/fs/symlink.h b/src/common/fs/symlink.h index 3bfff95ebf..5c2a2f9950 100644 --- a/src/common/fs/symlink.h +++ b/src/common/fs/symlink.h @@ -6,7 +6,7 @@ #include namespace Common::FS { -bool CreateSymlink(const std::filesystem::path &from, const std::filesystem::path &to); +bool CreateSymlink(std::filesystem::__cxx11::path from, std::filesystem::__cxx11::path to); bool IsSymlink(const std::filesystem::path &path); } // namespace Common::FS diff --git a/src/core/hle/service/acc/profile_manager.cpp b/src/core/hle/service/acc/profile_manager.cpp index c0cc2986a7..5db00860ce 100644 --- a/src/core/hle/service/acc/profile_manager.cpp +++ b/src/core/hle/service/acc/profile_manager.cpp @@ -7,8 +7,6 @@ #include #include #include -#include -#include #include #include @@ -22,7 +20,6 @@ #include "common/string_util.h" #include "core/file_sys/savedata_factory.h" #include "core/hle/service/acc/profile_manager.h" -#include namespace Service::Account { diff --git a/src/qt_common/qt_string_lookup.h b/src/qt_common/qt_string_lookup.h index 42d71e6f9d..b33bd044c2 100644 --- a/src/qt_common/qt_string_lookup.h +++ b/src/qt_common/qt_string_lookup.h @@ -8,6 +8,12 @@ #include "frozen/map.h" #include "frozen/string.h" +/// Small helper to look up enums. +/// res = the result code +/// base = the base matching value in the StringKey table +#define LOOKUP_ENUM(res, base) StringLookup::Lookup( \ + static_cast((int) res + (int) StringLookup::base)) + namespace QtCommon::StringLookup { Q_NAMESPACE diff --git a/src/qt_common/util/content.h b/src/qt_common/util/content.h index 4102737fb1..6e8642083f 100644 --- a/src/qt_common/util/content.h +++ b/src/qt_common/util/content.h @@ -25,8 +25,7 @@ enum class FirmwareInstallResult { inline const QString GetFirmwareInstallResultString(FirmwareInstallResult result) { - return QtCommon::StringLookup::Lookup(static_cast( - (int) result + (int) QtCommon::StringLookup::FwInstallSuccess)); + return LOOKUP_ENUM(result, FwInstallSuccess); } /** @@ -36,9 +35,7 @@ inline const QString GetFirmwareInstallResultString(FirmwareInstallResult result */ inline const QString GetKeyInstallResultString(FirmwareManager::KeyInstallResult result) { - // this can probably be made into a common function of sorts - return QtCommon::StringLookup::Lookup(static_cast( - (int) result + (int) QtCommon::StringLookup::KeyInstallSuccess)); + return LOOKUP_ENUM(result, KeyInstallSuccess); } void InstallFirmware(const QString &location, bool recursive); diff --git a/src/qt_common/util/fs.cpp b/src/qt_common/util/fs.cpp index 06fcc5455a..c1465bea88 100644 --- a/src/qt_common/util/fs.cpp +++ b/src/qt_common/util/fs.cpp @@ -1,11 +1,10 @@ // SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project // SPDX-License-Identifier: GPL-3.0-or-later +#include #include -#include "common/fs/path_util.h" #include "common/fs/ryujinx_compat.h" #include "common/fs/symlink.h" -#include "frontend_common/data_manager.h" #include "fs.h" #include "qt_common/abstract/frontend.h" #include "qt_common/qt_string_lookup.h" @@ -132,7 +131,6 @@ const fs::path GetRyujinxSavePath(const fs::path &path_hint, const u64 &program_ Common::FS::IMENReadResult res = Common::FS::ReadKvdb(kvdb_path, imens); if (res == Common::FS::IMENReadResult::Success) { - // TODO: this can probably be done with std::find_if but I'm lazy for (const Common::FS::IMEN &imen : imens) { if (imen.title_id == program_id) return Common::FS::GetRyuSavePath(ryu_path, imen.save_id); @@ -143,8 +141,7 @@ const fs::path GetRyujinxSavePath(const fs::path &path_hint, const u64 &program_ StringLookup::Lookup(StringLookup::RyujinxNoSaveId).arg(program_id, 0, 16)); } else { // TODO: make this long thing a function or something - QString caption = StringLookup::Lookup( - static_cast((int) res + (int) StringLookup::KvdbNonexistent)); + QString caption = LOOKUP_ENUM(res, KvdbNonexistent); QtCommon::Frontend::Critical(tr("Could not find Ryujinx save data"), caption); } diff --git a/src/yuzu/migration_worker.cpp b/src/yuzu/migration_worker.cpp index 50b6d1ebd4..0149db4149 100644 --- a/src/yuzu/migration_worker.cpp +++ b/src/yuzu/migration_worker.cpp @@ -11,11 +11,11 @@ #include "common/fs/path_util.h" -MigrationWorker::MigrationWorker(const Emulator selected_legacy_emu_, +MigrationWorker::MigrationWorker(const Emulator selected_emu_, const bool clear_shader_cache_, const MigrationStrategy strategy_) : QObject() - , selected_legacy_emu(selected_legacy_emu_) + , selected_emu(selected_emu_) , clear_shader_cache(clear_shader_cache_) , strategy(strategy_) {} @@ -25,15 +25,20 @@ void MigrationWorker::process() namespace fs = std::filesystem; constexpr auto copy_options = fs::copy_options::update_existing | fs::copy_options::recursive; - const fs::path legacy_user_dir = selected_legacy_emu.get_user_dir(); - const fs::path legacy_config_dir = selected_legacy_emu.get_config_dir(); - const fs::path legacy_cache_dir = selected_legacy_emu.get_cache_dir(); + const fs::path legacy_user_dir = selected_emu.get_user_dir(); + const fs::path legacy_config_dir = selected_emu.get_config_dir(); + const fs::path legacy_cache_dir = selected_emu.get_cache_dir(); // TODO(crueter): Make these constexpr since they're defaulted - const fs::path eden_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::EdenDir); - const fs::path config_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir); - const fs::path cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir); - const fs::path shader_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); + fs::path eden_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::EdenDir); + fs::path config_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir); + fs::path cache_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::CacheDir); + fs::path shader_dir = Common::FS::GetEdenPath(Common::FS::EdenPath::ShaderDir); + + eden_dir.make_preferred(); + config_dir.make_preferred(); + cache_dir.make_preferred(); + shader_dir.make_preferred(); try { fs::remove_all(eden_dir); @@ -55,8 +60,8 @@ void MigrationWorker::process() std::exit(-1); } -// Windows doesn't need any more links, because cache and config -// are already children of the root directory + // Windows doesn't need any more links, because cache and config + // are already children of the root directory #ifndef WIN32 if (fs::is_directory(legacy_config_dir)) { Common::FS::CreateSymlink(legacy_config_dir, config_dir); @@ -69,7 +74,7 @@ void MigrationWorker::process() success_text.append(tr("\n\nNote that your configuration and data will be shared with %1.\n" "If this is not desirable, delete the following files:\n%2\n%3\n%4") - .arg(selected_legacy_emu.name(), + .arg(selected_emu.name(), QString::fromStdString(eden_dir.string()), QString::fromStdString(config_dir.string()), QString::fromStdString(cache_dir.string()))); @@ -79,8 +84,8 @@ void MigrationWorker::process() // Rename directories if deletion is requested (achieves the same result) fs::rename(legacy_user_dir, eden_dir); -// Windows doesn't need any more renames, because cache and config -// are already children of the root directory + // Windows doesn't need any more renames, because cache and config + // are already children of the root directory #ifndef WIN32 if (fs::is_directory(legacy_config_dir)) { fs::rename(legacy_config_dir, config_dir); @@ -96,8 +101,8 @@ void MigrationWorker::process() // Default behavior: copy fs::copy(legacy_user_dir, eden_dir, copy_options); -// Windows doesn't need any more copies, because cache and config -// are already children of the root directory + // Windows doesn't need any more copies, because cache and config + // are already children of the root directory #ifndef WIN32 if (fs::is_directory(legacy_config_dir)) { fs::copy(legacy_config_dir, config_dir, copy_options); diff --git a/src/yuzu/migration_worker.h b/src/yuzu/migration_worker.h index 2ff6e8c481..2db05570ea 100644 --- a/src/yuzu/migration_worker.h +++ b/src/yuzu/migration_worker.h @@ -7,14 +7,12 @@ #include #include "common/fs/path_util.h" -using namespace Common::FS; - typedef struct Emulator { const char *m_name; - EmuPath e_user_dir; - EmuPath e_config_dir; - EmuPath e_cache_dir; + Common::FS::EmuPath e_user_dir; + Common::FS::EmuPath e_config_dir; + Common::FS::EmuPath e_cache_dir; const std::string get_user_dir() const { return Common::FS::GetLegacyPath(e_user_dir).string(); @@ -35,11 +33,13 @@ typedef struct Emulator { } } Emulator; +#define STRUCT_EMU(name, enumName) Emulator{name, Common::FS::enumName##Dir, Common::FS::enumName##ConfigDir, Common::FS::enumName##CacheDir} + static constexpr std::array legacy_emus = { - Emulator{QT_TR_NOOP("Citron"), CitronDir, CitronConfigDir, CitronCacheDir}, - Emulator{QT_TR_NOOP("Sudachi"), SudachiDir, SudachiConfigDir, SudachiCacheDir}, - Emulator{QT_TR_NOOP("Suyu"), SuyuDir, SuyuConfigDir, SuyuCacheDir}, - Emulator{QT_TR_NOOP("Yuzu"), YuzuDir, YuzuConfigDir, YuzuCacheDir}, + STRUCT_EMU(QT_TR_NOOP("Citron"), Citron), + STRUCT_EMU(QT_TR_NOOP("Sudachi"), Sudachi), + STRUCT_EMU(QT_TR_NOOP("Suyu"), Suyu), + STRUCT_EMU(QT_TR_NOOP("Yuzu"), Yuzu), }; class MigrationWorker : public QObject @@ -52,7 +52,7 @@ public: Link, }; - MigrationWorker(const Emulator selected_legacy_emu, + MigrationWorker(const Emulator selected_emu, const bool clear_shader_cache, const MigrationStrategy strategy); @@ -64,7 +64,7 @@ signals: void error(const QString &error_message); private: - Emulator selected_legacy_emu; + Emulator selected_emu; bool clear_shader_cache; MigrationStrategy strategy; QString success_text = tr("Data was migrated successfully."); diff --git a/src/yuzu/user_data_migration.cpp b/src/yuzu/user_data_migration.cpp index a0243ec882..bc31c99e30 100644 --- a/src/yuzu/user_data_migration.cpp +++ b/src/yuzu/user_data_migration.cpp @@ -23,8 +23,6 @@ #include #include -namespace fs = std::filesystem; - UserDataMigrator::UserDataMigrator(QMainWindow *main_window) { // NOTE: Logging is not initialized yet, do not produce logs here. @@ -32,7 +30,7 @@ UserDataMigrator::UserDataMigrator(QMainWindow *main_window) // Check migration if config directory does not exist // TODO: ProfileManager messes with us a bit here, and force-creates the /nand/system/save/8000000000000010/su/avators/profiles.dat // file. Find a way to reorder operations and have it create after this guy runs. - if (!fs::is_directory(Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir))) { + if (!std::filesystem::is_directory(Common::FS::GetEdenPath(Common::FS::EdenPath::ConfigDir))) { ShowMigrationPrompt(main_window); } } @@ -40,23 +38,7 @@ UserDataMigrator::UserDataMigrator(QMainWindow *main_window) void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) { namespace fs = std::filesystem; - - // define strings here for easy access - - QString prompt_prefix_text = QtCommon::StringLookup::Lookup( - QtCommon::StringLookup::MigrationPromptPrefix); - QString migration_prompt_message = QtCommon::StringLookup::Lookup( - QtCommon::StringLookup::MigrationPrompt); - QString clear_shader_tooltip = QtCommon::StringLookup::Lookup( - QtCommon::StringLookup::MigrationTooltipClearShader); - QString keep_old_data_tooltip = QtCommon::StringLookup::Lookup( - QtCommon::StringLookup::MigrationTooltipKeepOld); - QString clear_old_data_tooltip = QtCommon::StringLookup::Lookup( - QtCommon::StringLookup::MigrationTooltipClearOld); - QString link_old_dir_tooltip = QtCommon::StringLookup::Lookup( - QtCommon::StringLookup::MigrationTooltipLinkOld); - - // actual migration code + using namespace QtCommon::StringLookup; MigrationDialog migration_prompt; migration_prompt.setWindowTitle(QObject::tr("Migration")); @@ -69,11 +51,11 @@ void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) #define BUTTON(clazz, name, text, tooltip, checkState) \ clazz *name = new clazz(&migration_prompt); \ name->setText(text); \ - name->setToolTip(tooltip); \ + name->setToolTip(Lookup(tooltip)); \ name->setChecked(checkState); \ migration_prompt.addBox(name); - BUTTON(QCheckBox, clear_shaders, QObject::tr("Clear Shader Cache"), clear_shader_tooltip, true) + BUTTON(QCheckBox, clear_shaders, QObject::tr("Clear Shader Cache"), MigrationTooltipClearShader, true) u32 id = 0; @@ -81,9 +63,9 @@ void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) BUTTON(QRadioButton, name, text, tooltip, checkState) \ group->addButton(name, ++id); - RADIO(keep_old, QObject::tr("Keep Old Data"), keep_old_data_tooltip, true) - RADIO(clear_old, QObject::tr("Clear Old Data"), clear_old_data_tooltip, false) - RADIO(link_old, QObject::tr("Link Old Directory"), link_old_dir_tooltip, false) + RADIO(keep_old, QObject::tr("Keep Old Data"), MigrationTooltipKeepOld, true) + RADIO(clear_old, QObject::tr("Clear Old Data"), MigrationTooltipClearOld, false) + RADIO(link_old, QObject::tr("Link Old Directory"), MigrationTooltipLinkOld, false) #undef RADIO #undef BUTTON @@ -101,7 +83,7 @@ void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) // makes my life easier qRegisterMetaType(); - QString prompt_text = prompt_prefix_text; + QString prompt_text = Lookup(MigrationPromptPrefix); // natural language processing is a nightmare for (const Emulator &emu : found) { @@ -114,7 +96,7 @@ void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) } prompt_text.append(QObject::tr("\n\n")); - prompt_text = prompt_text % QStringLiteral("\n\n") % migration_prompt_message; + prompt_text = prompt_text % QStringLiteral("\n\n") % Lookup(MigrationPrompt); migration_prompt.setText(prompt_text); migration_prompt.addButton(QObject::tr("No"), true); @@ -127,24 +109,12 @@ void UserDataMigrator::ShowMigrationPrompt(QMainWindow *main_window) return ShowMigrationCancelledMessage(main_window); } - MigrationWorker::MigrationStrategy strategy; - - switch (group->checkedId()) { - default: - [[fallthrough]]; - case 1: - strategy = MigrationWorker::MigrationStrategy::Copy; - break; - case 2: - strategy = MigrationWorker::MigrationStrategy::Move; - break; - case 3: - strategy = MigrationWorker::MigrationStrategy::Link; - break; - } + MigrationWorker::MigrationStrategy strategy = static_cast( + group->checkedId()); + + selected_emu = button->property("emulator").value(); MigrateUserData(main_window, - button->property("emulator").value(), clear_shaders->isChecked(), strategy); } @@ -161,12 +131,9 @@ void UserDataMigrator::ShowMigrationCancelledMessage(QMainWindow *main_window) } void UserDataMigrator::MigrateUserData(QMainWindow *main_window, - const Emulator selected_legacy_emu, const bool clear_shader_cache, const MigrationWorker::MigrationStrategy strategy) { - selected_emu = selected_legacy_emu; - // Create a dialog to let the user know it's migrating QProgressDialog *progress = new QProgressDialog(main_window); progress->setWindowTitle(QObject::tr("Migrating")); @@ -176,7 +143,7 @@ void UserDataMigrator::MigrateUserData(QMainWindow *main_window, progress->setWindowModality(Qt::WindowModality::ApplicationModal); QThread *thread = new QThread(main_window); - MigrationWorker *worker = new MigrationWorker(selected_legacy_emu, clear_shader_cache, strategy); + MigrationWorker *worker = new MigrationWorker(selected_emu, clear_shader_cache, strategy); worker->moveToThread(thread); thread->connect(thread, &QThread::started, worker, &MigrationWorker::process); diff --git a/src/yuzu/user_data_migration.h b/src/yuzu/user_data_migration.h index a18dd27ddb..1cfeda3bca 100644 --- a/src/yuzu/user_data_migration.h +++ b/src/yuzu/user_data_migration.h @@ -22,7 +22,6 @@ private: void ShowMigrationPrompt(QMainWindow* main_window); void ShowMigrationCancelledMessage(QMainWindow* main_window); void MigrateUserData(QMainWindow* main_window, - const Emulator selected_legacy_emu, const bool clear_shader_cache, const MigrationWorker::MigrationStrategy strategy); };