aboutsummaryrefslogtreecommitdiff
path: root/backends/saves/default/default-saves.cpp
diff options
context:
space:
mode:
authorMax Horn2007-09-18 20:02:04 +0000
committerMax Horn2007-09-18 20:02:04 +0000
commitc3d3aebe87d16d4fc3b7ac8581b99fb97241c9ac (patch)
tree17b2ba9f45743d2cf8f8e5faa6c9511e213f15f3 /backends/saves/default/default-saves.cpp
parent5c08cb1bcf84828cc93114fadbc89dd6f9909d06 (diff)
parent1dc13a641dd82825334e81bb3eb3b4ebd69d2552 (diff)
downloadscummvm-rg350-c3d3aebe87d16d4fc3b7ac8581b99fb97241c9ac.tar.gz
scummvm-rg350-c3d3aebe87d16d4fc3b7ac8581b99fb97241c9ac.tar.bz2
scummvm-rg350-c3d3aebe87d16d4fc3b7ac8581b99fb97241c9ac.zip
Patch #1768757: Merge fsnode-gsoc into trunk (MAJOR change, will break compilation on some ports)
svn-id: r28944
Diffstat (limited to 'backends/saves/default/default-saves.cpp')
-rw-r--r--backends/saves/default/default-saves.cpp115
1 files changed, 82 insertions, 33 deletions
diff --git a/backends/saves/default/default-saves.cpp b/backends/saves/default/default-saves.cpp
index 1898a23f2a..f4742f15a0 100644
--- a/backends/saves/default/default-saves.cpp
+++ b/backends/saves/default/default-saves.cpp
@@ -28,6 +28,8 @@
#include "common/stdafx.h"
#include "common/savefile.h"
#include "common/util.h"
+#include "common/fs.h"
+#include "common/file.h"
#include "backends/saves/default/default-saves.h"
#include "backends/saves/compressed/compressed-saves.h"
@@ -86,7 +88,6 @@ public:
}
};
-
static void join_paths(const char *filename, const char *directory,
char *buf, int bufsize) {
buf[bufsize-1] = '\0';
@@ -113,42 +114,103 @@ static void join_paths(const char *filename, const char *directory,
strncat(buf, filename, bufsize-1);
}
+Common::StringList DefaultSaveFileManager::listSavefiles(const char *regex) {
+ FilesystemNode savePath(getSavePath());
+ FSList savefiles;
+ Common::StringList results;
+ Common::String search(regex);
+
+ if (savePath.lookupFile(savefiles, savePath, search, false, true)) {
+ for (FSList::const_iterator file = savefiles.begin(); file != savefiles.end(); file++) {
+ results.push_back(file->getPath());
+ }
+ }
+
+ return results;
+}
+
+Common::InSaveFile *DefaultSaveFileManager::openForLoading(const char *filename) {
+ char buf[256];
+ join_paths(filename, getSavePath(), buf, sizeof(buf));
+
+ StdioSaveFile *sf = new StdioSaveFile(buf, false);
+
+ if (!sf->isOpen()) {
+ delete sf;
+ sf = 0;
+ }
+ return wrapInSaveFile(sf);
+}
+
Common::OutSaveFile *DefaultSaveFileManager::openForSaving(const char *filename) {
char buf[256];
// Ensure that the savepath exists and is writeable. If not, generate
// an appropriate error
const char *savePath = getSavePath();
+
#if defined(UNIX) || defined(__SYMBIAN32__)
struct stat sb;
+ clearError();
// Check whether the dir exists
if (stat(savePath, &sb) == -1) {
// The dir does not exist, or stat failed for some other reason.
// If the problem was that the path pointed to nothing, try
- // to create the dir.
- if (errno == ENOENT) {
+ // to create the dir (ENOENT case).
+ switch (errno) {
+ case EACCES:
+ setError(SFM_DIR_ACCESS, Common::String("Search or write permission denied"));
+ break;
+ case ELOOP:
+ setError(SFM_DIR_LOOP, Common::String("Too many symbolic links encountered while traversing the path"));
+ break;
+ case ENAMETOOLONG:
+ setError(SFM_DIR_NAMETOOLONG, Common::String("The path name is too long"));
+ break;
+ case ENOENT:
if (mkdir(savePath, 0755) != 0) {
// mkdir could fail for various reasons: The parent dir doesn't exist,
// or is not writeable, the path could be completly bogus, etc.
warning("mkdir for '%s' failed!", savePath);
perror("mkdir");
- // TODO: Specify an error code here so that callers can
- // determine what exactly went wrong.
+
+ switch (errno) {
+ case EACCES:
+ setError(SFM_DIR_ACCESS, Common::String("Search or write permission denied"));
+ break;
+ case EMLINK:
+ setError(SFM_DIR_LINKMAX, Common::String("The link count of the parent directory would exceed {LINK_MAX}"));
+ break;
+ case ELOOP:
+ setError(SFM_DIR_LOOP, Common::String("Too many symbolic links encountered while traversing the path"));
+ break;
+ case ENAMETOOLONG:
+ setError(SFM_DIR_NAMETOOLONG, Common::String("The path name is too long"));
+ break;
+ case ENOENT:
+ setError(SFM_DIR_NOENT, Common::String("A component of the path path does not exist, or the path is an empty string"));
+ break;
+ case ENOTDIR:
+ setError(SFM_DIR_NOTDIR, Common::String("A component of the path prefix is not a directory"));
+ break;
+ case EROFS:
+ setError(SFM_DIR_ROFS, Common::String("The parent directory resides on a read-only file system"));
+ break;
+ }
+
return 0;
}
- } else {
- // Unknown error, abort.
- // TODO: Specify an error code here so that callers can
- // determine what exactly went wrong.
- return 0;
- }
+ break;
+ case ENOTDIR:
+ setError(SFM_DIR_NOTDIR, Common::String("A component of the path prefix is not a directory"));
+ break;
+ }
} else {
- // So stat() succeeded. But is the path actually pointing to a
- // directory?
+ // So stat() succeeded. But is the path actually pointing to a directory?
if (!S_ISDIR(sb.st_mode)) {
- // TODO: Specify an error code here so that callers can
- // determine what exactly went wrong.
+ setError(SFM_DIR_NOTDIR, Common::String("The given savepath is not a directory"));
+
return 0;
}
}
@@ -163,27 +225,14 @@ Common::OutSaveFile *DefaultSaveFileManager::openForSaving(const char *filename)
delete sf;
sf = 0;
}
+
return wrapOutSaveFile(sf);
}
-Common::InSaveFile *DefaultSaveFileManager::openForLoading(const char *filename) {
- char buf[256];
- join_paths(filename, getSavePath(), buf, sizeof(buf));
-
- StdioSaveFile *sf = new StdioSaveFile(buf, false);
-
- if (!sf->isOpen()) {
- delete sf;
- sf = 0;
- }
- return wrapInSaveFile(sf);
-}
-
-void DefaultSaveFileManager::listSavefiles(const char * /* prefix */, bool *marks, int num) {
- // TODO: Implement this properly, at least on systems that support
- // opendir/readdir.
- // Even better, replace this with a better design...
- memset(marks, true, num * sizeof(bool));
+bool DefaultSaveFileManager::removeSavefile(const char *filename) {
+ Common::File file;
+ FilesystemNode savePath(filename);
+ return file.remove(savePath);
}
#endif // !defined(DISABLE_DEFAULT_SAVEFILEMANAGER)