diff --git a/include/services/fs.hpp b/include/services/fs.hpp index 8a765f7d..172007fd 100644 --- a/include/services/fs.hpp +++ b/include/services/fs.hpp @@ -34,12 +34,12 @@ class FSService { UserSaveDataArchive userSaveData2; std::unordered_map extSaveData_sdmc; - std::unordered_map sharedExtSaveData_nand; + std::unordered_map nandExtSaveData_nand; SystemSaveDataArchive systemSaveData; ArchiveBase* getArchiveFromID(u32 id, const FSPath& archivePath); - ExtSaveDataArchive* getExtArchiveFromID(u64 saveId); - ExtSaveDataArchive* getSharedExtArchiveFromID(u64 saveId); + ExtSaveDataArchive* getExtArchiveFromID(u64 saveId, bool isShared); + ExtSaveDataArchive* getNANDExtArchiveFromID(u64 saveId, bool isShared); Rust::Result openArchiveHandle(u32 archiveID, const FSPath& path); Rust::Result openDirectoryHandle(ArchiveBase* archive, const FSPath& path); std::optional openFileHandle(ArchiveBase* archive, const FSPath& path, const FSPath& archivePath, const FilePerms& perms); diff --git a/src/core/fs/archive_ext_save_data.cpp b/src/core/fs/archive_ext_save_data.cpp index efccc881..e5fc1719 100644 --- a/src/core/fs/archive_ext_save_data.cpp +++ b/src/core/fs/archive_ext_save_data.cpp @@ -269,7 +269,7 @@ std::string ExtSaveDataArchive::getExtSaveDataPathFromBinary(const FSPath& path) } const ExtSaveDataInfo info = *reinterpret_cast(&path.binary[0]); - return backingFolder + "_" + std::to_string(info.save_id); + return fs::path(backingFolder).filename().string() + "_" + std::to_string(info.save_id); } std::string ExtSaveDataArchive::getExtSaveDataPath() const { diff --git a/src/core/services/fs.cpp b/src/core/services/fs.cpp index 7b46b3ce..09220209 100644 --- a/src/core/services/fs.cpp +++ b/src/core/services/fs.cpp @@ -84,21 +84,18 @@ void FSService::initializeFilesystem() { } } -ExtSaveDataArchive* FSService::getExtArchiveFromID(u64 saveId) { - // todo: should we have title id in here? +ExtSaveDataArchive* FSService::getExtArchiveFromID(u64 saveId, bool isShared) { if (const auto entry = extSaveData_sdmc.find(saveId); entry == extSaveData_sdmc.end()) { - extSaveData_sdmc.emplace(saveId, ExtSaveDataArchive(mem, "SDMC", saveId)); + extSaveData_sdmc.emplace(saveId, ExtSaveDataArchive(mem, "SDMC", saveId, isShared)); } return &extSaveData_sdmc.at(saveId); } - -ExtSaveDataArchive* FSService::getSharedExtArchiveFromID(u64 saveId) { - // todo: should we have title id in here? - if (const auto entry = sharedExtSaveData_nand.find(saveId); entry == sharedExtSaveData_nand.end()) { - sharedExtSaveData_nand.emplace(saveId, ExtSaveDataArchive(mem, "../SharedFiles/NAND", saveId, true)); +ExtSaveDataArchive* FSService::getNANDExtArchiveFromID(u64 saveId, bool isShared) { + if (const auto entry = nandExtSaveData_nand.find(saveId); entry == nandExtSaveData_nand.end()) { + nandExtSaveData_nand.emplace(saveId, ExtSaveDataArchive(mem, "../SharedFiles/NAND", saveId, isShared)); } - return &sharedExtSaveData_nand.at(saveId); + return &nandExtSaveData_nand.at(saveId); } @@ -111,8 +108,12 @@ ArchiveBase* FSService::getArchiveFromID(u32 id, const FSPath& archivePath) { case ArchiveID::ExtSaveData: { const ExtSaveDataInfo info = *reinterpret_cast(&archivePath.binary[0]); switch(info.media_type) { + case MediaType::NAND: { + return getNANDExtArchiveFromID(info.save_id, false); + break; + } case MediaType::SD: { - return getExtArchiveFromID(info.save_id); + return getExtArchiveFromID(info.save_id, false); break; } default: @@ -125,7 +126,11 @@ ArchiveBase* FSService::getArchiveFromID(u32 id, const FSPath& archivePath) { const ExtSaveDataInfo info = *reinterpret_cast(&archivePath.binary[0]); switch(info.media_type) { case MediaType::NAND: { - return getSharedExtArchiveFromID(info.save_id); + return getNANDExtArchiveFromID(info.save_id, true); + break; + } + case MediaType::SD: { + return getExtArchiveFromID(info.save_id, true); break; } default: @@ -601,8 +606,9 @@ void FSService::createExtSaveData(u32 messagePointer) { ExtSaveDataArchive* selected = nullptr; switch(mediaType) { - case MediaType::NAND: selected = getSharedExtArchiveFromID(saveID); break; - case MediaType::SD: selected = getExtArchiveFromID(saveID); break; + // is there ever a situation where it formats a shared archive? + case MediaType::NAND: selected = getNANDExtArchiveFromID(saveID, false); break; + case MediaType::SD: selected = getExtArchiveFromID(saveID, false); break; default: Helpers::warn("FS::CreateExtSaveData - Unhandled ExtSaveData MediaType %d", static_cast(mediaType)); break; }