More elegant serialisation data structure.
Signed-off-by: Andrea Odetti <mariofutire@gmail.com>
This commit is contained in:
parent
02740cee80
commit
a16b2b2d35
3 changed files with 18 additions and 17 deletions
|
@ -387,13 +387,13 @@ size_t retro_serialize_size(void)
|
|||
bool retro_serialize(void *data, size_t size)
|
||||
{
|
||||
ra2::log_cb(RETRO_LOG_INFO, "RA2: %s\n", __FUNCTION__);
|
||||
return ra2::RetroSerialisation::serialise(static_cast<char *>(data), size);
|
||||
return ra2::RetroSerialisation::serialise(data, size);
|
||||
}
|
||||
|
||||
bool retro_unserialize(const void *data, size_t size)
|
||||
{
|
||||
ra2::log_cb(RETRO_LOG_INFO, "RA2: %s\n", __FUNCTION__);
|
||||
return ra2::RetroSerialisation::deserialise(static_cast<const char *>(data), size);
|
||||
return ra2::RetroSerialisation::deserialise(data, size);
|
||||
}
|
||||
|
||||
void retro_cheat_reset(void)
|
||||
|
|
|
@ -49,6 +49,12 @@ namespace
|
|||
Snapshot_SaveState();
|
||||
}
|
||||
|
||||
struct SerialisationFormat_t
|
||||
{
|
||||
uint32_t size;
|
||||
char data[]; // zero-length array, containing the AW's yaml format
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
namespace ra2
|
||||
|
@ -70,7 +76,7 @@ namespace ra2
|
|||
return sizeof(uint32_t) + fileSize;
|
||||
}
|
||||
|
||||
bool RetroSerialisation::serialise(char * data, size_t size)
|
||||
bool RetroSerialisation::serialise(void * data, size_t size)
|
||||
{
|
||||
AutoFile autoFile;
|
||||
if (!autoFile)
|
||||
|
@ -89,19 +95,17 @@ namespace ra2
|
|||
}
|
||||
else
|
||||
{
|
||||
uint32_t * sizePtr = reinterpret_cast<uint32_t *>(data);
|
||||
*sizePtr = fileSize;
|
||||
|
||||
char * dataPtr = data + sizeof(uint32_t);
|
||||
SerialisationFormat_t * serialised = reinterpret_cast<SerialisationFormat_t *>(data);
|
||||
serialised->size = fileSize;
|
||||
|
||||
ifs.seekg(0, std::ios::beg);
|
||||
ifs.read(dataPtr, fileSize);
|
||||
ifs.read(serialised->data, serialised->size);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool RetroSerialisation::deserialise(const char * data, size_t size)
|
||||
bool RetroSerialisation::deserialise(const void * data, size_t size)
|
||||
{
|
||||
AutoFile autoFile;
|
||||
if (!autoFile)
|
||||
|
@ -109,22 +113,19 @@ namespace ra2
|
|||
return false;
|
||||
}
|
||||
|
||||
const uint32_t * sizePtr = reinterpret_cast<const uint32_t *>(data);
|
||||
const size_t fileSize = *sizePtr;
|
||||
const SerialisationFormat_t * serialised = reinterpret_cast<const SerialisationFormat_t *>(data);
|
||||
|
||||
if (sizeof(uint32_t) + fileSize > size)
|
||||
if (sizeof(uint32_t) + serialised->size > size)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
const char * dataPtr = data + sizeof(uint32_t);
|
||||
|
||||
const std::string filename = autoFile.getFilename();
|
||||
// do not remove the {} scope below!
|
||||
{
|
||||
std::ofstream ofs(filename, std::ios::binary);
|
||||
ofs.write(dataPtr, fileSize);
|
||||
ofs.write(serialised->data, serialised->size);
|
||||
}
|
||||
|
||||
Snapshot_SetFilename(filename);
|
||||
|
|
|
@ -7,8 +7,8 @@ namespace ra2
|
|||
{
|
||||
public:
|
||||
static size_t getSize();
|
||||
static bool serialise(char * data, size_t size);
|
||||
static bool deserialise(const char * data, size_t size);
|
||||
static bool serialise(void * data, size_t size);
|
||||
static bool deserialise(const void * data, size_t size);
|
||||
};
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue