[Scummvm-git-logs] scummvm master -> e455d1ba1a1dadd29858767bfe6e074c34b8ea5c
dreammaster
dreammaster at scummvm.org
Tue Aug 31 04:47:37 UTC 2021
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
e455d1ba1a AGS: Simultate opening existing save files for read/write
Commit: e455d1ba1a1dadd29858767bfe6e074c34b8ea5c
https://github.com/scummvm/scummvm/commit/e455d1ba1a1dadd29858767bfe6e074c34b8ea5c
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2021-08-30T21:45:09-07:00
Commit Message:
AGS: Simultate opening existing save files for read/write
When the open mode of kFile_Create is passed, files are
meant to be opened in read/write mode if they already exist,
rather than simply replacing them. The code of this commit
should allow this to be simulated, by opening the file first
for reading, and then duplicating into a new OutSaveFile for
writing
Changed paths:
engines/ags/shared/util/file_stream.cpp
engines/ags/shared/util/file_stream.h
diff --git a/engines/ags/shared/util/file_stream.cpp b/engines/ags/shared/util/file_stream.cpp
index 28d8ee464a..0907d899a6 100644
--- a/engines/ags/shared/util/file_stream.cpp
+++ b/engines/ags/shared/util/file_stream.cpp
@@ -164,11 +164,15 @@ bool FileStream::Seek(soff_t offset, StreamSeek origin) {
return ags_fseek(_file, (file_off_t)offset, stdclib_origin) == 0;
}
+String FileStream::getSaveName(const String &filename) {
+ return String(filename.GetCStr() + strlen(SAVE_FOLDER_PREFIX));
+}
+
void FileStream::Open(const String &file_name, FileOpenMode open_mode, FileWorkMode work_mode) {
if (open_mode == kFile_Open) {
if (!file_name.CompareLeftNoCase(SAVE_FOLDER_PREFIX)) {
- _file = g_system->getSavefileManager()->openForLoading(
- file_name.GetCStr() + strlen(SAVE_FOLDER_PREFIX));
+ String saveName = getSaveName(file_name);
+ _file = g_system->getSavefileManager()->openForLoading(saveName);
} else {
// First try to open file in game folder
@@ -184,9 +188,37 @@ void FileStream::Open(const String &file_name, FileOpenMode open_mode, FileWorkM
} else {
if (!file_name.CompareLeftNoCase(SAVE_FOLDER_PREFIX)) {
- _file = g_system->getSavefileManager()->openForSaving(
- file_name.GetCStr() + strlen(SAVE_FOLDER_PREFIX), false);
+ String saveName = getSaveName(file_name);
+ Common::InSaveFile *existing = nullptr;
+
+ if (open_mode == kFile_Create &&
+ (existing = g_system->getSavefileManager()->openForLoading(saveName)) != nullptr) {
+ // kFile_Create mode allows opening existing files for read/write.
+ // Since ScummVM doesn't support this via the save file manager,
+ // we need to do a bit of a hack and load the existing contents,
+ // then recreate the file and write out the contents so that further
+ // writes will be possible without affecting the old data
+ size_t fileSize = existing->size();
+ byte *data = new byte[fileSize];
+ existing->read(data, fileSize);
+ delete existing;
+
+ Common::OutSaveFile *out = g_system->getSavefileManager()->openForSaving(saveName, false);
+ assert(out);
+
+ out->write(data, fileSize);
+ out->seek(0, SEEK_SET);
+ delete[] data;
+
+ _file = out;
+ } else {
+ _file = g_system->getSavefileManager()->openForSaving(saveName, false);
+ }
+
} else {
+ if (open_mode == kFile_Create)
+ warning("Non-save file opened in kFile_Create mode");
+
Common::String fname = file_name;
if (fname.hasPrefix("./"))
fname = fname.substr(2);
diff --git a/engines/ags/shared/util/file_stream.h b/engines/ags/shared/util/file_stream.h
index 590f971706..feb3a4b1db 100644
--- a/engines/ags/shared/util/file_stream.h
+++ b/engines/ags/shared/util/file_stream.h
@@ -67,6 +67,7 @@ public:
private:
void Open(const String &file_name, FileOpenMode open_mode, FileWorkMode work_mode);
+ String getSaveName(const String &filename);
Common::Stream *_file;
const FileWorkMode _workMode;
More information about the Scummvm-git-logs
mailing list