From 9ec29646959b8d8562ef15efd10f0551713b89bb Mon Sep 17 00:00:00 2001 From: wheremyfoodat Date: Sat, 20 May 2023 01:24:30 +0300 Subject: [PATCH] [FS] Add FormatThisUserSaveData --- include/services/fs.hpp | 1 + src/core/fs/archive_save_data.cpp | 2 +- src/core/services/fs.cpp | 26 ++++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/include/services/fs.hpp b/include/services/fs.hpp index e79dbf02..b4cc1fb6 100644 --- a/include/services/fs.hpp +++ b/include/services/fs.hpp @@ -43,6 +43,7 @@ class FSService { void controlArchive(u32 messagePointer); void deleteFile(u32 messagePointer); void formatSaveData(u32 messagePointer); + void formatThisUserSaveData(u32 messagePointer); void getFreeBytes(u32 messagePointer); void getFormatInfo(u32 messagePointer); void getPriority(u32 messagePointer); diff --git a/src/core/fs/archive_save_data.cpp b/src/core/fs/archive_save_data.cpp index 52ca6ad0..a25ba08f 100644 --- a/src/core/fs/archive_save_data.cpp +++ b/src/core/fs/archive_save_data.cpp @@ -106,7 +106,7 @@ void SaveDataArchive::format(const FSPath& path, const ArchiveBase::FormatInfo& fs::create_directories(saveDataPath); // Write format info on disk - IOFile file(formatInfoPath, "wb+"); + IOFile file(formatInfoPath, "wb"); file.writeBytes(&info, sizeof(info)); } diff --git a/src/core/services/fs.cpp b/src/core/services/fs.cpp index 9a3a7466..fd85b484 100644 --- a/src/core/services/fs.cpp +++ b/src/core/services/fs.cpp @@ -21,6 +21,7 @@ namespace FSCommands { OpenArchive = 0x080C00C2, ControlArchive = 0x080D0144, CloseArchive = 0x080E0080, + FormatThisUserSaveData = 0x080F0180, GetFreeBytes = 0x08120080, IsSdmcDetected = 0x08170000, GetFormatInfo = 0x084500C2, @@ -166,6 +167,7 @@ void FSService::handleSyncRequest(u32 messagePointer) { case FSCommands::CloseArchive: closeArchive(messagePointer); break; case FSCommands::DeleteFile: deleteFile(messagePointer); break; case FSCommands::FormatSaveData: formatSaveData(messagePointer); break; + case FSCommands::FormatThisUserSaveData: formatThisUserSaveData(messagePointer); break; case FSCommands::GetFreeBytes: getFreeBytes(messagePointer); break; case FSCommands::GetFormatInfo: getFormatInfo(messagePointer); break; case FSCommands::GetPriority: getPriority(messagePointer); break; @@ -427,6 +429,8 @@ void FSService::getFormatInfo(u32 messagePointer) { } void FSService::formatSaveData(u32 messagePointer) { + log("FS::FormatSaveData\n"); + const u32 archiveID = mem.read32(messagePointer + 4); if (archiveID != ArchiveID::SaveData) Helpers::panic("FS::FormatSaveData: Archive is not SaveData"); @@ -461,6 +465,28 @@ void FSService::formatSaveData(u32 messagePointer) { mem.write32(messagePointer + 4, ResultCode::Success); } +void FSService::formatThisUserSaveData(u32 messagePointer) { + log("FS::FormatThisUserSaveData\n"); + + const u32 blockSize = mem.read32(messagePointer + 4); + const u32 directoryNum = mem.read32(messagePointer + 8); // Max number of directories + const u32 fileNum = mem.read32(messagePointer + 12); // Max number of files + const u32 directoryBucketNum = mem.read32(messagePointer + 16); // Not sure what a directory bucket is...? + const u32 fileBucketNum = mem.read32(messagePointer + 20); // Same here + const bool duplicateData = mem.read8(messagePointer + 24) != 0; + + ArchiveBase::FormatInfo info { + .size = blockSize * 0x200, + .numOfDirectories = directoryNum, + .numOfFiles = fileNum, + .duplicateData = duplicateData + }; + FSPath emptyPath; + + mem.write32(messagePointer, IPC::responseHeader(0x080F, 1, 0)); + saveData.format(emptyPath, info); +} + void FSService::controlArchive(u32 messagePointer) { const Handle archiveHandle = mem.read64(messagePointer + 4); const u32 action = mem.read32(messagePointer + 12);