aboutsummaryrefslogtreecommitdiff
path: root/engines/gargoyle/files.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gargoyle/files.cpp')
-rw-r--r--engines/gargoyle/files.cpp79
1 files changed, 71 insertions, 8 deletions
diff --git a/engines/gargoyle/files.cpp b/engines/gargoyle/files.cpp
index c3f1367c66..e14a315f09 100644
--- a/engines/gargoyle/files.cpp
+++ b/engines/gargoyle/files.cpp
@@ -21,12 +21,15 @@
*/
#include "gargoyle/files.h"
+#include "gargoyle/gargoyle.h"
#include "gui/saveload.h"
+#include "common/file.h"
+#include "common/savefile.h"
#include "common/translation.h"
namespace Gargoyle {
-frefid_t Files::prompt(glui32 usage, FileMode fmode, glui32 rock) {
+frefid_t Files::createByPrompt(glui32 usage, FileMode fmode, glui32 rock) {
switch (usage & fileusage_TypeMask) {
case fileusage_SavedGame: {
if (fmode == filemode_Write) {
@@ -64,34 +67,94 @@ frefid_t Files::prompt(glui32 usage, FileMode fmode, glui32 rock) {
}
frefid_t Files::createRef(int slot, const Common::String &desc, glui32 usage, glui32 rock) {
- _fileReferences.push_back(FileReference());
- frefid_t fref = &_fileReferences.back();
-
+ frefid_t fref = new FileReference();
fref->_slotNumber = slot;
fref->_description = desc;
fref->_textMode = ((usage & fileusage_TextMode) != 0);
fref->_fileType = (FileUsage)(usage & fileusage_TypeMask);
+
+ _fileReferences.push_back(FileRefArray::value_type(fref));
return fref;
}
frefid_t Files::createRef(const Common::String &filename, glui32 usage, glui32 rock) {
- _fileReferences.push_back(FileReference());
- frefid_t fref = &_fileReferences.back();
-
+ frefid_t fref = new FileReference();
fref->_filename = filename;
fref->_textMode = ((usage & fileusage_TextMode) != 0);
fref->_fileType = (FileUsage)(usage & fileusage_TypeMask);
+
+ _fileReferences.push_back(FileRefArray::value_type(fref));
return fref;
}
+frefid_t Files::createTemp(glui32 usage, glui32 rock) {
+ return createRef(Common::String::format("%s.tmp", g_vm->getTargetName().c_str()),
+ usage, rock);
+}
+
+frefid_t Files::createFromRef(frefid_t fref, glui32 usage, glui32 rock) {
+ return createRef(fref->_filename, usage, rock);
+}
+
void Files::deleteRef(frefid_t fref) {
for (uint idx = 0; idx < _fileReferences.size(); ++idx) {
- if (&_fileReferences[idx] == fref) {
+ if (_fileReferences[idx].get() == fref) {
_fileReferences.remove_at(idx);
return;
}
}
}
+frefid_t Files::iterate(frefid_t fref, glui32 *rock) {
+ // Find reference following the specified one
+ int index = -1;
+ for (uint idx = 0; idx < _fileReferences.size(); ++idx) {
+ if (fref == nullptr || _fileReferences[idx].get() == fref) {
+ if (idx < (_fileReferences.size() - 1))
+ index = idx + 1;
+ break;
+ }
+ }
+
+ if (index != -1) {
+ if (rock)
+ *rock = _fileReferences[index].get()->_rock;
+ return _fileReferences[index].get();
+ }
+
+ if (rock)
+ *rock = 0;
+ return nullptr;
+}
+
+/*--------------------------------------------------------------------------*/
+
+const Common::String FileReference::getSaveName() const {
+ assert(_slotNumber != -1);
+ return Common::String::format("%s.%.3d", g_vm->getTargetName().c_str(), _slotNumber);
+}
+
+bool FileReference::exists() const {
+ Common::String filename;
+
+ if (_slotNumber == -1) {
+ if (Common::File::exists(_filename))
+ return true;
+ filename = _filename;
+ } else {
+ filename = getSaveName();
+ }
+
+ // Check for a savegame (or other file in the save folder) with that name
+ Common::InSaveFile *inSave = g_system->getSavefileManager()->openForLoading(filename);
+ bool result = inSave != nullptr;
+ delete inSave;
+ return result;
+}
+
+void FileReference::deleteFile() {
+ Common::String filename = (_slotNumber == -1) ? _filename : getSaveName();
+ g_system->getSavefileManager()->removeSavefile(filename);
+}
} // End of namespace Gargoyle