aboutsummaryrefslogtreecommitdiff
path: root/backends/PalmOS/Src/saveslot.cpp
diff options
context:
space:
mode:
authorMax Horn2003-04-30 11:37:10 +0000
committerMax Horn2003-04-30 11:37:10 +0000
commit42f156ddada4c6f51e1612e9b0f18ec7c9dd9cee (patch)
treea2b7ba14f7f919987239902e513c1a646ca2e9f8 /backends/PalmOS/Src/saveslot.cpp
parent79ebda7613b3280ae644d67af50712deef8819d7 (diff)
downloadscummvm-rg350-42f156ddada4c6f51e1612e9b0f18ec7c9dd9cee.tar.gz
scummvm-rg350-42f156ddada4c6f51e1612e9b0f18ec7c9dd9cee.tar.bz2
scummvm-rg350-42f156ddada4c6f51e1612e9b0f18ec7c9dd9cee.zip
started to merge in Chrilith's PalmOS port
svn-id: r7219
Diffstat (limited to 'backends/PalmOS/Src/saveslot.cpp')
-rw-r--r--backends/PalmOS/Src/saveslot.cpp92
1 files changed, 92 insertions, 0 deletions
diff --git a/backends/PalmOS/Src/saveslot.cpp b/backends/PalmOS/Src/saveslot.cpp
new file mode 100644
index 0000000000..b8bd5bdeed
--- /dev/null
+++ b/backends/PalmOS/Src/saveslot.cpp
@@ -0,0 +1,92 @@
+//#include "extras.h"
+#include <string.h>
+#include "scummsys.h"
+#include "saveload.h"
+
+#define MAX_BLOCK 64000
+
+enum SaveLoadState {
+ STATE_LOAD,
+ STATE_SAVE,
+ STATE_NONE
+};
+
+class SaveLoadData {
+ public:
+ SaveLoadData();
+
+ SaveLoadState _currentState;
+ byte * _readWriteData;
+ uint32 _readWritePos;
+ bool _needDump;
+};
+
+SaveLoadData current;
+
+SaveLoadData::SaveLoadData()
+{
+ _currentState = STATE_NONE;
+ _readWritePos = 0;
+ _needDump = false;
+}
+
+bool SerializerStream::fopen(const char *filename, const char *mode)
+{
+ if (current._currentState != STATE_NONE)
+ fclose();
+
+ context = ::fopen(filename, mode);
+ if (context != NULL) {
+ current._currentState = ((strcmp(mode,"rb")==0) ? STATE_LOAD : STATE_SAVE);
+ return true;
+ }
+
+ return false;
+}
+
+int SerializerStream::fread(void *buf, int size, int cnt)
+{
+ return ::fread(buf, size, cnt, (FILE *)context);
+}
+
+int SerializerStream::fwrite(void *buf, int size, int cnt) {
+
+ int fullsize = size*cnt;
+
+ if (current._currentState == STATE_SAVE && fullsize<=MAX_BLOCK)
+ {
+ if (!current._readWriteData)
+ current._readWriteData = (byte *)malloc(MAX_BLOCK);
+
+ if ((current._readWritePos+fullsize)>MAX_BLOCK) {
+ ::fwrite(current._readWriteData, current._readWritePos, 1, (FILE *)context);
+ current._readWritePos = 0;
+ current._needDump = false;
+ }
+
+ memcpy(current._readWriteData + current._readWritePos, buf, fullsize);
+ current._readWritePos += fullsize;
+ current._needDump = true;
+
+ return cnt;
+ }
+
+ return ::fwrite(buf, size, cnt, (FILE *)context);
+}
+
+
+void SerializerStream::fclose()
+{
+ if (current._needDump && current._readWriteData != NULL) {
+ if (current._currentState == STATE_SAVE)
+ ::fwrite(current._readWriteData, current._readWritePos, 1, (FILE *)context);
+
+ free(current._readWriteData);
+ current._readWriteData = NULL;
+ }
+
+ current._readWritePos = 0;
+ current._needDump = false;
+ current._currentState = STATE_NONE;
+ ::fclose((FILE *)context);
+} \ No newline at end of file