From 2c89d4d5cd4e308b04cebb1c9bca48e12f0945da Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 29 Dec 2014 13:04:37 -0500 Subject: Archives: Implemented ExtSaveData and SharedExtSaveData They will be stored in /extsavedata/SDMC and /extsavedata/NAND respectively. Also redirect some APT_A functions to their APT_U equivalents. Implemented the gamecoin.dat file in SharedExtSaveData in the PTM module. Implemented formatting the savegame. Retake a previous savegame if it exists instead of reporting them as not formatted every time a game is loaded. --- src/core/file_sys/archive_savedata.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'src/core/file_sys/archive_savedata.cpp') diff --git a/src/core/file_sys/archive_savedata.cpp b/src/core/file_sys/archive_savedata.cpp index 97853567c..280d4ff5d 100644 --- a/src/core/file_sys/archive_savedata.cpp +++ b/src/core/file_sys/archive_savedata.cpp @@ -16,18 +16,29 @@ namespace FileSys { -Archive_SaveData::Archive_SaveData(const std::string& mount_point, u64 program_id) - : DiskArchive(mount_point + Common::StringFromFormat("%016X", program_id) + DIR_SEP) { +Archive_SaveData::Archive_SaveData(const std::string& mount_point) + : DiskArchive(mount_point) { LOG_INFO(Service_FS, "Directory %s set as SaveData.", this->mount_point.c_str()); } -bool Archive_SaveData::Initialize() { - if (!FileUtil::CreateFullPath(mount_point)) { - LOG_ERROR(Service_FS, "Unable to create SaveData path."); - return false; +ResultCode Archive_SaveData::Open(const Path& path) { + if (concrete_mount_point.empty()) + concrete_mount_point = Common::StringFromFormat("%s%016X", mount_point.c_str(), Kernel::g_program_id) + DIR_SEP; + if (!FileUtil::Exists(concrete_mount_point)) { + // When a SaveData archive is created for the first time, it is not yet formatted + // and the save file/directory structure expected by the game has not yet been initialized. + // Returning the NotFormatted error code will signal the game to provision the SaveData archive + // with the files and folders that it expects. + return ResultCode(ErrorDescription::FS_NotFormatted, ErrorModule::FS, + ErrorSummary::InvalidState, ErrorLevel::Status); } + return RESULT_SUCCESS; +} - return true; +ResultCode Archive_SaveData::Format(const Path& path) const { + FileUtil::DeleteDirRecursively(concrete_mount_point); + FileUtil::CreateFullPath(concrete_mount_point); + return RESULT_SUCCESS; } } // namespace FileSys -- cgit v1.2.3