mirror of
https://github.com/libretro/scummvm.git
synced 2024-12-13 04:28:37 +00:00
Harmonized SaveFile API with File API a bit.
svn-id: r9626
This commit is contained in:
parent
9d09512765
commit
a5aa5c0d73
@ -36,10 +36,9 @@ public:
|
||||
~PalmSaveFile();
|
||||
|
||||
bool is_open() { return file != NULL; }
|
||||
protected:
|
||||
int fread(void *buf, int size, int cnt);
|
||||
int fwrite(void *buf, int size, int cnt);
|
||||
// must be removed
|
||||
int feof() { return ::feof(file); }
|
||||
int fwrite(const void *buf, int size, int cnt);
|
||||
|
||||
private :
|
||||
FILE *file;
|
||||
@ -71,7 +70,7 @@ int PalmSaveFile::fread(void *buf, int size, int cnt) {
|
||||
return ::fread(buf, size, cnt, file);
|
||||
}
|
||||
|
||||
int PalmSaveFile::fwrite(void *buf, int size, int cnt) {
|
||||
int PalmSaveFile::fwrite(const void *buf, int size, int cnt) {
|
||||
UInt32 fullsize = size*cnt;
|
||||
|
||||
if (fullsize <= MAX_BLOCK)
|
||||
@ -104,8 +103,12 @@ public:
|
||||
void list_savefiles(const char *prefix, bool *marks, int num);
|
||||
};
|
||||
|
||||
SaveFile *PalmSaveFileManager::open_savefile(const char *filename, bool saveOrLoad) {
|
||||
PalmSaveFile *sf = new PalmSaveFile(filename, (saveOrLoad? "wb":"rb"));
|
||||
SaveFile *PalmSaveFileManager::open_savefile(const char *filename, const char *dirname, bool saveOrLoad) {
|
||||
char buf[256];
|
||||
|
||||
join_paths(filename, dirname, buf, sizeof(buf));
|
||||
|
||||
PalmSaveFile *sf = new PalmSaveFile(buf, (saveOrLoad? "wb":"rb"));
|
||||
|
||||
if(!sf->is_open()) {
|
||||
delete sf;
|
||||
@ -115,21 +118,20 @@ SaveFile *PalmSaveFileManager::open_savefile(const char *filename, bool saveOrLo
|
||||
return sf;
|
||||
}
|
||||
|
||||
void PalmSaveFileManager::list_savefiles(const char *prefix, bool *marks, int num) {
|
||||
void PalmSaveFileManager::list_savefiles(const char *prefix, const char *direcory, bool *marks, int num) {
|
||||
FileRef fileRef;
|
||||
// try to open the dir
|
||||
Err e = VFSFileOpen(gVars->volRefNum, SCUMMVM_SAVEPATH, vfsModeRead, &fileRef);
|
||||
Err e = VFSFileOpen(gVars->volRefNum, directory, vfsModeRead, &fileRef);
|
||||
memset(marks, false, num*sizeof(bool));
|
||||
|
||||
if (e != errNone)
|
||||
return;
|
||||
|
||||
// enumerate all files
|
||||
Char *nameonly = strrchr(prefix,'/') + 1;
|
||||
UInt32 dirEntryIterator = vfsIteratorStart;
|
||||
Char filename[32];
|
||||
FileInfoType info = {0, filename, 32};
|
||||
UInt16 length = StrLen(nameonly);
|
||||
UInt16 length = StrLen(prefix);
|
||||
int slot = 0;
|
||||
|
||||
while (dirEntryIterator != vfsIteratorStop) {
|
||||
@ -138,7 +140,7 @@ void PalmSaveFileManager::list_savefiles(const char *prefix, bool *marks, int nu
|
||||
if (e != expErrEnumerationEmpty) { // there is something
|
||||
|
||||
if (StrLen(info.nameP) == (length + 2)) { // consider max 99, filename length is ok
|
||||
if (StrNCaselessCompare(nameonly, info.nameP, length) == 0) { // this seems to be a save file
|
||||
if (StrNCaselessCompare(prefix, info.nameP, length) == 0) { // this seems to be a save file
|
||||
if (isdigit(info.nameP[length]) && isdigit(info.nameP[length+1])) {
|
||||
|
||||
slot = StrAToI(filename + length);
|
||||
|
@ -224,6 +224,10 @@ private:
|
||||
int pos, size;
|
||||
char filename[16];
|
||||
|
||||
protected:
|
||||
virtual int fread(void *buf, int size, int cnt);
|
||||
virtual int fwrite(const void *buf, int size, int cnt);
|
||||
|
||||
public:
|
||||
VMSave(const char *_filename, bool _saveOrLoad)
|
||||
: issave(_saveOrLoad), pos(0), buffer(NULL)
|
||||
@ -235,9 +239,6 @@ public:
|
||||
|
||||
~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); }
|
||||
|
||||
@ -257,11 +258,11 @@ public:
|
||||
};
|
||||
|
||||
class VMSaveManager : public SaveFileManager {
|
||||
virtual SaveFile *open_savefile(const char *filename, bool saveOrLoad);
|
||||
virtual void list_savefiles(const char *prefix, bool *marks, int num);
|
||||
virtual SaveFile *open_savefile(const char *filename, const char *directory, bool saveOrLoad);
|
||||
virtual void list_savefiles(const char *prefix, const char *directory, bool *marks, int num);
|
||||
};
|
||||
|
||||
SaveFile *VMSaveManager::open_savefile(const char *filename,
|
||||
SaveFile *VMSaveManager::open_savefile(const char *filename, const char *directory,
|
||||
bool saveOrLoad)
|
||||
{
|
||||
VMSave *s = new VMSave(filename, saveOrLoad);
|
||||
@ -314,7 +315,7 @@ int VMSave::fread(void *buf, int sz, int cnt)
|
||||
return cnt;
|
||||
}
|
||||
|
||||
int VMSave::fwrite(void *buf, int sz, int cnt)
|
||||
int VMSave::fwrite(const void *buf, int sz, int cnt)
|
||||
{
|
||||
if (!issave)
|
||||
return -1;
|
||||
@ -331,7 +332,7 @@ int VMSave::fwrite(void *buf, int sz, int cnt)
|
||||
}
|
||||
|
||||
|
||||
void VMSaveManager::list_savefiles(const char *prefix,
|
||||
void VMSaveManager::list_savefiles(const char *prefix, const char *directory,
|
||||
bool *marks, int num)
|
||||
{
|
||||
memset(marks, false, num*sizeof(bool));
|
||||
|
@ -8,7 +8,8 @@ MODULE_OBJS = \
|
||||
common/scaler.o \
|
||||
common/str.o \
|
||||
common/timer.o \
|
||||
common/util.o
|
||||
common/util.o \
|
||||
common/savefile.o
|
||||
|
||||
# Include common rules
|
||||
include common.rules
|
||||
|
131
common/savefile.cpp
Normal file
131
common/savefile.cpp
Normal file
@ -0,0 +1,131 @@
|
||||
/* ScummVM - Scumm Interpreter
|
||||
* Copyright (C) 2002-2003 The ScummVM project
|
||||
*
|
||||
* 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
*
|
||||
* $Header$
|
||||
*
|
||||
*/
|
||||
|
||||
#include "common/savefile.h"
|
||||
#include "common/util.h"
|
||||
#include "common/engine.h" // For debug/warning/error
|
||||
|
||||
uint32 SaveFile::read(void *ptr, uint32 size)
|
||||
{
|
||||
return fread(ptr, 1, size);
|
||||
}
|
||||
|
||||
byte SaveFile::readByte()
|
||||
{
|
||||
byte b;
|
||||
if (fread(&b, 1, 1) != 1)
|
||||
return 0;
|
||||
return b;
|
||||
}
|
||||
|
||||
uint16 SaveFile::readUint16LE() {
|
||||
uint16 a = readByte();
|
||||
uint16 b = readByte();
|
||||
return a | (b << 8);
|
||||
}
|
||||
|
||||
uint32 SaveFile::readUint32LE() {
|
||||
uint32 a = readUint16LE();
|
||||
uint32 b = readUint16LE();
|
||||
return (b << 16) | a;
|
||||
}
|
||||
|
||||
uint16 SaveFile::readUint16BE() {
|
||||
uint16 b = readByte();
|
||||
uint16 a = readByte();
|
||||
return a | (b << 8);
|
||||
}
|
||||
|
||||
uint32 SaveFile::readUint32BE() {
|
||||
uint32 b = readUint16BE();
|
||||
uint32 a = readUint16BE();
|
||||
return (b << 16) | a;
|
||||
}
|
||||
|
||||
uint32 SaveFile::write(const void *ptr, uint32 size)
|
||||
{
|
||||
return fwrite(ptr, 1, size);
|
||||
}
|
||||
|
||||
void SaveFile::writeByte(byte value)
|
||||
{
|
||||
fwrite(&value, 1, 1);
|
||||
}
|
||||
|
||||
void SaveFile::writeUint16LE(uint16 value) {
|
||||
writeByte((byte)(value & 0xff));
|
||||
writeByte((byte)(value >> 8));
|
||||
}
|
||||
|
||||
void SaveFile::writeUint32LE(uint32 value) {
|
||||
writeUint16LE((uint16)(value & 0xffff));
|
||||
writeUint16LE((uint16)(value >> 16));
|
||||
}
|
||||
|
||||
void SaveFile::writeUint16BE(uint16 value) {
|
||||
writeByte((byte)(value >> 8));
|
||||
writeByte((byte)(value & 0xff));
|
||||
}
|
||||
|
||||
void SaveFile::writeUint32BE(uint32 value) {
|
||||
writeUint16BE((uint16)(value >> 16));
|
||||
writeUint16BE((uint16)(value & 0xffff));
|
||||
}
|
||||
|
||||
SaveFile *SaveFileManager::open_savefile(const char *filename, const char *directory, bool saveOrLoad)
|
||||
{
|
||||
char buf[256];
|
||||
join_paths(filename, directory, buf, sizeof(buf));
|
||||
StdioSaveFile *sf = new StdioSaveFile(buf,
|
||||
(saveOrLoad? "wb":"rb"));
|
||||
if (!sf->is_open()) {
|
||||
delete sf;
|
||||
sf = NULL;
|
||||
}
|
||||
return sf;
|
||||
}
|
||||
|
||||
void SaveFileManager::join_paths(const char *filename, const char *directory,
|
||||
char *buf, int bufsize)
|
||||
{
|
||||
buf[bufsize-1] = '\0';
|
||||
strncpy(buf, directory, bufsize-1);
|
||||
|
||||
#ifdef WIN32
|
||||
// Fix for Win98 issue related with game directory pointing to root drive ex. "c:\"
|
||||
if ((buf[0] != 0) && (buf[1] == ':') && (buf[2] == '\\') && (buf[3] == 0)) {
|
||||
buf[2] = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
const int dirLen = strlen(buf);
|
||||
|
||||
if (dirLen > 0) {
|
||||
#ifdef __MORPHOS__
|
||||
if (buf[dirLen-1] != ':' && buf[dirLen-1] != '/')
|
||||
#endif
|
||||
|
||||
#if !defined(__GP32__) && !defined(__PALM_OS__)
|
||||
strncat(buf, "/", bufsize-1); // prevent double /
|
||||
#endif
|
||||
}
|
||||
strncat(buf, filename, bufsize-1);
|
||||
}
|
@ -23,14 +23,34 @@
|
||||
#ifndef COMMON_SAVEFILE_H
|
||||
#define COMMON_SAVEFILE_H
|
||||
|
||||
#include "stdafx.h"
|
||||
#include "common/scummsys.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
class SaveFile {
|
||||
public:
|
||||
virtual ~SaveFile() {}
|
||||
|
||||
/* Compatible with File API */
|
||||
uint32 read(void *ptr, uint32 size);
|
||||
byte readByte();
|
||||
uint16 readUint16LE();
|
||||
uint32 readUint32LE();
|
||||
uint16 readUint16BE();
|
||||
uint32 readUint32BE();
|
||||
uint32 write(const void *ptr, uint32 size);
|
||||
void writeByte(byte value);
|
||||
void writeUint16LE(uint16 value);
|
||||
void writeUint32LE(uint32 value);
|
||||
void writeUint16BE(uint16 value);
|
||||
void writeUint32BE(uint32 value);
|
||||
|
||||
protected:
|
||||
/* Only for internal use, use File compatible API above instead */
|
||||
virtual int fread(void *buf, int size, int cnt) = 0;
|
||||
virtual int fwrite(void *buf, int size, int cnt) = 0;
|
||||
virtual int fwrite(const void *buf, int size, int cnt) = 0;
|
||||
};
|
||||
|
||||
class StdioSaveFile : public SaveFile {
|
||||
@ -45,10 +65,10 @@ public:
|
||||
|
||||
bool is_open() { return fh != NULL; }
|
||||
|
||||
|
||||
protected:
|
||||
int fread(void *buf, int size, int cnt)
|
||||
{ return ::fread(buf, size, cnt, fh); }
|
||||
int fwrite(void *buf, int size, int cnt)
|
||||
int fwrite(const void *buf, int size, int cnt)
|
||||
{ return ::fwrite(buf, size, cnt, fh); }
|
||||
};
|
||||
|
||||
@ -57,20 +77,16 @@ class SaveFileManager {
|
||||
public:
|
||||
virtual ~SaveFileManager() {}
|
||||
|
||||
virtual SaveFile *open_savefile(const char *filename, bool saveOrLoad) {
|
||||
StdioSaveFile *sf = new StdioSaveFile(filename,
|
||||
(saveOrLoad? "wb":"rb"));
|
||||
if (!sf->is_open()) {
|
||||
delete sf;
|
||||
sf = NULL;
|
||||
}
|
||||
return sf;
|
||||
}
|
||||
virtual SaveFile *open_savefile(const char *filename, const char *directory, bool saveOrLoad);
|
||||
|
||||
virtual void list_savefiles(const char * /* prefix */, bool *marks, int num) {
|
||||
virtual void list_savefiles(const char * /* prefix */, const char *directory, bool *marks, int num) {
|
||||
memset(marks, true, num * sizeof(bool));
|
||||
}
|
||||
|
||||
protected:
|
||||
void join_paths(const char *filename, const char *directory,
|
||||
char *buf, int bufsize);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -61,7 +61,7 @@ bool Scumm::saveState(int slot, bool compat, SaveFileManager *mgr) {
|
||||
|
||||
makeSavegameName(filename, slot, compat);
|
||||
|
||||
if (!(out = mgr->open_savefile(filename, true)))
|
||||
if (!(out = mgr->open_savefile(filename, getSavePath(), true)))
|
||||
return false;
|
||||
|
||||
memcpy(hdr.name, _saveLoadName, sizeof(hdr.name));
|
||||
@ -70,7 +70,7 @@ bool Scumm::saveState(int slot, bool compat, SaveFileManager *mgr) {
|
||||
hdr.size = 0;
|
||||
hdr.ver = TO_LE_32(CURRENT_VER);
|
||||
|
||||
out->fwrite(&hdr, sizeof(hdr), 1);
|
||||
out->write(&hdr, sizeof(hdr));
|
||||
|
||||
Serializer ser(out, true, CURRENT_VER);
|
||||
saveOrLoad(&ser, CURRENT_VER);
|
||||
@ -88,10 +88,10 @@ bool Scumm::loadState(int slot, bool compat, SaveFileManager *mgr) {
|
||||
byte *roomptr;
|
||||
|
||||
makeSavegameName(filename, slot, compat);
|
||||
if (!(out = mgr->open_savefile(filename, false)))
|
||||
if (!(out = mgr->open_savefile(filename, getSavePath(), false)))
|
||||
return false;
|
||||
|
||||
out->fread(&hdr, sizeof(hdr), 1);
|
||||
out->read(&hdr, sizeof(hdr));
|
||||
if (hdr.type != MKID('SCVM')) {
|
||||
warning("Invalid savegame '%s'", filename);
|
||||
delete out;
|
||||
@ -221,12 +221,11 @@ bool Scumm::loadState(int slot, bool compat, SaveFileManager *mgr) {
|
||||
}
|
||||
|
||||
void Scumm::makeSavegameName(char *out, int slot, bool compatible) {
|
||||
const char *dir = getSavePath();
|
||||
|
||||
#ifndef __PALM_OS__
|
||||
sprintf(out, "%s%s.%c%.2d", dir, _game_name, compatible ? 'c' : 's', slot);
|
||||
sprintf(out, "%s.%c%.2d", _game_name, compatible ? 'c' : 's', slot);
|
||||
#else
|
||||
sprintf(out, "%s%s.%s%.2d", dir, _game_name, compatible ? "c" : "s", slot);
|
||||
sprintf(out, "%s.%s%.2d", _game_name, compatible ? "c" : "s", slot);
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -234,7 +233,7 @@ void Scumm::listSavegames(bool *marks, int num, SaveFileManager *mgr) {
|
||||
char prefix[256];
|
||||
makeSavegameName(prefix, 99, false);
|
||||
prefix[strlen(prefix)-2] = 0;
|
||||
mgr->list_savefiles(prefix, marks, num);
|
||||
mgr->list_savefiles(prefix, getSavePath(), marks, num);
|
||||
}
|
||||
|
||||
bool Scumm::getSavegameName(int slot, char *desc, SaveFileManager *mgr) {
|
||||
@ -244,14 +243,14 @@ bool Scumm::getSavegameName(int slot, char *desc, SaveFileManager *mgr) {
|
||||
int len;
|
||||
|
||||
makeSavegameName(filename, slot, false);
|
||||
if (!(out = mgr->open_savefile(filename, false))) {
|
||||
if (!(out = mgr->open_savefile(filename, getSavePath(), false))) {
|
||||
strcpy(desc, "");
|
||||
return false;
|
||||
}
|
||||
len = out->fread(&hdr, sizeof(hdr), 1);
|
||||
len = out->read(&hdr, sizeof(hdr));
|
||||
delete out;
|
||||
|
||||
if (len != 1 || hdr.type != MKID('SCVM')) {
|
||||
if (len != sizeof(hdr) || hdr.type != MKID('SCVM')) {
|
||||
strcpy(desc, "Invalid savegame");
|
||||
return false;
|
||||
}
|
||||
@ -710,43 +709,35 @@ void Scumm::saveLoadResource(Serializer *ser, int type, int idx) {
|
||||
}
|
||||
|
||||
void Serializer::saveBytes(void *b, int len) {
|
||||
_saveLoadStream->fwrite(b, 1, len);
|
||||
_saveLoadStream->write(b, len);
|
||||
}
|
||||
|
||||
void Serializer::loadBytes(void *b, int len) {
|
||||
_saveLoadStream->fread(b, 1, len);
|
||||
_saveLoadStream->read(b, len);
|
||||
}
|
||||
|
||||
void Serializer::saveUint32(uint32 d) {
|
||||
uint32 e = FROM_LE_32(d);
|
||||
saveBytes(&e, 4);
|
||||
_saveLoadStream->writeUint32LE(d);
|
||||
}
|
||||
|
||||
void Serializer::saveWord(uint16 d) {
|
||||
uint16 e = FROM_LE_16(d);
|
||||
saveBytes(&e, 2);
|
||||
_saveLoadStream->writeUint16LE(d);
|
||||
}
|
||||
|
||||
void Serializer::saveByte(byte b) {
|
||||
saveBytes(&b, 1);
|
||||
_saveLoadStream->writeByte(b);
|
||||
}
|
||||
|
||||
uint32 Serializer::loadUint32() {
|
||||
uint32 e;
|
||||
loadBytes(&e, 4);
|
||||
return FROM_LE_32(e);
|
||||
return _saveLoadStream->readUint32LE();
|
||||
}
|
||||
|
||||
uint16 Serializer::loadWord() {
|
||||
uint16 e;
|
||||
loadBytes(&e, 2);
|
||||
return FROM_LE_16(e);
|
||||
return _saveLoadStream->readUint16LE();
|
||||
}
|
||||
|
||||
byte Serializer::loadByte() {
|
||||
byte e;
|
||||
loadBytes(&e, 1);
|
||||
return e;
|
||||
return _saveLoadStream->readByte();
|
||||
}
|
||||
|
||||
void Serializer::saveArrayOf(void *b, int len, int datasize, byte filetype) {
|
||||
|
Loading…
Reference in New Issue
Block a user