GRIM: New static functions to create a SaveGame object that deal with failures.

This commit is contained in:
Giulio Camuffo 2011-07-18 14:35:16 +02:00
parent ba723db930
commit 9b11f73bc0
6 changed files with 52 additions and 32 deletions

View file

@ -442,7 +442,7 @@ SaveStateList GrimMetaEngine::listSaves(const char *target) const {
int slotNum = atoi(file->c_str() + 4);
if (slotNum >= 0 && slotNum <= 99) {
SaveGame *savedState = new SaveGame((*file).c_str(), false);
SaveGame *savedState = SaveGame::openForLoading((*file).c_str());
if (savedState) {
if (savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) {
delete savedState;

View file

@ -1137,7 +1137,7 @@ void GrimEngine::savegameRestore() {
} else {
filename = _savegameFileName;
}
_savedState = new SaveGame(filename, false);
_savedState = SaveGame::openForLoading(filename);
if (!_savedState || _savedState->saveVersion() != SaveGame::SAVEGAME_VERSION)
return;
g_imuse->stopAllSounds();
@ -1314,7 +1314,7 @@ void GrimEngine::savegameSave() {
} else {
strcpy(filename, _savegameFileName.c_str());
}
_savedState = new SaveGame(filename, true);
_savedState = SaveGame::openForSaving(filename);
if (!_savedState)
return;

View file

@ -962,7 +962,7 @@ void L1_GetSaveGameImage() {
return;
}
const char *filename = lua_getstring(param);
SaveGame *savedState = new SaveGame(filename, false);
SaveGame *savedState = SaveGame::openForLoading(filename);
if (!savedState || savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) {
lua_pushnil();
return;
@ -1016,7 +1016,7 @@ void L1_GetSaveGameData() {
if (!lua_isstring(param))
return;
const char *filename = lua_getstring(param);
SaveGame *savedState = new SaveGame(filename, false);
SaveGame *savedState = SaveGame::openForLoading(filename);
lua_Object result = lua_createtable();
if (!savedState || savedState->saveVersion() != SaveGame::SAVEGAME_VERSION) {

View file

@ -229,7 +229,7 @@ void L1_ImSetSequence() {
}
void L1_SaveIMuse() {
SaveGame *savedIMuse = new SaveGame("grim.tmp", true);
SaveGame *savedIMuse = SaveGame::openForSaving("grim.tmp");
if (!savedIMuse)
return;
g_imuse->saveState(savedIMuse);
@ -237,7 +237,7 @@ void L1_SaveIMuse() {
}
void L1_RestoreIMuse() {
SaveGame *savedIMuse = new SaveGame("grim.tmp", false);
SaveGame *savedIMuse = SaveGame::openForLoading("grim.tmp");
if (!savedIMuse)
return;
g_imuse->stopAllSounds();

View file

@ -35,31 +35,48 @@ namespace Grim {
int SaveGame::SAVEGAME_VERSION = 18;
// Constructor. Should create/open a saved game
SaveGame::SaveGame(const Common::String &filename, bool saving) :
_saving(saving), _currentSection(0), _sectionBuffer(0) {
if (_saving) {
_outSaveFile = g_system->getSavefileManager()->openForSaving(filename);
if (!_outSaveFile) {
warning("SaveGame::SaveGame() Error creating savegame file");
return;
SaveGame *SaveGame::openForLoading(const Common::String &filename) {
Common::InSaveFile *inSaveFile = g_system->getSavefileManager()->openForLoading(filename);
if (!inSaveFile) {
warning("SaveGame::openForLoading() Error opening savegame file");
return NULL;
}
_outSaveFile->writeUint32BE(SAVEGAME_HEADERTAG);
_outSaveFile->writeUint32BE(SAVEGAME_VERSION);
_version = SAVEGAME_VERSION;
} else {
uint32 tag;
SaveGame *save = new SaveGame();
_inSaveFile = g_system->getSavefileManager()->openForLoading(filename);
if (!_inSaveFile) {
warning("SaveGame::SaveGame() Error opening savegame file");
return;
}
tag = _inSaveFile->readUint32BE();
save->_saving = false;
save->_inSaveFile = inSaveFile;
uint32 tag = inSaveFile->readUint32BE();
assert(tag == SAVEGAME_HEADERTAG);
_version = _inSaveFile->readUint32BE();
save->_version = inSaveFile->readUint32BE();
return save;
}
SaveGame *SaveGame::openForSaving(const Common::String &filename) {
Common::OutSaveFile *outSaveFile = g_system->getSavefileManager()->openForSaving(filename);
if (!outSaveFile) {
warning("SaveGame::openForSaving() Error creating savegame file");
return NULL;
}
SaveGame *save = new SaveGame();
save->_saving = true;
save->_outSaveFile = outSaveFile;
outSaveFile->writeUint32BE(SAVEGAME_HEADERTAG);
outSaveFile->writeUint32BE(SAVEGAME_VERSION);
save->_version = SAVEGAME_VERSION;
return save;
}
SaveGame::SaveGame() :
_currentSection(0), _sectionBuffer(0) {
}
SaveGame::~SaveGame() {

View file

@ -35,7 +35,8 @@ class Color;
class SaveGame {
public:
SaveGame(const Common::String &filename, bool saving);
static SaveGame *openForLoading(const Common::String &filename);
static SaveGame *openForSaving(const Common::String &filename);
~SaveGame();
static int SAVEGAME_VERSION;
@ -69,6 +70,8 @@ public:
void checkAlloc(int size);
protected:
SaveGame();
int _version;
bool _saving;
Common::InSaveFile *_inSaveFile;