From d016c353c5f2f87278e244ec6418c87d681925b1 Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 3 May 2006 20:43:26 +0000 Subject: Changed FilesystemNode::listDir to return a bool indicating its success (or failure) svn-id: r22315 --- backends/fs/abstract-fs.h | 2 +- backends/fs/amigaos4/amigaos4-fs.cpp | 15 +++++++-------- backends/fs/fs.cpp | 20 ++++++++++++-------- backends/fs/fs.h | 7 ++++--- backends/fs/morphos/abox-fs.cpp | 13 ++++++------- backends/fs/palmos/palmos-fs.cpp | 9 ++++----- backends/fs/posix/posix-fs.cpp | 9 ++++----- backends/fs/ps2/ps2-fs.cpp | 8 +++----- backends/fs/symbian/symbian-fs.cpp | 7 +++---- backends/fs/windows/windows-fs.cpp | 10 ++++------ base/main.cpp | 8 +++----- common/file.cpp | 13 ++++++------- engines/scumm/plugin.cpp | 8 ++++++-- engines/sword1/sword1.cpp | 7 +++++-- gui/launcher.cpp | 6 +++++- 15 files changed, 73 insertions(+), 69 deletions(-) diff --git a/backends/fs/abstract-fs.h b/backends/fs/abstract-fs.h index a01ad11c69..d6229a992c 100644 --- a/backends/fs/abstract-fs.h +++ b/backends/fs/abstract-fs.h @@ -88,7 +88,7 @@ public: virtual bool isValid() const = 0; virtual bool isDirectory() const = 0; virtual String path() const = 0; - virtual AbstractFSList listDir(ListMode mode) const = 0; + virtual bool listDir(AbstractFSList &list, ListMode mode) const = 0; /* TODO: diff --git a/backends/fs/amigaos4/amigaos4-fs.cpp b/backends/fs/amigaos4/amigaos4-fs.cpp index 2be79012ec..cc7220c9b1 100644 --- a/backends/fs/amigaos4/amigaos4-fs.cpp +++ b/backends/fs/amigaos4/amigaos4-fs.cpp @@ -69,7 +69,7 @@ class AmigaOSFilesystemNode : public AbstractFilesystemNode { virtual bool isDirectory() const { return _bIsDirectory; }; virtual String path() const { return _sPath; }; - virtual AbstractFSList listDir(ListMode mode) const; + virtual bool listDir(AbstractFSList &list, ListMode mode) const; virtual AbstractFSList listVolumes(void) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; @@ -222,27 +222,26 @@ AmigaOSFilesystemNode::~AmigaOSFilesystemNode() { LEAVE(); } -AbstractFSList AmigaOSFilesystemNode::listDir(ListMode mode) const { +bool AmigaOSFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { ENTER(); - AbstractFSList myList; - if (!_bIsValid) { debug(6, "Invalid node"); LEAVE(); - return myList; // Empty list + return false; // Empty list } if (!_bIsDirectory) { debug(6, "Not a directory"); LEAVE(); - return myList; // Empty list + return false; // Empty list } if (_pFileLock == 0) { debug(6, "Root node"); LEAVE(); - return listVolumes(); + myList = listVolumes(); + return true; } struct ExAllControl *eac = (struct ExAllControl *)IDOS->AllocDosObject(DOS_EXALLCONTROL, 0); @@ -293,7 +292,7 @@ AbstractFSList AmigaOSFilesystemNode::listDir(ListMode mode) const { } LEAVE(); - return myList; + return true; } AbstractFilesystemNode *AmigaOSFilesystemNode::parent() const { diff --git a/backends/fs/fs.cpp b/backends/fs/fs.cpp index f7844fb66a..12cdc145ba 100644 --- a/backends/fs/fs.cpp +++ b/backends/fs/fs.cpp @@ -99,17 +99,21 @@ FilesystemNode FilesystemNode::getChild(const String &name) const { return FilesystemNode(node); } -FSList FilesystemNode::listDir(ListMode mode) const { - assert(_realNode); - assert(_realNode->isDirectory()); - AbstractFSList inList(_realNode->listDir(mode)); - FSList outList; +bool FilesystemNode::listDir(FSList &fslist, ListMode mode) const { + if (!_realNode || !_realNode->isDirectory()) + return false; + + AbstractFSList tmp; + + if (!_realNode->listDir(tmp, mode)) + return false; - for (AbstractFSList::iterator i = inList.begin(); i != inList.end(); ++i) { - outList.push_back(FilesystemNode(*i)); + fslist.clear(); + for (AbstractFSList::iterator i = tmp.begin(); i != tmp.end(); ++i) { + fslist.push_back(FilesystemNode(*i)); } - return outList; + return true; } Common::String FilesystemNode::displayName() const { diff --git a/backends/fs/fs.h b/backends/fs/fs.h index 38b46db031..f2930bd375 100644 --- a/backends/fs/fs.h +++ b/backends/fs/fs.h @@ -106,11 +106,12 @@ public: FilesystemNode getChild(const String &name) const; /** - * Return a list of child nodes of this directory node. If called - * on a node that does not represent a directory, an error is triggered. + * Return a list of child nodes of this directory node. If called on a node + * that does not represent a directory, false is returned. + * @return true if succesful, false otherwise (e.g. when the directory does not exist). * @todo Rename this to listChildren or getChildren. */ - virtual FSList listDir(ListMode mode = kListDirectoriesOnly) const; + virtual bool listDir(FSList &fslist, ListMode mode = kListDirectoriesOnly) const; /** * Return a human readable string for this node, usable for display (e.g. diff --git a/backends/fs/morphos/abox-fs.cpp b/backends/fs/morphos/abox-fs.cpp index 70234740d3..38e84b2547 100644 --- a/backends/fs/morphos/abox-fs.cpp +++ b/backends/fs/morphos/abox-fs.cpp @@ -51,7 +51,7 @@ class ABoxFilesystemNode : public AbstractFilesystemNode { virtual bool isDirectory() const { return _isDirectory; } virtual String path() const { return _path; } - virtual AbstractFSList listDir(ListMode mode) const; + virtual bool listDir(AbstractFSList &list, ListMode mode) const; static AbstractFSList listRoot(); virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; @@ -129,10 +129,8 @@ ABoxFilesystemNode::~ABoxFilesystemNode() } } -AbstractFSList ABoxFilesystemNode::listDir(ListMode mode) const +bool ABoxFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { - AbstractFSList myList; - if (!_isValid) error("listDir() called on invalid node"); @@ -142,7 +140,8 @@ AbstractFSList ABoxFilesystemNode::listDir(ListMode mode) const if (_lock == NULL) { /* This is the root node */ - return listRoot(); + myList = listRoot(); + return true; } /* "Normal" file system directory */ @@ -151,7 +150,7 @@ AbstractFSList ABoxFilesystemNode::listDir(ListMode mode) const if (fib == NULL) { warning("Failed to allocate memory for FileInfoBlock"); - return myList; + return false; } if (Examine(_lock, fib) != DOSFALSE) @@ -189,7 +188,7 @@ AbstractFSList ABoxFilesystemNode::listDir(ListMode mode) const FreeDosObject(DOS_FIB, fib); - return myList; + return tree; } AbstractFilesystemNode *ABoxFilesystemNode::parent() const diff --git a/backends/fs/palmos/palmos-fs.cpp b/backends/fs/palmos/palmos-fs.cpp index 4bbe8e383f..20480e9a14 100644 --- a/backends/fs/palmos/palmos-fs.cpp +++ b/backends/fs/palmos/palmos-fs.cpp @@ -48,7 +48,7 @@ public: virtual bool isDirectory() const { return _isDirectory; } virtual String path() const { return _path; } - virtual AbstractFSList listDir(ListMode) const; + virtual bool listDir(AbstractFSList &list, ListMode mode) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; @@ -116,8 +116,7 @@ PalmOSFilesystemNode::PalmOSFilesystemNode(const PalmOSFilesystemNode &node) { _path = node._path; } -AbstractFSList PalmOSFilesystemNode::listDir(ListMode mode) const { - AbstractFSList myList; +bool PalmOSFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { Err e; Char nameP[256]; FileInfoType desc; @@ -129,7 +128,7 @@ AbstractFSList PalmOSFilesystemNode::listDir(ListMode mode) const { e = VFSFileOpen(gVars->VFS.volRefNum, _path.c_str(), vfsModeRead, &handle); if (e) - return myList; + return false; while(dirIterator != expIteratorStop) { e = VFSDirEntryEnumerate(handle, &dirIterator, &desc); @@ -140,7 +139,7 @@ AbstractFSList PalmOSFilesystemNode::listDir(ListMode mode) const { VFSFileClose(handle); - return myList; + return true; } const char *lastPathComponent(const Common::String &str) { diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp index 86ca581fd1..b9278fbb00 100644 --- a/backends/fs/posix/posix-fs.cpp +++ b/backends/fs/posix/posix-fs.cpp @@ -57,7 +57,7 @@ public: virtual bool isDirectory() const { return _isDirectory; } virtual String path() const { return _path; } - virtual AbstractFSList listDir(ListMode mode) const; + virtual bool listDir(AbstractFSList &list, ListMode mode) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; }; @@ -136,15 +136,14 @@ POSIXFilesystemNode::POSIXFilesystemNode(const String &p, bool verify) { } } -AbstractFSList POSIXFilesystemNode::listDir(ListMode mode) const { +bool POSIXFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { assert(_isDirectory); DIR *dirp = opendir(_path.c_str()); struct dirent *dp; - AbstractFSList myList; if (dirp == NULL) - return myList; + return false; // ... loop over dir entries using readdir while ((dp = readdir(dirp)) != NULL) { @@ -201,7 +200,7 @@ AbstractFSList POSIXFilesystemNode::listDir(ListMode mode) const { myList.push_back(new POSIXFilesystemNode(entry)); } closedir(dirp); - return myList; + return true; } AbstractFilesystemNode *POSIXFilesystemNode::parent() const { diff --git a/backends/fs/ps2/ps2-fs.cpp b/backends/fs/ps2/ps2-fs.cpp index 980df347af..7370c3393e 100644 --- a/backends/fs/ps2/ps2-fs.cpp +++ b/backends/fs/ps2/ps2-fs.cpp @@ -45,7 +45,7 @@ public: virtual bool isDirectory() const { return _isDirectory; } virtual String path() const { return _path; } - virtual AbstractFSList listDir(ListMode) const; + virtual bool listDir(AbstractFSList &list, ListMode mode) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; @@ -79,11 +79,9 @@ Ps2FilesystemNode::Ps2FilesystemNode(const String &path) { _isDirectory = true; } -AbstractFSList Ps2FilesystemNode::listDir(ListMode mode) const { +bool Ps2FilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { assert(_isDirectory); - AbstractFSList myList; - struct TocEntry tocEntries[MAX_LIST_ENTRIES]; int files; char listDir[512]; @@ -115,7 +113,7 @@ AbstractFSList Ps2FilesystemNode::listDir(ListMode mode) const { myList.push_back(new Ps2FilesystemNode(dirEntry)); } } - return myList; + return true; } AbstractFilesystemNode *Ps2FilesystemNode::parent() const { diff --git a/backends/fs/symbian/symbian-fs.cpp b/backends/fs/symbian/symbian-fs.cpp index 948c86372e..e73c4d4489 100644 --- a/backends/fs/symbian/symbian-fs.cpp +++ b/backends/fs/symbian/symbian-fs.cpp @@ -52,7 +52,7 @@ public: virtual bool isDirectory() const { return _isDirectory; } virtual String path() const { return _path; } - virtual AbstractFSList listDir(ListMode mode) const; + virtual bool listDir(AbstractFSList &list, ListMode mode) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; }; @@ -105,9 +105,8 @@ SymbianFilesystemNode::SymbianFilesystemNode(const String &path) { _isDirectory = true; } -AbstractFSList SymbianFilesystemNode::listDir(ListMode mode) const { +bool SymbianFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { assert(_isDirectory); - AbstractFSList myList; if (_isPseudoRoot) { // Drives enumeration @@ -179,7 +178,7 @@ AbstractFSList SymbianFilesystemNode::listDir(ListMode mode) const { } } - return myList; + return true; } AbstractFilesystemNode *SymbianFilesystemNode::parent() const { diff --git a/backends/fs/windows/windows-fs.cpp b/backends/fs/windows/windows-fs.cpp index 0f01fda280..250953b064 100644 --- a/backends/fs/windows/windows-fs.cpp +++ b/backends/fs/windows/windows-fs.cpp @@ -50,7 +50,7 @@ public: virtual bool isDirectory() const { return _isDirectory; } virtual String path() const { return _path; } - virtual AbstractFSList listDir(ListMode) const; + virtual bool listDir(AbstractFSList &list, ListMode mode) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; @@ -163,11 +163,9 @@ WindowsFilesystemNode::WindowsFilesystemNode(const String &p) { _isPseudoRoot = false; } -AbstractFSList WindowsFilesystemNode::listDir(ListMode mode) const { +bool WindowsFilesystemNode::listDir(AbstractFSList &myList, ListMode mode) const { assert(_isDirectory); - AbstractFSList myList; - if (_isPseudoRoot) { #ifndef _WIN32_WCE // Drives enumeration @@ -200,7 +198,7 @@ AbstractFSList WindowsFilesystemNode::listDir(ListMode mode) const { handle = FindFirstFile(toUnicode(searchPath), &desc); if (handle == INVALID_HANDLE_VALUE) - return myList; + return false; addFile(myList, mode, _path.c_str(), &desc); while (FindNextFile(handle, &desc)) addFile(myList, mode, _path.c_str(), &desc); @@ -208,7 +206,7 @@ AbstractFSList WindowsFilesystemNode::listDir(ListMode mode) const { FindClose(handle); } - return myList; + return true; } AbstractFilesystemNode *WindowsFilesystemNode::parent() const { diff --git a/base/main.cpp b/base/main.cpp index 2a46357af4..e438cec0c8 100644 --- a/base/main.cpp +++ b/base/main.cpp @@ -271,15 +271,13 @@ static void runDetectorTest() { } FilesystemNode dir(path); - - if (!dir.isValid() || !dir.isDirectory()) { + FSList files; + if (!dir.listDir(files, FilesystemNode::kListAll)) { printf(" ... invalid path, skipping\n"); continue; } - - FSList files = dir.listDir(FilesystemNode::kListAll); - DetectedGameList candidates(PluginManager::instance().detectGames(files)); + DetectedGameList candidates(PluginManager::instance().detectGames(files)); bool gameidDiffers = false; for (DetectedGameList::iterator x = candidates.begin(); x != candidates.end(); ++x) { gameidDiffers |= scumm_stricmp(gameid.c_str(), x->gameid.c_str()); diff --git a/common/file.cpp b/common/file.cpp index c4baebcd37..b662ab9c44 100644 --- a/common/file.cpp +++ b/common/file.cpp @@ -124,27 +124,26 @@ void File::addDefaultDirectoryRecursive(const FilesystemNode &dir, int level) { if (level <= 0) return; - // Abort if this isn't a directory! - if (!dir.isDirectory()) + FSList fslist; + if (!dir.listDir(fslist, FilesystemNode::kListAll)) { + // Failed listing the contents of this node, so it is either not a + // directory, or just doesn't exist at all. return; - - const String &directory(dir.path()); + } if (!_defaultDirectories) _defaultDirectories = new StringIntMap; // Do not add directories multiple times, unless this time they are added // with a bigger depth. + const String &directory(dir.path()); if (_defaultDirectories->contains(directory) && (*_defaultDirectories)[directory] >= level) return; - (*_defaultDirectories)[directory] = level; if (!_filesMap) _filesMap = new FilesMap; - const FSList fslist(dir.listDir(FilesystemNode::kListAll)); - for (FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) { if (file->isDirectory()) { addDefaultDirectoryRecursive(file->path(), level - 1); diff --git a/engines/scumm/plugin.cpp b/engines/scumm/plugin.cpp index 5d37a8609c..cba5b77005 100644 --- a/engines/scumm/plugin.cpp +++ b/engines/scumm/plugin.cpp @@ -1318,14 +1318,18 @@ PluginError Engine_SCUMM_create(OSystem *syst, Engine **engine) { } + FSList fslist; FilesystemNode dir; if (ConfMan.hasKey("path") ) dir = FilesystemNode(ConfMan.get("path")); - FSList fslist = dir.listDir(FilesystemNode::kListFilesOnly); - Common::List results; + if (!dir.listDir(fslist, FilesystemNode::kListFilesOnly)) { + warning("ScummEngine: invalid game path '%s'", dir.path().c_str()); + return kInvalidPathError; + } // Invoke the detector, but fixed to the specified gameid. + Common::List results; detectGames(fslist, results, gameid); // Unable to locate game data diff --git a/engines/sword1/sword1.cpp b/engines/sword1/sword1.cpp index b31df25db5..e57cadcff3 100644 --- a/engines/sword1/sword1.cpp +++ b/engines/sword1/sword1.cpp @@ -90,8 +90,11 @@ void Sword1CheckDirectory(const FSList &fslist, bool *filesFound) { filesFound[cnt] = true; } else { for (int cnt = 0; cnt < ARRAYSIZE(g_dirNames); cnt++) - if (scumm_stricmp(file->displayName().c_str(), g_dirNames[cnt]) == 0) - Sword1CheckDirectory(file->listDir(FilesystemNode::kListFilesOnly), filesFound); + if (scumm_stricmp(file->displayName().c_str(), g_dirNames[cnt]) == 0) { + FSList fslist2; + if (file->listDir(fslist2, FilesystemNode::kListFilesOnly)) + Sword1CheckDirectory(fslist2, filesFound); + } } } } diff --git a/gui/launcher.cpp b/gui/launcher.cpp index af7f67d997..86e8ad926b 100644 --- a/gui/launcher.cpp +++ b/gui/launcher.cpp @@ -576,7 +576,11 @@ void LauncherDialog::addGame() { if (_browser->runModal() > 0) { // User made his choice... FilesystemNode dir(_browser->getResult()); - FSList files = dir.listDir(FilesystemNode::kListAll); + FSList files; + if (!dir.listDir(files, FilesystemNode::kListAll)) { + error("browser returned a node that is not a directory: '%s'", + dir.path().c_str()); + } // ...so let's determine a list of candidates, games that // could be contained in the specified directory. -- cgit v1.2.3