From db23f072a207b66009bb8936d129e1a7a8ac5061 Mon Sep 17 00:00:00 2001 From: ITotalJustice <47043333+ITotalJustice@users.noreply.github.com> Date: Sun, 11 May 2025 20:14:34 +0100 Subject: [PATCH] add sysmmc / emummc install enable options. allows the user to enable installs for one config and disable it for the other. by default, it will load the install option found in the config, if found. otherwise, it will load from the new config option. --- sphaira/include/app.hpp | 23 +++++++++++++++++++++-- sphaira/include/option.hpp | 4 ++++ sphaira/source/app.cpp | 30 +++++++++++++++++++++++++----- sphaira/source/option.cpp | 22 ++++++++++++++++++---- 4 files changed, 68 insertions(+), 11 deletions(-) diff --git a/sphaira/include/app.hpp b/sphaira/include/app.hpp index f0a260c..29fe57d 100644 --- a/sphaira/include/app.hpp +++ b/sphaira/include/app.hpp @@ -77,6 +77,8 @@ public: static auto GetLogEnable() -> bool; static auto GetReplaceHbmenuEnable() -> bool; static auto GetInstallEnable() -> bool; + static auto GetInstallSysmmcEnable() -> bool; + static auto GetInstallEmummcEnable() -> bool; static auto GetInstallSdEnable() -> bool; static auto GetInstallPrompt() -> bool; static auto GetThemeMusicEnable() -> bool; @@ -89,7 +91,8 @@ public: static void SetNxlinkEnable(bool enable); static void SetLogEnable(bool enable); static void SetReplaceHbmenuEnable(bool enable); - static void SetInstallEnable(bool enable); + static void SetInstallSysmmcEnable(bool enable); + static void SetInstallEmummcEnable(bool enable); static void SetInstallSdEnable(bool enable); static void SetInstallPrompt(bool enable); static void SetThemeMusicEnable(bool enable); @@ -142,6 +145,21 @@ public: return R_SUCCEEDED(pmdmntGetApplicationProcessId(&pid)); } + static auto IsEmunand() -> bool { + struct EmummcPaths { + char unk[0x80]; + char nintendo[0x80]; + } paths{}; + + SecmonArgs args{}; + args.X[0] = 0xF0000404; /* smcAmsGetEmunandConfig */ + args.X[1] = 0; /* EXO_EMUMMC_MMC_NAND*/ + args.X[2] = (u64)&paths; /* out path */ + svcCallSecureMonitor(&args); + + return (paths.unk[0] != '\0') || (paths.nintendo[0] != '\0'); + } + // private: static constexpr inline auto CONFIG_PATH = "/config/sphaira/config.ini"; @@ -187,7 +205,8 @@ public: option::OptionString m_right_side_menu{INI_SECTION, "right_side_menu", "Appstore"}; // install options - option::OptionBool m_install{INI_SECTION, "install", false}; + option::OptionBool m_install_sysmmc{INI_SECTION, "install_sysmmc", false}; + option::OptionBool m_install_emummc{INI_SECTION, "install_emummc", false}; option::OptionBool m_install_sd{INI_SECTION, "install_sd", true}; option::OptionLong m_install_prompt{INI_SECTION, "install_prompt", true}; option::OptionLong m_boost_mode{INI_SECTION, "boost_mode", false}; diff --git a/sphaira/include/option.hpp b/sphaira/include/option.hpp index cebab9a..1625176 100644 --- a/sphaira/include/option.hpp +++ b/sphaira/include/option.hpp @@ -14,8 +14,12 @@ struct OptionBase { {} auto Get() -> T; + auto GetOr(const char* name) -> T; void Set(T value); +private: + auto GetInternal(const char* name) -> T; + private: const std::string m_section; const std::string m_name; diff --git a/sphaira/source/app.cpp b/sphaira/source/app.cpp index 44e04bf..65fe280 100644 --- a/sphaira/source/app.cpp +++ b/sphaira/source/app.cpp @@ -598,7 +598,19 @@ auto App::GetReplaceHbmenuEnable() -> bool { } auto App::GetInstallEnable() -> bool { - return g_app->m_install.Get(); + if (IsEmunand()) { + return GetInstallEmummcEnable(); + } else { + return GetInstallSysmmcEnable(); + } +} + +auto App::GetInstallSysmmcEnable() -> bool { + return g_app->m_install_sysmmc.GetOr("install"); +} + +auto App::GetInstallEmummcEnable() -> bool { + return g_app->m_install_emummc.GetOr("install"); } auto App::GetInstallSdEnable() -> bool { @@ -754,8 +766,12 @@ void App::SetReplaceHbmenuEnable(bool enable) { } } -void App::SetInstallEnable(bool enable) { - g_app->m_install.Set(enable); +void App::SetInstallSysmmcEnable(bool enable) { + g_app->m_install_sysmmc.Set(enable); +} + +void App::SetInstallEmummcEnable(bool enable) { + g_app->m_install_emummc.Set(enable); } void App::SetInstallSdEnable(bool enable) { @@ -1566,8 +1582,12 @@ void App::DisplayInstallOptions(bool left_side) { install_items.push_back("System memory"_i18n); install_items.push_back("microSD card"_i18n); - options->Add(std::make_shared("Enable"_i18n, App::GetApp()->m_install.Get(), [](bool& enable){ - App::GetApp()->m_install.Set(enable); + options->Add(std::make_shared("Enable sysmmc"_i18n, App::GetInstallSysmmcEnable(), [](bool& enable){ + App::SetInstallSysmmcEnable(enable); + })); + + options->Add(std::make_shared("Enable emummc"_i18n, App::GetInstallEmummcEnable(), [](bool& enable){ + App::SetInstallEmummcEnable(enable); })); options->Add(std::make_shared("Show install warning"_i18n, App::GetApp()->m_install_prompt.Get(), [](bool& enable){ diff --git a/sphaira/source/option.cpp b/sphaira/source/option.cpp index 6f7261e..2286c84 100644 --- a/sphaira/source/option.cpp +++ b/sphaira/source/option.cpp @@ -6,21 +6,35 @@ namespace sphaira::option { template -auto OptionBase::Get() -> T { +auto OptionBase::GetInternal(const char* name) -> T { if (!m_value.has_value()) { if constexpr(std::is_same_v) { - m_value = ini_getbool(m_section.c_str(), m_name.c_str(), m_default_value, App::CONFIG_PATH); + m_value = ini_getbool(m_section.c_str(), name, m_default_value, App::CONFIG_PATH); } else if constexpr(std::is_same_v) { - m_value = ini_getl(m_section.c_str(), m_name.c_str(), m_default_value, App::CONFIG_PATH); + m_value = ini_getl(m_section.c_str(), name, m_default_value, App::CONFIG_PATH); } else if constexpr(std::is_same_v) { char buf[FS_MAX_PATH]; - ini_gets(m_section.c_str(), m_name.c_str(), m_default_value.c_str(), buf, sizeof(buf), App::CONFIG_PATH); + ini_gets(m_section.c_str(), name, m_default_value.c_str(), buf, sizeof(buf), App::CONFIG_PATH); m_value = buf; } } return m_value.value(); } +template +auto OptionBase::Get() -> T { + return GetInternal(m_name.c_str()); +} + +template +auto OptionBase::GetOr(const char* name) -> T { + if (ini_haskey(m_section.c_str(), m_name.c_str(), App::CONFIG_PATH)) { + return Get(); + } else { + return GetInternal(name); + } +} + template void OptionBase::Set(T value) { m_value = value;