mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 23:49:01 -05:00 
			
		
		
		
	filesystem: Populate save data sizes from control data
This commit is contained in:
		| @@ -8,18 +8,23 @@ | ||||
| #include "common/file_util.h" | ||||
| #include "core/core.h" | ||||
| #include "core/file_sys/bis_factory.h" | ||||
| #include "core/file_sys/control_metadata.h" | ||||
| #include "core/file_sys/errors.h" | ||||
| #include "core/file_sys/mode.h" | ||||
| #include "core/file_sys/partition_filesystem.h" | ||||
| #include "core/file_sys/patch_manager.h" | ||||
| #include "core/file_sys/registered_cache.h" | ||||
| #include "core/file_sys/romfs_factory.h" | ||||
| #include "core/file_sys/savedata_factory.h" | ||||
| #include "core/file_sys/sdmc_factory.h" | ||||
| #include "core/file_sys/vfs.h" | ||||
| #include "core/file_sys/vfs_offset.h" | ||||
| #include "core/hle/kernel/process.h" | ||||
| #include "core/hle/service/filesystem/filesystem.h" | ||||
| #include "core/hle/service/filesystem/fsp_ldr.h" | ||||
| #include "core/hle/service/filesystem/fsp_pr.h" | ||||
| #include "core/hle/service/filesystem/fsp_srv.h" | ||||
| #include "core/loader/loader.h" | ||||
|  | ||||
| namespace Service::FileSystem { | ||||
|  | ||||
| @@ -28,6 +33,10 @@ namespace Service::FileSystem { | ||||
| // TODO(DarkLordZach): Eventually make this configurable in settings. | ||||
| constexpr u64 EMULATED_SD_REPORTED_SIZE = 32000000000; | ||||
|  | ||||
| // A default size for normal/journal save data size if application control metadata cannot be found. | ||||
| // This should be large enough to satisfy even the most extreme requirements (~4.2GB) | ||||
| constexpr u64 SUFFICIENT_SAVE_DATA_SIZE = 0xF0000000; | ||||
|  | ||||
| static FileSys::VirtualDir GetDirectoryRelativeWrapped(FileSys::VirtualDir base, | ||||
|                                                        std::string_view dir_name_) { | ||||
|     std::string dir_name(FileUtil::SanitizePath(dir_name_)); | ||||
| @@ -341,6 +350,44 @@ ResultVal<FileSys::VirtualDir> OpenSDMC() { | ||||
|     return sdmc_factory->Open(); | ||||
| } | ||||
|  | ||||
| FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id) { | ||||
|     if (save_data_factory == nullptr) { | ||||
|         return {0, 0}; | ||||
|     } | ||||
|  | ||||
|     const auto value = save_data_factory->ReadSaveDataSize(type, title_id, user_id); | ||||
|  | ||||
|     if (value.normal == 0 && value.journal == 0) { | ||||
|         FileSys::SaveDataSize new_size{SUFFICIENT_SAVE_DATA_SIZE, SUFFICIENT_SAVE_DATA_SIZE}; | ||||
|  | ||||
|         FileSys::NACP nacp; | ||||
|         const auto res = Core::System::GetInstance().GetAppLoader().ReadControlData(nacp); | ||||
|  | ||||
|         if (res != Loader::ResultStatus::Success) { | ||||
|             FileSys::PatchManager pm{Core::CurrentProcess()->GetTitleID()}; | ||||
|             auto [nacp_unique, discard] = pm.GetControlMetadata(); | ||||
|  | ||||
|             if (nacp_unique != nullptr) { | ||||
|                 new_size = {nacp_unique->GetDefaultNormalSaveSize(), | ||||
|                             nacp_unique->GetDefaultJournalSaveSize()}; | ||||
|             } | ||||
|         } else { | ||||
|             new_size = {nacp.GetDefaultNormalSaveSize(), nacp.GetDefaultJournalSaveSize()}; | ||||
|         } | ||||
|  | ||||
|         WriteSaveDataSize(type, title_id, user_id, new_size); | ||||
|         return new_size; | ||||
|     } | ||||
|  | ||||
|     return value; | ||||
| } | ||||
|  | ||||
| void WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id, | ||||
|                        FileSys::SaveDataSize new_value) { | ||||
|     if (save_data_factory != nullptr) | ||||
|         save_data_factory->WriteSaveDataSize(type, title_id, user_id, new_value); | ||||
| } | ||||
|  | ||||
| FileSys::RegisteredCacheUnion GetUnionContents() { | ||||
|     return FileSys::RegisteredCacheUnion{ | ||||
|         {GetSystemNANDContents(), GetUserNANDContents(), GetSDMCContents()}}; | ||||
|   | ||||
| @@ -21,9 +21,11 @@ class SDMCFactory; | ||||
| enum class ContentRecordType : u8; | ||||
| enum class Mode : u32; | ||||
| enum class SaveDataSpaceId : u8; | ||||
| enum class SaveDataType : u8; | ||||
| enum class StorageId : u8; | ||||
|  | ||||
| struct SaveDataDescriptor; | ||||
| struct SaveDataSize; | ||||
| } // namespace FileSys | ||||
|  | ||||
| namespace Service { | ||||
| @@ -48,6 +50,10 @@ ResultVal<FileSys::VirtualDir> OpenSaveData(FileSys::SaveDataSpaceId space, | ||||
| ResultVal<FileSys::VirtualDir> OpenSaveDataSpace(FileSys::SaveDataSpaceId space); | ||||
| ResultVal<FileSys::VirtualDir> OpenSDMC(); | ||||
|  | ||||
| FileSys::SaveDataSize ReadSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id); | ||||
| void WriteSaveDataSize(FileSys::SaveDataType type, u64 title_id, u128 user_id, | ||||
|                        FileSys::SaveDataSize new_value); | ||||
|  | ||||
| FileSys::RegisteredCacheUnion GetUnionContents(); | ||||
|  | ||||
| FileSys::RegisteredCache* GetSystemNANDContents(); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Zach Hilman
					Zach Hilman