aboutsummaryrefslogtreecommitdiff
path: root/backends/dc/vmsave.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'backends/dc/vmsave.cpp')
-rw-r--r--backends/dc/vmsave.cpp407
1 files changed, 0 insertions, 407 deletions
diff --git a/backends/dc/vmsave.cpp b/backends/dc/vmsave.cpp
deleted file mode 100644
index 604d9230a7..0000000000
--- a/backends/dc/vmsave.cpp
+++ /dev/null
@@ -1,407 +0,0 @@
-/* ScummVM - Scumm Interpreter
- * Dreamcast port
- * Copyright (C) 2002-2004 Marcus Comstedt
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
-
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
-
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- *
- * $URL$
- * $Id$
- *
- */
-
-#include <common/stdafx.h>
-#include <common/scummsys.h>
-#include "base/engine.h"
-#include "dc.h"
-#include "icon.h"
-#include <common/savefile.h>
-#include <gui/newgui.h>
-#include <gui/message.h>
-
-#include <zlib.h>
-
-
-// Savegame can not be bigger than this, even before compression
-#define MAX_SAVE_SIZE (128*1024)
-
-
-enum vmsaveResult {
- VMSAVE_OK,
- VMSAVE_NOVM,
- VMSAVE_NOSPACE,
- VMSAVE_WRITEERROR,
-};
-
-
-static int lastvm=-1;
-
-static void displaySaveResult(vmsaveResult res)
-{
- char buf[1024];
-
- switch(res) {
- case VMSAVE_OK:
- sprintf(buf, "Game saved on unit %c%d", 'A'+(lastvm/6), lastvm%6);
- break;
- case VMSAVE_NOVM:
- strcpy(buf, "No memory card present!");
- break;
- case VMSAVE_NOSPACE:
- strcpy(buf, "Not enough space available!");
- break;
- case VMSAVE_WRITEERROR:
- strcpy(buf, "Write error!!!");
- break;
- default:
- strcpy(buf, "Unknown error!!!");
- break;
- }
-
- GUI::MessageDialog dialog(buf);
- dialog.runModal();
-}
-
-static vmsaveResult trySave(const char *gamename, const char *data, int size,
- const char *filename, class Icon &icon, int vm)
-{
- struct vmsinfo info;
- struct superblock super;
- struct vms_file file;
- struct vms_file_header header;
- struct timestamp tstamp;
- struct tm tm;
- time_t t;
- unsigned char iconbuffer[512+32];
-
- if(!vmsfs_check_unit(vm, 0, &info))
- return VMSAVE_NOVM;
- if(!vmsfs_get_superblock(&info, &super))
- return VMSAVE_NOVM;
- int free_cnt = vmsfs_count_free(&super);
- if(vmsfs_open_file(&super, filename, &file))
- free_cnt += file.blks;
- if(((128+512+size+511)>>9) > free_cnt)
- return VMSAVE_NOSPACE;
-
- memset(&header, 0, sizeof(header));
- strncpy(header.shortdesc, "ScummVM savegame", 16);
- strncpy(header.longdesc, gamename, 32);
- strncpy(header.id, "ScummVM", 16);
- icon.create_vmicon(iconbuffer);
- header.numicons = 1;
- memcpy(header.palette, iconbuffer, sizeof(header.palette));
- time(&t);
- tm = *localtime(&t);
- tstamp.year = tm.tm_year+1900;
- tstamp.month = tm.tm_mon+1;
- tstamp.day = tm.tm_mday;
- tstamp.hour = tm.tm_hour;
- tstamp.minute = tm.tm_min;
- tstamp.second = tm.tm_sec;
- tstamp.wkday = (tm.tm_wday+6)%7;
-
- vmsfs_beep(&info, 1);
-
- vmsfs_errno = 0;
- if(!vmsfs_create_file(&super, filename, &header,
- iconbuffer+sizeof(header.palette), NULL,
- data, size, &tstamp)) {
- fprintf(stderr, "%s\n", vmsfs_describe_error());
- vmsfs_beep(&info, 0);
- return VMSAVE_WRITEERROR;
- }
-
- vmsfs_beep(&info, 0);
- return VMSAVE_OK;
-}
-
-static bool tryLoad(char *&buffer, int &size, const char *filename, int vm)
-{
- struct vmsinfo info;
- struct superblock super;
- struct vms_file file;
- struct vms_file_header header;
- struct timestamp tstamp;
- struct tm tm;
- time_t t;
- unsigned char iconbuffer[512+32];
-
- if(!vmsfs_check_unit(vm, 0, &info))
- return false;
- if(!vmsfs_get_superblock(&info, &super))
- return false;
- if(!vmsfs_open_file(&super, filename, &file))
- return false;
-
- buffer = new char[size = file.size];
-
- if(vmsfs_read_file(&file, (unsigned char *)buffer, size))
- return true;
-
- delete[] buffer;
- buffer = NULL;
- 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 && i<num &&
- (endp - buf) == l)
- marks[i] = true;
- }
-}
-
-vmsaveResult writeSaveGame(const char *gamename, const char *data, int size,
- const char *filename, class Icon &icon)
-{
- vmsaveResult r, res = VMSAVE_NOVM;
-
- if(lastvm >= 0 &&
- (res = trySave(gamename, data, size, filename, icon, lastvm)) == VMSAVE_OK)
- return res;
-
- for(int i=0; i<24; i++)
- if((r = trySave(gamename, data, size, filename, icon, i)) == VMSAVE_OK) {
- lastvm = i;
- return r;
- } else if(r > res)
- res = r;
-
- return res;
-}
-
-bool readSaveGame(char *&buffer, int &size, const char *filename)
-{
- if(lastvm >= 0 &&
- tryLoad(buffer, size, filename, lastvm))
- return true;
-
- for(int i=0; i<24; i++)
- if(tryLoad(buffer, size, filename, i)) {
- lastvm = i;
- return true;
- }
-
- return false;
-}
-
-
-class InVMSave : public Common::InSaveFile {
-private:
- char *buffer;
- int _pos, _size;
-
- uint32 read(void *buf, uint32 cnt);
- void skip(uint32 offset);
- void seek(int32 offs, int whence);
-
-public:
- InVMSave()
- : _pos(0), buffer(NULL)
- { }
-
- ~InVMSave()
- {
- if(buffer != NULL)
- delete[] buffer;
- }
-
- bool eos() const { return _pos >= _size; }
- uint32 pos() const { return _pos; }
- uint32 size() const { return _size; }
-
- bool readSaveGame(const char *filename)
- { 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*)buffer, _size)) {
- delete[] buffer;
- buffer = expbuf;
- _size = destlen;
- } else delete[] expbuf;
- }
- }
-};
-
-class OutVMSave : public Common::OutSaveFile {
-private:
- char *buffer;
- int pos, size, committed;
- char filename[16];
- bool iofailed;
-
-public:
- uint32 write(const void *buf, uint32 cnt);
-
- OutVMSave(const char *_filename)
- : pos(0), committed(-1), iofailed(false)
- {
- strncpy(filename, _filename, 16);
- buffer = new char[size = MAX_SAVE_SIZE];
- }
-
- ~OutVMSave();
-
- bool ioFailed() const { return iofailed; }
- void clearIOFailed() { iofailed = false; }
- void flush();
-};
-
-class VMSaveManager : public Common::SaveFileManager {
-public:
-
- virtual Common::OutSaveFile *openForSaving(const char *filename) {
- return new OutVMSave(filename);
- }
-
- virtual Common::InSaveFile *openForLoading(const char *filename) {
- InVMSave *s = new InVMSave();
- if(s->readSaveGame(filename)) {
- s->tryUncompress();
- return s;
- } else {
- delete s;
- return NULL;
- }
- }
-
- virtual void listSavefiles(const char *prefix, bool *marks, int num);
-};
-
-void OutVMSave::flush()
-{
- extern const char *gGameName;
- extern Icon icon;
-
- if(committed >= pos)
- return;
-
- char *data = buffer, *compbuf = NULL;
- int len = pos;
-
- if(pos) {
- // Try compression
- compbuf = new char[pos];
- unsigned long destlen = pos;
- if(!compress((Bytef*)compbuf, &destlen, (Bytef*)buffer, pos)) {
- data = compbuf;
- len = destlen;
- }
- }
- vmsaveResult r = writeSaveGame(gGameName, data, len, filename, icon);
- committed = pos;
- if(compbuf != NULL)
- delete[] compbuf;
- if(r != VMSAVE_OK)
- iofailed = true;
- displaySaveResult(r);
-}
-
-OutVMSave::~OutVMSave()
-{
- flush();
- delete[] buffer;
-}
-
-uint32 InVMSave::read(void *buf, uint32 cnt)
-{
- int nbyt = cnt;
- if (_pos + nbyt > _size) {
- cnt = (_size - _pos);
- nbyt = cnt;
- }
- if (nbyt)
- memcpy(buf, buffer + _pos, nbyt);
- _pos += nbyt;
- return cnt;
-}
-
-void InVMSave::skip(uint32 offset)
-{
- int nbyt = offset;
- if (_pos + nbyt > _size)
- nbyt = (_size - _pos);
- _pos += nbyt;
-}
-
-void InVMSave::seek(int32 offs, int whence)
-{
- switch(whence) {
- case SEEK_SET:
- _pos = offs;
- break;
- case SEEK_CUR:
- _pos += offs;
- break;
- case SEEK_END:
- _pos = _size + offs;
- break;
- }
- if(_pos < 0)
- _pos = 0;
- else if(_pos > _size)
- _pos = _size;
-}
-
-uint32 OutVMSave::write(const void *buf, uint32 cnt)
-{
- int nbyt = cnt;
- if (pos + nbyt > size) {
- cnt = (size - pos);
- nbyt = cnt;
- }
- if (nbyt)
- memcpy(buffer + pos, buf, nbyt);
- pos += nbyt;
- return cnt;
-}
-
-
-void VMSaveManager::listSavefiles(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);
-}
-
-Common::SaveFileManager *OSystem_Dreamcast::getSavefileManager()
-{
- return new VMSaveManager();
-}