Display title regions.

This commit is contained in:
Steven Smith 2016-07-24 22:54:36 -07:00
parent 81cb06aad7
commit 943418459b
7 changed files with 80 additions and 15 deletions

View File

@ -568,3 +568,40 @@ void util_escape_file_name(char* out, const char* in, size_t size) {
} }
} }
} }
#define SMDH_NUM_REGIONS 7
#define SMDH_ALL_REGIONS 0x7F
static const char* regionStrings[SMDH_NUM_REGIONS] = {
"Japan",
"North America",
"Europe",
"Australia",
"China",
"Korea",
"Taiwan"
};
void util_smdh_region_to_string(char* out, u32 region, size_t size) {
if(out == NULL) {
return;
}
if(region == 0) {
snprintf(out, size, "Unknown");
} else if((region & SMDH_ALL_REGIONS) == SMDH_ALL_REGIONS) {
snprintf(out, size, "Region Free");
} else {
size_t pos = 0;
for(u32 i = 0; i < SMDH_NUM_REGIONS; i++) {
if(region & (1 << i)) {
if(pos > 0) {
pos += snprintf(out + pos, size - pos, ", ");
}
pos += snprintf(out + pos, size - pos, regionStrings[i]);
}
}
}
}

View File

@ -77,3 +77,5 @@ double util_get_display_size(u64 size);
const char* util_get_display_size_units(u64 size); const char* util_get_display_size_units(u64 size);
void util_escape_file_name(char* out, const char* in, size_t size); void util_escape_file_name(char* out, const char* in, size_t size);
void util_smdh_region_to_string(char* out, u32 region, size_t size);

View File

@ -61,6 +61,7 @@ static Result task_populate_ext_save_data_from(populate_ext_save_data_data* data
utf16_to_utf8((uint8_t*) extSaveDataInfo->meta.shortDescription, smdh->titles[systemLanguage].shortDescription, sizeof(extSaveDataInfo->meta.shortDescription) - 1); utf16_to_utf8((uint8_t*) extSaveDataInfo->meta.shortDescription, smdh->titles[systemLanguage].shortDescription, sizeof(extSaveDataInfo->meta.shortDescription) - 1);
utf16_to_utf8((uint8_t*) extSaveDataInfo->meta.longDescription, smdh->titles[systemLanguage].longDescription, sizeof(extSaveDataInfo->meta.longDescription) - 1); utf16_to_utf8((uint8_t*) extSaveDataInfo->meta.longDescription, smdh->titles[systemLanguage].longDescription, sizeof(extSaveDataInfo->meta.longDescription) - 1);
utf16_to_utf8((uint8_t*) extSaveDataInfo->meta.publisher, smdh->titles[systemLanguage].publisher, sizeof(extSaveDataInfo->meta.publisher) - 1); utf16_to_utf8((uint8_t*) extSaveDataInfo->meta.publisher, smdh->titles[systemLanguage].publisher, sizeof(extSaveDataInfo->meta.publisher) - 1);
extSaveDataInfo->meta.region = smdh->region;
extSaveDataInfo->meta.texture = screen_load_texture_tiled_auto(smdh->largeIcon, sizeof(smdh->largeIcon), 48, 48, GPU_RGB565, false); extSaveDataInfo->meta.texture = screen_load_texture_tiled_auto(smdh->largeIcon, sizeof(smdh->largeIcon), 48, 48, GPU_RGB565, false);
} }
} }

View File

@ -78,6 +78,7 @@ Result task_create_file_item(list_item** out, FS_Archive archive, const char* pa
utf16_to_utf8((uint8_t*) fileInfo->ciaInfo.meta.shortDescription, smdh->titles[systemLanguage].shortDescription, sizeof(fileInfo->ciaInfo.meta.shortDescription) - 1); utf16_to_utf8((uint8_t*) fileInfo->ciaInfo.meta.shortDescription, smdh->titles[systemLanguage].shortDescription, sizeof(fileInfo->ciaInfo.meta.shortDescription) - 1);
utf16_to_utf8((uint8_t*) fileInfo->ciaInfo.meta.longDescription, smdh->titles[systemLanguage].longDescription, sizeof(fileInfo->ciaInfo.meta.longDescription) - 1); utf16_to_utf8((uint8_t*) fileInfo->ciaInfo.meta.longDescription, smdh->titles[systemLanguage].longDescription, sizeof(fileInfo->ciaInfo.meta.longDescription) - 1);
utf16_to_utf8((uint8_t*) fileInfo->ciaInfo.meta.publisher, smdh->titles[systemLanguage].publisher, sizeof(fileInfo->ciaInfo.meta.publisher) - 1); utf16_to_utf8((uint8_t*) fileInfo->ciaInfo.meta.publisher, smdh->titles[systemLanguage].publisher, sizeof(fileInfo->ciaInfo.meta.publisher) - 1);
fileInfo->ciaInfo.meta.region = smdh->region;
fileInfo->ciaInfo.meta.texture = screen_load_texture_tiled_auto(smdh->largeIcon, sizeof(smdh->largeIcon), 48, 48, GPU_RGB565, false); fileInfo->ciaInfo.meta.texture = screen_load_texture_tiled_auto(smdh->largeIcon, sizeof(smdh->largeIcon), 48, 48, GPU_RGB565, false);
} }
} }

View File

@ -50,6 +50,7 @@ static Result task_populate_titles_add_ctr(populate_titles_data* data, FS_MediaT
utf16_to_utf8((uint8_t*) titleInfo->meta.shortDescription, smdh->titles[systemLanguage].shortDescription, sizeof(titleInfo->meta.shortDescription) - 1); utf16_to_utf8((uint8_t*) titleInfo->meta.shortDescription, smdh->titles[systemLanguage].shortDescription, sizeof(titleInfo->meta.shortDescription) - 1);
utf16_to_utf8((uint8_t*) titleInfo->meta.longDescription, smdh->titles[systemLanguage].longDescription, sizeof(titleInfo->meta.longDescription) - 1); utf16_to_utf8((uint8_t*) titleInfo->meta.longDescription, smdh->titles[systemLanguage].longDescription, sizeof(titleInfo->meta.longDescription) - 1);
utf16_to_utf8((uint8_t*) titleInfo->meta.publisher, smdh->titles[systemLanguage].publisher, sizeof(titleInfo->meta.publisher) - 1); utf16_to_utf8((uint8_t*) titleInfo->meta.publisher, smdh->titles[systemLanguage].publisher, sizeof(titleInfo->meta.publisher) - 1);
titleInfo->meta.region = smdh->region;
titleInfo->meta.texture = screen_load_texture_tiled_auto(smdh->largeIcon, sizeof(smdh->largeIcon), 48, 48, GPU_RGB565, false); titleInfo->meta.texture = screen_load_texture_tiled_auto(smdh->largeIcon, sizeof(smdh->largeIcon), 48, 48, GPU_RGB565, false);
} }
} }
@ -111,29 +112,29 @@ static Result task_populate_titles_add_twl(populate_titles_data* data, FS_MediaT
u16 version = 0; u16 version = 0;
u64 installedSize = 0; u64 installedSize = 0;
u8 header[0x3B4] = {0};
Result headerRes = FSUSER_GetLegacyRomHeader(mediaType, titleId, header);
AM_TitleEntry entry; AM_TitleEntry entry;
if(R_SUCCEEDED(res = AM_GetTitleInfo(mediaType, 1, &titleId, &entry))) { if(R_SUCCEEDED(res = AM_GetTitleInfo(mediaType, 1, &titleId, &entry))) {
realTitleId = titleId; realTitleId = titleId;
AM_GetTitleProductCode(mediaType, titleId, productCode); AM_GetTitleProductCode(mediaType, titleId, productCode);
version = entry.version; version = entry.version;
installedSize = entry.size; installedSize = entry.size;
} else { } else if(R_SUCCEEDED(res = headerRes)) {
u8 header[0x3B4] = {0}; memcpy(&realTitleId, &header[0x230], sizeof(realTitleId));
if(R_SUCCEEDED(res = FSUSER_GetLegacyRomHeader(mediaType, titleId, header))) { memcpy(productCode, header, sizeof(productCode));
memcpy(&realTitleId, &header[0x230], sizeof(u64));
memcpy(productCode, header, 0x00C);
version = header[0x01E]; version = header[0x01E];
u32 size = 0; u32 size = 0;
if((header[0x012] & 0x2) != 0) { if((header[0x012] & 0x2) != 0) {
memcpy(&size, &header[0x210], sizeof(u32)); memcpy(&size, &header[0x210], sizeof(size));
} else { } else {
memcpy(&size, &header[0x080], sizeof(u32)); memcpy(&size, &header[0x080], sizeof(size));
} }
installedSize = size; installedSize = size;
} }
}
if(R_SUCCEEDED(res)) { if(R_SUCCEEDED(res)) {
list_item* item = (list_item*) calloc(1, sizeof(list_item)); list_item* item = (list_item*) calloc(1, sizeof(list_item));
@ -201,6 +202,12 @@ static Result task_populate_titles_add_twl(populate_titles_data* data, FS_MediaT
} }
} }
if(R_SUCCEEDED(headerRes)) {
memcpy(&titleInfo->meta.region, &header[0x1B0], sizeof(titleInfo->meta.region));
} else {
titleInfo->meta.region = 0;
}
titleInfo->meta.texture = screen_load_texture_auto(icon, sizeof(icon), 32, 32, GPU_RGBA5551, false); titleInfo->meta.texture = screen_load_texture_auto(icon, sizeof(icon), 32, 32, GPU_RGBA5551, false);
} }

View File

@ -10,6 +10,7 @@ typedef struct meta_info_s {
char shortDescription[0x100]; char shortDescription[0x100];
char longDescription[0x200]; char longDescription[0x200];
char publisher[0x100]; char publisher[0x100];
u32 region;
u32 texture; u32 texture;
} meta_info; } meta_info;

View File

@ -454,16 +454,24 @@ void ui_draw_file_info(ui_view* view, void* data, float x1, float y1, float x2,
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Size: %.2f %s\n", util_get_display_size(info->size), util_get_display_size_units(info->size)); infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Size: %.2f %s\n", util_get_display_size(info->size), util_get_display_size_units(info->size));
if(info->isCia) { if(info->isCia) {
char regionString[64];
if(info->ciaInfo.hasMeta) { if(info->ciaInfo.hasMeta) {
ui_draw_meta_info(view, &info->ciaInfo.meta, x1, y1, x2, y2); ui_draw_meta_info(view, &info->ciaInfo.meta, x1, y1, x2, y2);
util_smdh_region_to_string(regionString, info->ciaInfo.meta.region, sizeof(regionString));
} else {
snprintf(regionString, sizeof(regionString), "Unknown");
} }
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos,
"Title ID: %016llX\n" "Title ID: %016llX\n"
"Version: %hu (%d.%d.%d)\n" "Version: %hu (%d.%d.%d)\n"
"Region: %s\n"
"Installed Size: %.2f %s", "Installed Size: %.2f %s",
info->ciaInfo.titleId, info->ciaInfo.titleId,
info->ciaInfo.version, (info->ciaInfo.version >> 10) & 0x3F, (info->ciaInfo.version >> 4) & 0x3F, info->ciaInfo.version & 0xF, info->ciaInfo.version, (info->ciaInfo.version >> 10) & 0x3F, (info->ciaInfo.version >> 4) & 0x3F, info->ciaInfo.version & 0xF,
regionString,
util_get_display_size(info->ciaInfo.installedSize), util_get_display_size_units(info->ciaInfo.installedSize)); util_get_display_size(info->ciaInfo.installedSize), util_get_display_size_units(info->ciaInfo.installedSize));
} else if(info->isTicket) { } else if(info->isTicket) {
infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Ticket ID: %016llX", info->ticketInfo.titleId); infoTextPos += snprintf(infoText + infoTextPos, sizeof(infoText) - infoTextPos, "Ticket ID: %016llX", info->ticketInfo.titleId);
@ -532,8 +540,14 @@ void ui_draw_ticket_info(ui_view* view, void* data, float x1, float y1, float x2
void ui_draw_title_info(ui_view* view, void* data, float x1, float y1, float x2, float y2) { void ui_draw_title_info(ui_view* view, void* data, float x1, float y1, float x2, float y2) {
title_info* info = (title_info*) data; title_info* info = (title_info*) data;
char regionString[64];
if(info->hasMeta) { if(info->hasMeta) {
ui_draw_meta_info(view, &info->meta, x1, y1, x2, y2); ui_draw_meta_info(view, &info->meta, x1, y1, x2, y2);
util_smdh_region_to_string(regionString, info->meta.region, sizeof(regionString));
} else {
snprintf(regionString, sizeof(regionString), "Unknown");
} }
char infoText[512]; char infoText[512];
@ -543,11 +557,13 @@ void ui_draw_title_info(ui_view* view, void* data, float x1, float y1, float x2,
"Media Type: %s\n" "Media Type: %s\n"
"Version: %hu\n" "Version: %hu\n"
"Product Code: %s\n" "Product Code: %s\n"
"Region: %s\n"
"Size: %.2f %s", "Size: %.2f %s",
info->titleId, info->titleId,
info->mediaType == MEDIATYPE_NAND ? "NAND" : info->mediaType == MEDIATYPE_SD ? "SD" : "Game Card", info->mediaType == MEDIATYPE_NAND ? "NAND" : info->mediaType == MEDIATYPE_SD ? "SD" : "Game Card",
info->version, info->version,
info->productCode, info->productCode,
regionString,
util_get_display_size(info->installedSize), util_get_display_size_units(info->installedSize)); util_get_display_size(info->installedSize), util_get_display_size_units(info->installedSize));
float infoWidth; float infoWidth;