From 9c1fc023281d1ea3789dcdb2cf7451baaf3d061f Mon Sep 17 00:00:00 2001 From: Max Horn Date: Wed, 3 May 2006 11:13:21 +0000 Subject: Got rid of AbstractFilesystemNode::wrap (begone, evil hack) svn-id: r22300 --- backends/fs/abstract-fs.h | 17 ++++++----------- backends/fs/amigaos4/amigaos4-fs.cpp | 16 ++++++++-------- backends/fs/fs.cpp | 18 ++++++++++-------- backends/fs/fs.h | 2 -- backends/fs/morphos/abox-fs.cpp | 16 ++++++++-------- backends/fs/palmos/palmos-fs.cpp | 12 ++++++------ backends/fs/posix/posix-fs.cpp | 8 ++++---- backends/fs/ps2/ps2-fs.cpp | 8 ++++---- backends/fs/symbian/symbian-fs.cpp | 10 +++++----- backends/fs/windows/windows-fs.cpp | 14 +++++++------- 10 files changed, 58 insertions(+), 63 deletions(-) diff --git a/backends/fs/abstract-fs.h b/backends/fs/abstract-fs.h index 0cfd89e875..5bba75756c 100644 --- a/backends/fs/abstract-fs.h +++ b/backends/fs/abstract-fs.h @@ -22,10 +22,15 @@ #ifndef BACKENDS_ABSTRACT_FS_H #define BACKENDS_ABSTRACT_FS_H +#include "common/array.h" #include "common/str.h" #include "backends/fs/fs.h" +class AbstractFilesystemNode; + +typedef Common::Array AbstractFSList; + /** * Abstract file system node. Private subclasses implement the actual * functionality. @@ -49,16 +54,6 @@ protected: */ virtual AbstractFilesystemNode *child(const String &name) const = 0; - /** - * This method is a rather ugly hack which is used internally by the - * actual node implementions to wrap up raw nodes inside FilesystemNode - * objects. We probably want to get rid of this eventually and replace it - * with a cleaner / more elegant solution, but for now it works. - * @note This takes over ownership of node. Do not delete it yourself, - * else you'll get ugly crashes. You've been warned! - */ - static FilesystemNode wrap(AbstractFilesystemNode *node); - /** * Returns a special node representing the FS root. The starting point for * any file system browsing. @@ -126,7 +121,7 @@ public: * on a node that does not represent a directory, an error is triggered. * @todo Rename this to listChildren. */ - virtual FSList listDir(ListMode mode) const = 0; + virtual AbstractFSList listDir(ListMode mode) const = 0; /* TODO: diff --git a/backends/fs/amigaos4/amigaos4-fs.cpp b/backends/fs/amigaos4/amigaos4-fs.cpp index 4875b74e28..2be79012ec 100644 --- a/backends/fs/amigaos4/amigaos4-fs.cpp +++ b/backends/fs/amigaos4/amigaos4-fs.cpp @@ -69,8 +69,8 @@ class AmigaOSFilesystemNode : public AbstractFilesystemNode { virtual bool isDirectory() const { return _bIsDirectory; }; virtual String path() const { return _sPath; }; - virtual FSList listDir(ListMode mode) const; - virtual FSList listVolumes(void) const; + virtual AbstractFSList listDir(ListMode mode) const; + virtual AbstractFSList listVolumes(void) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; }; @@ -222,10 +222,10 @@ AmigaOSFilesystemNode::~AmigaOSFilesystemNode() { LEAVE(); } -FSList AmigaOSFilesystemNode::listDir(ListMode mode) const { +AbstractFSList AmigaOSFilesystemNode::listDir(ListMode mode) const { ENTER(); - FSList myList; + AbstractFSList myList; if (!_bIsValid) { debug(6, "Invalid node"); @@ -275,7 +275,7 @@ FSList AmigaOSFilesystemNode::listDir(ListMode mode) const { AmigaOSFilesystemNode *entry = new AmigaOSFilesystemNode(lock, (char *)ead->ed_Name); if (entry) { if (entry->isValid()) - myList.push_back(wrap(entry)); + myList.push_back(entry); else delete entry; } @@ -334,10 +334,10 @@ AbstractFilesystemNode *AmigaOSFilesystemNode::child(const String &name) const { return new AmigaOSFilesystemNode(newPath); } -FSList AmigaOSFilesystemNode::listVolumes(void) const { +AbstractFSList AmigaOSFilesystemNode::listVolumes(void) const { ENTER(); - FSList myList; + AbstractFSList myList; const uint32 kLockFlags = LDF_READ | LDF_VOLUMES; char name[MAXPATHLEN]; @@ -367,7 +367,7 @@ FSList AmigaOSFilesystemNode::listVolumes(void) const { AmigaOSFilesystemNode *entry = new AmigaOSFilesystemNode(volumeLock, name); if (entry) { if (entry->isValid()) - myList.push_back(wrap(entry)); + myList.push_back(entry); else delete entry; } diff --git a/backends/fs/fs.cpp b/backends/fs/fs.cpp index a081a0af4f..f7844fb66a 100644 --- a/backends/fs/fs.cpp +++ b/backends/fs/fs.cpp @@ -29,11 +29,6 @@ static AbstractFilesystemNode *_rootNode = 0; static int *_rootRefCount = 0; -FilesystemNode AbstractFilesystemNode::wrap(AbstractFilesystemNode *node) { - FilesystemNode wrapper(node); - return wrapper; -} - FilesystemNode::FilesystemNode(AbstractFilesystemNode *realNode) { _realNode = realNode; _refCount = new int(1); @@ -91,7 +86,7 @@ FilesystemNode FilesystemNode::getParent() const { if (node == 0) { return *this; } else { - return AbstractFilesystemNode::wrap(node); + return FilesystemNode(node); } } @@ -101,13 +96,20 @@ FilesystemNode FilesystemNode::getChild(const String &name) const { assert(_realNode->isDirectory()); AbstractFilesystemNode *node = _realNode->child(name); - return AbstractFilesystemNode::wrap(node); + return FilesystemNode(node); } FSList FilesystemNode::listDir(ListMode mode) const { assert(_realNode); assert(_realNode->isDirectory()); - return _realNode->listDir(mode); + AbstractFSList inList(_realNode->listDir(mode)); + FSList outList; + + for (AbstractFSList::iterator i = inList.begin(); i != inList.end(); ++i) { + outList.push_back(FilesystemNode(*i)); + } + + return outList; } Common::String FilesystemNode::displayName() const { diff --git a/backends/fs/fs.h b/backends/fs/fs.h index a9883accd3..75adc57417 100644 --- a/backends/fs/fs.h +++ b/backends/fs/fs.h @@ -68,8 +68,6 @@ class FSList : public Common::Array {}; class FilesystemNode { - friend class AbstractFilesystemNode; - typedef Common::String String; private: AbstractFilesystemNode *_realNode; diff --git a/backends/fs/morphos/abox-fs.cpp b/backends/fs/morphos/abox-fs.cpp index bf7deb826b..70234740d3 100644 --- a/backends/fs/morphos/abox-fs.cpp +++ b/backends/fs/morphos/abox-fs.cpp @@ -51,8 +51,8 @@ class ABoxFilesystemNode : public AbstractFilesystemNode { virtual bool isDirectory() const { return _isDirectory; } virtual String path() const { return _path; } - virtual FSList listDir(ListMode mode) const; - static FSList listRoot(); + virtual AbstractFSList listDir(ListMode mode) const; + static AbstractFSList listRoot(); virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; }; @@ -129,9 +129,9 @@ ABoxFilesystemNode::~ABoxFilesystemNode() } } -FSList ABoxFilesystemNode::listDir(ListMode mode) const +AbstractFSList ABoxFilesystemNode::listDir(ListMode mode) const { - FSList myList; + AbstractFSList myList; if (!_isValid) error("listDir() called on invalid node"); @@ -174,7 +174,7 @@ FSList ABoxFilesystemNode::listDir(ListMode mode) const if (entry) { if (entry->isValid()) - myList.push_back(wrap(entry)); + myList.push_back(entry); else delete entry; } @@ -218,9 +218,9 @@ AbstractFilesystemNode *ABoxFilesystemNode::child(const String &name) const { TODO } -FSList ABoxFilesystemNode::listRoot() +AbstractFSList ABoxFilesystemNode::listRoot() { - FSList myList; + AbstractFSList myList; DosList *dosList; CONST ULONG lockDosListFlags = LDF_READ | LDF_VOLUMES; char name[256]; @@ -255,7 +255,7 @@ FSList ABoxFilesystemNode::listRoot() if (entry) { if (entry->isValid()) - myList.push_back(wrap(entry)); + myList.push_back(entry); else delete entry; } diff --git a/backends/fs/palmos/palmos-fs.cpp b/backends/fs/palmos/palmos-fs.cpp index bebf20ec59..4bbe8e383f 100644 --- a/backends/fs/palmos/palmos-fs.cpp +++ b/backends/fs/palmos/palmos-fs.cpp @@ -48,15 +48,15 @@ public: virtual bool isDirectory() const { return _isDirectory; } virtual String path() const { return _path; } - virtual FSList listDir(ListMode) const; + virtual AbstractFSList listDir(ListMode) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; private: - static void addFile (FSList &list, ListMode mode, const Char *base, FileInfoType* find_data); + static void addFile (AbstractFSList &list, ListMode mode, const Char *base, FileInfoType* find_data); }; -void PalmOSFilesystemNode::addFile(FSList &list, ListMode mode, const char *base, FileInfoType* find_data) { +void PalmOSFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const char *base, FileInfoType* find_data) { PalmOSFilesystemNode entry; bool isDirectory; @@ -75,7 +75,7 @@ void PalmOSFilesystemNode::addFile(FSList &list, ListMode mode, const char *base entry._isValid = true; entry._isPseudoRoot = false; - list.push_back(wrap(new PalmOSFilesystemNode(entry))); + list.push_back(new PalmOSFilesystemNode(entry)); } AbstractFilesystemNode *AbstractFilesystemNode::getRoot() { @@ -116,8 +116,8 @@ PalmOSFilesystemNode::PalmOSFilesystemNode(const PalmOSFilesystemNode &node) { _path = node._path; } -FSList PalmOSFilesystemNode::listDir(ListMode mode) const { - FSList myList; +AbstractFSList PalmOSFilesystemNode::listDir(ListMode mode) const { + AbstractFSList myList; Err e; Char nameP[256]; FileInfoType desc; diff --git a/backends/fs/posix/posix-fs.cpp b/backends/fs/posix/posix-fs.cpp index 43cf964d3d..ade8a2060f 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 FSList listDir(ListMode mode) const; + virtual AbstractFSList listDir(ListMode mode) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; }; @@ -130,12 +130,12 @@ POSIXFilesystemNode::POSIXFilesystemNode(const String &p, bool verify) { } } -FSList POSIXFilesystemNode::listDir(ListMode mode) const { +AbstractFSList POSIXFilesystemNode::listDir(ListMode mode) const { assert(_isDirectory); DIR *dirp = opendir(_path.c_str()); struct dirent *dp; - FSList myList; + AbstractFSList myList; if (dirp == NULL) return myList; @@ -192,7 +192,7 @@ FSList POSIXFilesystemNode::listDir(ListMode mode) const { if (entry._isDirectory) entry._path += "/"; - myList.push_back(wrap(new POSIXFilesystemNode(entry))); + myList.push_back(new POSIXFilesystemNode(entry)); } closedir(dirp); return myList; diff --git a/backends/fs/ps2/ps2-fs.cpp b/backends/fs/ps2/ps2-fs.cpp index 6a18a8ef02..980df347af 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 FSList listDir(ListMode) const; + virtual AbstractFSList listDir(ListMode) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; @@ -79,10 +79,10 @@ Ps2FilesystemNode::Ps2FilesystemNode(const String &path) { _isDirectory = true; } -FSList Ps2FilesystemNode::listDir(ListMode mode) const { +AbstractFSList Ps2FilesystemNode::listDir(ListMode mode) const { assert(_isDirectory); - FSList myList; + AbstractFSList myList; struct TocEntry tocEntries[MAX_LIST_ENTRIES]; int files; @@ -112,7 +112,7 @@ FSList Ps2FilesystemNode::listDir(ListMode mode) const { dirEntry._path += tocEntries[fCnt].filename; dirEntry._displayName = tocEntries[fCnt].filename; - myList.push_back(wrap(new Ps2FilesystemNode(dirEntry))); + myList.push_back(new Ps2FilesystemNode(dirEntry)); } } return myList; diff --git a/backends/fs/symbian/symbian-fs.cpp b/backends/fs/symbian/symbian-fs.cpp index 0971b112dc..948c86372e 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 FSList listDir(ListMode mode) const; + virtual AbstractFSList listDir(ListMode mode) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; }; @@ -105,9 +105,9 @@ SymbianFilesystemNode::SymbianFilesystemNode(const String &path) { _isDirectory = true; } -FSList SymbianFilesystemNode::listDir(ListMode mode) const { +AbstractFSList SymbianFilesystemNode::listDir(ListMode mode) const { assert(_isDirectory); - FSList myList; + AbstractFSList myList; if (_isPseudoRoot) { // Drives enumeration @@ -144,7 +144,7 @@ FSList SymbianFilesystemNode::listDir(ListMode mode) const { entry._isValid = true; entry._isPseudoRoot = false; entry._path = path; - myList.push_back(wrap(new SymbianFilesystemNode(entry))); + myList.push_back(new SymbianFilesystemNode(entry)); } } else { TPtrC8 ptr((const unsigned char*)_path.c_str(),_path.size()); @@ -173,7 +173,7 @@ FSList SymbianFilesystemNode::listDir(ListMode mode) const { if (entry._isDirectory) entry._path += "\\"; - myList.push_back(wrap(new SymbianFilesystemNode(entry))); + myList.push_back(new SymbianFilesystemNode(entry)); } CleanupStack::PopAndDestroy(dirPtr); } diff --git a/backends/fs/windows/windows-fs.cpp b/backends/fs/windows/windows-fs.cpp index 5172054c38..e1e9da12ab 100644 --- a/backends/fs/windows/windows-fs.cpp +++ b/backends/fs/windows/windows-fs.cpp @@ -50,14 +50,14 @@ public: virtual bool isDirectory() const { return _isDirectory; } virtual String path() const { return _path; } - virtual FSList listDir(ListMode) const; + virtual AbstractFSList listDir(ListMode) const; virtual AbstractFilesystemNode *parent() const; virtual AbstractFilesystemNode *child(const String &name) const; private: static char *toAscii(TCHAR *x); static const TCHAR* toUnicode(const char *x); - static void addFile (FSList &list, ListMode mode, const char *base, WIN32_FIND_DATA* find_data); + static void addFile (AbstractFSList &list, ListMode mode, const char *base, WIN32_FIND_DATA* find_data); }; @@ -93,7 +93,7 @@ const TCHAR* WindowsFilesystemNode::toUnicode(const char *x) { #endif } -void WindowsFilesystemNode::addFile(FSList &list, ListMode mode, const char *base, WIN32_FIND_DATA* find_data) { +void WindowsFilesystemNode::addFile(AbstractFSList &list, ListMode mode, const char *base, WIN32_FIND_DATA* find_data) { WindowsFilesystemNode entry; char *asciiName = toAscii(find_data->cFileName); bool isDirectory; @@ -117,7 +117,7 @@ void WindowsFilesystemNode::addFile(FSList &list, ListMode mode, const char *bas entry._isValid = true; entry._isPseudoRoot = false; - list.push_back(wrap(new WindowsFilesystemNode(entry))); + list.push_back(new WindowsFilesystemNode(entry)); } AbstractFilesystemNode *AbstractFilesystemNode::getRoot() { @@ -163,10 +163,10 @@ WindowsFilesystemNode::WindowsFilesystemNode(const String &p) { _isPseudoRoot = false; } -FSList WindowsFilesystemNode::listDir(ListMode mode) const { +AbstractFSList WindowsFilesystemNode::listDir(ListMode mode) const { assert(_isDirectory); - FSList myList; + AbstractFSList myList; if (_isPseudoRoot) { #ifndef _WIN32_WCE @@ -186,7 +186,7 @@ FSList WindowsFilesystemNode::listDir(ListMode mode) const { entry._isValid = true; entry._isPseudoRoot = false; entry._path = toAscii(current_drive); - myList.push_back(wrap(new WindowsFilesystemNode(entry))); + myList.push_back(new WindowsFilesystemNode(entry)); } #endif } -- cgit v1.2.3