aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/savefile.h15
-rw-r--r--engines/agi/savegame.cpp2
-rw-r--r--engines/agos/saveload.cpp8
-rw-r--r--engines/gob/gob.cpp4
-rw-r--r--engines/kyra/saveload.cpp2
-rw-r--r--engines/queen/queen.cpp2
-rw-r--r--engines/saga/saveload.cpp2
-rw-r--r--engines/scumm/saveload.cpp2
-rw-r--r--engines/sky/control.cpp6
-rw-r--r--engines/sword1/control.cpp4
-rw-r--r--engines/sword2/saveload.cpp2
-rw-r--r--engines/touche/saveload.cpp2
12 files changed, 32 insertions, 19 deletions
diff --git a/common/savefile.h b/common/savefile.h
index cacb0bfaff..1e48bafdfd 100644
--- a/common/savefile.h
+++ b/common/savefile.h
@@ -41,7 +41,20 @@ class InSaveFile : public SeekableReadStream {};
* That typically means "save games", but also includes things like the
* IQ points in Indy3.
*/
-class OutSaveFile : public WriteStream {};
+class OutSaveFile : public WriteStream {
+public:
+ /**
+ * Close this savefile, to be called right before destruction of this
+ * savefile. The idea is that this ways, I/O errors that occur
+ * during closing/flushing of the file can still be handled by the
+ * game engine.
+ *
+ * By default, this just flushes the stream.
+ */
+ virtual void finalize() {
+ flush();
+ }
+};
/**
* Convenience intermediate class, to be removed.
diff --git a/engines/agi/savegame.cpp b/engines/agi/savegame.cpp
index 76466088ab..1dd63ee66a 100644
--- a/engines/agi/savegame.cpp
+++ b/engines/agi/savegame.cpp
@@ -200,7 +200,7 @@ int AgiEngine::saveGame(const char *fileName, const char *description) {
}
out->writeByte(0);
- out->flush();
+ out->finalize();
if (out->ioFailed())
warning("Can't write file '%s'. (Disk full?)", fileName);
else
diff --git a/engines/agos/saveload.cpp b/engines/agos/saveload.cpp
index fb19fea3d0..0e82033ea2 100644
--- a/engines/agos/saveload.cpp
+++ b/engines/agos/saveload.cpp
@@ -649,7 +649,7 @@ bool AGOSEngine::loadGame_e1(const char *filename, bool restartMode) {
}
bool AGOSEngine::saveGame_e1(const char *filename) {
- Common::WriteStream *f;
+ Common::OutSaveFile *f;
uint item_index, num_item, i;
TimeEvent *te;
uint32 curTime = 0;
@@ -717,7 +717,7 @@ bool AGOSEngine::saveGame_e1(const char *filename) {
f->writeUint16BE(readVariable(i));
}
- f->flush();
+ f->finalize();
bool result = !f->ioFailed();
delete f;
@@ -873,7 +873,7 @@ bool AGOSEngine::loadGame(const char *filename, bool restartMode) {
}
bool AGOSEngine::saveGame(uint slot, const char *caption) {
- Common::WriteStream *f;
+ Common::OutSaveFile *f;
uint item_index, num_item, i, j;
TimeEvent *te;
uint32 curTime = 0;
@@ -988,7 +988,7 @@ bool AGOSEngine::saveGame(uint slot, const char *caption) {
f->writeUint16BE(_superRoomNumber);
}
- f->flush();
+ f->finalize();
bool result = !f->ioFailed();
delete f;
diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp
index f1fcb47239..89a761dcdc 100644
--- a/engines/gob/gob.cpp
+++ b/engines/gob/gob.cpp
@@ -295,7 +295,7 @@ void GobEngine::saveGameData(enum SaveFiles sFile, int16 dataVar, int32 size, in
retSize = writeDataEndian(*out, buf, _global->_inter_variablesSizes + dataVar, size);
- out->flush();
+ out->finalize();
if (out->ioFailed() || (retSize != size))
warning("Can't write file \"%s\"", sName);
@@ -329,7 +329,7 @@ bool GobEngine::saveGame(int saveSlot, int16 dataVar, int32 size, int32 offset)
}
writeDataEndian(*out, _saveIndex + saveSlot * 40, _saveIndexSizes + saveSlot * 40, 40);
writeDataEndian(*out, varBuf, sizeBuf, size);
- out->flush();
+ out->finalize();
if (out->ioFailed()) {
warning("Can't save to slot %d", saveSlot);
return false;
diff --git a/engines/kyra/saveload.cpp b/engines/kyra/saveload.cpp
index 8f095237ab..8245a8753f 100644
--- a/engines/kyra/saveload.cpp
+++ b/engines/kyra/saveload.cpp
@@ -362,7 +362,7 @@ void KyraEngine::saveGame(const char *fileName, const char *saveName) {
out->writeByte(_curSfxFile);
- out->flush();
+ out->finalize();
// check for errors
if (out->ioFailed())
diff --git a/engines/queen/queen.cpp b/engines/queen/queen.cpp
index 7877b60a5a..273436837f 100644
--- a/engines/queen/queen.cpp
+++ b/engines/queen/queen.cpp
@@ -249,7 +249,7 @@ void QueenEngine::saveGameState(uint16 slot, const char *desc) {
// write save data
file->write(saveData, dataSize);
- file->flush();
+ file->finalize();
// check for errors
if (file->ioFailed()) {
diff --git a/engines/saga/saveload.cpp b/engines/saga/saveload.cpp
index 40a18f8aed..2977990a9d 100644
--- a/engines/saga/saveload.cpp
+++ b/engines/saga/saveload.cpp
@@ -211,7 +211,7 @@ void SagaEngine::save(const char *fileName, const char *saveName) {
out->writeSint16LE(_isoMap->getMapPosition().x);
out->writeSint16LE(_isoMap->getMapPosition().y);
- out->flush();
+ out->finalize();
// TODO: Check out->ioFailed()
diff --git a/engines/scumm/saveload.cpp b/engines/scumm/saveload.cpp
index 25988c5122..fdcd111fe8 100644
--- a/engines/scumm/saveload.cpp
+++ b/engines/scumm/saveload.cpp
@@ -109,7 +109,7 @@ bool ScummEngine::saveState(int slot, bool compat) {
Serializer ser(0, out, CURRENT_VER);
saveOrLoad(&ser);
- out->flush();
+ out->finalize();
if (out->ioFailed()) {
delete out;
debug(1, "State save as '%s' FAILED", filename);
diff --git a/engines/sky/control.cpp b/engines/sky/control.cpp
index 172891643b..e4b60629d0 100644
--- a/engines/sky/control.cpp
+++ b/engines/sky/control.cpp
@@ -1138,7 +1138,7 @@ void Control::saveDescriptions(uint8 *srcBuf) {
bool ioFailed = true;
if (outf) {
outf->write(tmpBuf, tmpPos - tmpBuf);
- outf->flush();
+ outf->finalize();
if (!outf->ioFailed())
ioFailed = false;
delete outf;
@@ -1165,7 +1165,7 @@ void Control::doAutoSave(void) {
uint32 fSize = prepareSaveData(saveData);
outf->write(saveData, fSize);
- outf->flush();
+ outf->finalize();
if (outf->ioFailed())
displayMessage(0, "Unable to write autosave file '%s' in directory '%s'. Disk full?", fName, _saveFileMan->getSavePath());
@@ -1187,7 +1187,7 @@ uint16 Control::saveGameToFile(void) {
uint32 fSize = prepareSaveData(saveData);
uint32 writeRes = outf->write(saveData, fSize);
- outf->flush();
+ outf->finalize();
if (outf->ioFailed())
writeRes = 0;
free(saveData);
diff --git a/engines/sword1/control.cpp b/engines/sword1/control.cpp
index 85e25c75fc..d40c76eb89 100644
--- a/engines/sword1/control.cpp
+++ b/engines/sword1/control.cpp
@@ -763,7 +763,7 @@ void Control::writeSavegameDescriptions(void) {
else
outf->writeByte(255);
}
- outf->flush();
+ outf->finalize();
if (outf->ioFailed())
displayMessage(0, "Can't write to SAVEGAME.INF in directory '%s'. Device full?", _saveFileMan->getSavePath());
delete outf;
@@ -958,7 +958,7 @@ void Control::saveGameToFile(uint8 slot) {
uint32 *playerRaw = (uint32*)cpt;
for (uint32 cnt2 = 0; cnt2 < playerSize; cnt2++)
outf->writeUint32LE(playerRaw[cnt2]);
- outf->flush();
+ outf->finalize();
if (outf->ioFailed())
displayMessage(0, "Couldn't write to file '%s' in directory '%s'. Device full?", fName, _saveFileMan->getSavePath());
delete outf;
diff --git a/engines/sword2/saveload.cpp b/engines/sword2/saveload.cpp
index eb7b6e0b0c..3f37d6b5de 100644
--- a/engines/sword2/saveload.cpp
+++ b/engines/sword2/saveload.cpp
@@ -132,7 +132,7 @@ uint32 Sword2Engine::saveData(uint16 slotNo, byte *buffer, uint32 bufferSize) {
}
out->write(buffer, bufferSize);
- out->flush();
+ out->finalize();
if (!out->ioFailed()) {
delete out;
diff --git a/engines/touche/saveload.cpp b/engines/touche/saveload.cpp
index 05ec9b3904..dd29c3c387 100644
--- a/engines/touche/saveload.cpp
+++ b/engines/touche/saveload.cpp
@@ -344,7 +344,7 @@ bool ToucheEngine::saveGameState(int num, const char *description) {
strncpy(headerDescription, description, kGameStateDescriptionLen - 1);
f->write(headerDescription, kGameStateDescriptionLen);
saveGameStateData(f);
- f->flush();
+ f->finalize();
if (!f->ioFailed()) {
saveOk = true;
} else {