mirror of
https://github.com/J-D-K/JKSV.git
synced 2026-09-08 02:25:17 -05:00
More refactoring. Start to completely implement remote storage.
This commit is contained in:
@@ -1,86 +1,63 @@
|
||||
#include "fs/SaveMetaData.hpp"
|
||||
|
||||
#include "error.hpp"
|
||||
#include "fs/directory_functions.hpp"
|
||||
#include "fs/save_data_functions.hpp"
|
||||
#include "fs/save_mount.hpp"
|
||||
#include "fslib.hpp"
|
||||
#include "logger.hpp"
|
||||
|
||||
namespace
|
||||
{
|
||||
/// @brief This is the string template for errors here.
|
||||
constexpr std::string_view STRING_ERROR_TEMPLATE = "Error processing save meta for %016llX: %s";
|
||||
} // namespace
|
||||
constexpr size_t SIZE_EXTRA_DATA = sizeof(FsSaveDataExtraData);
|
||||
}
|
||||
|
||||
bool fs::fill_save_meta_data(const FsSaveDataInfo *saveInfo, fs::SaveMetaData &meta)
|
||||
{
|
||||
// This struct will allow us to fill this all out in one shot.
|
||||
FsSaveDataExtraData extraData;
|
||||
if (R_FAILED(fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(
|
||||
&extraData,
|
||||
sizeof(FsSaveDataExtraData),
|
||||
static_cast<FsSaveDataSpaceId>(saveInfo->save_data_space_id),
|
||||
saveInfo->save_data_id)))
|
||||
{
|
||||
logger::log("Error generating save meta: Failed to read save extra data!");
|
||||
return false;
|
||||
}
|
||||
const FsSaveDataSpaceId spaceID = static_cast<FsSaveDataSpaceId>(saveInfo->save_data_space_id);
|
||||
const uint64_t saveID = saveInfo->save_data_id;
|
||||
|
||||
// Fill the struct.
|
||||
meta = {.m_magic = fs::SAVE_META_MAGIC,
|
||||
.m_revision = 0x00,
|
||||
.m_applicationID = extraData.attr.application_id,
|
||||
.m_accountID = extraData.attr.uid,
|
||||
.m_systemSaveID = extraData.attr.system_save_data_id,
|
||||
.m_saveDataType = extraData.attr.save_data_type,
|
||||
.m_saveDataRank = extraData.attr.save_data_rank,
|
||||
.m_saveDataIndex = extraData.attr.save_data_index,
|
||||
.m_ownerID = extraData.owner_id,
|
||||
.m_timestamp = extraData.timestamp,
|
||||
.m_flags = extraData.flags,
|
||||
.m_saveDataSize = extraData.data_size,
|
||||
.m_journalSize = extraData.journal_size,
|
||||
.m_commitID = extraData.commit_id};
|
||||
FsSaveDataExtraData extraData{};
|
||||
const bool readError =
|
||||
error::libnx(fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(&extraData, SIZE_EXTRA_DATA, spaceID, saveID));
|
||||
if (readError) { return false; }
|
||||
|
||||
meta = {.magic = fs::SAVE_META_MAGIC,
|
||||
.revision = 0x00,
|
||||
.applicationID = extraData.attr.application_id,
|
||||
.accountID = extraData.attr.uid,
|
||||
.systemSaveID = extraData.attr.system_save_data_id,
|
||||
.saveDataType = extraData.attr.save_data_type,
|
||||
.saveDataRank = extraData.attr.save_data_rank,
|
||||
.saveDataIndex = extraData.attr.save_data_index,
|
||||
.ownerID = extraData.owner_id,
|
||||
.timestamp = extraData.timestamp,
|
||||
.flags = extraData.flags,
|
||||
.saveDataSize = extraData.data_size,
|
||||
.journalSize = extraData.journal_size,
|
||||
.commitID = extraData.commit_id};
|
||||
|
||||
// Should be good.
|
||||
return true;
|
||||
}
|
||||
|
||||
bool fs::process_save_meta_data(const FsSaveDataInfo *saveInfo, const SaveMetaData &meta)
|
||||
{
|
||||
// We're going to grab this quick and use this to compare.
|
||||
FsSaveDataExtraData extraData = {0};
|
||||
if (R_FAILED(fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(
|
||||
&extraData,
|
||||
sizeof(FsSaveDataExtraData),
|
||||
static_cast<FsSaveDataSpaceId>(saveInfo->save_data_space_id),
|
||||
saveInfo->save_data_id)))
|
||||
{
|
||||
logger::log(STRING_ERROR_TEMPLATE.data(), saveInfo->application_id, fslib::error::get_string());
|
||||
return false;
|
||||
}
|
||||
const FsSaveDataSpaceId spaceID = static_cast<FsSaveDataSpaceId>(saveInfo->save_data_space_id);
|
||||
const uint64_t saveID = saveInfo->save_data_id;
|
||||
|
||||
// We need to temporarily close the file system.
|
||||
if (!fslib::close_file_system(fs::DEFAULT_SAVE_MOUNT))
|
||||
{
|
||||
logger::log(STRING_ERROR_TEMPLATE.data(), saveInfo->application_id, fslib::error::get_string());
|
||||
return false;
|
||||
}
|
||||
FsSaveDataExtraData extraData{};
|
||||
const bool readError =
|
||||
error::libnx(fsReadSaveDataFileSystemExtraDataBySaveDataSpaceId(&extraData, SIZE_EXTRA_DATA, spaceID, saveID));
|
||||
if (readError) { return false; }
|
||||
|
||||
// To do: Other checks.
|
||||
if (extraData.data_size < meta.m_saveDataSize &&
|
||||
!fs::extend_save_data(saveInfo, meta.m_saveDataSize, meta.m_journalSize))
|
||||
{
|
||||
// The fs::extend_save_data function should log the error that occurred.
|
||||
return false;
|
||||
}
|
||||
// We need to close this temporarily. To do: Look for a way to make this not needed?
|
||||
const bool closeError = error::fslib(fslib::close_file_system(fs::DEFAULT_SAVE_MOUNT));
|
||||
const bool needsExtend = extraData.data_size < meta.saveDataSize;
|
||||
const bool extended = !closeError && needsExtend && fs::extend_save_data(saveInfo, meta.saveDataSize, meta.journalSize);
|
||||
if (needsExtend && !extended) { return false; }
|
||||
|
||||
// Now reopen it.
|
||||
if (!fslib::open_save_data_with_save_info(fs::DEFAULT_SAVE_MOUNT, *saveInfo))
|
||||
{
|
||||
logger::log(STRING_ERROR_TEMPLATE.data(), saveInfo->application_id, fslib::error::get_string());
|
||||
return false;
|
||||
}
|
||||
const bool reopenError = error::fslib(fslib::open_save_data_with_save_info(fs::DEFAULT_SAVE_MOUNT, *saveInfo));
|
||||
|
||||
// More later if needed.
|
||||
return true;
|
||||
// Maybe more later.
|
||||
|
||||
return reopenError;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user