diff --git a/source/core/util.c b/source/core/util.c index c08dfb5..3215c3f 100644 --- a/source/core/util.c +++ b/source/core/util.c @@ -527,14 +527,14 @@ Result util_close_archive(FS_Archive archive) { } const char* util_get_display_eta(u32 seconds) { - static char disp[9]; + static char disp[12]; u8 hours = seconds / 3600; seconds -= hours * 3600; u8 minutes = seconds / 60; seconds -= minutes* 60; - snprintf(disp, 9, "%02u:%02u:%02u", hours, minutes, (u8) seconds); + snprintf(disp, 12, "%02u:%02u:%02u", hours, minutes, (u8) seconds); return disp; } diff --git a/source/ui/section/action/installcdn.c b/source/ui/section/action/installcdn.c index e62f563..5ba51c1 100644 --- a/source/ui/section/action/installcdn.c +++ b/source/ui/section/action/installcdn.c @@ -19,6 +19,7 @@ #define CONTENTS_MAX 256 typedef struct { + list_item* item; ticket_info* ticket; volatile bool* done; bool finishedPrompt; @@ -220,6 +221,10 @@ static void action_install_cdn_update(ui_view* view, void* data, float* progress if(R_SUCCEEDED(installData->installInfo.result) && R_SUCCEEDED(res)) { if(installData->finishedPrompt) { + if(installData->item != NULL) { + task_populate_tickets_update_use(installData->item); + } + prompt_display_notify("Success", "Install finished.", COLOR_TEXT, installData->ticket, ui_draw_ticket_info, NULL); } } else { @@ -291,7 +296,7 @@ static void action_install_cdn_version_onresponse(ui_view* view, void* data, Swk } } -void action_install_cdn_noprompt(volatile bool* done, ticket_info* info, bool finishedPrompt, bool promptVersion) { +void action_install_cdn_noprompt_internal(volatile bool* done, ticket_info* info, bool finishedPrompt, bool promptVersion, list_item* item) { install_cdn_data* data = (install_cdn_data*) calloc(1, sizeof(install_cdn_data)); if(data == NULL) { error_display(NULL, NULL, "Failed to allocate install CDN data."); @@ -299,6 +304,7 @@ void action_install_cdn_noprompt(volatile bool* done, ticket_info* info, bool fi return; } + data->item = item; data->ticket = info; data->done = done; data->finishedPrompt = finishedPrompt; @@ -349,18 +355,24 @@ void action_install_cdn_noprompt(volatile bool* done, ticket_info* info, bool fi } } +void action_install_cdn_noprompt(volatile bool* done, ticket_info* info, bool finishedPrompt, bool promptVersion) { + action_install_cdn_noprompt_internal(done, info, finishedPrompt, promptVersion, NULL); +} + #define CDN_PROMPT_DEFAULT_VERSION 0 #define CDN_PROMPT_SELECT_VERSION 1 #define CDN_PROMPT_NO 2 static void action_install_cdn_onresponse(ui_view* view, void* data, u32 response) { if(response != CDN_PROMPT_NO) { - action_install_cdn_noprompt(NULL, (ticket_info*) data, true, response == CDN_PROMPT_SELECT_VERSION); + list_item* item = (list_item*) data; + + action_install_cdn_noprompt_internal(NULL, (ticket_info*) item->data, true, response == CDN_PROMPT_SELECT_VERSION, item); } } void action_install_cdn(linked_list* items, list_item* selected) { static const char* options[3] = {"Default\nVersion", "Select\nVersion", "No"}; static u32 optionButtons[3] = {KEY_A, KEY_X, KEY_B}; - prompt_display_multi_choice("Confirmation", "Install the selected title from the CDN?", COLOR_TEXT, options, optionButtons, 3, selected->data, ui_draw_ticket_info, action_install_cdn_onresponse); + prompt_display_multi_choice("Confirmation", "Install the selected title from the CDN?", COLOR_TEXT, options, optionButtons, 3, selected, ui_draw_ticket_info, action_install_cdn_onresponse); } \ No newline at end of file diff --git a/source/ui/section/task/listtickets.c b/source/ui/section/task/listtickets.c index d347363..83d3651 100644 --- a/source/ui/section/task/listtickets.c +++ b/source/ui/section/task/listtickets.c @@ -18,6 +18,26 @@ static int task_populate_tickets_compare_ids(const void* e1, const void* e2) { return id1 > id2 ? 1 : id1 < id2 ? -1 : 0; } +void task_populate_tickets_update_use(list_item* item) { + if(item == NULL) { + return; + } + + ticket_info* info = (ticket_info*) item->data; + + info->inUse = false; + + AM_TitleEntry entry; + for(FS_MediaType mediaType = MEDIATYPE_NAND; mediaType != MEDIATYPE_GAME_CARD; mediaType++) { + if(R_SUCCEEDED(AM_GetTitleInfo(mediaType, 1, &info->titleId, &entry))) { + info->inUse = true; + break; + } + } + + item->color = info->inUse ? COLOR_TICKET_IN_USE : COLOR_TICKET_NOT_IN_USE; +} + static void task_populate_tickets_thread(void* arg) { populate_tickets_data* data = (populate_tickets_data*) arg; @@ -41,20 +61,12 @@ static void task_populate_tickets_thread(void* arg) { ticket_info* ticketInfo = (ticket_info*) calloc(1, sizeof(ticket_info)); if(ticketInfo != NULL) { ticketInfo->titleId = ticketIds[i]; - ticketInfo->inUse = false; - - AM_TitleEntry entry; - for(FS_MediaType mediaType = MEDIATYPE_NAND; mediaType != MEDIATYPE_GAME_CARD; mediaType++) { - if(R_SUCCEEDED(AM_GetTitleInfo(mediaType, 1, &ticketInfo->titleId, &entry))) { - ticketInfo->inUse = true; - break; - } - } snprintf(item->name, LIST_ITEM_NAME_MAX, "%016llX", ticketIds[i]); - item->color = ticketInfo->inUse ? COLOR_TICKET_IN_USE : COLOR_TICKET_NOT_IN_USE; item->data = ticketInfo; + task_populate_tickets_update_use(item); + linked_list_add(data->items, item); } else { free(item); diff --git a/source/ui/section/task/task.h b/source/ui/section/task/task.h index aa9a528..166bfff 100644 --- a/source/ui/section/task/task.h +++ b/source/ui/section/task/task.h @@ -250,6 +250,7 @@ void task_free_system_save_data(list_item* item); void task_clear_system_save_data(linked_list* items); Result task_populate_system_save_data(populate_system_save_data_data* data); +void task_populate_tickets_update_use(list_item* item); void task_free_ticket(list_item* item); void task_clear_tickets(linked_list* items); Result task_populate_tickets(populate_tickets_data* data);