savedata_factory: Partially implement IVFC save sizes using files
This stores a file in the save directory called '.yuzu_save_size' which stores the two save sizes (normal area and journaled area) sequentially as u64s.
This commit is contained in:
parent
0756f29a2c
commit
4082c4eda6
|
@ -13,6 +13,8 @@
|
||||||
|
|
||||||
namespace FileSys {
|
namespace FileSys {
|
||||||
|
|
||||||
|
constexpr const char* SAVE_DATA_SIZE_FILENAME = ".yuzu_save_size";
|
||||||
|
|
||||||
std::string SaveDataDescriptor::DebugInfo() const {
|
std::string SaveDataDescriptor::DebugInfo() const {
|
||||||
return fmt::format("[type={:02X}, title_id={:016X}, user_id={:016X}{:016X}, save_id={:016X}]",
|
return fmt::format("[type={:02X}, title_id={:016X}, user_id={:016X}{:016X}, save_id={:016X}]",
|
||||||
static_cast<u8>(type), title_id, user_id[1], user_id[0], save_id);
|
static_cast<u8>(type), title_id, user_id[1], user_id[0], save_id);
|
||||||
|
@ -132,4 +134,32 @@ std::string SaveDataFactory::GetFullPath(SaveDataSpaceId space, SaveDataType typ
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SaveDataSize SaveDataFactory::ReadSaveDataSize(SaveDataType type, u64 title_id,
|
||||||
|
u128 user_id) const {
|
||||||
|
const auto path = GetFullPath(SaveDataSpaceId::NandUser, type, title_id, user_id, 0);
|
||||||
|
const auto dir = GetOrCreateDirectoryRelative(this->dir, path);
|
||||||
|
|
||||||
|
const auto size_file = dir->GetFile(SAVE_DATA_SIZE_FILENAME);
|
||||||
|
if (size_file == nullptr || size_file->GetSize() < sizeof(SaveDataSize))
|
||||||
|
return {0, 0};
|
||||||
|
|
||||||
|
SaveDataSize out;
|
||||||
|
if (size_file->ReadObject(&out) != sizeof(SaveDataSize))
|
||||||
|
return {0, 0};
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SaveDataFactory::WriteSaveDataSize(SaveDataType type, u64 title_id, u128 user_id,
|
||||||
|
SaveDataSize new_value) {
|
||||||
|
const auto path = GetFullPath(SaveDataSpaceId::NandUser, type, title_id, user_id, 0);
|
||||||
|
const auto dir = GetOrCreateDirectoryRelative(this->dir, path);
|
||||||
|
|
||||||
|
const auto size_file = dir->CreateFile(SAVE_DATA_SIZE_FILENAME);
|
||||||
|
if (size_file == nullptr)
|
||||||
|
return;
|
||||||
|
|
||||||
|
size_file->Resize(sizeof(SaveDataSize));
|
||||||
|
size_file->WriteObject(new_value);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace FileSys
|
} // namespace FileSys
|
||||||
|
|
|
@ -46,6 +46,11 @@ struct SaveDataDescriptor {
|
||||||
};
|
};
|
||||||
static_assert(sizeof(SaveDataDescriptor) == 0x40, "SaveDataDescriptor has incorrect size.");
|
static_assert(sizeof(SaveDataDescriptor) == 0x40, "SaveDataDescriptor has incorrect size.");
|
||||||
|
|
||||||
|
struct SaveDataSize {
|
||||||
|
u64 normal;
|
||||||
|
u64 journal;
|
||||||
|
};
|
||||||
|
|
||||||
/// File system interface to the SaveData archive
|
/// File system interface to the SaveData archive
|
||||||
class SaveDataFactory {
|
class SaveDataFactory {
|
||||||
public:
|
public:
|
||||||
|
@ -60,6 +65,9 @@ public:
|
||||||
static std::string GetFullPath(SaveDataSpaceId space, SaveDataType type, u64 title_id,
|
static std::string GetFullPath(SaveDataSpaceId space, SaveDataType type, u64 title_id,
|
||||||
u128 user_id, u64 save_id);
|
u128 user_id, u64 save_id);
|
||||||
|
|
||||||
|
SaveDataSize ReadSaveDataSize(SaveDataType type, u64 title_id, u128 user_id) const;
|
||||||
|
void WriteSaveDataSize(SaveDataType type, u64 title_id, u128 user_id, SaveDataSize new_value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
VirtualDir dir;
|
VirtualDir dir;
|
||||||
};
|
};
|
||||||
|
|
Reference in New Issue