[Scummvm-cvs-logs] SF.net SVN: scummvm:[53202] scummvm/trunk/engines/sword25/kernel

sev at users.sourceforge.net sev at users.sourceforge.net
Wed Oct 13 00:20:41 CEST 2010


Revision: 53202
          http://scummvm.svn.sourceforge.net/scummvm/?rev=53202&view=rev
Author:   sev
Date:     2010-10-12 22:20:41 +0000 (Tue, 12 Oct 2010)

Log Message:
-----------
SWORD25: Converted Savegame Load/Save code

In addition to converting the loading/saving of savefiles to use the SaveFileManager interface, also converted the date/time code to use the ScummVM TimeDate structure.

Modified Paths:
--------------
    scummvm/trunk/engines/sword25/kernel/filesystemutil.cpp
    scummvm/trunk/engines/sword25/kernel/filesystemutil.h
    scummvm/trunk/engines/sword25/kernel/persistenceservice.cpp

Modified: scummvm/trunk/engines/sword25/kernel/filesystemutil.cpp
===================================================================
--- scummvm/trunk/engines/sword25/kernel/filesystemutil.cpp	2010-10-12 22:20:11 UTC (rev 53201)
+++ scummvm/trunk/engines/sword25/kernel/filesystemutil.cpp	2010-10-12 22:20:41 UTC (rev 53202)
@@ -102,11 +102,13 @@
 		return size;
 	}
 
-	virtual time_t GetFileTime(const Common::String &Filename) {
+	virtual TimeDate GetFileTime(const Common::String &Filename) {
 		// TODO: There isn't any way in ScummVM to get a file's modified date/time. We will need to check
 		// what code makes use of it. If it's only the save game code, for example, we may be able to
 		// encode the date/time inside the savegame files themselves.
-		return 0;
+		TimeDate result;
+		g_system->getTimeAndDate(result);
+		return result;
 	}
 
 	virtual bool FileExists(const Common::String &Filename) {

Modified: scummvm/trunk/engines/sword25/kernel/filesystemutil.h
===================================================================
--- scummvm/trunk/engines/sword25/kernel/filesystemutil.h	2010-10-12 22:20:11 UTC (rev 53201)
+++ scummvm/trunk/engines/sword25/kernel/filesystemutil.h	2010-10-12 22:20:41 UTC (rev 53202)
@@ -48,6 +48,7 @@
 // Includes
 // -----------------------------------------------------------------------------
 
+#include "common/system.h"
 #include "common/str.h"
 #include "common/str-array.h"
 #include "sword25/kernel/common.h"
@@ -83,9 +84,9 @@
 	virtual int64 GetFileSize(const Common::String &Filename) = 0;
 	/**
 	 * @param Filename		The path to a file.
-	 * @return				Returns the timestamp of the specified file. On error it returns 0
+	 * @return				Returns the timestamp of the specified file.
 	 */
-	virtual time_t GetFileTime(const Common::String &Filename) = 0;
+	virtual TimeDate GetFileTime(const Common::String &Filename) = 0;
 	/**
 	 * @param Filename		The path to a file.
 	 * @return				Returns true if the file exists.

Modified: scummvm/trunk/engines/sword25/kernel/persistenceservice.cpp
===================================================================
--- scummvm/trunk/engines/sword25/kernel/persistenceservice.cpp	2010-10-12 22:20:11 UTC (rev 53201)
+++ scummvm/trunk/engines/sword25/kernel/persistenceservice.cpp	2010-10-12 22:20:41 UTC (rev 53202)
@@ -36,6 +36,7 @@
 // Includes
 // -----------------------------------------------------------------------------
 
+#include "common/savefile.h"
 #include "sword25/kernel/kernel.h"
 #include "sword25/kernel/persistenceservice.h"
 #include "sword25/kernel/inputpersistenceblock.h"
@@ -48,23 +49,15 @@
 #include "sword25/script/script.h"
 #include <zlib.h>
 
-#include "sword25/kernel/memlog_off.h"
-#include <sstream>
-#include <fstream>
-#include <algorithm>
-#include <locale>
-#include "sword25/kernel/memlog_on.h"
-
 using namespace std;
 
 #define BS_LOG_PREFIX "PERSISTENCESERVICE"
 
 // -----------------------------------------------------------------------------
-// Konstanten und Hilfsfunktionen
+// Constants and utility functions
 // -----------------------------------------------------------------------------
 
-namespace
-{
+namespace Sword25 {
 	const char *		SAVEGAME_EXTENSION = ".b25s";
 	const char *		SAVEGAME_DIRECTORY = "saves";
 	const char *		FILE_MARKER = "BS25SAVEGAME";
@@ -74,60 +67,72 @@
 
 	// -------------------------------------------------------------------------
 
-	string GenerateSavegameFilename(unsigned int SlotID)
-	{
-		ostringstream oss;
-		oss << SlotID << SAVEGAME_EXTENSION;
-		return oss.str();
+	Common::String GenerateSavegameFilename(unsigned int SlotID) {
+		Common::String oss;
+		oss += SlotID;
+		oss += SAVEGAME_EXTENSION;
+		return oss;
 	}
 
 	// -------------------------------------------------------------------------
 
-	string GenerateSavegamePath(unsigned int SlotID)
-	{
-		ostringstream oss;
-		oss << BS_PersistenceService::GetSavegameDirectory() << BS_FileSystemUtil::GetInstance().GetPathSeparator() << GenerateSavegameFilename(SlotID);
-		return oss.str();
+	Common::String GenerateSavegamePath(unsigned int SlotID) {
+		Common::String oss;
+		oss = BS_PersistenceService::GetSavegameDirectory();
+		oss += BS_FileSystemUtil::GetInstance().GetPathSeparator();
+		oss += GenerateSavegameFilename(SlotID);
+		return oss;
 	}
 
 	// -------------------------------------------------------------------------
 
-	string FormatTimestamp(time_t Time)
-	{
-		// Zeitstempel in Einzelkomponenten aufl\xF6sen.
-		tm * Timeinfo = localtime(&Time);
+	Common::String FormatTimestamp(TimeDate Time) {
+		// In the original BS2.5 engine, this used a local object to show the date/time as as a string.
+		// For now in ScummVM it's being hardcoded to 'dd-MON-yyyy hh:mm:ss'
+		Common::String monthList[12] = { 
+			"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"
+		};
+		char buffer[100];
+		snprintf(buffer, 100, "%.2d-%s-%.4d %.2d:%.2d:%.2d", 
+			Time.tm_mday, monthList[Time.tm_mon].c_str(), Time.tm_year,
+			Time.tm_hour, Time.tm_min, Time.tm_sec
+		);
 
-		// Zeitangabe im lokalen Format in einen String-Stream schreiben.
-		locale Locale("");
-		ostringstream StringBuilder;
-		StringBuilder.imbue(Locale);
-		char * Pattern = "%x %X";
-		use_facet<time_put<char> >(Locale).put(StringBuilder,
-			StringBuilder, StringBuilder.fill(), Timeinfo, Pattern, Pattern + strlen(Pattern));
+		return Common::String(buffer);
+	}
 
-		// Formatierten String zur\xFCckgeben.
-		return StringBuilder.str();
+	// -------------------------------------------------------------------------
+
+	Common::String LoadString(Common::InSaveFile *In, uint MaxSize = 999) {
+		Common::String Result;
+		char ch;
+		while ((ch = (char)In->readByte()) != '\0') {
+			Result += ch;
+			if (Result.size() >= MaxSize) break;
+		}
+
+		return Result;
 	}
 }
 
+namespace Sword25 {
+
 // -----------------------------------------------------------------------------
-// Private Implementation (Pimpl-Pattern)
+// Private Implementation
 // -----------------------------------------------------------------------------
 
-struct SavegameInformation
-{
+struct SavegameInformation {
 	bool			IsOccupied;
 	bool			IsCompatible;
-	string			Description;
-	string			Filename;
+	Common::String	Description;
+	Common::String	Filename;
 	unsigned int	GamedataLength;
 	unsigned int	GamedataOffset;
 	unsigned int	GamedataUncompressedLength;
 
 	SavegameInformation() { Clear(); }
 
-	void Clear()
-	{
+	void Clear() {
 		IsOccupied = false;
 		IsCompatible = false;
 		Description = "";
@@ -138,64 +143,61 @@
 	}
 };
 
-struct BS_PersistenceService::Impl
-{
+struct BS_PersistenceService::Impl {
 	SavegameInformation m_SavegameInformations[SLOT_COUNT];
 
 	// -----------------------------------------------------------------------------
 
-	Impl()
-	{
+	Impl() {
 		ReloadSlots();
 	}
 
 	// -----------------------------------------------------------------------------
 
-	void ReloadSlots()
-	{
+	void ReloadSlots() {
 		// \xDCber alle Spielstanddateien iterieren und deren Infos einlesen.
-		for (unsigned int i = 0; i < SLOT_COUNT; ++i)
-		{
+		for (unsigned int i = 0; i < SLOT_COUNT; ++i) {
 			ReadSlotSavegameInformation(i);
 		}
 	}
 
-	void ReadSlotSavegameInformation(unsigned int SlotID)
-	{
+	void ReadSlotSavegameInformation(unsigned int SlotID) {
 		// Aktuelle Slotinformationen in den Ausgangszustand versetzen, er wird im Folgenden neu gef\xFCllt.
 		SavegameInformation & CurSavegameInfo = m_SavegameInformations[SlotID];
 		CurSavegameInfo.Clear();
 
 		// Den Dateinamen f\xFCr den Spielstand des Slots generieren.
-		string Filename = GenerateSavegamePath(SlotID);
+		Common::String Filename = GenerateSavegamePath(SlotID);
 
 		// Feststellen, ob eine Spielstanddatei dieses Namens existiert.
-		if (BS_FileSystemUtil::GetInstance().FileExists(Filename))
-		{
-			// Die Spielstanddatei \xF6ffnen.
-			ifstream File(Filename.c_str(), ifstream::binary);
-			if (File.good() && File.is_open())
-			{
-				// Die Headerdaten einlesen.
-				string StoredMarker, StoredVersionID;
-				File >> StoredMarker >> StoredVersionID >> CurSavegameInfo.GamedataLength >> CurSavegameInfo.GamedataUncompressedLength;
+		if (BS_FileSystemUtil::GetInstance().FileExists(Filename)) {
+			// Read in the game
+			Common::SaveFileManager *sfm = g_system->getSavefileManager();
+			Common::InSaveFile *File = sfm->openForLoading(Filename);
 
-				// Falls die Headerdaten gelesen werden konnten und der Marker stimmt, nehmen wir an eine g\xFCltige Spielstanddatei zu haben.
-				if (File.good() && StoredMarker == FILE_MARKER)
-				{
+			if (File) {
+				// Read in the header
+				Common::String StoredMarker = LoadString(File);
+				Common::String StoredVersionID = LoadString(File);
+				CurSavegameInfo.GamedataLength = File->readUint32LE();
+				CurSavegameInfo.GamedataUncompressedLength = File->readUint32LE();
+
+				// If the header can be read in and is detected to be valid, we will have a valid file
+				if (StoredMarker == FILE_MARKER) {
 					// Der Slot wird als belegt markiert.
 					CurSavegameInfo.IsOccupied = true;
 					// Speichern, ob der Spielstand kompatibel mit der aktuellen Engine-Version ist.
-					CurSavegameInfo.IsCompatible = (StoredVersionID == string(VERSIONID));
+					CurSavegameInfo.IsCompatible = (StoredVersionID == Common::String(VERSIONID));
 					// Dateinamen des Spielstandes speichern.
 					CurSavegameInfo.Filename = GenerateSavegameFilename(SlotID);
 					// Die Beschreibung des Spielstandes besteht aus einer textuellen Darstellung des \xC4nderungsdatums der Spielstanddatei.
 					CurSavegameInfo.Description = FormatTimestamp(BS_FileSystemUtil::GetInstance().GetFileTime(Filename));
 					// Den Offset zu den gespeicherten Spieldaten innerhalb der Datei speichern.
 					// Dieses entspricht der aktuellen Position + 1, da nach der letzten Headerinformation noch ein Leerzeichen als trenner folgt.
-					CurSavegameInfo.GamedataOffset = static_cast<unsigned int>(File.tellg()) + 1;
+					CurSavegameInfo.GamedataOffset = static_cast<unsigned int>(File->pos()) + 1;
 				}
 
+				delete File;
 			}
 		}
 	}
@@ -205,22 +207,19 @@
 // Construction / Destruction
 // -----------------------------------------------------------------------------
 
-BS_PersistenceService & BS_PersistenceService::GetInstance()
-{
+BS_PersistenceService & BS_PersistenceService::GetInstance() {
 	static BS_PersistenceService Instance;
 	return Instance;
 }
 
 // -----------------------------------------------------------------------------
 
-BS_PersistenceService::BS_PersistenceService() : m_impl(new Impl)
-{
+BS_PersistenceService::BS_PersistenceService() : m_impl(new Impl) {
 }
 
 // -----------------------------------------------------------------------------
 
-BS_PersistenceService::~BS_PersistenceService()
-{
+BS_PersistenceService::~BS_PersistenceService() {
 	delete m_impl;
 }
 
@@ -228,39 +227,31 @@
 // Implementation
 // -----------------------------------------------------------------------------
 
-void BS_PersistenceService::ReloadSlots()
-{
+void BS_PersistenceService::ReloadSlots() {
 	m_impl->ReloadSlots();
 }
 
 // -----------------------------------------------------------------------------
 
-unsigned int BS_PersistenceService::GetSlotCount()
-{
+unsigned int BS_PersistenceService::GetSlotCount() {
 	return SLOT_COUNT;
 }
 
 // -----------------------------------------------------------------------------
 
-std::string BS_PersistenceService::GetSavegameDirectory()
-{
+Common::String BS_PersistenceService::GetSavegameDirectory() {
 	return BS_FileSystemUtil::GetInstance().GetUserdataDirectory() + BS_FileSystemUtil::GetInstance().GetPathSeparator() + SAVEGAME_DIRECTORY;
 }
 
 // -----------------------------------------------------------------------------
 
-namespace
-{
-	bool CheckSlotID(unsigned int SlotID)
-	{
+namespace {
+	bool CheckSlotID(unsigned int SlotID) {
 		// \xDCberpr\xFCfen, ob die Slot-ID zul\xE4ssig ist.
-		if (SlotID >= SLOT_COUNT)
-		{
+		if (SlotID >= SLOT_COUNT) {
 			BS_LOG_ERRORLN("Tried to access an invalid slot (%d). Only slot ids from 0 to %d are allowed.", SlotID, SLOT_COUNT - 1);
 			return false;
-		}
-		else
-		{
+		} else {
 			return true;
 		}
 	}
@@ -268,142 +259,129 @@
 
 // -----------------------------------------------------------------------------
 
-bool BS_PersistenceService::IsSlotOccupied(unsigned int SlotID)
-{
+bool BS_PersistenceService::IsSlotOccupied(unsigned int SlotID) {
 	if (!CheckSlotID(SlotID)) return false;
 	return m_impl->m_SavegameInformations[SlotID].IsOccupied;
 }
 
 // -----------------------------------------------------------------------------
 
-bool BS_PersistenceService::IsSavegameCompatible(unsigned int SlotID)
-{
+bool BS_PersistenceService::IsSavegameCompatible(unsigned int SlotID) {
 	if (!CheckSlotID(SlotID)) return false;
 	return m_impl->m_SavegameInformations[SlotID].IsCompatible;
 }
 
 // -----------------------------------------------------------------------------
 
-string & BS_PersistenceService::GetSavegameDescription(unsigned int SlotID)
-{
-	static string EmptyString;
+Common::String &BS_PersistenceService::GetSavegameDescription(unsigned int SlotID) {
+	static Common::String EmptyString;
 	if (!CheckSlotID(SlotID)) return EmptyString;
 	return m_impl->m_SavegameInformations[SlotID].Description;
 }
 
 // -----------------------------------------------------------------------------
 
-string & BS_PersistenceService::GetSavegameFilename(unsigned int SlotID)
-{
-	static string EmptyString;
+Common::String &BS_PersistenceService::GetSavegameFilename(unsigned int SlotID) {
+	static Common::String EmptyString;
 	if (!CheckSlotID(SlotID)) return EmptyString;
 	return m_impl->m_SavegameInformations[SlotID].Filename;
 }
 
 // -----------------------------------------------------------------------------
 
-bool BS_PersistenceService::SaveGame(unsigned int SlotID, const std::string & ScreenshotFilename)
-{
+bool BS_PersistenceService::SaveGame(unsigned int SlotID, const Common::String &ScreenshotFilename) {
 	// \xDCberpr\xFCfen, ob die Slot-ID zul\xE4ssig ist.
-	if (SlotID >= SLOT_COUNT)
-	{
+	if (SlotID >= SLOT_COUNT) {
 		BS_LOG_ERRORLN("Tried to save to an invalid slot (%d). Only slot ids form 0 to %d are allowed.", SlotID, SLOT_COUNT - 1);
 		return false;
 	}
 
 	// Dateinamen erzeugen.
-	string Filename = GenerateSavegamePath(SlotID).c_str();
+	Common::String Filename = GenerateSavegamePath(SlotID).c_str();
 
-	try
-	{
-		// Sicherstellen, dass das Verzeichnis f\xFCr die Spielstanddateien existiert.
-		BS_FileSystemUtil::GetInstance().CreateDirectory(GetSavegameDirectory());
+	// Sicherstellen, dass das Verzeichnis f\xFCr die Spielstanddateien existiert.
+	BS_FileSystemUtil::GetInstance().CreateDirectory(GetSavegameDirectory());
 
-		// Spielstanddatei \xF6ffnen und die Headerdaten schreiben.
-		ofstream File(Filename.c_str(), ofstream::binary);
-		File << string(FILE_MARKER) << " " << string(VERSIONID) << " ";
-		if (!File.good())
-		{
-			BS_LOG_ERRORLN("Unable to write header data to savegame file \"%s\".", Filename.c_str());
-			throw 0;
-		}
+	// Spielstanddatei \xF6ffnen und die Headerdaten schreiben.
+	Common::SaveFileManager *sfm = g_system->getSavefileManager();
+	Common::OutSaveFile *File = sfm->openForSaving(Filename);			
 
-		// Alle notwendigen Module persistieren.
-		BS_OutputPersistenceBlock Writer;
-		bool Success = true;
-		Success &= BS_Kernel::GetInstance()->GetScript()->Persist(Writer);
-		Success &= BS_RegionRegistry::GetInstance().Persist(Writer);
-		Success &= BS_Kernel::GetInstance()->GetGfx()->Persist(Writer);
-		Success &= BS_Kernel::GetInstance()->GetSfx()->Persist(Writer);
-		Success &= BS_Kernel::GetInstance()->GetInput()->Persist(Writer);
-		if (!Success)
-		{
-			BS_LOG_ERRORLN("Unable to persist modules for savegame file \"%s\".", Filename.c_str());
-			throw 0;
-		}
+	File->writeString(FILE_MARKER);
+	File->writeByte(' ');
+	File->writeString(VERSIONID);
+	File->writeByte(' ');
 
-		// Daten komprimieren.
-		vector<unsigned char> CompressionBuffer(Writer.GetDataSize() + (Writer.GetDataSize() + 500) / 1000 + 12);
-		uLongf CompressedLength = CompressionBuffer.size();
-		if (compress2(&CompressionBuffer[0], &CompressedLength, reinterpret_cast<const Bytef *>(Writer.GetData()), Writer.GetDataSize(), 6) != Z_OK)
-		{
-			BS_LOG_ERRORLN("Unable to compress savegame data in savegame file \"%s\".", Filename.c_str());
-			throw 0;
-		}
+	if (File->err()) {
+		error("Unable to write header data to savegame file \"%s\".", Filename.c_str());
+	}
 
-		// L\xE4nge der komprimierten Daten und der unkomprimierten Daten in die Datei schreiben.
-		File << CompressedLength << " " << Writer.GetDataSize() << " ";
+	// Alle notwendigen Module persistieren.
+	BS_OutputPersistenceBlock Writer;
+	bool Success = true;
+	Success &= BS_Kernel::GetInstance()->GetScript()->Persist(Writer);
+	Success &= BS_RegionRegistry::GetInstance().Persist(Writer);
+	Success &= BS_Kernel::GetInstance()->GetGfx()->Persist(Writer);
+	Success &= BS_Kernel::GetInstance()->GetSfx()->Persist(Writer);
+	Success &= BS_Kernel::GetInstance()->GetInput()->Persist(Writer);
+	if (!Success) {
+		error("Unable to persist modules for savegame file \"%s\".", Filename.c_str());
+	}
 
-		// Komprimierte Daten in die Datei schreiben.
-		File.write(reinterpret_cast<char *>(&CompressionBuffer[0]), CompressedLength);
-		if (!File.good())
-		{
-			BS_LOG_ERRORLN("Unable to write game data to savegame file \"%s\".", Filename.c_str());
-			throw 0;
-		}
+	// Daten komprimieren.
+	uLongf CompressedLength = Writer.GetDataSize() + (Writer.GetDataSize() + 500) / 1000 + 12;
+	Bytef *CompressionBuffer = new Bytef[CompressedLength];
+	
+	if (compress2(&CompressionBuffer[0], &CompressedLength, reinterpret_cast<const Bytef *>(Writer.GetData()), Writer.GetDataSize(), 6) != Z_OK) {
+		error("Unable to compress savegame data in savegame file \"%s\".", Filename.c_str());
+	}
 
-		// Screenshotdatei an die Datei anf\xFCgen.
-		if (BS_FileSystemUtil::GetInstance().FileExists(ScreenshotFilename))
-		{
-			ifstream ScreenshotFile(ScreenshotFilename.c_str(), ifstream::binary);
+	// L\xE4nge der komprimierten Daten und der unkomprimierten Daten in die Datei schreiben.
+	char sBuffer[10];
+	ltoa(CompressedLength, sBuffer, 10);
+	File->writeString(sBuffer);
+	File->writeByte(' ');
+	ltoa(Writer.GetDataSize(), sBuffer, 10);
+	File->writeString(sBuffer);
+	File->writeByte(' ');
 
-			vector<char> Buffer(FILE_COPY_BUFFER_SIZE);
-			while (ScreenshotFile.good())
-			{
-				ScreenshotFile.read(&Buffer[0], Buffer.size());
-				File.write(&Buffer[0], ScreenshotFile.gcount());
-			}
-		}
-		else
-		{
-			BS_LOG_WARNINGLN("The screenshot file \"%s\" does not exist. Savegame is written without a screenshot.", Filename.c_str());
-		}
-
-		// Savegameinformationen f\xFCr diesen Slot aktualisieren.
-		m_impl->ReadSlotSavegameInformation(SlotID);
+	// Komprimierte Daten in die Datei schreiben.
+	File->write(reinterpret_cast<char *>(&CompressionBuffer[0]), CompressedLength);
+	if (File->err()) {
+		error("Unable to write game data to savegame file \"%s\".", Filename.c_str());
 	}
-	catch(...)
-	{
-		BS_LOG_ERRORLN("An error occured while create savegame file \"%s\".", Filename.c_str());
 
-		// Es ist ein Fehler aufgetreten, die Spielstanddatei wird gel\xF6scht, da sie keinen konsistenten Zustand besitzt.
-		::remove(Filename.c_str());
+	// Screenshotdatei an die Datei anf\xFCgen.
+	if (BS_FileSystemUtil::GetInstance().FileExists(ScreenshotFilename)) {
+		Common::File ScreenshotFile;
+		if (!ScreenshotFile.open(ScreenshotFilename.c_str())) 
+			error("Unable to load screenshot file");
 
-		// Misserfolg signalisieren.
-		return false;
+		byte *Buffer = new Byte[FILE_COPY_BUFFER_SIZE];
+		while (!ScreenshotFile.eos()) {
+			int bytesRead = ScreenshotFile.read(&Buffer[0], FILE_COPY_BUFFER_SIZE);
+			File->write(&Buffer[0], bytesRead);
+		}
+	} else {
+		BS_LOG_WARNINGLN("The screenshot file \"%s\" does not exist. Savegame is written without a screenshot.", Filename.c_str());
 	}
 
+	// Savegameinformationen f\xFCr diesen Slot aktualisieren.
+	m_impl->ReadSlotSavegameInformation(SlotID);
+
+	delete[] CompressionBuffer;
+
 	// Erfolg signalisieren.
 	return true;
 }
 
 // -----------------------------------------------------------------------------
 
-bool BS_PersistenceService::LoadGame(unsigned int SlotID)
-{
+bool BS_PersistenceService::LoadGame(unsigned int SlotID) {
+	Common::SaveFileManager *sfm = g_system->getSavefileManager();
+	Common::InSaveFile *File;
+
 	// \xDCberpr\xFCfen, ob die Slot-ID zul\xE4ssig ist.
-	if (SlotID >= SLOT_COUNT)
-	{
+	if (SlotID >= SLOT_COUNT) {
 		BS_LOG_ERRORLN("Tried to load from an invalid slot (%d). Only slot ids form 0 to %d are allowed.", SlotID, SLOT_COUNT - 1);
 		return false;
 	}
@@ -411,8 +389,7 @@
 	SavegameInformation & CurSavegameInfo = m_impl->m_SavegameInformations[SlotID];
 
 	// \xDCberpr\xFCfen, ob der Slot belegt ist.
-	if (!CurSavegameInfo.IsOccupied)
-	{
+	if (!CurSavegameInfo.IsOccupied) {
 		BS_LOG_ERRORLN("Tried to load from an empty slot (%d).", SlotID);
 		return false;
 	}
@@ -428,32 +405,33 @@
 	}
 #endif
 
-	vector<unsigned char> UncompressedDataBuffer(CurSavegameInfo.GamedataUncompressedLength);
+	Bytef *UncompressedDataBuffer = new Bytef[CurSavegameInfo.GamedataUncompressedLength];
 	{
 		// Komprimierte gespeicherte Spieldaten laden.
 		vector<unsigned char> CompressedDataBuffer(CurSavegameInfo.GamedataLength);
 		{
-			ifstream File(GenerateSavegamePath(SlotID).c_str(), ifstream::binary);
-			File.seekg(CurSavegameInfo.GamedataOffset);
-			File.read(reinterpret_cast<char *>(&CompressedDataBuffer[0]), CurSavegameInfo.GamedataLength);
-			if (!File.good())
-			{
+			File = sfm->openForLoading(GenerateSavegamePath(SlotID));			
+
+			File->seek(CurSavegameInfo.GamedataOffset);
+			File->read(reinterpret_cast<char *>(&CompressedDataBuffer[0]), CurSavegameInfo.GamedataLength);
+			if (File->err()) {
 				BS_LOG_ERRORLN("Unable to load the gamedata from the savegame file \"%s\".", CurSavegameInfo.Filename.c_str());
 				return false;
 			}
 		}
 
 		// Spieldaten dekomprimieren.
-		uLongf UncompressedBufferSize = UncompressedDataBuffer.size();
+		uLongf UncompressedBufferSize = CurSavegameInfo.GamedataUncompressedLength;
 		if (uncompress(reinterpret_cast<Bytef *>(&UncompressedDataBuffer[0]), &UncompressedBufferSize,
-			reinterpret_cast<Bytef *>(&CompressedDataBuffer[0]), CompressedDataBuffer.size()) != Z_OK)
-		{
+			reinterpret_cast<Bytef *>(&CompressedDataBuffer[0]), CompressedDataBuffer.size()) != Z_OK) {
 			BS_LOG_ERRORLN("Unable to decompress the gamedata from savegame file \"%s\".", CurSavegameInfo.Filename.c_str());
+			delete[] UncompressedDataBuffer;
+			delete File;
 			return false;
 		}
 	}
 
-	BS_InputPersistenceBlock Reader(&UncompressedDataBuffer[0], UncompressedDataBuffer.size());
+	BS_InputPersistenceBlock Reader(&UncompressedDataBuffer[0], CurSavegameInfo.GamedataUncompressedLength);
 
 	// Einzelne Engine-Module depersistieren.
 	bool Success = true;
@@ -464,11 +442,15 @@
 	Success &= BS_Kernel::GetInstance()->GetSfx()->Unpersist(Reader);
 	Success &= BS_Kernel::GetInstance()->GetInput()->Unpersist(Reader);
 
-	if (!Success)
-	{
+	delete[] UncompressedDataBuffer;
+	delete File;
+
+	if (!Success) {
 		BS_LOG_ERRORLN("Unable to unpersist the gamedata from savegame file \"%s\".", CurSavegameInfo.Filename.c_str());
 		return false;
 	}
 
 	return true;
 }
+
+} // End of namespace Sword25


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