diff options
Diffstat (limited to 'backends/saves/default')
-rw-r--r-- | backends/saves/default/default-saves.cpp | 115 | ||||
-rw-r--r-- | backends/saves/default/default-saves.h | 6 |
2 files changed, 86 insertions, 35 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) diff --git a/backends/saves/default/default-saves.h b/backends/saves/default/default-saves.h index 3aea1495a4..9346e79700 100644 --- a/backends/saves/default/default-saves.h +++ b/backends/saves/default/default-saves.h @@ -28,12 +28,14 @@ #include "common/stdafx.h" #include "common/savefile.h" +#include "common/str.h" class DefaultSaveFileManager : public Common::SaveFileManager { public: - virtual Common::OutSaveFile *openForSaving(const char *filename); + virtual Common::StringList listSavefiles(const char *regex); virtual Common::InSaveFile *openForLoading(const char *filename); - virtual void listSavefiles(const char * /* prefix */, bool *marks, int num); + virtual Common::OutSaveFile *openForSaving(const char *filename); + virtual bool removeSavefile(const char *filename); }; #endif |