From 69bfe075b5c3f6b17ce269950d1f8c9aab18e2de Mon Sep 17 00:00:00 2001 From: Zach Hilman Date: Tue, 17 Jul 2018 15:42:15 -0400 Subject: General Filesystem and Save Data Fixes (#670) --- src/core/hle/service/filesystem/filesystem.cpp | 77 ++++++++++++++++---------- 1 file changed, 49 insertions(+), 28 deletions(-) (limited to 'src/core/hle/service/filesystem/filesystem.cpp') diff --git a/src/core/hle/service/filesystem/filesystem.cpp b/src/core/hle/service/filesystem/filesystem.cpp index f58b518b6..902256757 100644 --- a/src/core/hle/service/filesystem/filesystem.cpp +++ b/src/core/hle/service/filesystem/filesystem.cpp @@ -4,6 +4,7 @@ #include #include "common/file_util.h" +#include "core/file_sys/errors.h" #include "core/file_sys/filesystem.h" #include "core/file_sys/savedata_factory.h" #include "core/file_sys/sdmc_factory.h" @@ -16,57 +17,77 @@ namespace Service::FileSystem { * Map of registered file systems, identified by type. Once an file system is registered here, it * is never removed until UnregisterFileSystems is called. */ -static boost::container::flat_map> filesystem_map; - -ResultCode RegisterFileSystem(std::unique_ptr&& factory, Type type) { - auto result = filesystem_map.emplace(type, std::move(factory)); +static std::unique_ptr romfs_factory; +static std::unique_ptr save_data_factory; +static std::unique_ptr sdmc_factory; + +ResultCode RegisterRomFS(std::unique_ptr&& factory) { + ASSERT_MSG(romfs_factory == nullptr, "Tried to register a second RomFS"); + romfs_factory = std::move(factory); + LOG_DEBUG(Service_FS, "Registered RomFS"); + return RESULT_SUCCESS; +} - bool inserted = result.second; - ASSERT_MSG(inserted, "Tried to register more than one system with same id code"); +ResultCode RegisterSaveData(std::unique_ptr&& factory) { + ASSERT_MSG(romfs_factory == nullptr, "Tried to register a second save data"); + save_data_factory = std::move(factory); + LOG_DEBUG(Service_FS, "Registered save data"); + return RESULT_SUCCESS; +} - auto& filesystem = result.first->second; - LOG_DEBUG(Service_FS, "Registered file system {} with id code 0x{:08X}", filesystem->GetName(), - static_cast(type)); +ResultCode RegisterSDMC(std::unique_ptr&& factory) { + ASSERT_MSG(sdmc_factory == nullptr, "Tried to register a second SDMC"); + sdmc_factory = std::move(factory); + LOG_DEBUG(Service_FS, "Registered SDMC"); return RESULT_SUCCESS; } -ResultVal> OpenFileSystem(Type type, - FileSys::Path& path) { - LOG_TRACE(Service_FS, "Opening FileSystem with type={}", static_cast(type)); +ResultVal> OpenRomFS(u64 title_id) { + LOG_TRACE(Service_FS, "Opening RomFS for title_id={:016X}", title_id); - auto itr = filesystem_map.find(type); - if (itr == filesystem_map.end()) { + if (romfs_factory == nullptr) { // TODO(bunnei): Find a better error code for this return ResultCode(-1); } - return itr->second->Open(path); + return romfs_factory->Open(title_id); } -ResultCode FormatFileSystem(Type type) { - LOG_TRACE(Service_FS, "Formatting FileSystem with type={}", static_cast(type)); +ResultVal> OpenSaveData( + FileSys::SaveDataSpaceId space, FileSys::SaveDataDescriptor save_struct) { + LOG_TRACE(Service_FS, "Opening Save Data for space_id={:01X}, save_struct={}", + static_cast(space), SaveStructDebugInfo(save_struct)); - auto itr = filesystem_map.find(type); - if (itr == filesystem_map.end()) { - // TODO(bunnei): Find a better error code for this - return ResultCode(-1); + if (save_data_factory == nullptr) { + return ResultCode(ErrorModule::FS, FileSys::ErrCodes::SaveDataNotFound); + } + + return save_data_factory->Open(space, save_struct); +} + +ResultVal> OpenSDMC() { + LOG_TRACE(Service_FS, "Opening SDMC"); + + if (sdmc_factory == nullptr) { + return ResultCode(ErrorModule::FS, FileSys::ErrCodes::SdCardNotFound); } - FileSys::Path unused; - return itr->second->Format(unused); + return sdmc_factory->Open(); } void RegisterFileSystems() { - filesystem_map.clear(); + romfs_factory = nullptr; + save_data_factory = nullptr; + sdmc_factory = nullptr; std::string nand_directory = FileUtil::GetUserPath(D_NAND_IDX); std::string sd_directory = FileUtil::GetUserPath(D_SDMC_IDX); - auto savedata = std::make_unique(std::move(nand_directory)); - RegisterFileSystem(std::move(savedata), Type::SaveData); + auto savedata = std::make_unique(std::move(nand_directory)); + save_data_factory = std::move(savedata); - auto sdcard = std::make_unique(std::move(sd_directory)); - RegisterFileSystem(std::move(sdcard), Type::SDMC); + auto sdcard = std::make_unique(std::move(sd_directory)); + sdmc_factory = std::move(sdcard); } void InstallInterfaces(SM::ServiceManager& service_manager) { -- cgit v1.2.3