diff options
author | Subv <subv2112@gmail.com> | 2015-12-28 19:51:44 +0100 |
---|---|---|
committer | Subv <subv2112@gmail.com> | 2016-03-20 20:30:01 +0100 |
commit | d26c6b3212ed36970410814593ee5ec082b1d95a (patch) | |
tree | 3b03822761cbec083ea57719b0c8a9df530c4899 /src/core/file_sys/archive_savedata.cpp | |
parent | HLE/FS: Don't return an error when deleting the ExtSaveData if it does not exist. (diff) | |
download | yuzu-d26c6b3212ed36970410814593ee5ec082b1d95a.tar yuzu-d26c6b3212ed36970410814593ee5ec082b1d95a.tar.gz yuzu-d26c6b3212ed36970410814593ee5ec082b1d95a.tar.bz2 yuzu-d26c6b3212ed36970410814593ee5ec082b1d95a.tar.lz yuzu-d26c6b3212ed36970410814593ee5ec082b1d95a.tar.xz yuzu-d26c6b3212ed36970410814593ee5ec082b1d95a.tar.zst yuzu-d26c6b3212ed36970410814593ee5ec082b1d95a.zip |
Diffstat (limited to 'src/core/file_sys/archive_savedata.cpp')
-rw-r--r-- | src/core/file_sys/archive_savedata.cpp | 32 |
1 files changed, 31 insertions, 1 deletions
diff --git a/src/core/file_sys/archive_savedata.cpp b/src/core/file_sys/archive_savedata.cpp index 12876899f..82f49af5d 100644 --- a/src/core/file_sys/archive_savedata.cpp +++ b/src/core/file_sys/archive_savedata.cpp @@ -31,6 +31,12 @@ static std::string GetSaveDataPath(const std::string& mount_location, u64 progra return Common::StringFromFormat("%s%08x/%08x/data/00000001/", mount_location.c_str(), high, low); } +static std::string GetSaveDataMetadataPath(const std::string& mount_location, u64 program_id) { + u32 high = program_id >> 32; + u32 low = program_id & 0xFFFFFFFF; + return Common::StringFromFormat("%s%08x/%08x/data/00000001.metadata", mount_location.c_str(), high, low); +} + ArchiveFactory_SaveData::ArchiveFactory_SaveData(const std::string& sdmc_directory) : mount_point(GetSaveDataContainerPath(sdmc_directory)) { LOG_INFO(Service_FS, "Directory %s set as SaveData.", this->mount_point.c_str()); @@ -51,11 +57,35 @@ ResultVal<std::unique_ptr<ArchiveBackend>> ArchiveFactory_SaveData::Open(const P return MakeResult<std::unique_ptr<ArchiveBackend>>(std::move(archive)); } -ResultCode ArchiveFactory_SaveData::Format(const Path& path) { +ResultCode ArchiveFactory_SaveData::Format(const Path& path, const FileSys::ArchiveFormatInfo& format_info) { std::string concrete_mount_point = GetSaveDataPath(mount_point, Kernel::g_current_process->codeset->program_id); FileUtil::DeleteDirRecursively(concrete_mount_point); FileUtil::CreateFullPath(concrete_mount_point); + + // Write the format metadata + std::string metadata_path = GetSaveDataMetadataPath(mount_point, Kernel::g_current_process->codeset->program_id); + FileUtil::IOFile file(metadata_path, "wb"); + + if (file.IsOpen()) { + file.WriteBytes(&format_info, sizeof(format_info)); + return RESULT_SUCCESS; + } return RESULT_SUCCESS; } +ResultVal<ArchiveFormatInfo> ArchiveFactory_SaveData::GetFormatInfo(const Path& path) const { + std::string metadata_path = GetSaveDataMetadataPath(mount_point, Kernel::g_current_process->codeset->program_id); + FileUtil::IOFile file(metadata_path, "rb"); + + if (file.IsOpen()) { + ArchiveFormatInfo info; + file.ReadBytes(&info, sizeof(info)); + return MakeResult<ArchiveFormatInfo>(info); + } + + LOG_ERROR(Service_FS, "Could not open metadata information for archive"); + // TODO(Subv): Verify error code + return ResultCode(ErrorDescription::FS_NotFormatted, ErrorModule::FS, ErrorSummary::InvalidState, ErrorLevel::Status); +} + } // namespace FileSys |