diff --git a/.gitignore b/.gitignore index fb68992..4f32723 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ sysapp.cbp .idea/ cmake-build-debug/ CMakeLists.txt +*.zip diff --git a/Dockerfile b/Dockerfile index 4746656..b41810a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM ghcr.io/wiiu-env/devkitppc:20230621 +FROM ghcr.io/wiiu-env/devkitppc:20231112 -COPY --from=ghcr.io/wiiu-env/wiiupluginsystem:20230719 /artifacts $DEVKITPRO +COPY --from=ghcr.io/wiiu-env/wiiupluginsystem:0.8.0-dev-20231221-ca17105 /artifacts $DEVKITPRO COPY --from=ghcr.io/wiiu-env/libnotifications:20230621 /artifacts $DEVKITPRO COPY --from=ghcr.io/wiiu-env/librpxloader:20230621 /artifacts $DEVKITPRO COPY --from=ghcr.io/wiiu-env/libcurlwrapper:20230715 /artifacts $DEVKITPRO diff --git a/src/Hints.cpp b/src/Hints.cpp index 137baa3..39fe5d3 100644 --- a/src/Hints.cpp +++ b/src/Hints.cpp @@ -5,11 +5,15 @@ #include #include #include +#include +#include #include std::unique_ptr sShowHintThread; static bool sShutdownHintThread = false; +bool SaveHintShownToStorage(bool hintShown); + void ShowHints() { bool isOverlayReady = false; while (!sShutdownHintThread && @@ -50,20 +54,31 @@ void ShowHints() { NotificationModuleStatus err; if ((err = NotificationModule_SetDefaultValue(NOTIFICATION_MODULE_NOTIFICATION_TYPE_INFO, NOTIFICATION_MODULE_DEFAULT_OPTION_DURATION_BEFORE_FADE_OUT, 15.0f)) == NOTIFICATION_MODULE_RESULT_SUCCESS && (err = NotificationModule_AddInfoNotification("Tip: You can open a configuration menu by pressing \ue052 + \ue07A + \ue046")) == NOTIFICATION_MODULE_RESULT_SUCCESS) { - if (WUPS_OpenStorage() == WUPS_STORAGE_ERROR_SUCCESS) { - gConfigMenuHintShown = true; - wups_storage_item_t *cat_other = nullptr; - if (WUPS_GetSubItem(nullptr, CAT_OTHER, &cat_other) == WUPS_STORAGE_ERROR_SUCCESS) { - WUPS_StoreInt(cat_other, CONFIG_MENU_HINT_SHOWN_ID, gConfigMenuHintShown); - } - WUPS_CloseStorage(); - } + + gConfigMenuHintShown = true; + SaveHintShownToStorage(gConfigMenuHintShown); } else { DEBUG_FUNCTION_LINE_ERR("Failed to show Notification: %d %s", err, NotificationModule_GetStatusStr(err)); } } } +bool SaveHintShownToStorage(bool hintShown) { + WUPSStorageError storageError; + auto subItem = WUPSStorageAPI::GetSubItem(CAT_OTHER, storageError); + if (!subItem) { + DEBUG_FUNCTION_LINE_ERR("Failed to get sub category"); + return false; + } + storageError = subItem->Store(CONFIG_MENU_HINT_SHOWN_ID, hintShown); + if (storageError != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to store hint shown"); + return false; + } + + return WUPSStorageAPI::SaveStorage() == WUPS_STORAGE_ERROR_SUCCESS; +} + void StartHintThread() { sShowHintThread.reset(); sShutdownHintThread = false; diff --git a/src/UpdaterCheck.cpp b/src/UpdaterCheck.cpp index 00d3dab..277a7dd 100644 --- a/src/UpdaterCheck.cpp +++ b/src/UpdaterCheck.cpp @@ -11,14 +11,17 @@ #include #include #include +#include #include #include +#include static NotificationModuleHandle sAromaUpdateHandle = 0; std::unique_ptr sCheckUpdateThread; static bool sShutdownUpdateThread = false; void UpdateCheckThreadEntry(); +void ShowUpdateNotification(); constexpr uint32_t HIDE_UPDATE_WARNING_VPAD_COMBO = VPAD_BUTTON_MINUS; constexpr uint32_t LAUNCH_AROMA_UPDATER_VPAD_COMBO = VPAD_BUTTON_PLUS; constexpr uint32_t sHoldForFramesTarget = 60; @@ -41,6 +44,26 @@ void StopUpdaterCheckThread() { } } +bool saveLatestUpdateHash(const std::string &hash) { + WUPSStorageError err; + auto subItem = WUPSStorageAPI::GetSubItem(CAT_OTHER, err); + if (!subItem) { + DEBUG_FUNCTION_LINE_ERR("Failed to get sub category"); + return false; + } + if (subItem->Store(LAST_UPDATE_HASH_ID, hash) != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to store latest update hash"); + return false; + } + + if (WUPSStorageAPI::SaveStorage() != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to save strorage"); + return false; + } + + return true; +} + void UpdateCheckThreadEntry() { bool isOverlayReady = false; while (!sShutdownUpdateThread && @@ -57,45 +80,46 @@ void UpdateCheckThreadEntry() { std::string errorTextOut; float progress; - if (DownloadUtils::DownloadFileToBuffer(AROMA_UPDATER_LAST_UPDATE_URL, outBuffer, responseCodeOut, errorOut, errorTextOut, &progress) == 0) { - try { - AromaUpdater::LatestVersion data = nlohmann::json::parse(outBuffer); - gUpdateChecked = true; - if (gLastHash.empty()) { // don't show update warning on first boot - gLastHash = data.getHash(); - } else if (gLastHash != data.getHash()) { - struct stat st {}; - if (stat(AROMA_UPDATER_PATH_FULL, &st) >= 0 && S_ISREG(st.st_mode)) { - NotificationModuleStatus err; - if ((err = NotificationModule_AddDynamicNotification("A new Aroma Update is available. " - "Hold \ue045 to launch the Aroma Updater, press \ue046 to hide this message", - &sAromaUpdateHandle)) != NOTIFICATION_MODULE_RESULT_SUCCESS) { - DEBUG_FUNCTION_LINE_ERR("Failed to add update notification. %s", NotificationModule_GetStatusStr(err)); - sAromaUpdateHandle = 0; - } - } else { - NotificationModule_SetDefaultValue(NOTIFICATION_MODULE_NOTIFICATION_TYPE_INFO, NOTIFICATION_MODULE_DEFAULT_OPTION_DURATION_BEFORE_FADE_OUT, 15.0f); - NotificationModule_AddInfoNotification("A new Aroma Update is available. Please launch the Aroma Updater!"); - } + if (DownloadUtils::DownloadFileToBuffer(AROMA_UPDATER_LAST_UPDATE_URL, outBuffer, responseCodeOut, errorOut, errorTextOut, &progress) != 0) { + DEBUG_FUNCTION_LINE_INFO("Download failed: %d %s", errorOut, errorTextOut.c_str()); + return; + } + try { + AromaUpdater::LatestVersion data = nlohmann::json::parse(outBuffer); + gUpdateChecked = true; - gLastHash = data.getHash(); - } else { - DEBUG_FUNCTION_LINE_VERBOSE("We don't need to update the hash"); - return; - } + if (gLastHash == data.getHash()) { + DEBUG_FUNCTION_LINE_VERBOSE("We don't need to update the hash"); + return; + } - if (WUPS_OpenStorage() == WUPS_STORAGE_ERROR_SUCCESS) { - wups_storage_item_t *cat_other = nullptr; - if (WUPS_GetSubItem(nullptr, CAT_OTHER, &cat_other) == WUPS_STORAGE_ERROR_SUCCESS) { - WUPS_StoreString(cat_other, LAST_UPDATE_HASH_ID, gLastHash.c_str()); - } - WUPS_CloseStorage(); - } - } catch (std::exception &e) { - DEBUG_FUNCTION_LINE_WARN("Failed to parse AromaUpdater::LatestVersion"); + // Update hash + gLastHash = data.getHash(); + + if (!gLastHash.empty()) { // don't show update warning on first boot + ShowUpdateNotification(); + } + + saveLatestUpdateHash(gLastHash); + } catch (std::exception &e) { + DEBUG_FUNCTION_LINE_WARN("Failed to parse AromaUpdater::LatestVersion"); + } +} + +void ShowUpdateNotification() { + struct stat st {}; + // Check if the Aroma Updater is on the sd card + if (stat(AROMA_UPDATER_PATH_FULL, &st) >= 0 && S_ISREG(st.st_mode)) { + NotificationModuleStatus err; + if ((err = NotificationModule_AddDynamicNotification("A new Aroma Update is available. " + "Hold \ue045 to launch the Aroma Updater, press \ue046 to hide this message", + &sAromaUpdateHandle)) != NOTIFICATION_MODULE_RESULT_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to add update notification. %s", NotificationModule_GetStatusStr(err)); + sAromaUpdateHandle = 0; } } else { - DEBUG_FUNCTION_LINE_INFO("Download failed: %d %s", errorOut, errorTextOut.c_str()); + NotificationModule_SetDefaultValue(NOTIFICATION_MODULE_NOTIFICATION_TYPE_INFO, NOTIFICATION_MODULE_DEFAULT_OPTION_DURATION_BEFORE_FADE_OUT, 15.0f); + NotificationModule_AddInfoNotification("A new Aroma Update is available. Please launch the Aroma Updater!"); } } @@ -158,6 +182,7 @@ DECL_FUNCTION(int32_t, VPADRead, VPADChan chan, static uint32_t sWPADLastButtonHold[4] = {0, 0, 0, 0}; static uint32_t sHoldForXFramesWPAD[4] = {0, 0, 0, 0}; + DECL_FUNCTION(void, WPADRead, WPADChan chan, WPADStatusProController *data) { real_WPADRead(chan, data); if (!sAromaUpdateHandle) { diff --git a/src/main.cpp b/src/main.cpp index 0dc9a9e..bdd05a7 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -22,7 +22,52 @@ WUPS_PLUGIN_LICENSE("GPL"); WUPS_USE_WUT_DEVOPTAB(); WUPS_USE_STORAGE("aroma_base_plugin"); // Unique id for the storage api -static bool sSDUtilsInitDone = false; +bool InitConfigValuesFromStorage() { + WUPSStorageError storageError; + auto subItemConfig = WUPSStorageAPI::GetOrCreateSubItem(CAT_CONFIG, storageError); + if (!subItemConfig) { + DEBUG_FUNCTION_LINE_ERR("Failed to get or create sub category \"%s\"", CAT_CONFIG); + return false; + } + + if (subItemConfig->GetOrStoreDefault(USTEALTH_CONFIG_ID, gActivateUStealth, gActivateUStealth) != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to get or create item \"%s\"", USTEALTH_CONFIG_ID); + return false; + } + if (subItemConfig->GetOrStoreDefault(POWEROFFWARNING_CONFIG_ID, gSkip4SecondOffStatusCheck, gSkip4SecondOffStatusCheck) != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to get or create item \"%s\"", POWEROFFWARNING_CONFIG_ID); + return false; + } + if (subItemConfig->GetOrStoreDefault(FORCE_NDM_SUSPEND_SUCCESS_CONFIG_ID, gForceNDMSuspendSuccess, gForceNDMSuspendSuccess) != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to get or create item \"%s\"", FORCE_NDM_SUSPEND_SUCCESS_CONFIG_ID); + return false; + } + if (subItemConfig->GetOrStoreDefault(ALLOW_ERROR_NOTIFICATIONS, gAllowErrorNotifications, gAllowErrorNotifications) != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to get or create item \"%s\"", ALLOW_ERROR_NOTIFICATIONS); + return false; + } + + auto subItemOther = WUPSStorageAPI::GetOrCreateSubItem(CAT_OTHER, storageError); + if (!subItemOther) { + DEBUG_FUNCTION_LINE_ERR("Failed to get or create sub category \"%s\"", CAT_OTHER); + return false; + } + + if (subItemOther->GetOrStoreDefault(CONFIG_MENU_HINT_SHOWN_ID, gConfigMenuHintShown, gConfigMenuHintShown) != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to get or create item \"%s\"", CONFIG_MENU_HINT_SHOWN_ID); + return false; + } + if (subItemOther->GetOrStoreDefault(CONFIG_MENU_HINT_SHOWN_ID, gLastHash, gLastHash) != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to get or create item \"%s\"", CONFIG_MENU_HINT_SHOWN_ID); + return false; + } + + if (WUPSStorageAPI::SaveStorage() != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to save storage"); + } + + return true; +} INITIALIZE_PLUGIN() { initLogging(); @@ -36,45 +81,7 @@ INITIALIZE_PLUGIN() { DEBUG_FUNCTION_LINE_ERR("SDUtils_InitLibrary failed"); } - // Open storage to read values - WUPSStorageError storageRes = WUPS_OpenStorage(); - if (storageRes == WUPS_STORAGE_ERROR_SUCCESS) { - wups_storage_item_t *cat_config = nullptr; - if (WUPS_GetSubItem(nullptr, CAT_CONFIG, &cat_config) == WUPS_STORAGE_ERROR_NOT_FOUND) { - if (WUPS_CreateSubItem(nullptr, CAT_CONFIG, &cat_config) != WUPS_STORAGE_ERROR_SUCCESS) { - cat_config = nullptr; - } - } - - if (cat_config != nullptr) { - LOAD_BOOL_FROM_STORAGE(cat_config, USTEALTH_CONFIG_ID, gActivateUStealth); - LOAD_BOOL_FROM_STORAGE(cat_config, POWEROFFWARNING_CONFIG_ID, gSkip4SecondOffStatusCheck); - LOAD_BOOL_FROM_STORAGE(cat_config, FORCE_NDM_SUSPEND_SUCCESS_CONFIG_ID, gForceNDMSuspendSuccess); - LOAD_BOOL_FROM_STORAGE(cat_config, ALLOW_ERROR_NOTIFICATIONS, gAllowErrorNotifications); - } - - wups_storage_item_t *cat_other = nullptr; - if (WUPS_GetSubItem(nullptr, CAT_OTHER, &cat_other) != WUPS_STORAGE_ERROR_SUCCESS) { - if (WUPS_CreateSubItem(nullptr, CAT_OTHER, &cat_other) != WUPS_STORAGE_ERROR_SUCCESS) { - cat_other = nullptr; - } - } - - if (cat_other != nullptr) { - LOAD_BOOL_FROM_STORAGE(cat_other, CONFIG_MENU_HINT_SHOWN_ID, gConfigMenuHintShown); - char hash[41]; - memset(hash, 0, sizeof(hash)); - LOAD_STRING_FROM_STORAGE(cat_other, LAST_UPDATE_HASH_ID, hash, sizeof(hash)); - gLastHash = hash; - } - - // Close storage - if (WUPS_CloseStorage() != WUPS_STORAGE_ERROR_SUCCESS) { - DEBUG_FUNCTION_LINE_ERR("Failed to close storage"); - } - } else { - DEBUG_FUNCTION_LINE_ERR("Failed to open storage %s (%d)", WUPS_GetStorageStatusStr(storageRes), storageRes); - } + InitConfigValuesFromStorage(); } ON_APPLICATION_START() { @@ -92,6 +99,7 @@ ON_APPLICATION_START() { ON_APPLICATION_ENDS() { StopHintThread(); StopUpdaterCheckThread(); + DownloadUtils::Deinit(); deinitLogging(); } diff --git a/src/utils/config.cpp b/src/utils/config.cpp index 314be15..99576b6 100644 --- a/src/utils/config.cpp +++ b/src/utils/config.cpp @@ -1,52 +1,75 @@ #include "config.h" -bool gActivateUStealth = false; -bool gSkip4SecondOffStatusCheck = true; -bool gConfigMenuHintShown = false; -bool gUpdateChecked = false; -bool gForceNDMSuspendSuccess = true; -bool gAllowErrorNotifications = true; -std::string gLastHash = {}; +bool gActivateUStealth = ACTIVATE_USTEALTH_DEFAULT; +bool gSkip4SecondOffStatusCheck = SKIP_4_SECOND_OFF_STATUS_CHECK_DEFAULT; +bool gConfigMenuHintShown = CONFIG_MENU_HINT_SHOWN_DEFAULT; +bool gUpdateChecked = UPDATE_CHECKED_DEFAULT; +bool gForceNDMSuspendSuccess = FORCE_NDM_SUSPEND_SUCCESS_DEFAULT; +bool gAllowErrorNotifications = ALLOW_ERROR_NOTIFICATIONS_DEFAULT; +std::string gLastHash = LAST_UPDATE_HASH_DEFAULT; void boolItemChangedConfig(ConfigItemBoolean *item, bool newValue) { - wups_storage_item_t *cat_config; - if (WUPS_GetSubItem(nullptr, CAT_CONFIG, &cat_config) == WUPS_STORAGE_ERROR_SUCCESS) { - PROCESS_BOOL_ITEM_CHANGED(cat_config, USTEALTH_CONFIG_ID, gActivateUStealth); - PROCESS_BOOL_ITEM_CHANGED(cat_config, POWEROFFWARNING_CONFIG_ID, gSkip4SecondOffStatusCheck); - PROCESS_BOOL_ITEM_CHANGED(cat_config, FORCE_NDM_SUSPEND_SUCCESS_CONFIG_ID, gForceNDMSuspendSuccess); - PROCESS_BOOL_ITEM_CHANGED(cat_config, ALLOW_ERROR_NOTIFICATIONS, gAllowErrorNotifications); + WUPSStorageError storageError; + auto subItemConfig = WUPSStorageAPI::GetSubItem(CAT_CONFIG, storageError); + if (!subItemConfig) { + DEBUG_FUNCTION_LINE_ERR("Failed to get sub item \"%s\": %s", CAT_CONFIG, WUPSStorageAPI::GetStatusStr(storageError).data()); + return; + } + if (std::string_view(USTEALTH_CONFIG_ID) == item->identifier) { + gActivateUStealth = newValue; + storageError = subItemConfig->Store(USTEALTH_CONFIG_ID, newValue); + } else if (std::string_view(POWEROFFWARNING_CONFIG_ID) == item->identifier) { + gSkip4SecondOffStatusCheck = newValue; + storageError = subItemConfig->Store(POWEROFFWARNING_CONFIG_ID, newValue); + } else if (std::string_view(ALLOW_ERROR_NOTIFICATIONS) == item->identifier) { + gAllowErrorNotifications = newValue; + storageError = subItemConfig->Store(ALLOW_ERROR_NOTIFICATIONS, newValue); + } else if (std::string_view(FORCE_NDM_SUSPEND_SUCCESS_CONFIG_ID) == item->identifier) { + gForceNDMSuspendSuccess = newValue; + storageError = subItemConfig->Store(FORCE_NDM_SUSPEND_SUCCESS_CONFIG_ID, newValue); } else { - DEBUG_FUNCTION_LINE_ERR("Failed to get sub item: %s", CAT_CONFIG); + return; + } + if (storageError != WUPS_STORAGE_ERROR_SUCCESS) { + DEBUG_FUNCTION_LINE_ERR("Failed to store %s. New value was %d", item->identifier, newValue); } } -WUPS_GET_CONFIG() { - // We open the storage, so we can persist the configuration the user did. - if (WUPS_OpenStorage() != WUPS_STORAGE_ERROR_SUCCESS) { - DEBUG_FUNCTION_LINE("Failed to open storage"); - return 0; - } +WUPSConfigAPICallbackStatus ConfigMenuOpenedCallback(WUPSConfigCategoryHandle rootHandle) { + try { + WUPSConfigCategory root = WUPSConfigCategory(rootHandle); - WUPSConfigHandle config; - WUPSConfig_CreateHandled(&config, "Aroma Base Plugin"); + auto menuPatches = WUPSConfigCategory::Create("Wii U Menu patches"); - WUPSConfigCategoryHandle cat; - WUPSConfig_AddCategoryByNameHandled(config, "Wii U Menu patches", &cat); - WUPSConfigCategoryHandle catOther; - WUPSConfig_AddCategoryByNameHandled(config, "Other patches", &catOther); - WUPSConfigItemBoolean_AddToCategoryHandled(config, cat, USTEALTH_CONFIG_ID, "Avoid \"Format\" dialog on Wii U Menu", gActivateUStealth, &boolItemChangedConfig); - WUPSConfigItemBoolean_AddToCategoryHandled(config, cat, POWEROFFWARNING_CONFIG_ID, "Skip \"Shutdown warning\" on boot", gSkip4SecondOffStatusCheck, &boolItemChangedConfig); + menuPatches.add(WUPSConfigItemBoolean::Create(USTEALTH_CONFIG_ID, + "Avoid \"Format\" dialog on Wii U Menu", + ACTIVATE_USTEALTH_DEFAULT, gActivateUStealth, + &boolItemChangedConfig)); - WUPSConfigItemBoolean_AddToCategoryHandled(config, catOther, ALLOW_ERROR_NOTIFICATIONS, "Allow error notifications", gAllowErrorNotifications, &boolItemChangedConfig); - WUPSConfigItemBoolean_AddToCategoryHandled(config, catOther, FORCE_NDM_SUSPEND_SUCCESS_CONFIG_ID, "Fix connecting to a 3DS in Mii Maker", gForceNDMSuspendSuccess, &boolItemChangedConfig); + menuPatches.add(WUPSConfigItemBoolean::Create(POWEROFFWARNING_CONFIG_ID, + "Skip \"Shutdown warning\" on boot", + SKIP_4_SECOND_OFF_STATUS_CHECK_DEFAULT, gSkip4SecondOffStatusCheck, + &boolItemChangedConfig)); - return config; -} + root.add(std::move(menuPatches)); + + auto otherPatches = WUPSConfigCategory::Create("Other patches"); + + otherPatches.add(WUPSConfigItemBoolean::Create(ALLOW_ERROR_NOTIFICATIONS, + "Allow error notifications", + ALLOW_ERROR_NOTIFICATIONS_DEFAULT, gAllowErrorNotifications, + &boolItemChangedConfig)); + + otherPatches.add(WUPSConfigItemBoolean::Create(FORCE_NDM_SUSPEND_SUCCESS_CONFIG_ID, + "Fix connecting to a 3DS in Mii Maker", + FORCE_NDM_SUSPEND_SUCCESS_DEFAULT, gForceNDMSuspendSuccess, + &boolItemChangedConfig)); + root.add(std::move(otherPatches)); -WUPS_CONFIG_CLOSED() { - // Save all changes - if (WUPS_CloseStorage() != WUPS_STORAGE_ERROR_SUCCESS) { - DEBUG_FUNCTION_LINE_ERR("Failed to close storage"); + } catch (std::exception &e) { + OSReport("Exception T_T : %s\n", e.what()); + return WUPSCONFIG_API_CALLBACK_RESULT_ERROR; } + return WUPSCONFIG_API_CALLBACK_RESULT_SUCCESS; } \ No newline at end of file diff --git a/src/utils/config.h b/src/utils/config.h index bdf6086..ba75522 100644 --- a/src/utils/config.h +++ b/src/utils/config.h @@ -4,46 +4,24 @@ #include #include -#define CAT_CONFIG "config" -#define CAT_OTHER "other" - -#define USTEALTH_CONFIG_ID "ustealth" -#define POWEROFFWARNING_CONFIG_ID "SkipPowerOffWarning" -#define FORCE_NDM_SUSPEND_SUCCESS_CONFIG_ID "forceNDMSuspendSuccess" -#define ALLOW_ERROR_NOTIFICATIONS "allowErrorNotifications" - - -#define CONFIG_MENU_HINT_SHOWN_ID "configMenuHintShown" -#define LAST_UPDATE_HASH_ID "lastUpdateHash" - -#define LOAD_BOOL_FROM_STORAGE(__cat, config_name, __variable__) \ - if ((storageRes = WUPS_GetBool(__cat, config_name, &__variable__)) == WUPS_STORAGE_ERROR_NOT_FOUND) { \ - if (WUPS_StoreBool(__cat, config_name, __variable__) != WUPS_STORAGE_ERROR_SUCCESS) { \ - DEBUG_FUNCTION_LINE_WARN("Failed to store bool %s (%d)", WUPS_GetStorageStatusStr(storageRes), storageRes); \ - } \ - } else if (storageRes != WUPS_STORAGE_ERROR_SUCCESS) { \ - DEBUG_FUNCTION_LINE_WARN("Failed to get bool %s (%d)", WUPS_GetStorageStatusStr(storageRes), storageRes); \ - } \ - while (0) - -#define LOAD_STRING_FROM_STORAGE(__cat, config_name, __string, __string_length) \ - if ((storageRes = WUPS_GetString(__cat, config_name, __string, __string_length)) == WUPS_STORAGE_ERROR_NOT_FOUND) { \ - if (WUPS_StoreString(__cat, config_name, __string) != WUPS_STORAGE_ERROR_SUCCESS) { \ - DEBUG_FUNCTION_LINE_WARN("Failed to store string %s (%d)", WUPS_GetStorageStatusStr(storageRes), storageRes); \ - } \ - } else if (storageRes != WUPS_STORAGE_ERROR_SUCCESS) { \ - DEBUG_FUNCTION_LINE_WARN("Failed to get bool %s (%d)", WUPS_GetStorageStatusStr(storageRes), storageRes); \ - } \ - while (0) - -#define PROCESS_BOOL_ITEM_CHANGED(cat, __config__name, __variable__) \ - if (std::string_view(item->configId) == __config__name) { \ - DEBUG_FUNCTION_LINE_ERR("New value in %s: %d", __config__name, newValue); \ - __variable__ = newValue; \ - WUPS_StoreInt(cat, __config__name, __variable__); \ - return; \ - } \ - while (0) +#define CAT_CONFIG "config" +#define CAT_OTHER "other" + +#define USTEALTH_CONFIG_ID "ustealth" +#define POWEROFFWARNING_CONFIG_ID "SkipPowerOffWarning" +#define FORCE_NDM_SUSPEND_SUCCESS_CONFIG_ID "forceNDMSuspendSuccess" +#define ALLOW_ERROR_NOTIFICATIONS "allowErrorNotifications" + +#define CONFIG_MENU_HINT_SHOWN_ID "configMenuHintShown" +#define LAST_UPDATE_HASH_ID "lastUpdateHash" + +#define ACTIVATE_USTEALTH_DEFAULT false +#define SKIP_4_SECOND_OFF_STATUS_CHECK_DEFAULT false +#define CONFIG_MENU_HINT_SHOWN_DEFAULT false +#define UPDATE_CHECKED_DEFAULT false +#define FORCE_NDM_SUSPEND_SUCCESS_DEFAULT false +#define ALLOW_ERROR_NOTIFICATIONS_DEFAULT false +#define LAST_UPDATE_HASH_DEFAULT std::string() extern bool gActivateUStealth; extern bool gSkip4SecondOffStatusCheck;