diff --git a/sphaira/CMakeLists.txt b/sphaira/CMakeLists.txt index 95b32c5..2f43ef2 100644 --- a/sphaira/CMakeLists.txt +++ b/sphaira/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.13) -set(sphaira_VERSION 0.10.1) +set(sphaira_VERSION 0.10.2) project(sphaira VERSION ${sphaira_VERSION} diff --git a/sphaira/include/app.hpp b/sphaira/include/app.hpp index 6528963..5f7b855 100644 --- a/sphaira/include/app.hpp +++ b/sphaira/include/app.hpp @@ -127,6 +127,10 @@ public: void ScanThemes(const std::string& path); void ScanThemeEntries(); + // helper that converts 1.2.3 to a u32 used for comparisons. + static auto GetVersionFromString(const char* str) -> u32; + static auto IsVersionNewer(const char* current, const char* new_version) -> u32; + static auto IsApplication() -> bool { const auto type = appletGetAppletType(); return type == AppletType_Application || type == AppletType_SystemApplication; diff --git a/sphaira/source/app.cpp b/sphaira/source/app.cpp index 6fdbde3..cc0576a 100644 --- a/sphaira/source/app.cpp +++ b/sphaira/source/app.cpp @@ -719,7 +719,7 @@ void App::SetReplaceHbmenuEnable(bool enable) { } if (R_SUCCEEDED(rc) && !std::strcmp(sphaira_nacp.lang[0].name, "sphaira")) { - if (std::strcmp(sphaira_nacp.display_version, hbmenu_nacp.display_version) < 0) { + if (IsVersionNewer(sphaira_nacp.display_version, hbmenu_nacp.display_version)) { if (R_FAILED(rc = fs.copy_entire_file(sphaira_path, "/hbmenu.nro"))) { log_write("failed to copy entire file: %s 0x%X module: %u desc: %u\n", sphaira_path.s, rc, R_MODULE(rc), R_DESCRIPTION(rc)); } else { @@ -1744,7 +1744,7 @@ App::~App() { // found sphaira, now lets get compare version if (R_SUCCEEDED(rc) && !std::strcmp(sphaira_nacp.lang[0].name, "sphaira")) { - if (std::strcmp(hbmenu_nacp.display_version, sphaira_nacp.display_version) < 0) { + if (IsVersionNewer(hbmenu_nacp.display_version, sphaira_nacp.display_version)) { if (R_FAILED(rc = fs.copy_entire_file(GetExePath(), sphaira_path))) { log_write("failed to copy entire file: %s 0x%X module: %u desc: %u\n", sphaira_path.s, rc, R_MODULE(rc), R_DESCRIPTION(rc)); } else { @@ -1782,6 +1782,16 @@ App::~App() { ini_putl("paths", "timestamp", timestamp, App::CONFIG_PATH); } +auto App::GetVersionFromString(const char* str) -> u32 { + u32 major{}, minor{}, macro{}; + std::sscanf(str, "%u.%u.%u", &major, &minor, ¯o); + return MAKEHOSVERSION(major, minor, macro); +} + +auto App::IsVersionNewer(const char* current, const char* new_version) -> u32 { + return GetVersionFromString(current) < GetVersionFromString(new_version); +} + void App::createFramebufferResources() { this->swapchain = nullptr; diff --git a/sphaira/source/ui/menus/main_menu.cpp b/sphaira/source/ui/menus/main_menu.cpp index 5bb2498..5d97d1c 100644 --- a/sphaira/source/ui/menus/main_menu.cpp +++ b/sphaira/source/ui/menus/main_menu.cpp @@ -212,7 +212,7 @@ MainMenu::MainMenu() { const auto version = yyjson_get_str(tag_key); R_UNLESS(version, false); - if (!std::strcmp(APP_VERSION, version)) { + if (!App::IsVersionNewer(APP_VERSION, version)) { m_update_state = UpdateState::None; return true; }