aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTravis Howell2006-05-02 03:23:03 +0000
committerTravis Howell2006-05-02 03:23:03 +0000
commit01c92cf6f5efbfe36c48f9d00122c93cc4f5d2cd (patch)
tree2357149f0f0bbd6d77665c6e716830d3d3c19536
parent84b2a4f76fed5848b8a4ff49fd2fcfd9604a0c92 (diff)
downloadscummvm-rg350-01c92cf6f5efbfe36c48f9d00122c93cc4f5d2cd.tar.gz
scummvm-rg350-01c92cf6f5efbfe36c48f9d00122c93cc4f5d2cd.tar.bz2
scummvm-rg350-01c92cf6f5efbfe36c48f9d00122c93cc4f5d2cd.zip
Add support for reading/writing config files through saveGameManager and use for config files in HE games
svn-id: r22273
-rw-r--r--common/config-file.cpp27
-rw-r--r--common/config-file.h2
-rw-r--r--engines/scumm/he/intern_he.h2
-rw-r--r--engines/scumm/he/script_v60he.cpp18
-rw-r--r--engines/scumm/he/script_v80he.cpp20
5 files changed, 45 insertions, 24 deletions
diff --git a/common/config-file.cpp b/common/config-file.cpp
index 5d01e4402d..af991b931d 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<Section>::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 a7588a049d..2e1e80ed10 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 &section) const;
diff --git a/engines/scumm/he/intern_he.h b/engines/scumm/he/intern_he.h
index 47cb1cd374..ad67e47032 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 da8f8fbad6..614a337fc4 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 8735e920c7..b7d689c069 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);
}