aboutsummaryrefslogtreecommitdiff
path: root/backends/PalmOS/Src/palmsave.cpp
diff options
context:
space:
mode:
authorChris Apers2004-09-12 13:01:12 +0000
committerChris Apers2004-09-12 13:01:12 +0000
commit609c57c25ae0f7174bdacd4df14d6c290d6ca2be (patch)
tree996c56c8227cc69afa13592b6c73749f66bc16f8 /backends/PalmOS/Src/palmsave.cpp
parent30d0b6f7ba5e8e11baaf9dc0c14d41a48c283f70 (diff)
downloadscummvm-rg350-609c57c25ae0f7174bdacd4df14d6c290d6ca2be.tar.gz
scummvm-rg350-609c57c25ae0f7174bdacd4df14d6c290d6ca2be.tar.bz2
scummvm-rg350-609c57c25ae0f7174bdacd4df14d6c290d6ca2be.zip
Cache read/write data to speed up access
svn-id: r15046
Diffstat (limited to 'backends/PalmOS/Src/palmsave.cpp')
-rw-r--r--backends/PalmOS/Src/palmsave.cpp97
1 files changed, 70 insertions, 27 deletions
diff --git a/backends/PalmOS/Src/palmsave.cpp b/backends/PalmOS/Src/palmsave.cpp
index 5e49e71ec8..c3e2825f29 100644
--- a/backends/PalmOS/Src/palmsave.cpp
+++ b/backends/PalmOS/Src/palmsave.cpp
@@ -22,12 +22,9 @@
#include <ctype.h>
#include "stdafx.h"
-#include "common/scummsys.h"
-#include "base/engine.h"
-#include "scumm/saveload.h"
#include "palm.h"
-#define MAX_BLOCK 64000 // store in memory, before dump to file
+#define MAX_BLOCK 64000 // store in memory, before dump to file
// SaveFile class
@@ -38,14 +35,15 @@ public:
bool isOpen() const { return file != NULL; }
- uint32 read(void *buf, uint32 cnt);
- uint32 write(const void *buf, uint32 cnt);
+ uint32 read(void *buf, uint32 size);
+ uint32 write(const void *buf, uint32 size);
private :
FILE *file;
- UInt8 * _readWriteData;
+ UInt8 *_readWriteData;
UInt32 _readWritePos;
bool _needDump;
+ UInt32 length;
};
PalmSaveFile::PalmSaveFile(const char *filename, bool saveOrLoad) {
@@ -54,57 +52,102 @@ PalmSaveFile::PalmSaveFile(const char *filename, bool saveOrLoad) {
_needDump = false;
file = ::fopen(filename, (saveOrLoad ? "wb" : "rb"));
+
+ if (file) {
+ if (saveOrLoad) {
+ _readWriteData = (byte *)malloc(MAX_BLOCK);
+
+ } else {
+ // read : cache the whole file
+ ::fseek(file, 0, SEEK_END);
+ length = ::ftell(file);
+ ::fseek(file, 0, SEEK_SET);
+
+ _readWriteData = (byte *)malloc(length);
+ _readWritePos = 0;
+
+ if (_readWriteData)
+ ::fread(_readWriteData, 1, length, file);
+ }
+ }
}
PalmSaveFile::~PalmSaveFile() {
if (file) {
- if (_needDump && _readWriteData) {
+ if (_needDump)
::fwrite(_readWriteData, _readWritePos, 1, file);
+
+ if (_readWriteData)
free(_readWriteData);
- }
::fclose(file);
}
}
-uint32 PalmSaveFile::read(void *buf, uint32 cnt) {
- return ::fread(buf, 1, cnt, file);
+uint32 PalmSaveFile::read(void *buf, uint32 size) {
+ if (!_readWriteData)
+ // we must return the size, where fread return nitems upon success ( 1 <=> size)
+ return (::fread(buf, 1, size, file));
+
+ if (_readWritePos < length) {
+ MemMove(buf, _readWriteData + _readWritePos, size);
+ _readWritePos += size;
+ return size;
+ }
+
+ return 0;
}
-uint32 PalmSaveFile::write(const void *buf, uint32 cnt) {
- UInt32 fullsize = cnt;
+uint32 PalmSaveFile::write(const void *buf, uint32 size) {
+ if (_readWriteData) {
- if (fullsize <= MAX_BLOCK)
- {
- if (!_readWriteData)
- _readWriteData = (byte *)malloc(MAX_BLOCK);
+ if ((_readWritePos + size) > MAX_BLOCK) {
+ if (_readWritePos > 0)
+ ::fwrite(_readWriteData, _readWritePos, 1, file);
- if ((_readWritePos+fullsize)>MAX_BLOCK) {
- ::fwrite(_readWriteData, _readWritePos, 1, file);
_readWritePos = 0;
_needDump = false;
- }
-
- MemMove(_readWriteData + _readWritePos, buf, fullsize);
- _readWritePos += fullsize;
- _needDump = true;
- return cnt;
+ } else {
+ // save new block
+ MemMove(_readWriteData + _readWritePos, buf, size);
+ _readWritePos += size;
+ _needDump = true;
+
+ return size;
+ }
}
- return ::fwrite(buf, 1, cnt, file);
+ // we must return the size, where fwrite return nitems upon success ( 1 <=> size)
+ return ::fwrite(buf, 1, size, file);
}
// SaveFileManager class
-class PalmSaveFileManager : public DefaultSaveFileManager {
+class PalmSaveFileManager : public SaveFileManager {
public:
+ SaveFile *open_savefile(const char *filename, const char *directory, bool saveOrLoad);
void list_savefiles(const char *prefix, const char *directory, bool *marks, int num);
protected:
SaveFile *makeSaveFile(const char *filename, bool saveOrLoad);
};
+SaveFile *PalmSaveFileManager::open_savefile(const char *filename, const char *directory, bool saveOrLoad) {
+ char buf[256];
+
+ strncpy(buf, directory, sizeof(buf));
+ strncat(buf, filename, sizeof(buf));
+
+ SaveFile *sf = makeSaveFile(buf, saveOrLoad);
+ if (!sf->isOpen()) {
+ delete sf;
+ sf = NULL;
+ }
+
+ return sf;
+}
+
void PalmSaveFileManager::list_savefiles(const char *prefix, const char *directory, bool *marks, int num) {
FileRef fileRef;
// try to open the dir