aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backends/fs/abstract-fs.h2
-rw-r--r--backends/fs/amigaos4/amigaos4-fs.cpp15
-rw-r--r--backends/fs/fs.cpp20
-rw-r--r--backends/fs/fs.h7
-rw-r--r--backends/fs/morphos/abox-fs.cpp13
-rw-r--r--backends/fs/palmos/palmos-fs.cpp9
-rw-r--r--backends/fs/posix/posix-fs.cpp9
-rw-r--r--backends/fs/ps2/ps2-fs.cpp8
-rw-r--r--backends/fs/symbian/symbian-fs.cpp7
-rw-r--r--backends/fs/windows/windows-fs.cpp10
-rw-r--r--base/main.cpp8
-rw-r--r--common/file.cpp13
-rw-r--r--engines/scumm/plugin.cpp8
-rw-r--r--engines/sword1/sword1.cpp7
-rw-r--r--gui/launcher.cpp6
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<DetectorResult> 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<DetectorResult> 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.