From 83da387eef75aa1140c81bd9e3e002ae3ea83864 Mon Sep 17 00:00:00 2001 From: Marcus Comstedt Date: Tue, 17 Dec 2002 01:15:13 +0000 Subject: New savefile backend system (bye bye NONSTANDARD_SAVE...) svn-id: r6007 --- backends/dc/Makefile | 2 +- backends/dc/dc.h | 3 + backends/dc/vmsave.cpp | 179 ++++++++++++++++++++++++++++++++----------------- backends/gp32/gp32.cpp | 41 ++++++++--- backends/gp32/gp32.h | 4 ++ 5 files changed, 155 insertions(+), 74 deletions(-) (limited to 'backends') diff --git a/backends/dc/Makefile b/backends/dc/Makefile index 9a8595a95e..79688a729d 100644 --- a/backends/dc/Makefile +++ b/backends/dc/Makefile @@ -6,7 +6,7 @@ VPATH = ../.. CXX = sh-elf-g++ -ml -m4-single-only CXXFLAGS= -O1 -Wno-multichar -DEFINES = -D__DC__ -DNONSTANDARD_PORT -DNONSTANDARD_SAVE +DEFINES = -D__DC__ -DNONSTANDARD_PORT LDFLAGS := -Wl,-Ttext,0x8c010000 -nostartfiles ronin/crt0.o INCLUDES:= -I./ -I../.. -I../../common CPPFLAGS= $(DEFINES) $(INCLUDES) diff --git a/backends/dc/dc.h b/backends/dc/dc.h index cf65f90567..686c590b6b 100644 --- a/backends/dc/dc.h +++ b/backends/dc/dc.h @@ -84,6 +84,9 @@ class OSystem_Dreamcast : public OSystem { virtual void unlock_mutex(void *mutex); virtual void delete_mutex(void *mutex); + // Savefile handling + virtual SaveFileManager *get_savefile_manager(); + static OSystem *create(); diff --git a/backends/dc/vmsave.cpp b/backends/dc/vmsave.cpp index 2bfd2278dd..c8d6d43add 100644 --- a/backends/dc/vmsave.cpp +++ b/backends/dc/vmsave.cpp @@ -155,6 +155,33 @@ static bool tryLoad(char *&buffer, int &size, const char *filename, int vm) return false; } +static void tryList(const char *prefix, bool *marks, int num, int vm) +{ + struct vmsinfo info; + struct superblock super; + struct dir_iterator iter; + struct dir_entry de; + int pl = strlen(prefix); + + if(!vmsfs_check_unit(vm, 0, &info)) + return; + if(!vmsfs_get_superblock(&info, &super)) + return; + vmsfs_open_dir(&super, &iter); + while(vmsfs_next_dir_entry(&iter, &de)) + if(de.entry[0]) { + char buf[16], *endp = NULL; + strncpy(buf, (char *)de.entry+4, 12); + buf[12] = 0; + int l = strlen(buf); + long i = 42; + if(l > pl && !strncmp(buf, prefix, pl) && + (i = strtol(buf+pl, &endp, 10))>=0 && iissave = true; - strncpy(c->filename, filename, 16); - c->pos = 0; - c->buffer = new char[c->size = MAX_SAVE_SIZE]; - return true; - } else if(readSaveGame(c->buffer, c->size, filename)) { - if(c->size > 0 && c->buffer[0] != 'S') { +public: + VMSave(const char *_filename, bool _saveOrLoad) + : issave(_saveOrLoad), pos(0), buffer(NULL) + { + strncpy(filename, _filename, 16); + if(issave) + buffer = new char[size = MAX_SAVE_SIZE]; + } + + ~VMSave(); + + virtual int fread(void *buf, int size, int cnt); + virtual int fwrite(void *buf, int size, int cnt); + + bool readSaveGame() + { return ::readSaveGame(buffer, size, filename); } + + void tryUncompress() + { + if(size > 0 && buffer[0] != 'S') { // Data does not start with "SCVM". Maybe compressed? char *expbuf = new char[MAX_SAVE_SIZE]; unsigned long destlen = MAX_SAVE_SIZE; - if(!uncompress((Bytef*)expbuf, &destlen, (Bytef*)c->buffer, c->size)) { - delete(c->buffer); - c->buffer = expbuf; - c->size = destlen; + if(!uncompress((Bytef*)expbuf, &destlen, (Bytef*)buffer, size)) { + delete(buffer); + buffer = expbuf; + size = destlen; } else delete expbuf; } - c->issave = false; - c->pos = 0; - return true; + } +}; + +class VMSaveManager : public SaveFileManager { + virtual SaveFile *open_savefile(const char *filename, bool saveOrLoad); + virtual void list_savefiles(const char *prefix, bool *marks, int num); +}; + +SaveFile *VMSaveManager::open_savefile(const char *filename, + bool saveOrLoad) +{ + VMSave *s = new VMSave(filename, saveOrLoad); + if(saveOrLoad) + return s; + else if(s->readSaveGame()) { + s->tryUncompress(); + return s; } else { - delete c; - context = NULL; - return false; + delete s; + return NULL; } } -void SerializerStream::fclose() +VMSave::~VMSave() { extern const char *gGameName; extern Icon icon; - if(context) { - vmStreamContext *c = (vmStreamContext *)context; - if(c->issave) { - if(c->pos) { - // Try compression - char *compbuf = new char[c->pos]; - unsigned long destlen = c->pos; - if(!compress((Bytef*)compbuf, &destlen, (Bytef*)c->buffer, c->pos)) { - delete c->buffer; - c->buffer = compbuf; - c->pos = destlen; - } else delete compbuf; - } - displaySaveResult(writeSaveGame(gGameName, c->buffer, - c->pos, c->filename, icon)); + if(issave) { + if(pos) { + // Try compression + char *compbuf = new char[pos]; + unsigned long destlen = pos; + if(!compress((Bytef*)compbuf, &destlen, (Bytef*)buffer, pos)) { + delete buffer; + buffer = compbuf; + pos = destlen; + } else delete compbuf; } - delete c->buffer; - delete c; - context = NULL; + displaySaveResult(writeSaveGame(gGameName, buffer, + pos, filename, icon)); } + delete buffer; } -int SerializerStream::fread(void *buf, int size, int cnt) +int VMSave::fread(void *buf, int sz, int cnt) { - vmStreamContext *c = (vmStreamContext *)context; - - if (!c || c->issave) + if (issave) return -1; - int nbyt = size*cnt; - if (c->pos + nbyt > c->size) { - cnt = (c->size - c->pos)/size; - nbyt = size*cnt; + int nbyt = sz*cnt; + if (pos + nbyt > size) { + cnt = (size - pos)/sz; + nbyt = sz*cnt; } if (nbyt) - memcpy(buf, c->buffer + c->pos, nbyt); - c->pos += nbyt; + memcpy(buf, buffer + pos, nbyt); + pos += nbyt; return cnt; } -int SerializerStream::fwrite(void *buf, int size, int cnt) +int VMSave::fwrite(void *buf, int sz, int cnt) { - vmStreamContext *c = (vmStreamContext *)context; - - if (!c || !c->issave) + if (!issave) return -1; - int nbyt = size*cnt; - if (c->pos + nbyt > c->size) { - cnt = (c->size - c->pos)/size; - nbyt = size*cnt; + int nbyt = sz*cnt; + if (pos + nbyt > size) { + cnt = (size - pos)/sz; + nbyt = sz*cnt; } if (nbyt) - memcpy(c->buffer + c->pos, buf, nbyt); - c->pos += nbyt; + memcpy(buffer + pos, buf, nbyt); + pos += nbyt; return cnt; } + +void VMSaveManager::list_savefiles(const char *prefix, + bool *marks, int num) +{ + memset(marks, false, num*sizeof(bool)); + + for(int i=0; i<24; i++) + tryList(prefix, marks, num, i); +} + +SaveFileManager *OSystem_Dreamcast::get_savefile_manager() +{ + return new VMSaveManager(); +} diff --git a/backends/gp32/gp32.cpp b/backends/gp32/gp32.cpp index 773b4e95ec..19a1aaec57 100644 --- a/backends/gp32/gp32.cpp +++ b/backends/gp32/gp32.cpp @@ -1221,26 +1221,47 @@ extern "C" int write(int fd, void *p, size_t n); int write(int fd, void *p, size_t n) { return 0; } //ph0x hack! // fixme - unnecessary? -int SerializerStream::fwrite(void *buf, int size, int cnt) { +class GP32SaveFile : public SaveFile { +private: + FILE *fh; +public: + GP32SaveFile(FILE *f) : fh(f) { } + + ~GP32SaveFile(); + + int fread(void *buf, int size, int cnt); + int fwrite(void *buf, int size, int cnt); +} + +class GP32SaveFileManager : public SaveFileManager { + SaveFile *open_savefile(const char *filename, bool saveOrLoad); +} + +int GP32SaveFile::fwrite(void *buf, int size, int cnt) { // implement me - return ::fwrite(buf, size, cnt, (FILE*)context); + return ::fwrite(buf, size, cnt, fh); } -bool SerializerStream::fopen(const char *filename, const char *mode) { +SaveFile GP32SaveFileManager::open_savefile(const char *filename, + bool saveOrLoad) { // implement me - (FILE*)context = ::fopen(filename, mode); - //if (tolower(mode[0])=='w') error("Autosaving.."); - return context != NULL; + FILE *fh = ::fopen(filename, (saveOrLoad? "wb":"rb")); + //if (saveOrLoad) error("Autosaving.."); + return fh? new GP32SaveFile(fh) : NULL; } -void SerializerStream::fclose() { +void GP32SaveFile::~GP32SaveFile() { // implement me - ::fclose((FILE*)context); + ::fclose(fh); } -int SerializerStream::fread(void *buf, int size, int cnt) { +int GP32SaveFile::fread(void *buf, int size, int cnt) { // implement me - return ::fread(buf, size, cnt, (FILE*)context); + return ::fread(buf, size, cnt, fh); + +} +SaveFileManager *OSystem_GP32::get_savefile_manager() { + return new GP32SaveFileManager(); } // Converts 8bit rgb values to a GP32 palette value diff --git a/backends/gp32/gp32.h b/backends/gp32/gp32.h index 7546a25b7b..f56de538f7 100644 --- a/backends/gp32/gp32.h +++ b/backends/gp32/gp32.h @@ -115,6 +115,10 @@ public: void grab_overlay(int16 *buf, int pitch); void copy_rect_overlay(const int16 *buf, int pitch, int x, int y, int w, int h); + // Savefiles + SaveFileManager *get_savefile_manager(); + + static OSystem *create(int gfx_mode, bool full_screen); private: typedef void ScalerProc(uint8 *srcPtr, uint32 srcPitch, uint8 *deltaPtr, -- cgit v1.2.3