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