[Scummvm-cvs-logs] SF.net SVN: scummvm:[45499] scummvm/trunk/engines/sci/engine/kfile.cpp

thebluegr at users.sourceforge.net thebluegr at users.sourceforge.net
Thu Oct 29 10:58:36 CET 2009


Revision: 45499
          http://scummvm.svn.sourceforge.net/scummvm/?rev=45499&view=rev
Author:   thebluegr
Date:     2009-10-29 09:58:36 +0000 (Thu, 29 Oct 2009)

Log Message:
-----------
Fixed the deletion of save games - the wrong save game would be deleted with the previous code, as we sort the list by date

Modified Paths:
--------------
    scummvm/trunk/engines/sci/engine/kfile.cpp

Modified: scummvm/trunk/engines/sci/engine/kfile.cpp
===================================================================
--- scummvm/trunk/engines/sci/engine/kfile.cpp	2009-10-29 09:08:46 UTC (rev 45498)
+++ scummvm/trunk/engines/sci/engine/kfile.cpp	2009-10-29 09:58:36 UTC (rev 45499)
@@ -39,8 +39,12 @@
 	MAX_SAVEGAME_NR = 20 /**< Maximum number of savegames */
 };
 
+struct SavegameDesc {
+	int id;
+	int date;
+	int time;
+};
 
-
 /*
  * Note on how file I/O is implemented: In ScummVM, one can not create/write
  * arbitrary data files, simply because many of our target platforms do not
@@ -325,6 +329,47 @@
 	s->r_acc = make_reg(0, f->_in->seek(offset, whence));
 }
 
+static int _savegame_index_struct_compare(const void *a, const void *b) {
+	const SavegameDesc *A = (const SavegameDesc *)a;
+	const SavegameDesc *B = (const SavegameDesc *)b;
+
+	if (B->date != A->date)
+		return B->date - A->date;
+	return B->time - A->time;
+}
+
+void listSavegames(Common::Array<SavegameDesc> &saves) {
+	Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
+
+	// Load all saves
+	Common::StringList saveNames = saveFileMan->listSavefiles(((SciEngine *)g_engine)->getSavegamePattern());
+
+	for (Common::StringList::const_iterator iter = saveNames.begin(); iter != saveNames.end(); ++iter) {
+		Common::String filename = *iter;
+		Common::SeekableReadStream *in;
+		if ((in = saveFileMan->openForLoading(filename))) {
+			SavegameMetadata meta;
+			if (!get_savegame_metadata(in, &meta)) {
+				// invalid
+				delete in;
+				continue;
+			}
+			delete in;
+
+			SavegameDesc desc;
+			desc.id = strtol(filename.end() - 3, NULL, 10);
+			desc.date = meta.savegame_date;
+			desc.time = meta.savegame_time;
+			debug(3, "Savegame in file %s ok, id %d", filename.c_str(), desc.id);
+
+			saves.push_back(desc);
+		}
+	}
+
+	// Sort the list by creation date of the saves
+	qsort(saves.begin(), saves.size(), sizeof(SavegameDesc), _savegame_index_struct_compare);
+}
+
 reg_t kFGets(EngineState *s, int argc, reg_t *argv) {
 	int maxsize = argv[1].toUint16();
 	char *buf = new char[maxsize];
@@ -350,15 +395,6 @@
 	return argv[0];
 }
 
-void delete_savegame(EngineState *s, int savedir_nr) {
-	Common::String filename = ((Sci::SciEngine*)g_engine)->getSavegameName(savedir_nr);
-
-	//printf("Deleting savegame '%s'\n", filename.c_str());
-
-	Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
-	saveFileMan->removeSavefile(filename);
-}
-
 enum {
 	K_DEVICE_INFO_GET_DEVICE = 0,
 	K_DEVICE_INFO_GET_CURRENT_DEVICE = 1,
@@ -414,7 +450,13 @@
 		int savegame_id = argv[3].toUint16();
 		s->_segMan->strcpy(argv[1], "__throwaway");
 		debug(3, "K_DEVICE_INFO_GET_SAVEFILE_NAME(%s,%d) -> %s", game_prefix.c_str(), savegame_id, "__throwaway");
-		delete_savegame(s, savegame_id);
+		Common::Array<SavegameDesc> saves;
+		listSavegames(saves);
+		int savedir_nr = saves[savegame_id].id;
+		Common::String filename = ((Sci::SciEngine*)g_engine)->getSavegameName(savedir_nr);
+		//printf("Deleting savegame '%s'\n", filename.c_str());
+		Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
+		saveFileMan->removeSavefile(filename);
 		}
 		break;
 
@@ -447,54 +489,6 @@
 	return make_reg(0, 1);
 }
 
-
-struct SavegameDesc {
-	int id;
-	int date;
-	int time;
-};
-
-static int _savegame_index_struct_compare(const void *a, const void *b) {
-	const SavegameDesc *A = (const SavegameDesc *)a;
-	const SavegameDesc *B = (const SavegameDesc *)b;
-
-	if (B->date != A->date)
-		return B->date - A->date;
-	return B->time - A->time;
-}
-
-void listSavegames(Common::Array<SavegameDesc> &saves) {
-	Common::SaveFileManager *saveFileMan = g_engine->getSaveFileManager();
-
-	// Load all saves
-	Common::StringList saveNames = saveFileMan->listSavefiles(((SciEngine *)g_engine)->getSavegamePattern());
-
-	for (Common::StringList::const_iterator iter = saveNames.begin(); iter != saveNames.end(); ++iter) {
-		Common::String filename = *iter;
-		Common::SeekableReadStream *in;
-		if ((in = saveFileMan->openForLoading(filename))) {
-			SavegameMetadata meta;
-			if (!get_savegame_metadata(in, &meta)) {
-				// invalid
-				delete in;
-				continue;
-			}
-			delete in;
-
-			SavegameDesc desc;
-			desc.id = strtol(filename.end() - 3, NULL, 10);
-			desc.date = meta.savegame_date;
-			desc.time = meta.savegame_time;
-			debug(3, "Savegame in file %s ok, id %d", filename.c_str(), desc.id);
-
-			saves.push_back(desc);
-		}
-	}
-
-	// Sort the list by creation date of the saves
-	qsort(saves.begin(), saves.size(), sizeof(SavegameDesc), _savegame_index_struct_compare);
-}
-
 reg_t kCheckSaveGame(EngineState *s, int argc, reg_t *argv) {
 	Common::String game_id = s->_segMan->getString(argv[0]);
 	int savedir_nr = argv[1].toUint16();


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list