From 3dee91f68fc738f74492eb2d4e8cf14a19a8a6f4 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sun, 29 Sep 2013 13:54:39 -0700 Subject: [PATCH] Separate a quick interface to savestate to memory. --- Common/ChunkFile.h | 69 ++++++++++++++++++++++++++++++---------------- 1 file changed, 45 insertions(+), 24 deletions(-) diff --git a/Common/ChunkFile.h b/Common/ChunkFile.h index eb17f5eafb..e77668b0b2 100644 --- a/Common/ChunkFile.h +++ b/Common/ChunkFile.h @@ -661,6 +661,43 @@ public: ERROR_BROKEN_STATE, }; + // May fail badly if ptr doesn't point to valid data. + template + static Error LoadPtr(u8 *ptr, T &_class) + { + PointerWrap p(&ptr, PointerWrap::MODE_READ); + _class.DoState(p); + + if (p.error != p.ERROR_FAILURE) { + return ERROR_NONE; + } else { + return ERROR_BROKEN_STATE; + } + } + + template + static size_t MeasurePtr(T &_class) + { + u8 *ptr = 0; + PointerWrap p(&ptr, PointerWrap::MODE_MEASURE); + _class.DoState(p); + return (size_t)ptr; + } + + // Expects ptr to have at least MeasurePtr bytes at ptr. + template + static Error SavePtr(u8 *ptr, T &_class) + { + PointerWrap p(&ptr, PointerWrap::MODE_WRITE); + _class.DoState(p); + + if (p.error != p.ERROR_FAILURE) { + return ERROR_NONE; + } else { + return ERROR_BROKEN_STATE; + } + } + // Load file template template static Error Load(const std::string& _rFilename, int _Revision, const char *_VersionString, T& _class, std::string* _failureReason) @@ -745,18 +782,13 @@ public: delete [] buffer; } - PointerWrap p(&ptr, PointerWrap::MODE_READ); - _class.DoState(p); + Error error = LoadPtr(ptr, _class); delete[] buf; INFO_LOG(COMMON, "ChunkReader: Done loading %s" , _rFilename.c_str()); - if (p.error != p.ERROR_FAILURE) { - return ERROR_NONE; - } else { - return ERROR_BROKEN_STATE; - } + return error; } - + // Save file template template static Error Save(const std::string& _rFilename, int _Revision, const char *_VersionString, T& _class) @@ -773,15 +805,9 @@ public: bool compress = true; // Get data - u8 *ptr = 0; - PointerWrap p(&ptr, PointerWrap::MODE_MEASURE); - _class.DoState(p); - size_t const sz = (size_t)ptr; - - u8 * buffer = new u8[sz]; - ptr = &buffer[0]; - p.SetMode(PointerWrap::MODE_WRITE); - _class.DoState(p); + size_t const sz = MeasurePtr(_class); + u8 *buffer = new u8[sz]; + Error error = SavePtr(buffer, _class); // Create header SChunkHeader header; @@ -825,13 +851,8 @@ public: delete [] buffer; } - INFO_LOG(COMMON,"ChunkReader: Done writing %s", - _rFilename.c_str()); - if (p.error != p.ERROR_FAILURE) { - return ERROR_NONE; - } else { - return ERROR_BROKEN_STATE; - } + INFO_LOG(COMMON, "ChunkReader: Done writing %s", _rFilename.c_str()); + return error; } template