static Result action_url_install_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { url_install_data* installData = (url_install_data*) data; Result res = 0; installData->responseCode = 0; installData->ticket = false; installData->currTitleId = 0; installData->n3dsContinue = false; memset(&installData->ticketInfo, 0, sizeof(installData->ticketInfo)); if(*(u16*) initialReadBlock == 0x0100) { if(!installData->cdnDecided) { ui_view* view = prompt_display("Optional", "Install ticket titles from CDN?", COLOR_TEXT, true, data, NULL, action_url_install_cdn_check_onresponse); if(view != NULL) { svcWaitSynchronization(view->active, U64_MAX); } } installData->ticket = true; installData->ticketInfo.titleId = util_get_ticket_title_id((u8*) initialReadBlock); AM_DeleteTicket(installData->ticketInfo.titleId); res = AM_InstallTicketBegin(handle); } else if(*(u16*) initialReadBlock == 0x2020) { u64 titleId = util_get_cia_title_id((u8*) initialReadBlock); FS_MediaType dest = (titleId & 0x0000801000000002) != 0 ? MEDIATYPE_NAND : MEDIATYPE_SD; bool n3ds = false; if(R_SUCCEEDED(APT_CheckNew3DS(&n3ds)) && !n3ds && ((titleId >> 28) & 0xF) == 2) { ui_view* view = prompt_display("Confirmation", "Title is intended for New 3DS systems.\nContinue?", COLOR_TEXT, true, data, NULL, action_url_install_n3ds_onresponse); if(view != NULL) { svcWaitSynchronization(view->active, U64_MAX); } if(!installData->n3dsContinue) { return R_FBI_WRONG_SYSTEM; } } // Deleting FBI before it reinstalls itself causes issues. if(((titleId >> 8) & 0xFFFFF) != 0xF8001) { AM_DeleteTitle(dest, titleId); AM_DeleteTicket(titleId); if(dest == MEDIATYPE_SD) { AM_QueryAvailableExternalTitleDatabase(NULL); } } if(R_SUCCEEDED(res = AM_StartCiaInstall(dest, handle))) { installData->currTitleId = titleId; } } else {
void InstallTicket(std::string FullPath, std::string TitleId) { Handle hTik; u32 writtenbyte; std::string curr = get_file_contents(FullPath.c_str()); // Remove the ticket incase there was a bad one previously installed char* nTitleId = parse_string(TitleId); u64 titleId = u8_to_u64((u8*)nTitleId, BIG_ENDIAN); free (nTitleId); AM_DeleteTicket(titleId); // Install new ticket AM_InstallTicketBegin(&hTik); FSFILE_Write(hTik, &writtenbyte, 0, curr.c_str(), 0x100000, 0); AM_InstallTicketFinish(hTik); printf("Ticket Installed."); //delete temp ticket, ticket folder still exists... ugly. later stream directly to the handle remove(FullPath.c_str()); }
static Result action_install_tickets_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { return AM_InstallTicketBegin(handle); }