diff --git a/source/core/spi.c b/source/core/spi.c index 6691a1a..a62e1ea 100644 --- a/source/core/spi.c +++ b/source/core/spi.c @@ -241,13 +241,22 @@ static Result spi_read_data(SaveChip chip, u32* bytesRead, void* data, u32 offse break; case CHIP_EEPROM_8KB: case CHIP_EEPROM_64KB: - case CHIP_EEPROM_128KB: cmdSize = 3; cmd[0] = SPI_EEPROM_CMD_READ; cmd[1] = (u8) (pos >> 8); cmd[2] = (u8) pos; res = spi_execute_command(chip, cmd, cmdSize, data, size, NULL, 0); + pos += size; + break; + case CHIP_EEPROM_128KB: + cmdSize = 4; + cmd[0] = SPI_EEPROM_CMD_READ; + cmd[1] = (u8) (pos >> 16); + cmd[2] = (u8) (pos >> 8); + cmd[3] = (u8) pos; + res = spi_execute_command(chip, cmd, cmdSize, data, size, NULL, 0); + pos += size; break; case CHIP_FLASH_256KB: @@ -305,12 +314,18 @@ static Result spi_write_data(SaveChip chip, u32* bytesWritten, void* data, u32 o break; case CHIP_EEPROM_8KB: case CHIP_EEPROM_64KB: - case CHIP_EEPROM_128KB: cmdSize = 3; cmd[0] = SPI_EEPROM_CMD_WRITE; cmd[1] = (u8) (pos >> 8); cmd[2] = (u8) pos; break; + case CHIP_EEPROM_128KB: + cmdSize = 4; + cmd[0] = SPI_EEPROM_CMD_WRITE; + cmd[1] = (u8) (pos >> 16); + cmd[2] = (u8) (pos >> 8); + cmd[3] = (u8) pos; + break; case CHIP_FLASH_256KB: case CHIP_FLASH_512KB: case CHIP_FLASH_1MB: diff --git a/source/ui/section/action/exporttwlsave.c b/source/ui/section/action/exporttwlsave.c index 77eb4ab..d9d85fd 100644 --- a/source/ui/section/action/exporttwlsave.c +++ b/source/ui/section/action/exporttwlsave.c @@ -57,7 +57,7 @@ static Result action_export_twl_save_read_src(void* data, u32 handle, u32* bytes return spi_read_save(bytesRead, buffer, (u32) offset, size); } -static Result action_export_twl_save_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { +static Result action_export_twl_save_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { export_twl_save_data* exportData = (export_twl_save_data*) data; Result res = 0; diff --git a/source/ui/section/action/importtwlsave.c b/source/ui/section/action/importtwlsave.c index 05100ec..709e06e 100644 --- a/source/ui/section/action/importtwlsave.c +++ b/source/ui/section/action/importtwlsave.c @@ -66,7 +66,7 @@ static Result action_import_twl_save_read_src(void* data, u32 handle, u32* bytes return FSFILE_Read(handle, bytesRead, offset, buffer, size); } -static Result action_import_twl_save_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { +static Result action_import_twl_save_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { return spi_init_card(); } diff --git a/source/ui/section/action/installcdn.c b/source/ui/section/action/installcdn.c index 1021607..1759b90 100644 --- a/source/ui/section/action/installcdn.c +++ b/source/ui/section/action/installcdn.c @@ -94,7 +94,7 @@ static Result action_install_cdn_read_src(void* data, u32 handle, u32* bytesRead return res != HTTPC_RESULTCODE_DOWNLOADPENDING ? res : 0; } -static Result action_install_cdn_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { +static Result action_install_cdn_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { install_cdn_data* installData = (install_cdn_data*) data; if(index == 0) { diff --git a/source/ui/section/action/installcias.c b/source/ui/section/action/installcias.c index 5793bfe..6118fcd 100644 --- a/source/ui/section/action/installcias.c +++ b/source/ui/section/action/installcias.c @@ -109,7 +109,7 @@ static Result action_install_cias_read_src(void* data, u32 handle, u32* bytesRea return FSFILE_Read(handle, bytesRead, offset, buffer, size); } -static Result action_install_cias_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { +static Result action_install_cias_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { install_cias_data* installData = (install_cias_data*) data; u64 titleId = util_get_cia_title_id((u8*) initialReadBlock); diff --git a/source/ui/section/action/installtickets.c b/source/ui/section/action/installtickets.c index 06252f0..14f0100 100644 --- a/source/ui/section/action/installtickets.c +++ b/source/ui/section/action/installtickets.c @@ -108,7 +108,7 @@ static Result action_install_tickets_read_src(void* data, u32 handle, u32* bytes return FSFILE_Read(handle, bytesRead, offset, buffer, size); } -static Result action_install_tickets_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { +static Result action_install_tickets_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { AM_DeleteTicket(((file_info*) ((list_item*) linked_list_get(&((install_tickets_data*) data)->contents, index))->data)->ticketInfo.titleId); return AM_InstallTicketBegin(handle); } diff --git a/source/ui/section/action/pastefiles.c b/source/ui/section/action/pastefiles.c index 9d63e8b..88c8cef 100644 --- a/source/ui/section/action/pastefiles.c +++ b/source/ui/section/action/pastefiles.c @@ -121,7 +121,7 @@ static Result action_paste_files_read_src(void* data, u32 handle, u32* bytesRead return FSFILE_Read(handle, bytesRead, offset, buffer, size); } -static Result action_paste_files_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { +static Result action_paste_files_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { paste_files_data* pasteData = (paste_files_data*) data; Result res = 0; @@ -135,9 +135,13 @@ static Result action_paste_files_open_dst(void* data, u32 index, void* initialRe pasteData->currExists = R_SUCCEEDED(FSUSER_OpenFile(&currHandle, pasteData->target->archive, *fsPath, FS_OPEN_READ, 0)); if(pasteData->currExists) { FSFILE_Close(currHandle); + } else { + res = FSUSER_CreateFile(pasteData->target->archive, *fsPath, 0, size); } - res = FSUSER_OpenFile(handle, pasteData->target->archive, *fsPath, FS_OPEN_WRITE | FS_OPEN_CREATE, 0); + if(R_SUCCEEDED(res)) { + res = FSUSER_OpenFile(handle, pasteData->target->archive, *fsPath, FS_OPEN_WRITE, 0); + } util_free_path_utf8(fsPath); } else { diff --git a/source/ui/section/dumpnand.c b/source/ui/section/dumpnand.c index af5bef2..27ae0f3 100644 --- a/source/ui/section/dumpnand.c +++ b/source/ui/section/dumpnand.c @@ -36,7 +36,7 @@ static Result dumpnand_read_src(void* data, u32 handle, u32* bytesRead, void* bu return FSFILE_Read(handle, bytesRead, offset, buffer, size); } -static Result dumpnand_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { +static Result dumpnand_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { return FSUSER_OpenFileDirectly(handle, ARCHIVE_SDMC, fsMakePath(PATH_EMPTY, ""), fsMakePath(PATH_UTF16, u"/NAND.bin"), FS_OPEN_WRITE | FS_OPEN_CREATE, 0); } diff --git a/source/ui/section/networkinstall.c b/source/ui/section/networkinstall.c index c0739ad..e269f5a 100644 --- a/source/ui/section/networkinstall.c +++ b/source/ui/section/networkinstall.c @@ -103,7 +103,7 @@ static Result networkinstall_read_src(void* data, u32 handle, u32* bytesRead, vo return 0; } -static Result networkinstall_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { +static Result networkinstall_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { network_install_data* networkInstallData = (network_install_data*) data; Result res = 0; diff --git a/source/ui/section/qrinstall.c b/source/ui/section/qrinstall.c index 3308dc4..b90d5bb 100644 --- a/source/ui/section/qrinstall.c +++ b/source/ui/section/qrinstall.c @@ -104,7 +104,7 @@ static Result qrinstall_read_src(void* data, u32 handle, u32* bytesRead, void* b return res != HTTPC_RESULTCODE_DOWNLOADPENDING ? res : 0; } -static Result qrinstall_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { +static Result qrinstall_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { qr_install_data* qrInstallData = (qr_install_data*) data; Result res = 0; diff --git a/source/ui/section/task/dataop.c b/source/ui/section/task/dataop.c index f88906b..29913b1 100644 --- a/source/ui/section/task/dataop.c +++ b/source/ui/section/task/dataop.c @@ -55,7 +55,7 @@ static Result task_data_op_copy(data_op_data* data, u32 index) { if(data->currTotal == 0) { if(data->copyEmpty) { u32 dstHandle = 0; - if(R_SUCCEEDED(res = data->openDst(data->data, index, NULL, &dstHandle))) { + if(R_SUCCEEDED(res = data->openDst(data->data, index, NULL, data->currTotal, &dstHandle))) { res = data->closeDst(data->data, index, true, dstHandle); } } else { @@ -86,7 +86,7 @@ static Result task_data_op_copy(data_op_data* data, u32 index) { if(firstRun) { firstRun = false; - if(R_FAILED(res = data->openDst(data->data, index, buffer, &dstHandle))) { + if(R_FAILED(res = data->openDst(data->data, index, buffer, data->currTotal, &dstHandle))) { break; } } diff --git a/source/ui/section/task/task.h b/source/ui/section/task/task.h index 19090c2..ab949e3 100644 --- a/source/ui/section/task/task.h +++ b/source/ui/section/task/task.h @@ -109,7 +109,7 @@ typedef struct data_op_info_s { Result (*getSrcSize)(void* data, u32 handle, u64* size); Result (*readSrc)(void* data, u32 handle, u32* bytesRead, void* buffer, u64 offset, u32 size); - Result (*openDst)(void* data, u32 index, void* initialReadBlock, u32* handle); + Result (*openDst)(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle); Result (*closeDst)(void* data, u32 index, bool succeeded, u32 handle); Result (*writeDst)(void* data, u32 handle, u32* bytesWritten, void* buffer, u64 offset, u32 size); diff --git a/source/ui/section/update.c b/source/ui/section/update.c index c1c02ae..4f18184 100644 --- a/source/ui/section/update.c +++ b/source/ui/section/update.c @@ -87,7 +87,7 @@ static Result update_read_src(void* data, u32 handle, u32* bytesRead, void* buff return res != HTTPC_RESULTCODE_DOWNLOADPENDING ? res : 0; } -static Result update_open_dst(void* data, u32 index, void* initialReadBlock, u32* handle) { +static Result update_open_dst(void* data, u32 index, void* initialReadBlock, u64 size, u32* handle) { if(util_get_3dsx_path() != NULL) { FS_Path* path = util_make_path_utf8(util_get_3dsx_path()); if(path != NULL) {