|
|
|
@ -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()}}; |
|
|
|
|