From 01c92cf6f5efbfe36c48f9d00122c93cc4f5d2cd Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Tue, 2 May 2006 03:23:03 +0000 Subject: [PATCH] Add support for reading/writing config files through saveGameManager and use for config files in HE games svn-id: r22273 --- common/config-file.cpp | 27 +++++++++++++++++++++++++++ common/config-file.h | 2 ++ engines/scumm/he/intern_he.h | 2 +- engines/scumm/he/script_v60he.cpp | 18 +++--------------- engines/scumm/he/script_v80he.cpp | 20 ++++++++++++-------- 5 files changed, 45 insertions(+), 24 deletions(-) diff --git a/common/config-file.cpp b/common/config-file.cpp index 5d01e4402d2..af991b931d0 100644 --- a/common/config-file.cpp +++ b/common/config-file.cpp @@ -24,6 +24,8 @@ #include "common/config-file.h" #include "common/file.h" +#include "common/savefile.h" +#include "common/system.h" #include "common/util.h" #define MAXLINELEN 256 @@ -74,6 +76,18 @@ bool ConfigFile::loadFromFile(const String &filename) { return false; } +bool ConfigFile::loadFromSaveFile(const char *filename) { + SaveFileManager *saveFileMan = g_system->getSavefileManager(); + SeekableReadStream *loadFile; + + if (!(loadFile = saveFileMan->openForLoading(filename))) + return false; + + bool status = loadFromStream(*loadFile); + delete loadFile; + return status; +} + bool ConfigFile::loadFromStream(SeekableReadStream &stream) { char buf[MAXLINELEN]; Section section; @@ -176,6 +190,18 @@ bool ConfigFile::saveToFile(const String &filename) { return false; } +bool ConfigFile::saveToSaveFile(const char *filename) { + SaveFileManager *saveFileMan = g_system->getSavefileManager(); + WriteStream *saveFile; + + if (!(saveFile = saveFileMan->openForSaving(filename))) + return false; + + bool status = saveToStream(*saveFile); + delete saveFile; + return status; +} + bool ConfigFile::saveToStream(WriteStream &stream) { for (List
::iterator i = _sections.begin(); i != _sections.end(); ++i) { // Write out the section comment, if any @@ -203,6 +229,7 @@ bool ConfigFile::saveToStream(WriteStream &stream) { } } + stream.flush(); return !stream.ioFailed(); } diff --git a/common/config-file.h b/common/config-file.h index a7588a049d5..2e1e80ed10e 100644 --- a/common/config-file.h +++ b/common/config-file.h @@ -99,8 +99,10 @@ public: void clear(); bool loadFromFile(const String &filename); + bool loadFromSaveFile(const char *filename); bool loadFromStream(SeekableReadStream &stream); bool saveToFile(const String &filename); + bool saveToSaveFile(const char *filename); bool saveToStream(WriteStream &stream); bool hasSection(const String §ion) const; diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h index 47cb1cd374d..ad67e470327 100644 --- a/engines/scumm/he/intern_he.h +++ b/engines/scumm/he/intern_he.h @@ -83,7 +83,7 @@ protected: int virtScreenSave(byte *dst, int x1, int y1, int x2, int y2); void virtScreenLoad(int resIdx, int x1, int y1, int x2, int y2); - int convertFilePath(byte *dst, bool setFilePath = false); + int convertFilePath(byte *dst); virtual void decodeParseString(int a, int b); void swapObjects(int object1, int object2); diff --git a/engines/scumm/he/script_v60he.cpp b/engines/scumm/he/script_v60he.cpp index da8f8fbad65..614a337fc44 100644 --- a/engines/scumm/he/script_v60he.cpp +++ b/engines/scumm/he/script_v60he.cpp @@ -399,10 +399,10 @@ const char *ScummEngine_v60he::getOpcodeDesc(byte i) { return _opcodesv60he[i].desc; } -int ScummEngine_v60he::convertFilePath(byte *dst, bool setFilePath) { +int ScummEngine_v60he::convertFilePath(byte *dst) { debug(1, "convertFilePath: original filePath is %s", dst); - int len = resStrLen(dst) + 1; + int len = resStrLen(dst); if (dst[0] == ':') { // Switch all : to / for portablity int j = 0; @@ -431,19 +431,7 @@ int ScummEngine_v60he::convertFilePath(byte *dst, bool setFilePath) { } } - if (setFilePath) { - char filePath[256]; - strncpy(filePath, (char *)dst + r, sizeof(filePath)); - if (!Common::File::exists(filePath)) { - // FIXME: Using getSavePath() to generate filepaths used with - // File::open is not portable! - strncpy(filePath, _saveFileMan->getSavePath(), sizeof(filePath)); - strncat(filePath, (char *)dst + r, sizeof(filePath)); - } - strcpy((char *)dst, filePath); - debug(1, "convertFilePath: filePath is %s", dst); - } - + debug(1, "convertFilePath: converted filePath is %s", dst + r); return r; } diff --git a/engines/scumm/he/script_v80he.cpp b/engines/scumm/he/script_v80he.cpp index 8735e920c78..b7d689c069c 100644 --- a/engines/scumm/he/script_v80he.cpp +++ b/engines/scumm/he/script_v80he.cpp @@ -449,15 +449,18 @@ void ScummEngine_v80he::o80_readConfigFile() { byte option[128], section[128], filename[256]; ArrayHeader *ah; Common::String entry; - int len; + int len, r; copyScriptString(option, sizeof(option)); copyScriptString(section, sizeof(section)); copyScriptString(filename, sizeof(filename)); - convertFilePath(filename, true); + r = convertFilePath(filename); Common::ConfigFile ConfFile; - ConfFile.loadFromFile((const char *)filename); + if (!strcmp((char *)filename + r, "map.ini")) + ConfFile.loadFromFile((const char *)filename + r); + else + ConfFile.loadFromSaveFile((const char *)filename + r); byte subOp = fetchScriptByte(); @@ -487,7 +490,7 @@ void ScummEngine_v80he::o80_readConfigFile() { void ScummEngine_v80he::o80_writeConfigFile() { byte filename[256], section[256], option[256], string[1024]; - int value; + int r, value; byte subOp = fetchScriptByte(); @@ -499,7 +502,6 @@ void ScummEngine_v80he::o80_writeConfigFile() { copyScriptString(option, sizeof(option)); copyScriptString(section, sizeof(section)); copyScriptString(filename, sizeof(filename)); - convertFilePath(filename, true); break; case 77: // HE 100 case 7: // string @@ -507,16 +509,18 @@ void ScummEngine_v80he::o80_writeConfigFile() { copyScriptString(option, sizeof(option)); copyScriptString(section, sizeof(section)); copyScriptString(filename, sizeof(filename)); - convertFilePath(filename, true); break; default: error("o80_writeConfigFile: default type %d", subOp); } + r = convertFilePath(filename); + Common::ConfigFile ConfFile; - ConfFile.loadFromFile((const char *)filename); + ConfFile.loadFromSaveFile((const char *)filename + r); ConfFile.setKey((char *)option, (char *)section, (char *)string); - ConfFile.saveToFile((const char *)filename); + ConfFile.saveToSaveFile((const char *)filename + r); + debug(1,"o80_writeConfigFile: Filename %s Section %s Option %s String %s", filename, section, option, string); }