mirror of
https://gitlab.com/Theopse/fbi-i18n-zh.git
synced 2025-06-21 22:49:18 +08:00
Automatically determine appropriate CIA destination.
This commit is contained in:
parent
b4c70f0bb6
commit
b384008bb1
@ -8,7 +8,7 @@
|
||||
#include "section/section.h"
|
||||
#include "../screen.h"
|
||||
|
||||
#define MAINMENU_ITEM_COUNT 13
|
||||
#define MAINMENU_ITEM_COUNT 12
|
||||
|
||||
static u32 mainmenu_item_count = MAINMENU_ITEM_COUNT;
|
||||
static list_item mainmenu_items[MAINMENU_ITEM_COUNT] = {
|
||||
@ -23,8 +23,7 @@ static list_item mainmenu_items[MAINMENU_ITEM_COUNT] = {
|
||||
{"Tickets", COLOR_TEXT, tickets_open},
|
||||
{"Ext Save Data", COLOR_TEXT, extsavedata_open},
|
||||
{"System Save Data", COLOR_TEXT, systemsavedata_open},
|
||||
{"Network Install to SD", COLOR_TEXT, networkinstall_open_sd},
|
||||
{"Network Install to NAND", COLOR_TEXT, networkinstall_open_nand},
|
||||
{"Network Install", COLOR_TEXT, networkinstall_open},
|
||||
};
|
||||
|
||||
static void mainmenu_draw_top(ui_view* view, void* data, float x1, float y1, float x2, float y2, list_item* selected) {
|
||||
|
@ -9,10 +9,8 @@ void action_delete_ext_save_data(ext_save_data_info* info, bool* populated);
|
||||
void action_browse_system_save_data(system_save_data_info* info, bool* populated);
|
||||
void action_delete_system_save_data(system_save_data_info* info, bool* populated);
|
||||
|
||||
void action_install_cias_nand(file_info* info, bool* populated);
|
||||
void action_install_cias_sd(file_info* info, bool* populated);
|
||||
void action_install_cias_delete_nand(file_info* info, bool* populated);
|
||||
void action_install_cias_delete_sd(file_info* info, bool* populated);
|
||||
void action_install_cias(file_info* info, bool* populated);
|
||||
void action_install_cias_delete(file_info* info, bool* populated);
|
||||
void action_copy_contents(file_info* info, bool* populated);
|
||||
void action_delete_contents(file_info* info, bool* populated);
|
||||
void action_delete_dir_contents(file_info* info, bool* populated);
|
||||
|
@ -14,7 +14,6 @@
|
||||
|
||||
typedef struct {
|
||||
file_info* base;
|
||||
FS_MediaType dest;
|
||||
bool delete;
|
||||
bool* populated;
|
||||
Handle currHandle;
|
||||
@ -142,7 +141,7 @@ static void action_install_cias_update(ui_view* view, void* data, float* progres
|
||||
if(R_SUCCEEDED(res = FSFILE_GetSize(installData->currHandle, &size))) {
|
||||
installData->currTotal = size;
|
||||
|
||||
installData->installCancelEvent = task_install_cia(&installData->installResult, installData->dest, installData->currTotal, installData, action_install_cias_read);
|
||||
installData->installCancelEvent = task_install_cia(&installData->installResult, installData->currTotal, installData, action_install_cias_read);
|
||||
if(installData->installCancelEvent == 0) {
|
||||
ui_pop();
|
||||
progressbar_destroy(view);
|
||||
@ -192,10 +191,9 @@ static void action_install_cias_onresponse(ui_view* view, void* data, bool respo
|
||||
}
|
||||
}
|
||||
|
||||
static void action_install_cias(file_info* info, bool* populated, FS_MediaType mediaType, bool delete) {
|
||||
static void action_install_cias_internal(file_info* info, bool* populated, bool delete) {
|
||||
install_cias_data* data = (install_cias_data*) calloc(1, sizeof(install_cias_data));
|
||||
data->base = info;
|
||||
data->dest = mediaType;
|
||||
data->delete = delete;
|
||||
data->populated = populated;
|
||||
data->installStarted = false;
|
||||
@ -214,18 +212,10 @@ static void action_install_cias(file_info* info, bool* populated, FS_MediaType m
|
||||
ui_push(prompt_create("Confirmation", "Install the selected CIA(s)?", COLOR_TEXT, true, data, NULL, action_install_cias_draw_top, action_install_cias_onresponse));
|
||||
}
|
||||
|
||||
void action_install_cias_nand(file_info* info, bool* populated) {
|
||||
action_install_cias(info, populated, MEDIATYPE_NAND, false);
|
||||
void action_install_cias(file_info* info, bool* populated) {
|
||||
action_install_cias_internal(info, populated, false);
|
||||
}
|
||||
|
||||
void action_install_cias_sd(file_info* info, bool* populated) {
|
||||
action_install_cias(info, populated, MEDIATYPE_SD, false);
|
||||
}
|
||||
|
||||
void action_install_cias_delete_nand(file_info* info, bool* populated) {
|
||||
action_install_cias(info, populated, MEDIATYPE_NAND, true);
|
||||
}
|
||||
|
||||
void action_install_cias_delete_sd(file_info* info, bool* populated) {
|
||||
action_install_cias(info, populated, MEDIATYPE_SD, true);
|
||||
void action_install_cias_delete(file_info* info, bool* populated) {
|
||||
action_install_cias_internal(info, populated, true);
|
||||
}
|
@ -36,14 +36,12 @@ static list_item files_action_items[FILES_ACTION_COUNT] = {
|
||||
{"Paste", COLOR_TEXT, action_paste_contents},
|
||||
};
|
||||
|
||||
#define CIA_FILES_ACTION_COUNT 7
|
||||
#define CIA_FILES_ACTION_COUNT 5
|
||||
|
||||
static u32 cia_files_action_count = CIA_FILES_ACTION_COUNT;
|
||||
static list_item cia_files_action_items[CIA_FILES_ACTION_COUNT] = {
|
||||
{"Install CIA to SD", COLOR_TEXT, action_install_cias_sd},
|
||||
{"Install CIA to NAND", COLOR_TEXT, action_install_cias_nand},
|
||||
{"Install CIA to SD and delete", COLOR_TEXT, action_install_cias_delete_sd},
|
||||
{"Install CIA to NAND and delete", COLOR_TEXT, action_install_cias_delete_nand},
|
||||
{"Install CIA", COLOR_TEXT, action_install_cias},
|
||||
{"Install and delete CIA", COLOR_TEXT, action_install_cias_delete},
|
||||
{"Delete", COLOR_TEXT, action_delete_contents},
|
||||
{"Copy", COLOR_TEXT, action_copy_contents},
|
||||
{"Paste", COLOR_TEXT, action_paste_contents},
|
||||
@ -59,14 +57,12 @@ static list_item directories_action_items[DIRECTORIES_ACTION_COUNT] = {
|
||||
{"Paste", COLOR_TEXT, action_paste_contents},
|
||||
};
|
||||
|
||||
#define CIA_DIRECTORIES_ACTION_COUNT 9
|
||||
#define CIA_DIRECTORIES_ACTION_COUNT 7
|
||||
|
||||
static u32 cia_directories_action_count = CIA_DIRECTORIES_ACTION_COUNT;
|
||||
static list_item cia_directories_action_items[CIA_DIRECTORIES_ACTION_COUNT] = {
|
||||
{"Install all CIAs to SD", COLOR_TEXT, action_install_cias_sd},
|
||||
{"Install all CIAs to NAND", COLOR_TEXT, action_install_cias_nand},
|
||||
{"Install all CIAs to SD and delete", COLOR_TEXT, action_install_cias_delete_sd},
|
||||
{"Install all CIAs to NAND and delete", COLOR_TEXT, action_install_cias_delete_nand},
|
||||
{"Install all CIAs", COLOR_TEXT, action_install_cias},
|
||||
{"Install and delete all CIAs", COLOR_TEXT, action_install_cias_delete},
|
||||
{"Delete all CIAs", COLOR_TEXT, action_delete_dir_cias},
|
||||
{"Delete all contents", COLOR_TEXT, action_delete_dir_contents},
|
||||
{"Delete", COLOR_TEXT, action_delete_contents},
|
||||
|
@ -18,7 +18,6 @@
|
||||
#include "section.h"
|
||||
|
||||
typedef struct {
|
||||
FS_MediaType dest;
|
||||
int serverSocket;
|
||||
int clientSocket;
|
||||
bool installStarted;
|
||||
@ -165,7 +164,7 @@ static void networkinstall_install_update(ui_view* view, void* data, float* prog
|
||||
}
|
||||
|
||||
networkInstallData->currTotal = __builtin_bswap64(networkInstallData->currTotal);
|
||||
networkInstallData->installCancelEvent = task_install_cia(&networkInstallData->installResult, networkInstallData->dest, networkInstallData->currTotal, networkInstallData, networkinstall_read);
|
||||
networkInstallData->installCancelEvent = task_install_cia(&networkInstallData->installResult, networkInstallData->currTotal, networkInstallData, networkinstall_read);
|
||||
if(networkInstallData->installCancelEvent == 0) {
|
||||
ui_pop();
|
||||
progressbar_destroy(view);
|
||||
@ -245,7 +244,7 @@ static void networkinstall_wait_draw_bottom(ui_view* view, void* data, float x1,
|
||||
screen_draw_string(text, textX, textY, 0.5f, 0.5f, COLOR_TEXT, false);
|
||||
}
|
||||
|
||||
void networkinstall_open(FS_MediaType dest) {
|
||||
void networkinstall_open() {
|
||||
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
|
||||
if(sock < 0) {
|
||||
error_display_errno(NULL, NULL, errno, "Failed to open server socket.");
|
||||
@ -274,7 +273,6 @@ void networkinstall_open(FS_MediaType dest) {
|
||||
}
|
||||
|
||||
network_install_data* data = (network_install_data*) calloc(1, sizeof(network_install_data));
|
||||
data->dest = dest;
|
||||
data->serverSocket = sock;
|
||||
data->clientSocket = 0;
|
||||
data->installStarted = false;
|
||||
@ -294,12 +292,4 @@ void networkinstall_open(FS_MediaType dest) {
|
||||
view->drawTop = NULL;
|
||||
view->drawBottom = networkinstall_wait_draw_bottom;
|
||||
ui_push(view);
|
||||
}
|
||||
|
||||
void networkinstall_open_sd() {
|
||||
networkinstall_open(MEDIATYPE_SD);
|
||||
}
|
||||
|
||||
void networkinstall_open_nand() {
|
||||
networkinstall_open(MEDIATYPE_NAND);
|
||||
}
|
@ -10,9 +10,7 @@ void files_open_ctr_nand();
|
||||
void files_open_twl_nand();
|
||||
void files_open_twl_photo();
|
||||
void files_open_twl_sound();
|
||||
void networkinstall_open(FS_MediaType dest);
|
||||
void networkinstall_open_sd();
|
||||
void networkinstall_open_nand();
|
||||
void networkinstall_open();
|
||||
void pendingtitles_open();
|
||||
void systemsavedata_open();
|
||||
void tickets_open();
|
||||
|
@ -14,7 +14,6 @@
|
||||
|
||||
typedef struct {
|
||||
install_cia_result* result;
|
||||
FS_MediaType dest;
|
||||
u64 size;
|
||||
void* data;
|
||||
Result (*read)(void* data, u32* bytesRead, void* buffer, u32 size);
|
||||
@ -86,9 +85,7 @@ static void task_install_cia_thread(void* arg) {
|
||||
u32 certSize = *(u32*) &buffer[0x08];
|
||||
titleId = bswap_64(*(u64*) &buffer[align(headerSize, 64) + align(certSize, 64) + 0x1DC]);
|
||||
|
||||
if((titleId >> 32) & 0x8000) {
|
||||
data->dest = MEDIATYPE_NAND;
|
||||
}
|
||||
FS_MediaType dest = ((titleId >> 32) & 0x8010) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD;
|
||||
|
||||
u8 n3ds = false;
|
||||
if(R_SUCCEEDED(APT_CheckNew3DS(&n3ds)) && !n3ds && ((titleId >> 28) & 0xF) == 2) {
|
||||
@ -96,12 +93,11 @@ static void task_install_cia_thread(void* arg) {
|
||||
break;
|
||||
}
|
||||
|
||||
// TODO: Does this fix?
|
||||
AM_DeleteTitle(data->dest, titleId);
|
||||
AM_DeleteTitle(dest, titleId);
|
||||
AM_DeleteTicket(titleId);
|
||||
AM_QueryAvailableExternalTitleDatabase(NULL);
|
||||
|
||||
if(R_FAILED(data->result->result = AM_StartCiaInstall(data->dest, &ciaHandle))) {
|
||||
if(R_FAILED(data->result->result = AM_StartCiaInstall(dest, &ciaHandle))) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -138,14 +134,13 @@ static void task_install_cia_thread(void* arg) {
|
||||
free(data);
|
||||
}
|
||||
|
||||
Handle task_install_cia(install_cia_result* result, FS_MediaType dest, u64 size, void* data, Result (*read)(void* data, u32* bytesRead, void* buffer, u32 size)) {
|
||||
Handle task_install_cia(install_cia_result* result, u64 size, void* data, Result (*read)(void* data, u32* bytesRead, void* buffer, u32 size)) {
|
||||
if(result == NULL || size == 0 || read == NULL) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
install_cia_data* installData = (install_cia_data*) calloc(1, sizeof(install_cia_data));
|
||||
installData->result = result;
|
||||
installData->dest = dest;
|
||||
installData->size = size;
|
||||
installData->data = data;
|
||||
installData->read = read;
|
||||
|
@ -84,4 +84,4 @@ Handle task_populate_pending_titles(list_item* items, u32* count, u32 max);
|
||||
Handle task_populate_system_save_data(list_item* items, u32* count, u32 max);
|
||||
Handle task_populate_tickets(list_item* items, u32* count, u32 max);
|
||||
Handle task_populate_titles(list_item* items, u32* count, u32 max);
|
||||
Handle task_install_cia(install_cia_result* result, FS_MediaType dest, u64 size, void* data, Result (*read)(void* data, u32* bytesRead, void* buffer, u32 size));
|
||||
Handle task_install_cia(install_cia_result* result, u64 size, void* data, Result (*read)(void* data, u32* bytesRead, void* buffer, u32 size));
|
Loading…
x
Reference in New Issue
Block a user