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;