mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-30 21:30:04 +00:00 
			
		
		
		
	Basic archive backend serialization
This commit is contained in:
		
							parent
							
								
									2d2c7218ef
								
							
						
					
					
						commit
						2bf5b46460
					
				
					 18 changed files with 185 additions and 16 deletions
				
			
		
							
								
								
									
										23
									
								
								TODO
									
										
									
									
									
								
							
							
						
						
									
										23
									
								
								TODO
									
										
									
									
									
								
							|  | @ -10,19 +10,20 @@ | |||
| ✘ App loader @cancelled(20-01-01 22:59) | ||||
|     No relevant state | ||||
| ☐ Archive manager @started(20-01-01 23:03) | ||||
|     ☐ NCCH | ||||
|         ☐ Normal | ||||
|     ☐ NCCH @started(20-01-02 22:50) | ||||
|         ✔ Normal @done(20-01-02 22:50) | ||||
|         ☐ Self | ||||
|     ☐ SaveData | ||||
|         ☐ Normal | ||||
|         ☐ Ext | ||||
|         ☐ Other | ||||
|         ☐ Source SD | ||||
|         ☐ System | ||||
|     ☐ SDMC | ||||
|         ☐ Normal | ||||
|         ☐ Write-only | ||||
|     ✔ SaveData @started(20-01-02 23:03) @done(20-01-02 23:27) @lasted(25m) | ||||
|         ✔ Normal @done(20-01-02 23:03) | ||||
|         ✔ Ext @done(20-01-02 23:26) | ||||
|         ✔ Other @done(20-01-02 23:21) | ||||
|         ✔ Source SD @done(20-01-02 23:03) | ||||
|         ✔ System @done(20-01-02 23:13) | ||||
|     ✔ SDMC @done(20-01-02 23:34) | ||||
|         ✔ Normal @done(20-01-02 23:34) | ||||
|         ✔ Write-only @done(20-01-02 23:34) | ||||
|     ☐ File refs | ||||
|     ☐ Replace delay generator with virtual fns | ||||
| ☐ Custom texture cache | ||||
| ✘ MMIO @cancelled(20-01-01 01:06) | ||||
|     Seems that this whole subsystem is only used in tests | ||||
|  |  | |||
|  | @ -6,6 +6,7 @@ | |||
| #include <memory> | ||||
| #include <vector> | ||||
| #include <fmt/format.h> | ||||
| #include "common/archives.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/file_util.h" | ||||
| #include "common/logging/log.h" | ||||
|  | @ -19,6 +20,8 @@ | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_ExtSaveData) | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| /**
 | ||||
|  |  | |||
|  | @ -6,6 +6,8 @@ | |||
| 
 | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include <boost/serialization/string.hpp> | ||||
| #include "common/common_types.h" | ||||
| #include "core/file_sys/archive_backend.h" | ||||
| #include "core/hle/result.h" | ||||
|  | @ -54,6 +56,14 @@ private: | |||
| 
 | ||||
|     /// Returns a path with the correct SaveIdHigh value for Shared extdata paths.
 | ||||
|     Path GetCorrectedPath(const Path& path); | ||||
| 
 | ||||
|     ArchiveFactory_ExtSaveData() = default; | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& shared; | ||||
|         ar& mount_point; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -94,3 +104,5 @@ std::string GetExtDataContainerPath(const std::string& mount_point, bool shared) | |||
| Path ConstructExtDataBinaryPath(u32 media_type, u32 high, u32 low); | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_ExtSaveData) | ||||
|  |  | |||
|  | @ -8,6 +8,7 @@ | |||
| #include <utility> | ||||
| #include <vector> | ||||
| #include "bad_word_list.app.romfs.h" | ||||
| #include "common/archives.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/file_util.h" | ||||
| #include "common/logging/log.h" | ||||
|  | @ -28,6 +29,10 @@ | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::NCCHArchive) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::NCCHFile) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_NCCH) | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| struct NCCHArchivePath { | ||||
|  |  | |||
|  | @ -7,6 +7,9 @@ | |||
| #include <array> | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <boost/serialization/base_object.hpp> | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include <boost/serialization/vector.hpp> | ||||
| #include "core/file_sys/archive_backend.h" | ||||
| #include "core/file_sys/file_backend.h" | ||||
| #include "core/hle/result.h" | ||||
|  | @ -63,6 +66,17 @@ public: | |||
| protected: | ||||
|     u64 title_id; | ||||
|     Service::FS::MediaType media_type; | ||||
| 
 | ||||
| private: | ||||
|     NCCHArchive() = default; // NOTE: If the public ctor has behaviour, need to replace this with
 | ||||
|                              // *_construct_data
 | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& boost::serialization::base_object<ArchiveBackend>(*this); | ||||
|         ar& title_id; | ||||
|         ar& media_type; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| // File backend for NCCH files
 | ||||
|  | @ -81,7 +95,16 @@ public: | |||
|     void Flush() const override {} | ||||
| 
 | ||||
| private: | ||||
|     std::vector<u8> file_buffer; | ||||
|     NCCHFile() = default; // NOTE: If the public ctor has behaviour, need to replace this with
 | ||||
|                           // *_construct_data
 | ||||
|     std::vector<u8> file_buffer; // TODO: Replace with file ref for serialization
 | ||||
| 
 | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& boost::serialization::base_object<FileBackend>(*this); | ||||
|         ar& file_buffer; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| /// File system interface to the NCCH archive
 | ||||
|  | @ -97,6 +120,15 @@ public: | |||
|     ResultCode Format(const Path& path, const FileSys::ArchiveFormatInfo& format_info, | ||||
|                       u64 program_id) override; | ||||
|     ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path, u64 program_id) const override; | ||||
| 
 | ||||
| private: | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) {} | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::NCCHArchive) | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::NCCHFile) | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_NCCH) | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
| 
 | ||||
| #include <tuple> | ||||
| #include <utility> | ||||
| #include "common/archives.h" | ||||
| #include "core/file_sys/archive_other_savedata.h" | ||||
| #include "core/file_sys/errors.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
|  | @ -12,6 +13,9 @@ | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_OtherSaveDataPermitted) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_OtherSaveDataGeneral) | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| // TODO(wwylele): The storage info in exheader should be checked before accessing these archives
 | ||||
|  |  | |||
|  | @ -4,6 +4,8 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include <boost/serialization/shared_ptr.hpp> | ||||
| #include "core/file_sys/archive_source_sd_savedata.h" | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|  | @ -27,8 +29,15 @@ public: | |||
|     ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path, u64 program_id) const override; | ||||
| 
 | ||||
| private: | ||||
|     std::string mount_point; | ||||
|     std::string mount_point; // TODO: Remove, unused?
 | ||||
|     std::shared_ptr<ArchiveSource_SDSaveData> sd_savedata_source; | ||||
| 
 | ||||
|     ArchiveFactory_OtherSaveDataPermitted() = default; | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& sd_savedata_source; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| /// File system interface to the OtherSaveDataGeneral archive
 | ||||
|  | @ -47,8 +56,18 @@ public: | |||
|     ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path, u64 program_id) const override; | ||||
| 
 | ||||
| private: | ||||
|     std::string mount_point; | ||||
|     std::string mount_point; // TODO: Remove, unused?
 | ||||
|     std::shared_ptr<ArchiveSource_SDSaveData> sd_savedata_source; | ||||
| 
 | ||||
|     ArchiveFactory_OtherSaveDataGeneral() = default; | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& sd_savedata_source; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_OtherSaveDataPermitted) | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_OtherSaveDataGeneral) | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <utility> | ||||
| #include "common/archives.h" | ||||
| #include "core/core.h" | ||||
| #include "core/file_sys/archive_savedata.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
|  | @ -10,6 +11,8 @@ | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_SaveData) | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| ArchiveFactory_SaveData::ArchiveFactory_SaveData( | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
| 
 | ||||
| #pragma once | ||||
| 
 | ||||
| #include <boost/serialization/shared_ptr.hpp> | ||||
| #include "core/file_sys/archive_source_sd_savedata.h" | ||||
| 
 | ||||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
|  | @ -27,8 +28,17 @@ public: | |||
|     ResultVal<ArchiveFormatInfo> GetFormatInfo(const Path& path, u64 program_id) const override; | ||||
| 
 | ||||
| private: | ||||
|     std::string mount_point; | ||||
|     std::string mount_point; // TODO: Remove this? seems unused
 | ||||
|     std::shared_ptr<ArchiveSource_SDSaveData> sd_savedata_source; | ||||
| 
 | ||||
|     ArchiveFactory_SaveData() = default; | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& sd_savedata_source; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_SaveData) | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
| 
 | ||||
| #include <algorithm> | ||||
| #include <memory> | ||||
| #include "common/archives.h" | ||||
| #include "common/file_util.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/file_sys/archive_sdmc.h" | ||||
|  | @ -15,6 +16,9 @@ | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::SDMCArchive) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_SDMC) | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| class SDMCDelayGenerator : public DelayGenerator { | ||||
|  |  | |||
|  | @ -6,6 +6,9 @@ | |||
| 
 | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <boost/serialization/base_object.hpp> | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include <boost/serialization/string.hpp> | ||||
| #include "core/file_sys/archive_backend.h" | ||||
| #include "core/hle/result.h" | ||||
| 
 | ||||
|  | @ -42,6 +45,14 @@ public: | |||
| protected: | ||||
|     ResultVal<std::unique_ptr<FileBackend>> OpenFileBase(const Path& path, const Mode& mode) const; | ||||
|     std::string mount_point; | ||||
| 
 | ||||
|     SDMCArchive() = default; | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& boost::serialization::base_object<ArchiveBackend>(*this); | ||||
|         ar& mount_point; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| /// File system interface to the SDMC archive
 | ||||
|  | @ -66,6 +77,16 @@ public: | |||
| 
 | ||||
| private: | ||||
|     std::string sdmc_directory; | ||||
| 
 | ||||
|     ArchiveFactory_SDMC() = default; | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& sdmc_directory; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::SDMCArchive) | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_SDMC) | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <memory> | ||||
| #include "common/archives.h" | ||||
| #include "common/file_util.h" | ||||
| #include "core/file_sys/archive_sdmcwriteonly.h" | ||||
| #include "core/file_sys/directory_backend.h" | ||||
|  | @ -13,6 +14,9 @@ | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::SDMCWriteOnlyArchive) | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_SDMCWriteOnly) | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| class SDMCWriteOnlyDelayGenerator : public DelayGenerator { | ||||
|  |  | |||
|  | @ -31,6 +31,14 @@ public: | |||
|                                                      const Mode& mode) const override; | ||||
| 
 | ||||
|     ResultVal<std::unique_ptr<DirectoryBackend>> OpenDirectory(const Path& path) const override; | ||||
| 
 | ||||
| private: | ||||
|     SDMCWriteOnlyArchive() = default; | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& boost::serialization::base_object<SDMCArchive>(*this); | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| /// File system interface to the SDMC write-only archive
 | ||||
|  | @ -55,6 +63,16 @@ public: | |||
| 
 | ||||
| private: | ||||
|     std::string sdmc_directory; | ||||
| 
 | ||||
|     ArchiveFactory_SDMCWriteOnly() = default; | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& sdmc_directory; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::SDMCWriteOnlyArchive) | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_SDMCWriteOnly) | ||||
|  |  | |||
|  | @ -3,6 +3,7 @@ | |||
| // Refer to the license.txt file included.
 | ||||
| 
 | ||||
| #include <fmt/format.h> | ||||
| #include "common/archives.h" | ||||
| #include "common/file_util.h" | ||||
| #include "common/logging/log.h" | ||||
| #include "core/file_sys/archive_source_sd_savedata.h" | ||||
|  | @ -13,6 +14,8 @@ | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ArchiveSource_SDSaveData) | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| namespace { | ||||
|  |  | |||
|  | @ -6,6 +6,8 @@ | |||
| 
 | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include <boost/serialization/string.hpp> | ||||
| #include "core/file_sys/archive_backend.h" | ||||
| #include "core/hle/result.h" | ||||
| 
 | ||||
|  | @ -27,6 +29,15 @@ public: | |||
| 
 | ||||
| private: | ||||
|     std::string mount_point; | ||||
| 
 | ||||
|     ArchiveSource_SDSaveData() = default; | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& mount_point; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveSource_SDSaveData) | ||||
|  |  | |||
|  | @ -7,6 +7,7 @@ | |||
| #include <memory> | ||||
| #include <vector> | ||||
| #include <fmt/format.h> | ||||
| #include "common/archives.h" | ||||
| #include "common/common_types.h" | ||||
| #include "common/file_util.h" | ||||
| #include "core/file_sys/archive_systemsavedata.h" | ||||
|  | @ -17,6 +18,8 @@ | |||
| ////////////////////////////////////////////////////////////////////////////////////////////////////
 | ||||
| // FileSys namespace
 | ||||
| 
 | ||||
| SERIALIZE_EXPORT_IMPL(FileSys::ArchiveFactory_SystemSaveData) | ||||
| 
 | ||||
| namespace FileSys { | ||||
| 
 | ||||
| std::string GetSystemSaveDataPath(const std::string& mount_point, const Path& path) { | ||||
|  |  | |||
|  | @ -6,6 +6,8 @@ | |||
| 
 | ||||
| #include <memory> | ||||
| #include <string> | ||||
| #include <boost/serialization/export.hpp> | ||||
| #include <boost/serialization/string.hpp> | ||||
| #include "common/common_types.h" | ||||
| #include "core/file_sys/archive_backend.h" | ||||
| #include "core/hle/result.h" | ||||
|  | @ -31,6 +33,13 @@ public: | |||
| 
 | ||||
| private: | ||||
|     std::string base_path; | ||||
| 
 | ||||
|     ArchiveFactory_SystemSaveData() = default; | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) { | ||||
|         ar& base_path; | ||||
|     } | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| /**
 | ||||
|  | @ -60,3 +69,5 @@ std::string GetSystemSaveDataContainerPath(const std::string& mount_point); | |||
| Path ConstructSystemSaveDataBinaryPath(u32 high, u32 low); | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
| 
 | ||||
| BOOST_CLASS_EXPORT_KEY(FileSys::ArchiveFactory_SystemSaveData) | ||||
|  |  | |||
|  | @ -89,7 +89,12 @@ public: | |||
|     virtual void Flush() const = 0; | ||||
| 
 | ||||
| protected: | ||||
|     std::unique_ptr<DelayGenerator> delay_generator; | ||||
|     std::unique_ptr<DelayGenerator> delay_generator; // TODO: replace with virtual Get*DelayNs
 | ||||
| 
 | ||||
| private: | ||||
|     template <class Archive> | ||||
|     void serialize(Archive& ar, const unsigned int) {} | ||||
|     friend class boost::serialization::access; | ||||
| }; | ||||
| 
 | ||||
| } // namespace FileSys
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue