[Scummvm-cvs-logs] SF.net SVN: scummvm: [22446] residual/trunk

aquadran at users.sourceforge.net aquadran at users.sourceforge.net
Sat May 13 08:24:37 CEST 2006


Revision: 22446
Author:   aquadran
Date:     2006-05-13 08:07:35 -0700 (Sat, 13 May 2006)
ViewCVS:  http://svn.sourceforge.net/scummvm/?rev=22446&view=rev

Log Message:
-----------
restored previous savegame code, but adopted lua access to save/restore

Modified Paths:
--------------
    residual/trunk/engine.cpp
    residual/trunk/engine.h
    residual/trunk/lua.cpp
    residual/trunk/savegame.cpp
    residual/trunk/savegame.h
Modified: residual/trunk/engine.cpp
===================================================================
--- residual/trunk/engine.cpp	2006-05-13 13:57:47 UTC (rev 22445)
+++ residual/trunk/engine.cpp	2006-05-13 15:07:35 UTC (rev 22446)
@@ -456,12 +456,12 @@
 	}
 }
 
-void Engine::savegameGzread(void *data, int size) {
-	gzread(g_engine->_savegameFileHandle, data, size);
+void Engine::savegameRead(void *data, int size) {
+	g_engine->_savedState->read(data, size);
 }
 
-void Engine::savegameGzwrite(void *data, int size) {
-	gzwrite(g_engine->_savegameFileHandle, data, size);
+void Engine::savegameWrite(void *data, int size) {
+	g_engine->_savedState->write(data, size);
 }
 
 void Engine::savegameRestore() {
@@ -474,7 +474,6 @@
 		strcpy(filename, _savegameFileName);
 	}
 	_savedState = new SaveGame(filename, false);
-	_savegameFileHandle = _savedState->fileHandle();
 
 	g_imuse->stopAllSounds();
 	g_imuse->resetState();
@@ -494,7 +493,9 @@
 	//Primitive_Restore(_savedState);
 	//Smush_Restore(_savedState);
 	g_imuse->restoreState(_savedState);
-	lua_Restore(savegameGzread);
+	_savedState->beginSection('LUAS');
+	lua_Restore(savegameRead);
+	_savedState->endSection();
 	//  unlock resources
 	delete _savedState;
 
@@ -515,7 +516,6 @@
 		strcpy(filename, _savegameFileName);
 	}
 	_savedState = new SaveGame(filename, true);
-	_savegameFileHandle = _savedState->fileHandle();
 
 	g_imuse->pause(true);
 	g_smush->pause(true);
@@ -531,7 +531,9 @@
 	//Primitive_Save(_savedState);
 	//Smush_Save(_savedState);
 	g_imuse->saveState(_savedState);
-	lua_Save(savegameGzwrite);
+	_savedState->beginSection('LUAS');
+	lua_Save(savegameWrite);
+	_savedState->endSection();
 
 	delete _savedState;
 

Modified: residual/trunk/engine.h
===================================================================
--- residual/trunk/engine.h	2006-05-13 13:57:47 UTC (rev 22445)
+++ residual/trunk/engine.h	2006-05-13 15:07:35 UTC (rev 22446)
@@ -156,13 +156,12 @@
 	void savegameSave();
 	void savegameRestore();
 	void savegameCallback();
-	static void savegameGzread(void *data, int size);
-	static void savegameGzwrite(void *data, int size);
-        
+	static void savegameRead(void *data, int size);
+	static void savegameWrite(void *data, int size);
+
 	bool _savegameLoadRequest;
 	bool _savegameSaveRequest;
 	char *_savegameFileName;
-	gzFile _savegameFileHandle;
 	SaveGame *_savedState;
 
 	Engine();

Modified: residual/trunk/lua.cpp
===================================================================
--- residual/trunk/lua.cpp	2006-05-13 13:57:47 UTC (rev 22445)
+++ residual/trunk/lua.cpp	2006-05-13 15:07:35 UTC (rev 22446)
@@ -2816,7 +2816,7 @@
 	g_engine->updateDisplayScene();
 	screenshot = g_driver->getScreenshot(width, height);
 	g_engine->setMode(mode);
-	savedState->writeTag('SIMG');
+	savedState->beginSection('SIMG');
 	if (screenshot) {
 		int size = screenshot->width() * screenshot->height() * sizeof(uint16);
 		screenshot->setNumber(0);
@@ -2826,6 +2826,7 @@
 	} else {
 		error("Unable to store screenshot!");
 	}
+	savedState->endSection();
 	printf("StoreSaveGameImage() finished.\n");
 }
 
@@ -2843,7 +2844,7 @@
 	DEBUG_FUNCTION();
 	filename = luaL_check_string(1);
 	SaveGame *savedState = new SaveGame(filename, false);
-	dataSize = savedState->checkTag('SIMG');
+	dataSize = savedState->beginSection('SIMG');
 	data = (char *)malloc(dataSize);
 	savedState->read(data, dataSize);
 	screenshot = new Bitmap(data, width, height, "screenshot");
@@ -2854,6 +2855,7 @@
 		lua_pushnil();
 		error("Could not restore screenshot from file!");
 	}
+	savedState->endSection();
 	printf("GetSaveGameImage() finished.\n");
 }
 
@@ -2870,7 +2872,7 @@
 	savedState = g_engine->savedState();
 	if (savedState == NULL)
 		error("Cannot obtain saved game!");
-	savedState->writeTag('SUBS');
+	savedState->beginSection('SUBS');
 	count = 0;
 	for (;;) {
 		lua_pushobject(table);
@@ -2884,6 +2886,7 @@
 		savedState->write(&len, sizeof(int));
 		savedState->write(str, len);
 	}
+	savedState->endSection();
 	printf("SubmitSaveGameData() finished.\n");
 	StoreSaveGameImage(savedState);
 }
@@ -2897,7 +2900,7 @@
 	DEBUG_FUNCTION();
 	filename = luaL_check_string(1);
 	SaveGame *savedState = new SaveGame(filename, false);
-	dataSize = savedState->checkTag('SUBS');
+	dataSize = savedState->beginSection('SUBS');
 
 	result = lua_createtable();
 
@@ -2920,6 +2923,7 @@
 	}
 	lua_pushobject(result);
 
+	savedState->endSection();
 	delete savedState;
 	printf("GetSaveGameData() finished.\n");
 }

Modified: residual/trunk/savegame.cpp
===================================================================
--- residual/trunk/savegame.cpp	2006-05-13 13:57:47 UTC (rev 22445)
+++ residual/trunk/savegame.cpp	2006-05-13 15:07:35 UTC (rev 22446)
@@ -29,7 +29,7 @@
 
 // Constructor. Should create/open a saved game
 SaveGame::SaveGame(char *filename, bool saving) :
-		_saving(saving) {
+		_saving(saving), _currentSection(0) {
 	if (_saving) {
 		uint32 tag = SAVEGAME_HEADERTAG;
 		uint32 version = SAVEGAME_VERSION;
@@ -63,31 +63,58 @@
 	gzclose(_fileHandle);
 }
 
-int SaveGame::read(void *data, int size) {
-	if (_saving)
-		error("SaveGame::readBlock called when storing a savegame!");
-	return gzread(_fileHandle, data, size);
+uint32 SaveGame::beginSection(uint32 sectionTag) {
+	if (_currentSection != 0)
+		error("Tried to begin a new save game section with ending old section!");
+	_currentSection = sectionTag;
+	_sectionSize = 0;
+	_sectionBuffer = (char *) malloc(_sectionSize);
+	if (!_saving) {
+		uint32 tag = 0;
+		
+		while (tag != sectionTag) {
+			free(_sectionBuffer);
+			gzread(_fileHandle, &tag, sizeof(uint32));
+			if (tag == SAVEGAME_FOOTERTAG)
+				error("Unable to find requested section of savegame!");
+			gzread(_fileHandle, &_sectionSize, sizeof(uint32));
+			_sectionBuffer = (char *)malloc(_sectionSize);
+			gzread(_fileHandle, _sectionBuffer, _sectionSize);
+		}
+	}
+	_sectionPtr = 0;
+	return _sectionSize;
 }
 
-int SaveGame::checkTag(uint32 tag) {
-	uint32 readTag;
-	int res = read(&readTag, 4);
-	assert(res == 4);
-	if (readTag != tag) {
-		error("SaveGame::readAndCheck: Wrong tag. Expected: %d", tag);
+void SaveGame::endSection() {
+	if (_currentSection == 0)
+		error("Tried to end a save game section without starting a section!");
+	if(_saving) {
+		gzwrite(_fileHandle, &_currentSection, sizeof(uint32));
+		gzwrite(_fileHandle, &_sectionSize, sizeof(uint32));
+		gzwrite(_fileHandle, _sectionBuffer, _sectionSize);
 	}
+	free(_sectionBuffer);
+	_currentSection = 0;
+}
 
-	return res;
+void SaveGame::read(void *data, int size) {
+	if (_saving)
+		error("SaveGame::readBlock called when storing a savegame!");
+	if (_currentSection == 0)
+		error("Tried to read a block without starting a section!");
+	memcpy(data, &_sectionBuffer[_sectionPtr], size);
+	_sectionPtr += size;
 }
 
-int SaveGame::write(void *data, int size) {
+void SaveGame::write(void *data, int size) {
 	if (!_saving)
 		error("SaveGame::writeBlock called when restoring a savegame!");
-	return gzwrite(_fileHandle, data, size);
+	if (_currentSection == 0)
+		error("Tried to write a block without starting a section!");
+	_sectionBuffer = (char *)realloc(_sectionBuffer, _sectionSize + size);
+	if (_sectionBuffer == NULL)
+		error("Failed to allocate space for buffer!");
+	memcpy(&_sectionBuffer[_sectionSize], data, size);
+	_sectionSize += size;
 }
-
-int SaveGame::writeTag(uint32 tag) {
-	int res = write(&tag, 4);
-	assert(res == 4);
-	return res;
-}

Modified: residual/trunk/savegame.h
===================================================================
--- residual/trunk/savegame.h	2006-05-13 13:57:47 UTC (rev 22445)
+++ residual/trunk/savegame.h	2006-05-13 15:07:35 UTC (rev 22446)
@@ -32,16 +32,24 @@
 	SaveGame(char *filename, bool saving);
 	~SaveGame();
 
-	int read(void *data, int size);
-	int checkTag(uint32 tag);
-	int write(void *data, int size);
-	int writeTag(uint32 tag);
-	gzFile fileHandle() { return _fileHandle; }
+//	int read(void *data, int size);
+//	int checkTag(uint32 tag);
+//	int write(void *data, int size);
+//	int writeTag(uint32 tag);
+//	gzFile fileHandle() { return _fileHandle; }
 
+	uint32 beginSection(uint32 sectionTag);
+	void endSection();
+	void read(void *data, int size);
+	void write(void *data, int size);
+
 protected:
 	bool _saving;
 	gzFile _fileHandle;
-
+	uint32 _currentSection;
+	uint32 _sectionSize;
+	uint32 _sectionPtr;
+	char *_sectionBuffer;
 };
 
 #endif


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