diff --git a/source/ui/section/action/installtitledb.c b/source/ui/section/action/installtitledb.c index 08d2cfe..5448c97 100644 --- a/source/ui/section/action/installtitledb.c +++ b/source/ui/section/action/installtitledb.c @@ -8,6 +8,7 @@ #include "../../list.h" #include "../../ui.h" #include "../../../core/linkedlist.h" +#include "../../../core/util.h" static void action_install_titledb_draw_top(ui_view* view, void* data, float x1, float y1, float x2, float y2, u32 index) { ui_draw_titledb_info(view, ((list_item*) data)->data, x1, y1, x2, y2); @@ -18,8 +19,16 @@ static void action_update_titledb_finished(void* data) { } void action_install_titledb(linked_list* items, list_item* selected) { - char url[64]; - snprintf(url, INSTALL_URL_MAX, "https://3ds.titledb.com/v1/%s/%lu/download", ((titledb_info*) selected->data)->type == TITLEDB_TYPE_CIA ? "cia" : "tdsx", ((titledb_info*) selected->data)->id); + titledb_info* info = (titledb_info*) selected->data; - action_install_url("Install the selected title from TitleDB?", url, NULL, selected, action_update_titledb_finished, action_install_titledb_draw_top); + char url[64]; + snprintf(url, INSTALL_URL_MAX, "https://3ds.titledb.com/v1/%s/%lu/download", info->type == TITLEDB_TYPE_CIA ? "cia" : "tdsx", info->id); + + char name[FILE_NAME_MAX]; + util_escape_file_name(name, info->meta.shortDescription, sizeof(name)); + + char path3dsx[FILE_PATH_MAX]; + snprintf(path3dsx, sizeof(path3dsx), "/3ds/%s/%s.3dsx", name, name); + + action_install_url("Install the selected title from TitleDB?", url, path3dsx, selected, action_update_titledb_finished, action_install_titledb_draw_top); } \ No newline at end of file diff --git a/source/ui/section/action/installurl.c b/source/ui/section/action/installurl.c index 9de06da..802bc81 100644 --- a/source/ui/section/action/installurl.c +++ b/source/ui/section/action/installurl.c @@ -231,7 +231,7 @@ static Result action_install_url_open_dst(void* data, u32 index, void* initialRe snprintf(installData->curr3dsxPath, FILE_PATH_MAX, "/3ds/%s/%s.3dsx", name, name); } - if(R_SUCCEEDED(res = util_ensure_dir(sdmcArchive, dir))) { + if(R_SUCCEEDED(res = util_ensure_dir(sdmcArchive, "/3ds/")) && R_SUCCEEDED(res = util_ensure_dir(sdmcArchive, dir))) { FS_Path* path = util_make_path_utf8(installData->curr3dsxPath); if(path != NULL) { res = FSUSER_OpenFileDirectly(handle, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, ""), *path, FS_OPEN_WRITE | FS_OPEN_CREATE, 0); diff --git a/source/ui/section/task/listtitledb.c b/source/ui/section/task/listtitledb.c index 25ffd8c..70e9f99 100644 --- a/source/ui/section/task/listtitledb.c +++ b/source/ui/section/task/listtitledb.c @@ -17,9 +17,32 @@ void task_populate_titledb_update_status(list_item* item) { titledb_info* info = (titledb_info*) item->data; - AM_TitleEntry entry; - info->installed = R_SUCCEEDED(AM_GetTitleInfo(util_get_title_destination(info->titleId), 1, &info->titleId, &entry)); - info->installedVersion = info->installed ? entry.version : (u16) 0; + if(info->type == TITLEDB_TYPE_CIA) { + AM_TitleEntry entry; + info->installed = R_SUCCEEDED(AM_GetTitleInfo(util_get_title_destination(info->titleId), 1, &info->titleId, &entry)); + info->installedVersion = info->installed ? entry.version : (u16) 0; + } else if(info->type == TITLEDB_TYPE_3DSX) { + info->installed = false; + info->installedVersion = 0; + + char name[FILE_NAME_MAX]; + util_escape_file_name(name, info->meta.shortDescription, sizeof(name)); + + char path3dsx[FILE_PATH_MAX]; + snprintf(path3dsx, sizeof(path3dsx), "/3ds/%s/%s.3dsx", name, name); + + FS_Path* fsPath = util_make_path_utf8(path3dsx); + if(fsPath != NULL) { + Handle handle = 0; + if(R_SUCCEEDED(FSUSER_OpenFileDirectly(&handle, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, ""), *fsPath, FS_OPEN_READ, 0))) { + info->installed = true; + + FSFILE_Close(handle); + } + + util_free_path_utf8(fsPath); + } + } if(info->installed) { item->color = COLOR_TITLEDB_INSTALLED; @@ -127,7 +150,7 @@ static void task_populate_titledb_thread(void* arg) { list_item* currItem = (list_item*) linked_list_iter_next(&iter); titledb_info* currTitledbInfo = (titledb_info*) currItem->data; - if(titledbInfo->titleId == currTitledbInfo->titleId) { + if(titledbInfo->titleId == currTitledbInfo->titleId && (titledbInfo->type == TITLEDB_TYPE_CIA || strncmp(titledbInfo->meta.shortDescription, currTitledbInfo->meta.shortDescription, sizeof(titledbInfo->meta.shortDescription)) == 0)) { if(strncmp(titledbInfo->updatedAt, currTitledbInfo->updatedAt, sizeof(titledbInfo->updatedAt)) >= 0) { linked_list_iter_remove(&iter); task_free_titledb(currItem); diff --git a/source/ui/ui.c b/source/ui/ui.c index f4891cc..cbc0aed 100644 --- a/source/ui/ui.c +++ b/source/ui/ui.c @@ -618,15 +618,23 @@ void ui_draw_titledb_info(ui_view* view, void* data, float x1, float y1, float x char infoText[512]; - snprintf(infoText, sizeof(infoText), - "Title ID: %016llX\n" - "Installed Version: %hu (%d.%d.%d)\n" - "Size: %.2f %s\n" - "Updated At: %s %s", - info->titleId, - info->installedVersion, (info->installedVersion >> 10) & 0x3F, (info->installedVersion >> 4) & 0x3F, info->installedVersion & 0xF, - util_get_display_size(info->size), util_get_display_size_units(info->size), - updatedDate, updatedTime); + if(info->type == TITLEDB_TYPE_CIA) { + snprintf(infoText, sizeof(infoText), + "Title ID: %016llX\n" + "Installed Version: %hu (%d.%d.%d)\n" + "Size: %.2f %s\n" + "Updated At: %s %s", + info->titleId, + info->installedVersion, (info->installedVersion >> 10) & 0x3F, (info->installedVersion >> 4) & 0x3F, info->installedVersion & 0xF, + util_get_display_size(info->size), util_get_display_size_units(info->size), + updatedDate, updatedTime); + } else { + snprintf(infoText, sizeof(infoText), + "Size: %.2f %s\n" + "Updated At: %s %s", + util_get_display_size(info->size), util_get_display_size_units(info->size), + updatedDate, updatedTime); + } float infoWidth; screen_get_string_size(&infoWidth, NULL, infoText, 0.5f, 0.5f);