diff --git a/source/ui/section/action/action.h b/source/ui/section/action/action.h index 92b5d95..df14462 100644 --- a/source/ui/section/action/action.h +++ b/source/ui/section/action/action.h @@ -26,4 +26,5 @@ void action_delete_title(title_info* info, bool* populated); void action_launch_title(title_info* info, bool* populated); void action_browse_title_save_data(title_info* info, bool* populated); void action_import_secure_value(title_info* info, bool* populated); -void action_export_secure_value(title_info* info, bool* populated); \ No newline at end of file +void action_export_secure_value(title_info* info, bool* populated); +void action_delete_secure_value(title_info* info, bool* populated); \ No newline at end of file diff --git a/source/ui/section/action/deletecontents.c b/source/ui/section/action/deletecontents.c index 9927d76..74e458a 100644 --- a/source/ui/section/action/deletecontents.c +++ b/source/ui/section/action/deletecontents.c @@ -62,6 +62,10 @@ static void action_delete_dir_contents_update(ui_view* view, void* data, float* res = FSUSER_DeleteFile(*archive, fsPath); } + if(R_SUCCEEDED(res) && archive->id == ARCHIVE_USER_SAVEDATA) { + res = FSUSER_ControlArchive(*archive, ARCHIVE_ACTION_COMMIT_SAVE_DATA, NULL, 0, NULL, 0); + } + if(R_FAILED(res)) { if(deleteData->processed >= deleteData->total - 1) { ui_pop(); diff --git a/source/ui/section/action/deletesecurevalue.c b/source/ui/section/action/deletesecurevalue.c new file mode 100644 index 0000000..70c3ced --- /dev/null +++ b/source/ui/section/action/deletesecurevalue.c @@ -0,0 +1,41 @@ +#include + +#include <3ds.h> + +#include "action.h" +#include "../../error.h" +#include "../../progressbar.h" +#include "../../prompt.h" +#include "../../../util.h" +#include "../../../screen.h" + +static void action_delete_secure_value_end_onresponse(ui_view* view, void* data, bool response) { + prompt_destroy(view); +} + +static void action_delete_secure_value_update(ui_view* view, void* data, float* progress, char* progressText) { + title_info* info = (title_info*) data; + + Result res = FSUSER_ControlSecureSave(SECURESAVE_ACTION_DELETE, (SECUREVALUE_SLOT_SD << 32) | (info->titleId & 0xFFFFFFF)); + + progressbar_destroy(view); + ui_pop(); + + if(R_FAILED(res)) { + error_display_res(info, ui_draw_title_info, res, "Failed to delete secure value."); + } else { + ui_push(prompt_create("Success", "Secure value deleted.", COLOR_TEXT, false, info, NULL, ui_draw_title_info, action_delete_secure_value_end_onresponse)); + } +} + +static void action_delete_secure_value_onresponse(ui_view* view, void* data, bool response) { + prompt_destroy(view); + + if(response) { + ui_push(progressbar_create("Deleting Secure Value", "", data, action_delete_secure_value_update, ui_draw_title_info)); + } +} + +void action_delete_secure_value(title_info* info, bool* populated) { + ui_push(prompt_create("Confirmation", "Delete the secure value of the selected title?", COLOR_TEXT, true, info, NULL, ui_draw_title_info, action_delete_secure_value_onresponse)); +} \ No newline at end of file diff --git a/source/ui/section/action/exportsecurevalue.c b/source/ui/section/action/exportsecurevalue.c index 3ba8d16..8c4d2a8 100644 --- a/source/ui/section/action/exportsecurevalue.c +++ b/source/ui/section/action/exportsecurevalue.c @@ -72,5 +72,5 @@ static void action_export_secure_value_onresponse(ui_view* view, void* data, boo } void action_export_secure_value(title_info* info, bool* populated) { - ui_push(prompt_create("Confirmation", "Export secure value for the selected title?", COLOR_TEXT, true, info, NULL, ui_draw_title_info, action_export_secure_value_onresponse)); + ui_push(prompt_create("Confirmation", "Export the secure value of the selected title?", COLOR_TEXT, true, info, NULL, ui_draw_title_info, action_export_secure_value_onresponse)); } \ No newline at end of file diff --git a/source/ui/section/action/importsecurevalue.c b/source/ui/section/action/importsecurevalue.c index ba5f3a6..d111c5e 100644 --- a/source/ui/section/action/importsecurevalue.c +++ b/source/ui/section/action/importsecurevalue.c @@ -56,5 +56,5 @@ static void action_import_secure_value_onresponse(ui_view* view, void* data, boo } void action_import_secure_value(title_info* info, bool* populated) { - ui_push(prompt_create("Confirmation", "Import secure value for the selected title?", COLOR_TEXT, true, info, NULL, ui_draw_title_info, action_import_secure_value_onresponse)); + ui_push(prompt_create("Confirmation", "Import the secure value of the selected title?", COLOR_TEXT, true, info, NULL, ui_draw_title_info, action_import_secure_value_onresponse)); } \ No newline at end of file diff --git a/source/ui/section/action/installcias.c b/source/ui/section/action/installcias.c index aded4ea..42999e4 100644 --- a/source/ui/section/action/installcias.c +++ b/source/ui/section/action/installcias.c @@ -114,7 +114,9 @@ static void action_install_cias_update(ui_view* view, void* data, float* progres } if(installData->delete) { - FSUSER_DeleteFile(*installData->base->archive, fsMakePath(PATH_ASCII, path)); + if(R_SUCCEEDED(FSUSER_DeleteFile(*installData->base->archive, fsMakePath(PATH_ASCII, path))) && installData->base->archive->id == ARCHIVE_USER_SAVEDATA) { + FSUSER_ControlArchive(*installData->base->archive, ARCHIVE_ACTION_COMMIT_SAVE_DATA, NULL, 0, NULL, 0); + } *installData->populated = false; } diff --git a/source/ui/section/task/installcia.c b/source/ui/section/task/installcia.c index 3d8cb4b..f4b0c59 100644 --- a/source/ui/section/task/installcia.c +++ b/source/ui/section/task/installcia.c @@ -1,7 +1,4 @@ -#include #include -#include -#include #include #include <3ds.h> @@ -9,7 +6,6 @@ #include "../../list.h" #include "../../error.h" -#include "../../../util.h" #include "task.h" typedef struct { @@ -95,7 +91,10 @@ static void task_install_cia_thread(void* arg) { AM_DeleteTitle(dest, titleId); AM_DeleteTicket(titleId); - AM_QueryAvailableExternalTitleDatabase(NULL); + + if(dest == 1) { + AM_QueryAvailableExternalTitleDatabase(NULL); + } if(R_FAILED(data->result->result = AM_StartCiaInstall(dest, &ciaHandle))) { break; @@ -115,7 +114,7 @@ static void task_install_cia_thread(void* arg) { if(R_FAILED(data->result->result)) { AM_CancelCIAInstall(ciaHandle); } else if(R_SUCCEEDED(data->result->result = AM_FinishCiaInstall(ciaHandle))) { - if(titleId == 0x0004013800000002LL || titleId == 0x0004013820000002LL) { + if(titleId == 0x0004013800000002 || titleId == 0x0004013820000002) { data->result->result = AM_InstallFirm(titleId); } } diff --git a/source/ui/section/titles.c b/source/ui/section/titles.c index 194332f..ce06726 100644 --- a/source/ui/section/titles.c +++ b/source/ui/section/titles.c @@ -17,7 +17,7 @@ typedef struct { bool populated; } titles_data; -#define TITLES_ACTION_COUNT 5 +#define TITLES_ACTION_COUNT 6 static u32 titles_action_count = TITLES_ACTION_COUNT; static list_item titles_action_items[TITLES_ACTION_COUNT] = { @@ -26,6 +26,7 @@ static list_item titles_action_items[TITLES_ACTION_COUNT] = { {"Browse Save Data", COLOR_TEXT, action_browse_title_save_data}, {"Import Secure Value", COLOR_TEXT, action_import_secure_value}, {"Export Secure Value", COLOR_TEXT, action_export_secure_value}, + {"Delete Secure Value", COLOR_TEXT, action_delete_secure_value}, }; #define CARD_TITLES_ACTION_COUNT 2