Improve title destination detection.

This commit is contained in:
Steven Smith 2016-09-04 14:04:33 -07:00
parent b973ba2c69
commit 71e670edde
8 changed files with 21 additions and 9 deletions

View File

@ -317,6 +317,15 @@ u32 util_get_seed_response_code() {
return import_response_code;
}
FS_MediaType util_get_title_destination(u64 titleId) {
u16 platform = (u16) ((titleId >> 48) & 0xFFFF);
u16 category = (u16) ((titleId >> 32) & 0xFFFF);
u8 variation = (u8) (titleId & 0xFF);
// DSiWare 3DS DSiWare, System, DLP Application System Title
return platform == 0x0003 || (platform == 0x0004 && ((category & 0x8011) != 0 || (category == 0x0000 && variation == 0x02))) ? MEDIATYPE_NAND : MEDIATYPE_SD;
}
static u32 sigSizes[6] = {0x240, 0x140, 0x80, 0x240, 0x140, 0x80};
u64 util_get_cia_title_id(u8* cia) {

View File

@ -54,6 +54,8 @@ void util_get_parent_path(char* out, const char* path, u32 size);
Result util_import_seed(u64 titleId);
u32 util_get_seed_response_code();
FS_MediaType util_get_title_destination(u64 titleId);
u64 util_get_cia_title_id(u8* cia);
Result util_get_cia_file_smdh(SMDH* smdh, Handle handle);
u64 util_get_ticket_title_id(u8* ticket);

View File

@ -133,7 +133,7 @@ static Result action_install_cdn_close_dst(void* data, u32 index, bool succeeded
} else {
Result res = 0;
if(R_SUCCEEDED(res = AM_InstallContentFinish(handle)) && index == 1 && installData->contentCount > 1 && (installData->ticket->titleId >> 32) == 0x0004008C) {
FS_MediaType dest = (installData->ticket->titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD;
FS_MediaType dest = util_get_title_destination(installData->ticket->titleId);
if(R_SUCCEEDED(res = AM_InstallTitleFinish())
&& R_SUCCEEDED(res = AM_CommitImportTitles(dest, 1, false, &installData->ticket->titleId))
&& R_SUCCEEDED(res = AM_InstallTitleBegin(dest, installData->ticket->titleId, false))) {
@ -181,7 +181,7 @@ static Result action_install_cdn_suspend(void* data, u32 index) {
static Result action_install_cdn_restore(void* data, u32 index) {
install_cdn_data* installData = (install_cdn_data*) data;
return AM_InstallTitleResume((installData->ticket->titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD, installData->ticket->titleId);
return AM_InstallTitleResume(util_get_title_destination(installData->ticket->titleId), installData->ticket->titleId);
}
bool action_install_cdn_error(void* data, u32 index, Result res) {
@ -221,7 +221,7 @@ static void action_install_cdn_update(ui_view* view, void* data, float* progress
if(R_SUCCEEDED(installData->installInfo.result)) {
if(R_SUCCEEDED(res = AM_InstallTitleFinish())
&& R_SUCCEEDED(res = AM_CommitImportTitles((installData->ticket->titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD, 1, false, &installData->ticket->titleId))) {
&& R_SUCCEEDED(res = AM_CommitImportTitles(util_get_title_destination(installData->ticket->titleId), 1, false, &installData->ticket->titleId))) {
util_import_seed(installData->ticket->titleId);
if(installData->ticket->titleId == 0x0004013800000002 || installData->ticket->titleId == 0x0004013820000002) {
@ -256,7 +256,7 @@ static void action_install_cdn_update(ui_view* view, void* data, float* progress
}
static void action_install_cdn_start(install_cdn_data* data) {
FS_MediaType dest = (data->ticket->titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD;
FS_MediaType dest = util_get_title_destination(data->ticket->titleId);
AM_DeleteTitle(dest, data->ticket->titleId);
if(dest == MEDIATYPE_SD) {

View File

@ -122,7 +122,7 @@ static Result action_install_cias_open_dst(void* data, u32 index, void* initialR
u64 titleId = util_get_cia_title_id((u8*) initialReadBlock);
FS_MediaType dest = (titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD;
FS_MediaType dest = util_get_title_destination(titleId);
bool n3ds = false;
if(R_SUCCEEDED(APT_CheckNew3DS(&n3ds)) && !n3ds && ((titleId >> 28) & 0xF) == 2) {

View File

@ -137,7 +137,7 @@ static Result action_url_install_open_dst(void* data, u32 index, void* initialRe
} else if(*(u16*) initialReadBlock == 0x2020) {
u64 titleId = util_get_cia_title_id((u8*) initialReadBlock);
FS_MediaType dest = (titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD;
FS_MediaType dest = util_get_title_destination(titleId);
bool n3ds = false;
if(R_SUCCEEDED(APT_CheckNew3DS(&n3ds)) && !n3ds && ((titleId >> 28) & 0xF) == 2) {

View File

@ -142,7 +142,7 @@ static Result networkinstall_open_dst(void* data, u32 index, void* initialReadBl
} else if(*(u16*) initialReadBlock == 0x2020) {
u64 titleId = util_get_cia_title_id((u8*) initialReadBlock);
FS_MediaType dest = (titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD;
FS_MediaType dest = util_get_title_destination(titleId);
bool n3ds = false;
if(R_SUCCEEDED(APT_CheckNew3DS(&n3ds)) && !n3ds && ((titleId >> 28) & 0xF) == 2) {

View File

@ -68,7 +68,7 @@ Result task_create_file_item(list_item** out, FS_Archive archive, const char* pa
fileInfo->ciaInfo.installedSize = titleEntry.size;
fileInfo->ciaInfo.hasMeta = false;
if((titleEntry.titleID & 0x0000801000000002) != 0 && R_SUCCEEDED(AM_GetCiaFileInfo(MEDIATYPE_NAND, &titleEntry, fileHandle))) {
if(util_get_title_destination(titleEntry.titleID) != MEDIATYPE_SD && R_SUCCEEDED(AM_GetCiaFileInfo(MEDIATYPE_NAND, &titleEntry, fileHandle))) {
fileInfo->ciaInfo.installedSize = titleEntry.size;
}

View File

@ -10,6 +10,7 @@
#include "../../error.h"
#include "../../../core/linkedlist.h"
#include "../../../core/screen.h"
#include "../../../core/util.h"
#include "../../../json/json.h"
#include "../../../stb_image/stb_image.h"
@ -117,7 +118,7 @@ static void task_populate_titledb_thread(void* arg) {
}
AM_TitleEntry entry;
if(R_SUCCEEDED(AM_GetTitleInfo((titledbInfo->titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD, 1, &titledbInfo->titleId, &entry))) {
if(R_SUCCEEDED(AM_GetTitleInfo(util_get_title_destination(titledbInfo->titleId), 1, &titledbInfo->titleId, &entry))) {
item->color = COLOR_INSTALLED;
} else {
item->color = COLOR_NOT_INSTALLED;