static void systemsavedata_action_update(ui_view* view, void* data, list_item** items, u32** itemCount, list_item* selected, bool selectedTouched) { systemsavedata_action_data* actionData = (systemsavedata_action_data*) data; if(hidKeysDown() & KEY_B) { list_destroy(view); ui_pop(); free(data); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { void(*action)(system_save_data_info*, bool*) = (void(*)(system_save_data_info*, bool*)) selected->data; list_destroy(view); ui_pop(); action(actionData->info, actionData->populated); free(data); return; } if(*itemCount != &systemsavedata_action_count || *items != systemsavedata_action_items) { *itemCount = &systemsavedata_action_count; *items = systemsavedata_action_items; } }
static void pendingtitles_action_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { pendingtitles_action_data* actionData = (pendingtitles_action_data*) data; if(hidKeysDown() & KEY_B) { ui_pop(); list_destroy(view); free(data); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { void(*action)(linked_list*, list_item*) = (void(*)(linked_list*, list_item*)) selected->data; ui_pop(); list_destroy(view); action(actionData->items, actionData->selected); free(data); return; } if(linked_list_size(items) == 0) { linked_list_add(items, &delete_pending_title); linked_list_add(items, &delete_all_pending_titles); } }
static void titles_action_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { titles_action_data* actionData = (titles_action_data*) data; if(hidKeysDown() & KEY_B) { ui_pop(); list_destroy(view); free(data); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { void(*action)(linked_list*, list_item*) = (void(*)(linked_list*, list_item*)) selected->data; ui_pop(); list_destroy(view); action(actionData->items, actionData->selected); free(data); return; } if(linked_list_size(items) == 0) { linked_list_add(items, &launch_title); title_info* info = (title_info*) actionData->selected->data; if(info->mediaType != MEDIATYPE_GAME_CARD) { linked_list_add(items, &delete_title); linked_list_add(items, &delete_title_ticket); } if(!info->twl) { linked_list_add(items, &extract_smdh); if(info->mediaType != MEDIATYPE_GAME_CARD) { linked_list_add(items, &import_seed); } linked_list_add(items, &browse_save_data); if(info->mediaType != MEDIATYPE_GAME_CARD) { linked_list_add(items, &import_secure_value); linked_list_add(items, &export_secure_value); linked_list_add(items, &delete_secure_value); } } else if(info->mediaType == MEDIATYPE_GAME_CARD) { linked_list_add(items, &import_save_data); linked_list_add(items, &export_save_data); linked_list_add(items, &erase_save_data); } } }
static void titles_filters_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { titles_data* listData = (titles_data*) data; if(hidKeysDown() & KEY_B) { linked_list_iter iter; linked_list_iterate(items, &iter); while(linked_list_iter_has_next(&iter)) { free(linked_list_iter_next(&iter)); linked_list_iter_remove(&iter); } ui_pop(); list_destroy(view); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { bool* val = (bool*) selected->data; *val = !(*val); selected->color = *val ? COLOR_ENABLED : COLOR_DISABLED; listData->populated = false; } if(linked_list_size(items) == 0) { titles_filters_add_entry(items, "Show game card", &listData->showGameCard); titles_filters_add_entry(items, "Show SD", &listData->showSD); titles_filters_add_entry(items, "Show NAND", &listData->showNAND); } }
static void files_filters_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { files_data* listData = (files_data*) data; if(hidKeysDown() & KEY_B) { linked_list_iter iter; linked_list_iterate(items, &iter); while(linked_list_iter_has_next(&iter)) { free(linked_list_iter_next(&iter)); linked_list_iter_remove(&iter); } ui_pop(); list_destroy(view); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { bool* val = (bool*) selected->data; *val = !(*val); selected->color = *val ? COLOR_ENABLED : COLOR_DISABLED; listData->populated = false; } if(linked_list_size(items) == 0) { files_filters_add_entry(items, "Show directories", &listData->showDirectories); files_filters_add_entry(items, "Show CIAs", &listData->showCias); files_filters_add_entry(items, "Show tickets", &listData->showTickets); files_filters_add_entry(items, "Show miscellaneous", &listData->showMisc); } }
static void action_delete_title_update(ui_view* view, void* data, float* progress, char* text) { delete_title_data* deleteData = (delete_title_data*) data; title_info* info = (title_info*) deleteData->selected->data; Result res = 0; if(R_SUCCEEDED(res = AM_DeleteTitle(info->mediaType, info->titleId)) && deleteData->ticket) { res = AM_DeleteTicket(info->titleId); } ui_pop(); info_destroy(view); if(R_FAILED(res)) { error_display_res(info, ui_draw_title_info, res, "Failed to delete title."); } else { linked_list_remove(deleteData->items, deleteData->selected); task_free_title(deleteData->selected); prompt_display("Success", "Title deleted.", COLOR_TEXT, false, NULL, NULL, NULL); } free(data); }
static void mainmenu_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { if(hidKeysDown() & KEY_START) { ui_pop(); list_destroy(view); return; } if(selected != NULL && (selectedTouched || hidKeysDown() & KEY_A) && selected->data != NULL) { ((void(*)()) selected->data)(); return; } if(linked_list_size(items) == 0) { linked_list_add(items, &sd); linked_list_add(items, &ctr_nand); linked_list_add(items, &twl_nand); linked_list_add(items, &twl_photo); linked_list_add(items, &twl_sound); linked_list_add(items, &dump_nand); linked_list_add(items, &titles); linked_list_add(items, &pending_titles); linked_list_add(items, &tickets); linked_list_add(items, &ext_save_data); linked_list_add(items, &system_save_data); linked_list_add(items, &titledb); linked_list_add(items, &network_install); linked_list_add(items, &qr_code_install); linked_list_add(items, &update); } }
static void action_paste_files_update(ui_view* view, void* data, float* progress, char* text) { paste_files_data* pasteData = (paste_files_data*) data; if(pasteData->pasteInfo.finished) { FSUSER_ControlArchive(pasteData->target->archive, ARCHIVE_ACTION_COMMIT_SAVE_DATA, NULL, 0, NULL, 0); linked_list_sort(pasteData->items, util_compare_file_infos); ui_pop(); info_destroy(view); if(R_SUCCEEDED(pasteData->pasteInfo.result)) { prompt_display("Success", "Contents pasted.", COLOR_TEXT, false, NULL, NULL, NULL); } action_paste_files_free_data(pasteData); return; } if((hidKeysDown() & KEY_B) && !pasteData->pasteInfo.finished) { svcSignalEvent(pasteData->pasteInfo.cancelEvent); } *progress = pasteData->pasteInfo.currTotal != 0 ? (float) ((double) pasteData->pasteInfo.currProcessed / (double) pasteData->pasteInfo.currTotal) : 0; snprintf(text, PROGRESS_TEXT_MAX, "%lu / %lu\n%.2f %s / %.2f %s", pasteData->pasteInfo.processed, pasteData->pasteInfo.total, util_get_display_size(pasteData->pasteInfo.currProcessed), util_get_display_size_units(pasteData->pasteInfo.currProcessed), util_get_display_size(pasteData->pasteInfo.currTotal), util_get_display_size_units(pasteData->pasteInfo.currTotal)); }
static void action_delete_system_save_data_update(ui_view* view, void* data, float* progress, char* progressText) { delete_system_save_data_data* deleteData = (delete_system_save_data_data*) data; FS_SystemSaveDataInfo sysInfo = {.mediaType = MEDIATYPE_NAND, .saveId = deleteData->info->systemSaveDataId}; Result res = FSUSER_DeleteSystemSaveData(sysInfo); progressbar_destroy(view); ui_pop(); if(R_FAILED(res)) { error_display_res(deleteData->info, ui_draw_system_save_data_info, res, "Failed to delete system save data."); } else { *deleteData->populated = false; ui_push(prompt_create("Success", "System save data deleted.", COLOR_TEXT, false, deleteData->info, NULL, ui_draw_system_save_data_info, action_delete_system_save_data_success_onresponse)); } free(data); } static void action_delete_system_save_data_onresponse(ui_view* view, void* data, bool response) { prompt_destroy(view); if(response) { ui_push(progressbar_create("Deleting System Save Data", "", data, action_delete_system_save_data_update, action_delete_system_save_data_draw_top)); } else { free(data); } }
static void files_update(ui_view* view, void* data, list_item** items, u32** itemCount, list_item* selected, bool selectedTouched) { files_data* listData = (files_data*) data; if(hidKeysDown() & KEY_B) { if(strcmp(listData->currDir.path, "/") == 0) { if(listData->archive.handle != 0) { FSUSER_CloseArchive(&listData->archive); listData->archive.handle = 0; } if(listData->archivePath != NULL) { free(listData->archivePath); listData->archivePath = NULL; } if(listData->cancelEvent != 0) { svcSignalEvent(listData->cancelEvent); while(svcWaitSynchronization(listData->cancelEvent, 0) == 0) { svcSleepThread(1000000); } listData->cancelEvent = 0; } ui_pop(); list_destroy(view); free(listData); return; } else { files_navigate(listData, listData->parentDir.path); } } if(hidKeysDown() & KEY_Y) { files_action_open(&listData->currDir, &listData->populated); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { file_info* fileInfo = (file_info*) selected->data; if(util_is_dir(&listData->archive, fileInfo->path)) { files_navigate(listData, fileInfo->path); } else { files_action_open(fileInfo, &listData->populated); return; } } if(!listData->populated || (hidKeysDown() & KEY_X)) { files_repopulate(listData); } if(*itemCount != &listData->count || *items != listData->items) { *itemCount = &listData->count; *items = listData->items; } }
static void files_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { files_data* listData = (files_data*) data; while(!util_is_dir(listData->archive, listData->currDir)) { char parentDir[FILE_PATH_MAX] = {'\0'}; util_get_parent_path(parentDir, listData->currDir, FILE_PATH_MAX); files_navigate(listData, items, parentDir); } if(hidKeysDown() & KEY_B) { if(strncmp(listData->currDir, "/", FILE_PATH_MAX) == 0) { ui_pop(); files_free_data(listData); task_clear_files(items); list_destroy(view); return; } else { char parentDir[FILE_PATH_MAX] = {'\0'}; util_get_parent_path(parentDir, listData->currDir, FILE_PATH_MAX); files_navigate(listData, items, parentDir); } } if(hidKeysDown() & KEY_SELECT) { files_filters_open(listData); return; } if((hidKeysDown() & KEY_Y) && listData->dirItem != NULL) { files_action_open(items, listData->dirItem, listData); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { file_info* fileInfo = (file_info*) selected->data; if(fileInfo->isDirectory) { files_navigate(listData, items, fileInfo->path); } else { files_action_open(items, selected, listData); return; } } if(!listData->populated || (hidKeysDown() & KEY_X)) { files_repopulate(listData, items); } if(listData->populateData.finished && R_FAILED(listData->populateData.result)) { error_display_res(NULL, NULL, NULL, listData->populateData.result, "Failed to populate file list."); listData->populateData.result = 0; } }
static void titles_options_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { titles_data* listData = (titles_data*) data; if(hidKeysDown() & KEY_B) { linked_list_iter iter; linked_list_iterate(items, &iter); while(linked_list_iter_has_next(&iter)) { free(linked_list_iter_next(&iter)); linked_list_iter_remove(&iter); } ui_pop(); list_destroy(view); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { bool* val = (bool*) selected->data; *val = !(*val); if(*val && (val == &listData->sortById || val == &listData->sortByName || val == &listData->sortBySize)) { if(val == &listData->sortById) { listData->sortByName = false; listData->sortBySize = false; } else if(val == &listData->sortByName) { listData->sortById = false; listData->sortBySize = false; } else if(val == &listData->sortBySize) { listData->sortById = false; listData->sortByName = false; } linked_list_iter iter; linked_list_iterate(items, &iter); while(linked_list_iter_has_next(&iter)) { list_item* item = (list_item*) linked_list_iter_next(&iter); item->color = *(bool*) item->data ? COLOR_ENABLED : COLOR_DISABLED; } } else { selected->color = *val ? COLOR_ENABLED : COLOR_DISABLED; } listData->populated = false; } if(linked_list_size(items) == 0) { titles_options_add_entry(items, "Show game card", &listData->showGameCard); titles_options_add_entry(items, "Show SD", &listData->showSD); titles_options_add_entry(items, "Show NAND", &listData->showNAND); titles_options_add_entry(items, "Sort by ID", &listData->sortById); titles_options_add_entry(items, "Sort by name", &listData->sortByName); titles_options_add_entry(items, "Sort by size", &listData->sortBySize); } }
static void titles_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { titles_data* listData = (titles_data*) data; if(hidKeysDown() & KEY_B) { if(!listData->populateData.finished) { svcSignalEvent(listData->populateData.cancelEvent); while(!listData->populateData.finished) { svcSleepThread(1000000); } } ui_pop(); task_clear_titles(items); list_destroy(view); free(listData); return; } if(hidKeysDown() & KEY_SELECT) { titles_options_open(listData); return; } if(!listData->populated || (hidKeysDown() & KEY_X)) { if(!listData->populateData.finished) { svcSignalEvent(listData->populateData.cancelEvent); while(!listData->populateData.finished) { svcSleepThread(1000000); } } listData->populateData.items = items; Result res = task_populate_titles(&listData->populateData); if(R_FAILED(res)) { error_display_res(NULL, NULL, res, "Failed to initiate title list population."); } listData->populated = true; } if(listData->populateData.finished && R_FAILED(listData->populateData.result)) { error_display_res(NULL, NULL, listData->populateData.result, "Failed to populate title list."); listData->populateData.result = 0; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { titles_action_open(items, selected); return; } }
static void pendingtitles_action_update(ui_view* view, void* data, list_item** items, u32** itemCount, list_item* selected, bool selectedTouched) { if(hidKeysDown() & KEY_B) { list_destroy(view); ui_pop(); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { void(*action)(pending_title_info*) = (void(*)(pending_title_info*)) selected->data; list_destroy(view); ui_pop(); action((pending_title_info*) data); return; } if(*itemCount != &pending_titles_action_count || *items != pending_titles_action_items) { *itemCount = &pending_titles_action_count; *items = pending_titles_action_items; } }
static void action_import_seed_update(ui_view* view, void* data, float* progress, char* text) { title_info* info = (title_info*) data; Result res = util_import_seed(info->titleId); ui_pop(); info_destroy(view); if(R_SUCCEEDED(res)) { prompt_display("Success", "Seed imported.", COLOR_TEXT, false, info, NULL, ui_draw_title_info, NULL); } else { error_display_res(NULL, info, ui_draw_title_info, res, "Failed to import seed."); } }
static void action_delete_secure_value_update(ui_view* view, void* data, float* progress, char* text) { title_info* info = (title_info*) data; u64 param = ((u64) SECUREVALUE_SLOT_SD << 32) | (info->titleId & 0xFFFFFFF); u8 out = 0; Result res = FSUSER_ControlSecureSave(SECURESAVE_ACTION_DELETE, ¶m, sizeof(param), &out, sizeof(out)); ui_pop(); info_destroy(view); if(R_FAILED(res)) { error_display_res(info, ui_draw_title_info, res, "Failed to delete secure value."); } else { prompt_display("Success", "Secure value deleted.", COLOR_TEXT, false, info, ui_draw_title_info, NULL); } }
static void mainmenu_update(ui_view* view, void* data, list_item** items, u32** itemCount, list_item* selected, bool selectedTouched) { if(hidKeysDown() & KEY_START) { ui_pop(); list_destroy(view); return; } if(selected != NULL && (selectedTouched || hidKeysDown() & KEY_A) && selected->data != NULL) { ((void(*)()) selected->data)(); return; } if(*itemCount != &mainmenu_item_count || *items != mainmenu_items) { *itemCount = &mainmenu_item_count; *items = mainmenu_items; } }
static void action_delete_title_update(ui_view* view, void* data, float* progress, char* text) { delete_title_data* deleteData = (delete_title_data*) data; Result res = AM_DeleteTitle(deleteData->info->mediaType, deleteData->info->titleId); ui_pop(); info_destroy(view); if(R_FAILED(res)) { error_display_res(NULL, deleteData->info, ui_draw_title_info, res, "Failed to delete title."); } else { *deleteData->populated = false; prompt_display("Success", "Title deleted.", COLOR_TEXT, false, deleteData->info, NULL, ui_draw_title_info, NULL); } free(data); }
static void action_delete_system_save_data_update(ui_view* view, void* data, float* progress, char* text) { delete_system_save_data_data* deleteData = (delete_system_save_data_data*) data; system_save_data_info* info = (system_save_data_info*) deleteData->selected->data; FS_SystemSaveDataInfo sysInfo = {.mediaType = MEDIATYPE_NAND, .saveId = info->systemSaveDataId}; Result res = FSUSER_DeleteSystemSaveData(sysInfo); ui_pop(); info_destroy(view); if(R_FAILED(res)) { error_display_res(info, ui_draw_system_save_data_info, res, "Failed to delete system save data."); } else { linked_list_remove(deleteData->items, deleteData->selected); task_free_system_save_data(deleteData->selected); prompt_display("Success", "System save data deleted.", COLOR_TEXT, false, NULL, NULL, NULL); } free(data); } static void action_delete_system_save_data_onresponse(ui_view* view, void* data, bool response) { if(response) { info_display("Deleting System Save Data", "", false, data, action_delete_system_save_data_update, action_delete_system_save_data_draw_top); } else { free(data); } } void action_delete_system_save_data(linked_list* items, list_item* selected) { delete_system_save_data_data* data = (delete_system_save_data_data*) calloc(1, sizeof(delete_system_save_data_data)); if(data == NULL) { error_display(NULL, NULL, "Failed to allocate delete system save data data."); return; } data->items = items; data->selected = selected; prompt_display("Confirmation", "Delete the selected system save data?", COLOR_TEXT, true, data, action_delete_system_save_data_draw_top, action_delete_system_save_data_onresponse); }
static void extsavedata_update(ui_view* view, void* data, list_item** items, u32** itemCount, list_item* selected, bool selectedTouched) { extsavedata_data* listData = (extsavedata_data*) data; if(hidKeysDown() & KEY_B) { if(listData->cancelEvent != 0) { svcSignalEvent(listData->cancelEvent); while(svcWaitSynchronization(listData->cancelEvent, 0) == 0) { svcSleepThread(1000000); } listData->cancelEvent = 0; } ui_pop(); list_destroy(view); free(listData); return; } if(!listData->populated || (hidKeysDown() & KEY_X)) { if(listData->cancelEvent != 0) { svcSignalEvent(listData->cancelEvent); while(svcWaitSynchronization(listData->cancelEvent, 0) == 0) { svcSleepThread(1000000); } listData->cancelEvent = 0; } listData->cancelEvent = task_populate_ext_save_data(listData->items, &listData->count, EXTSAVEDATA_MAX); listData->populated = true; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { extsavedata_action_open((ext_save_data_info*) selected->data, &listData->populated); return; } if(*itemCount != &listData->count || *items != listData->items) { *itemCount = &listData->count; *items = listData->items; } }
static void pendingtitles_update(ui_view* view, void* data, list_item** items, u32** itemCount, list_item* selected, bool selectedTouched) { if(hidKeysDown() & KEY_B) { list_destroy(view); ui_pop(); return; } if(hidKeysDown() & KEY_X) { task_refresh_pending_titles(); } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { ui_push(pendingtitles_action_create((pending_title_info*) selected->data)); } if(*itemCount != task_get_pending_title_count() || *items != task_get_pending_titles()) { *itemCount = task_get_pending_title_count(); *items = task_get_pending_titles(); } }
static void action_install_tickets_update(ui_view* view, void* data, float* progress, char* text) { install_tickets_data* installData = (install_tickets_data*) data; if(installData->installInfo.finished) { ui_pop(); info_destroy(view); if(!installData->installInfo.premature) { prompt_display("Success", "Install finished.", COLOR_TEXT, false, installData->base, NULL, ui_draw_file_info, NULL); } action_install_tickets_free_data(installData); return; } if(hidKeysDown() & KEY_B) { svcSignalEvent(installData->cancelEvent); } *progress = installData->installInfo.currTotal != 0 ? (float) ((double) installData->installInfo.currProcessed / (double) installData->installInfo.currTotal) : 0; snprintf(text, PROGRESS_TEXT_MAX, "%lu / %lu\n%.2f MB / %.2f MB", installData->installInfo.processed, installData->installInfo.total, installData->installInfo.currProcessed / 1024.0 / 1024.0, installData->installInfo.currTotal / 1024.0 / 1024.0); }
static void dumpnand_update(ui_view* view, void* data, float* progress, char* text) { data_op_data* dumpData = (data_op_data*) data; if(dumpData->finished) { ui_pop(); info_destroy(view); if(R_SUCCEEDED(dumpData->result)) { prompt_display("Success", "NAND dumped.", COLOR_TEXT, false, NULL, NULL, NULL, NULL); } free(dumpData); return; } if(hidKeysDown() & KEY_B) { svcSignalEvent(dumpData->cancelEvent); } *progress = dumpData->currTotal != 0 ? (float) ((double) dumpData->currProcessed / (double) dumpData->currTotal) : 0; snprintf(text, PROGRESS_TEXT_MAX, "%.2f MiB / %.2f MiB", dumpData->currProcessed / 1024.0f / 1024.0f, dumpData->currTotal / 1024.0f / 1024.0f); }
static void action_launch_title_update(ui_view* view, void* data, float* progress, char* text) { title_info* info = (title_info*) data; Result res = 0; aptOpenSession(); if(R_SUCCEEDED(res = APT_PrepareToDoAppJump(0, info->titleId, info->mediaType))) { u8 buf0[0x300]; u8 buf1[0x20]; res = APT_DoAppJump(0x300, 0x20, buf0, buf1); } aptCloseSession(); if(R_FAILED(res)) { ui_pop(); info_destroy(view); error_display_res(NULL, info, ui_draw_title_info, res, "Failed to launch title."); } }
static void action_import_twl_save_update(ui_view* view, void* data, float* progress, char* text) { import_twl_save_data* importData = (import_twl_save_data*) data; if(importData->importInfo.finished) { ui_pop(); info_destroy(view); if(R_SUCCEEDED(importData->importInfo.result)) { prompt_display("Success", "Save imported.", COLOR_TEXT, false, importData->title, ui_draw_title_info, NULL); } free(data); return; } if(hidKeysDown() & KEY_B) { svcSignalEvent(importData->importInfo.cancelEvent); } *progress = importData->importInfo.currTotal != 0 ? (float) ((double) importData->importInfo.currProcessed / (double) importData->importInfo.currTotal) : 0; snprintf(text, PROGRESS_TEXT_MAX, "%.2f %s / %.2f %s", util_get_display_size(importData->importInfo.currProcessed), util_get_display_size_units(importData->importInfo.currProcessed), util_get_display_size(importData->importInfo.currTotal), util_get_display_size_units(importData->importInfo.currTotal)); }
static void action_install_cdn_update(ui_view* view, void* data, float* progress, char* text) { install_cdn_data* installData = (install_cdn_data*) data; if(installData->installInfo.finished) { ui_pop(); info_destroy(view); Result res = 0; if(R_SUCCEEDED(installData->installInfo.result)) { if(R_SUCCEEDED(res = AM_InstallTitleFinish()) && R_SUCCEEDED(res = AM_CommitImportTitles(((installData->ticket->titleId >> 32) & 0x8010) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD, 1, false, &installData->ticket->titleId))) { util_import_seed(installData->ticket->titleId); if(installData->ticket->titleId == 0x0004013800000002 || installData->ticket->titleId == 0x0004013820000002) { res = AM_InstallFirm(installData->ticket->titleId); } } } if(R_SUCCEEDED(installData->installInfo.result) && R_SUCCEEDED(res)) { if(installData->finishedPrompt) { prompt_display("Success", "Install finished.", COLOR_TEXT, false, installData->ticket, NULL, ui_draw_ticket_info, NULL); } } else { AM_InstallTitleAbort(); if(R_FAILED(res)) { error_display_res(NULL, installData->ticket, ui_draw_ticket_info, res, "Failed to install CDN title."); } } action_install_cdn_free_data(installData); return; }
static void files_action_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { files_action_data* actionData = (files_action_data*) data; if(hidKeysDown() & KEY_B) { ui_pop(); list_destroy(view); free(data); return; } if(selected != NULL && (selected->data != NULL || selected == © || selected == ©_all_contents) && (selectedTouched || (hidKeysDown() & KEY_A))) { void(*action)(linked_list*, list_item*) = (void(*)(linked_list*, list_item*)) selected->data; ui_pop(); list_destroy(view); if(selected == © || selected == ©_all_contents) { file_info* info = (file_info*) actionData->selected->data; Result res = 0; if(R_SUCCEEDED(res = clipboard_set_contents(actionData->parent->archiveId, &actionData->parent->archivePath, info->path, selected == ©_all_contents))) { prompt_display("Success", selected == ©_all_contents ? "Current directory contents copied to clipboard." : info->isDirectory ? "Current directory copied to clipboard." : "File copied to clipboard.", COLOR_TEXT, false, info, NULL, ui_draw_file_info, NULL); } else { error_display_res(NULL, info, ui_draw_file_info, res, "Failed to copy to clipboard."); } } else { action(actionData->items, actionData->selected); } free(data); return; } if(linked_list_size(items) == 0) { file_info* info = (file_info*) actionData->selected->data; if(info->isDirectory) { if(info->containsCias) { linked_list_add(items, &install_all_cias); linked_list_add(items, &install_and_delete_all_cias); linked_list_add(items, &delete_all_cias); } if(info->containsTickets) { linked_list_add(items, &install_all_tickets); linked_list_add(items, &install_and_delete_all_tickets); linked_list_add(items, &delete_all_tickets); } linked_list_add(items, &delete_all_contents); linked_list_add(items, ©_all_contents); linked_list_add(items, &delete_dir); } else { if(info->isCia) { linked_list_add(items, &install_cia); linked_list_add(items, &install_and_delete_cia); } if(info->isTicket) { linked_list_add(items, &install_ticket); linked_list_add(items, &install_and_delete_ticket); } linked_list_add(items, &delete_file); } linked_list_add(items, ©); linked_list_add(items, &paste); } }
static void files_update(ui_view* view, void* data, linked_list* items, list_item* selected, bool selectedTouched) { files_data* listData = (files_data*) data; if(listData->populated) { // Detect whether the current directory was renamed by an action. list_item* currDirItem = linked_list_get(items, 0); if(currDirItem != NULL && strncmp(listData->currDir, ((file_info*) currDirItem->data)->path, FILE_PATH_MAX) != 0) { strncpy(listData->currDir, ((file_info*) currDirItem->data)->path, FILE_PATH_MAX); } } while(!util_is_dir(listData->archive, listData->currDir)) { char parentDir[FILE_PATH_MAX] = {'\0'}; util_get_parent_path(parentDir, listData->currDir, FILE_PATH_MAX); files_navigate(listData, items, parentDir); } if(hidKeysDown() & KEY_B) { if(strncmp(listData->currDir, "/", FILE_PATH_MAX) == 0) { ui_pop(); files_free_data(listData); task_clear_files(items); list_destroy(view); return; } else { char parentDir[FILE_PATH_MAX] = {'\0'}; util_get_parent_path(parentDir, listData->currDir, FILE_PATH_MAX); files_navigate(listData, items, parentDir); } } if(hidKeysDown() & KEY_SELECT) { files_filters_open(listData); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { file_info* fileInfo = (file_info*) selected->data; if((fileInfo->attributes & FS_ATTRIBUTE_DIRECTORY) && strncmp(selected->name, "<current directory>", LIST_ITEM_NAME_MAX) != 0) { files_navigate(listData, items, fileInfo->path); } else { files_action_open(items, selected, listData); return; } } if(!listData->populated || (hidKeysDown() & KEY_X)) { files_repopulate(listData, items); } if(listData->populateData.finished && R_FAILED(listData->populateData.result)) { error_display_res(NULL, NULL, listData->populateData.result, "Failed to populate file list."); listData->populateData.result = 0; } }
static void files_action_update(ui_view* view, void* data, list_item** items, u32** itemCount, list_item* selected, bool selectedTouched) { files_action_data* actionData = (files_action_data*) data; if(hidKeysDown() & KEY_B) { ui_pop(); list_destroy(view); free(data); return; } if(selected != NULL && selected->data != NULL && (selectedTouched || (hidKeysDown() & KEY_A))) { void(*action)(file_info*, bool*) = (void(*)(file_info*, bool*)) selected->data; ui_pop(); list_destroy(view); action(actionData->info, actionData->populated); free(data); return; } if(actionData->info->isDirectory) { if(actionData->info->containsCias && actionData->info->containsTickets) { if(*itemCount != &cia_ticket_directories_action_count || *items != cia_ticket_directories_action_items) { *itemCount = &cia_ticket_directories_action_count; *items = cia_ticket_directories_action_items; } } else if(actionData->info->containsCias) { if(*itemCount != &cia_directories_action_count || *items != cia_directories_action_items) { *itemCount = &cia_directories_action_count; *items = cia_directories_action_items; } } else if(actionData->info->containsTickets) { if(*itemCount != &ticket_directories_action_count || *items != ticket_directories_action_items) { *itemCount = &ticket_directories_action_count; *items = ticket_directories_action_items; } } else { if(*itemCount != &directories_action_count || *items != directories_action_items) { *itemCount = &directories_action_count; *items = directories_action_items; } } } else { if(actionData->info->isCia) { if(*itemCount != &cia_files_action_count || *items != cia_files_action_items) { *itemCount = &cia_files_action_count; *items = cia_files_action_items; } } else if(actionData->info->isTicket) { if(*itemCount != &ticket_files_action_count || *items != ticket_files_action_items) { *itemCount = &ticket_files_action_count; *items = ticket_files_action_items; } } else { if(*itemCount != &files_action_count || *items != files_action_items) { *itemCount = &files_action_count; *items = files_action_items; } } } }