From 3ff6d55e2eed8dbf1a2187e764719738fc1b28ff Mon Sep 17 00:00:00 2001 From: Steven Smith Date: Fri, 23 Feb 2018 09:46:39 -0800 Subject: [PATCH] Update TitleDB cache when installing from FBI updater. --- source/fbi/action/installtitledb.c | 3 +- source/fbi/action/updatetitledb.c | 3 +- source/fbi/task/listtitledb.c | 10 +++--- source/fbi/task/listtitledb.h | 2 +- source/fbi/update.c | 52 ++++++++++++++++++++++++------ 5 files changed, 52 insertions(+), 18 deletions(-) diff --git a/source/fbi/action/installtitledb.c b/source/fbi/action/installtitledb.c index 25d763a..b2b86d7 100644 --- a/source/fbi/action/installtitledb.c +++ b/source/fbi/action/installtitledb.c @@ -25,8 +25,9 @@ static void action_install_titledb_draw_top(ui_view* view, void* data, float x1, static void action_install_titledb_finished_url(void* data, u32 index) { install_titledb_data* installData = (install_titledb_data*) data; list_item* item = installData->selected; + titledb_info* info = (titledb_info*) item->data; - task_populate_titledb_cache_installed((titledb_info*) item->data, installData->cia); + task_populate_titledb_cache_installed(info->id, installData->cia ? info->cia.id : info->tdsx.id, installData->cia); task_populate_titledb_update_status(item); } diff --git a/source/fbi/action/updatetitledb.c b/source/fbi/action/updatetitledb.c index bd20ebd..98b8758 100644 --- a/source/fbi/action/updatetitledb.c +++ b/source/fbi/action/updatetitledb.c @@ -31,8 +31,9 @@ static void action_update_titledb_draw_top(ui_view* view, void* data, float x1, static void action_update_titledb_finished_url(void* data, u32 index) { update_titledb_data* updateData = (update_titledb_data*) data; list_item* item = updateData->items[index]; + titledb_info* info = (titledb_info*) item->data; - task_populate_titledb_cache_installed((titledb_info*) item->data, updateData->cia[index]); + task_populate_titledb_cache_installed(info->id, updateData->cia[index] ? info->cia.id : info->tdsx.id, updateData->cia[index]); task_populate_titledb_update_status(item); } diff --git a/source/fbi/task/listtitledb.c b/source/fbi/task/listtitledb.c index 46994e8..359914d 100644 --- a/source/fbi/task/listtitledb.c +++ b/source/fbi/task/listtitledb.c @@ -77,13 +77,13 @@ static json_t* task_populate_titledb_get_cache_entry(u32 id) { } } -void task_populate_titledb_cache_installed(titledb_info* info, bool cia) { - json_t* cache = task_populate_titledb_get_cache_entry(info->id); +void task_populate_titledb_cache_installed(u32 id, u32 subId, bool cia) { + json_t* cache = task_populate_titledb_get_cache_entry(id); if(json_is_object(cache)) { if(cia) { - json_object_set(cache, "cia_id", json_integer(info->cia.id)); + json_object_set(cache, "cia_id", json_integer(subId)); } else { - json_object_set(cache, "tdsx_id", json_integer(info->tdsx.id)); + json_object_set(cache, "tdsx_id", json_integer(subId)); } task_populate_titledb_save_cache(); @@ -188,8 +188,6 @@ static void task_populate_titledb_thread(void* arg) { titledbInfo->headline[0] = '\0'; } - - json_t* cias = json_object_get(entry, "cia"); if(json_is_array(cias)) { for(u32 j = 0; j < json_array_size(cias); j++) { diff --git a/source/fbi/task/listtitledb.h b/source/fbi/task/listtitledb.h index 83536fd..89d44a3 100644 --- a/source/fbi/task/listtitledb.h +++ b/source/fbi/task/listtitledb.h @@ -62,7 +62,7 @@ typedef struct populate_titledb_data_s { } populate_titledb_data; void task_populate_titledb_unload_cache(); -void task_populate_titledb_cache_installed(titledb_info* info, bool cia); +void task_populate_titledb_cache_installed(u32 id, u32 subId, bool cia); void task_populate_titledb_update_status(list_item* item); void task_free_titledb(list_item* item); diff --git a/source/fbi/update.c b/source/fbi/update.c index 4b23612..17ffda1 100644 --- a/source/fbi/update.c +++ b/source/fbi/update.c @@ -11,23 +11,45 @@ #include "task/uitask.h" #include "../core/core.h" +typedef struct { + u32 id; + u32 subId; + bool cia; +} update_data; + +static void update_finished_url(void* data, u32 index) { + update_data* updateData = (update_data*) data; + + task_populate_titledb_cache_installed(updateData->id, updateData->subId, updateData->cia); +} + +static void update_finished_all(void* data) { + free(data); +} + static void update_check_update(ui_view* view, void* data, float* progress, char* text) { + update_data* updateData = (update_data*) data; + bool hasUpdate = false; char updateURL[DOWNLOAD_URL_MAX]; Result res = 0; json_t* json = NULL; - if(R_SUCCEEDED(res = http_download_json("https://api.titledb.com/v1/entry?nested=true&only=cia.id&only=cia.version&only=tdsx.id&only=tdsx.version&_filters=%7B%22name%22%3A%20%22FBI%22%7D", &json, 16 * 1024))) { + if(R_SUCCEEDED(res = http_download_json("https://api.titledb.com/v1/entry?nested=true&only=id&only=cia.id&only=cia.version&only=tdsx.id&only=tdsx.version&_filters=%7B%22name%22%3A%20%22FBI%22%7D", &json, 16 * 1024))) { const char* type = fs_get_3dsx_path() != NULL ? "tdsx" : "cia"; json_t* entry = NULL; + json_t* idJson = NULL; json_t* objs = NULL; if(json_is_array(json) && json_array_size(json) == 1 && json_is_object(entry = json_array_get(json, 0)) + && json_is_integer(idJson = json_object_get(entry, "id")) && json_is_array(objs = json_object_get(entry, type))) { if(json_array_size(json) > 0) { - u32 latestId = 0; + updateData->id = (u32) json_integer_value(idJson); + + u32 latestSubId = 0; u32 latestMajor = 0; u32 latestMinor = 0; u32 latestMicro = 0; @@ -35,10 +57,10 @@ static void update_check_update(ui_view* view, void* data, float* progress, char for(u32 i = 0; i < json_array_size(objs); i++) { json_t* obj = json_array_get(objs, i); if(json_is_object(obj)) { - json_t* idJson = json_object_get(obj, "id"); + json_t* subIdJson = json_object_get(obj, "id"); json_t* versionJson = json_object_get(obj, "version"); - if(json_is_integer(idJson) && json_is_string(versionJson)) { - u32 id = (u32) json_integer_value(idJson); + if(json_is_integer(subIdJson) && json_is_string(versionJson)) { + u32 subId = (u32) json_integer_value(subIdJson); const char* version = json_string_value(versionJson); u32 major = 0; @@ -49,7 +71,7 @@ static void update_check_update(ui_view* view, void* data, float* progress, char if(major > latestMajor || (major == latestMajor && minor > latestMinor) || (major == latestMajor && minor == latestMinor && micro > latestMicro)) { - latestId = id; + latestSubId = subId; latestMajor = major; latestMinor = minor; latestMicro = micro; @@ -58,10 +80,13 @@ static void update_check_update(ui_view* view, void* data, float* progress, char } } + updateData->subId = latestSubId; + updateData->cia = fs_get_3dsx_path() != NULL; + if(latestMajor > VERSION_MAJOR || (latestMajor == VERSION_MAJOR && latestMinor > VERSION_MINOR) || (latestMajor == VERSION_MAJOR && latestMinor == VERSION_MINOR && latestMicro > VERSION_MICRO)) { - snprintf(updateURL, DOWNLOAD_URL_MAX, "https://3ds.titledb.com/v1/%s/%lu/download", type, latestId); + snprintf(updateURL, DOWNLOAD_URL_MAX, "https://3ds.titledb.com/v1/%s/%lu/download", type, latestSubId); hasUpdate = true; } } @@ -76,16 +101,25 @@ static void update_check_update(ui_view* view, void* data, float* progress, char info_destroy(view); if(hasUpdate) { - action_install_url("Update FBI to the latest version?", updateURL, fs_get_3dsx_path(), NULL, NULL, NULL, NULL); + action_install_url("Update FBI to the latest version?", updateURL, fs_get_3dsx_path(), updateData, update_finished_url, update_finished_all, NULL); } else { if(R_FAILED(res)) { error_display_res(NULL, NULL, res, "Failed to check for update."); } else { prompt_display_notify("Success", "No updates available.", COLOR_TEXT, NULL, NULL, NULL); } + + free(updateData); } } void update_open() { - info_display("Checking For Updates", "", false, NULL, update_check_update, NULL); + update_data* data = (update_data*) calloc(1, sizeof(update_data)); + if(data == NULL) { + error_display(NULL, NULL, "Failed to allocate update data."); + + return; + } + + info_display("Checking For Updates", "", false, data, update_check_update, NULL); }