diff options
author | Max Horn | 2008-12-27 18:03:27 +0000 |
---|---|---|
committer | Max Horn | 2008-12-27 18:03:27 +0000 |
commit | 87a27477441ac9812406eb441465a5b9fddae85d (patch) | |
tree | 71d07df9a18ab186c8628e26136a723c983b222c | |
parent | db1a4b478940677c5a8d9128a283b74ad1c49104 (diff) | |
download | scummvm-rg350-87a27477441ac9812406eb441465a5b9fddae85d.tar.gz scummvm-rg350-87a27477441ac9812406eb441465a5b9fddae85d.tar.bz2 scummvm-rg350-87a27477441ac9812406eb441465a5b9fddae85d.zip |
Turned FSNode into a ArchiveMember subclass; removed the now obsolete FSDirectoryMember; moved FSDirectory from common/archive.h to common/fs.h
svn-id: r35578
-rw-r--r-- | common/archive.cpp | 30 | ||||
-rw-r--r-- | common/archive.h | 121 | ||||
-rw-r--r-- | common/fs.h | 136 | ||||
-rw-r--r-- | common/xmlparser.cpp | 1 | ||||
-rw-r--r-- | graphics/imageman.cpp | 1 |
5 files changed, 138 insertions, 151 deletions
diff --git a/common/archive.cpp b/common/archive.cpp index 338593cea9..d9d0a0a1d8 100644 --- a/common/archive.cpp +++ b/common/archive.cpp @@ -65,30 +65,6 @@ int Archive::listMatchingMembers(ArchiveMemberList &list, const String &pattern) return matches; } -/** - * FSDirectoryMemeber is the implementation of ArchiveMember used by - * by FSDirectory. It is right now a light wrapper or FSNode. - */ -class FSDirectoryMember : public ArchiveMember { - FSNode _node; - -public: - FSDirectoryMember(FSNode &node) : _node(node) { - } - - String getName() const { - return _node.getName(); - } - - String getDisplayName() const { - return _node.getPath(); - } - - SeekableReadStream *open() { - return _node.openForReading(); - } -}; - FSDirectory::FSDirectory(const FSNode &node, int depth) : _node(node), _cached(false), _depth(depth) { } @@ -157,7 +133,7 @@ ArchiveMemberPtr FSDirectory::getMember(const String &name) { return ArchiveMemberPtr(); } - return ArchiveMemberPtr(new FSDirectoryMember(node)); + return ArchiveMemberPtr(new FSNode(node)); } SeekableReadStream *FSDirectory::openFile(const String &name) { @@ -299,7 +275,7 @@ int FSDirectory::listMatchingMembers(ArchiveMemberList &list, const String &patt NodeCache::iterator it = _fileCache.begin(); for ( ; it != _fileCache.end(); ++it) { if (matchPath(it->_key.c_str(), lowercasePattern.c_str())) { - list.push_back(ArchiveMemberPtr(new FSDirectoryMember(it->_value))); + list.push_back(ArchiveMemberPtr(new FSNode(it->_value))); matches++; } } @@ -315,7 +291,7 @@ int FSDirectory::listMembers(ArchiveMemberList &list) { int files = 0; for (NodeCache::iterator it = _fileCache.begin(); it != _fileCache.end(); ++it) { - list.push_back(ArchiveMemberPtr(new FSDirectoryMember(it->_value))); + list.push_back(ArchiveMemberPtr(new FSNode(it->_value))); ++files; } diff --git a/common/archive.h b/common/archive.h index d2f2adbbc0..db42df8546 100644 --- a/common/archive.h +++ b/common/archive.h @@ -23,19 +23,22 @@ * */ -#ifndef COMMON_ARCHIVES_H -#define COMMON_ARCHIVES_H +#ifndef COMMON_ARCHIVE_H +#define COMMON_ARCHIVE_H -#include "common/fs.h" +//#include "common/fs.h" #include "common/str.h" #include "common/hash-str.h" #include "common/list.h" #include "common/ptr.h" #include "common/singleton.h" -#include "common/stream.h" namespace Common { +class FSNode; +class SeekableReadStream; + + /** * ArchiveMember is an abstract interface to represent elements inside * implementations of Archive. @@ -122,116 +125,6 @@ public: /** - * FSDirectory models a directory tree from the filesystem and allows users - * to access it through the Archive interface. Searching is case-insensitive, - * since the intended goal is supporting retrieval of game data. - * - * FSDirectory can represent a single directory, or a tree with specified depth, - * depending on the value passed to the 'depth' parameter in the constructors. - * Filenames are cached with their relative path, with elements separated by - * backslashes, e.g.: - * - * c:\my\data\file.ext - * - * would be cached as 'data/file.ext' if FSDirectory was created on 'c:/my' with - * depth > 1. If depth was 1, then the 'data' subdirectory would have been - * ignored, instead. - * Again, only BACKSLASHES are used as separators independently from the - * underlying file system. - * - * Relative paths can be specified when calling matching functions like openFile(), - * hasFile(), listMatchingMembers() and listMembers(). Please see the function - * specific comments for more information. - * - * Client code can customize cache by using the constructors with the 'prefix' - * parameter. In this case, the prefix is prepended to each entry in the cache, - * and effectively treated as a 'virtual' parent subdirectory. FSDirectory adds - * a trailing backslash to prefix if needed. Following on with the previous example - * and using 'your' as prefix, the cache entry would have been 'your/data/file.ext'. - * - */ -class FSDirectory : public Archive { - FSNode _node; - - // Caches are case insensitive, clashes are dealt with when creating - // Key is stored in lowercase. - typedef HashMap<String, FSNode, IgnoreCase_Hash, IgnoreCase_EqualTo> NodeCache; - NodeCache _fileCache, _subDirCache; - Common::String _prefix; // string that is prepended to each cache item key - void setPrefix(const String &prefix); - - // look for a match - FSNode lookupCache(NodeCache &cache, const String &name); - - // cache management - void cacheDirectoryRecursive(FSNode node, int depth, const String& prefix); - // fill cache if not already cached - void ensureCached(); - bool _cached; - int _depth; - -public: - /** - * Create a FSDirectory representing a tree with the specified depth. Will result in an - * unbound FSDirectory if name is not found on the filesystem or if the node is not a - * valid directory. - */ - FSDirectory(const String &name, int depth = 1); - FSDirectory(const FSNode &node, int depth = 1); - - /** - * Create a FSDirectory representing a tree with the specified depth. The parameter - * prefix is prepended to the keys in the cache. See class comment. - */ - FSDirectory(const String &prefix, const String &name, int depth = 1); - FSDirectory(const String &prefix, const FSNode &node, int depth = 1); - - virtual ~FSDirectory(); - - /** - * This return the underlying FSNode of the FSDirectory. - */ - FSNode getFSNode() const; - - /** - * Create a new FSDirectory pointing to a sub directory of the instance. See class comment - * for an explanation of the prefix parameter. - * @return a new FSDirectory instance - */ - FSDirectory *getSubDirectory(const String &name, int depth = 1); - FSDirectory *getSubDirectory(const String &prefix, const String &name, int depth = 1); - - /** - * Checks for existence in the cache. A full match of relative path and filename is needed - * for success. - */ - virtual bool hasFile(const String &name); - - /** - * Returns a list of matching file names. Pattern can use GLOB wildcards. - */ - virtual int listMatchingMembers(ArchiveMemberList &list, const String &pattern); - - /** - * Returns a list of all the files in the cache. - */ - virtual int listMembers(ArchiveMemberList &list); - - /** - * Get a ArchiveMember representation of the specified file. A full match of relative - * path and filename is needed for success. - */ - virtual ArchiveMemberPtr getMember(const String &name); - - /** - * Open the specified file. A full match of relative path and filename is needed - * for success. - */ - virtual SeekableReadStream *openFile(const String &name); -}; - - -/** * SearchSet enables access to a group of Archives through the Archive interface. * Its intended usage is a situation in which there are no name clashes among names in the * contained Archives, hence the simplistic policy of always looking for the first diff --git a/common/fs.h b/common/fs.h index 310d24c4c5..29d6f667ca 100644 --- a/common/fs.h +++ b/common/fs.h @@ -26,6 +26,7 @@ #define COMMON_FS_H #include "common/array.h" +#include "common/archive.h" #include "common/ptr.h" #include "common/str.h" @@ -42,7 +43,7 @@ class WriteStream; * This is subclass instead of just a typedef so that we can use forward * declarations of it in other places. */ -class FSList : public Common::Array<FSNode> {}; +class FSList : public Array<FSNode> {}; /** * FSNode, short for "File System Node", provides an abstraction for file @@ -54,9 +55,9 @@ class FSList : public Common::Array<FSNode> {}; * paths (and it's left to them whether / or \ or : is the path separator :-); * but it is also possible to use inodes or vrefs (MacOS 9) or anything else. */ -class FSNode { +class FSNode : public ArchiveMember { private: - Common::SharedPtr<AbstractFSNode> _realNode; + SharedPtr<AbstractFSNode> _realNode; FSNode(AbstractFSNode *realNode); public: @@ -85,7 +86,7 @@ public: * operating system doesn't support the concept), some other directory is * used (usually the root directory). */ - explicit FSNode(const Common::String &path); + explicit FSNode(const String &path); virtual ~FSNode() {} @@ -119,7 +120,7 @@ public: * @param name the name of a child of this directory * @return the node referring to the child with the given name */ - FSNode getChild(const Common::String &name) const; + FSNode getChild(const String &name) const; /** * Return a list of all child nodes of this directory node. If called on a node @@ -136,7 +137,7 @@ public: * * @return the display name */ - virtual Common::String getDisplayName() const; + virtual String getDisplayName() const; /** * Return a string representation of the name of the file. This is can be @@ -146,7 +147,7 @@ public: * * @return the file name */ - virtual Common::String getName() const; + virtual String getName() const; /** * Return a string representation of the file which is suitable for @@ -160,7 +161,7 @@ public: * * @return the 'path' represented by this filesystem node */ - virtual Common::String getPath() const; + virtual String getPath() const; /** * Get the parent node of this node. If this node has no parent node, @@ -212,7 +213,7 @@ public: * * @return pointer to the stream object, 0 in case of a failure */ - virtual Common::SeekableReadStream *openForReading() const; + virtual SeekableReadStream *openForReading() const; /** * Creates a WriteStream instance corresponding to the file @@ -221,9 +222,124 @@ public: * * @return pointer to the stream object, 0 in case of a failure */ - virtual Common::WriteStream *openForWriting() const; + virtual WriteStream *openForWriting() const; + + // Compatibility with ArchiveMember API. + SeekableReadStream *open() { + return openForReading(); + } }; +/** + * FSDirectory models a directory tree from the filesystem and allows users + * to access it through the Archive interface. Searching is case-insensitive, + * since the intended goal is supporting retrieval of game data. + * + * FSDirectory can represent a single directory, or a tree with specified depth, + * depending on the value passed to the 'depth' parameter in the constructors. + * Filenames are cached with their relative path, with elements separated by + * backslashes, e.g.: + * + * c:\my\data\file.ext + * + * would be cached as 'data/file.ext' if FSDirectory was created on 'c:/my' with + * depth > 1. If depth was 1, then the 'data' subdirectory would have been + * ignored, instead. + * Again, only BACKSLASHES are used as separators independently from the + * underlying file system. + * + * Relative paths can be specified when calling matching functions like openFile(), + * hasFile(), listMatchingMembers() and listMembers(). Please see the function + * specific comments for more information. + * + * Client code can customize cache by using the constructors with the 'prefix' + * parameter. In this case, the prefix is prepended to each entry in the cache, + * and effectively treated as a 'virtual' parent subdirectory. FSDirectory adds + * a trailing backslash to prefix if needed. Following on with the previous example + * and using 'your' as prefix, the cache entry would have been 'your/data/file.ext'. + * + */ +class FSDirectory : public Archive { + FSNode _node; + + // Caches are case insensitive, clashes are dealt with when creating + // Key is stored in lowercase. + typedef HashMap<String, FSNode, IgnoreCase_Hash, IgnoreCase_EqualTo> NodeCache; + NodeCache _fileCache, _subDirCache; + String _prefix; // string that is prepended to each cache item key + void setPrefix(const String &prefix); + + // look for a match + FSNode lookupCache(NodeCache &cache, const String &name); + + // cache management + void cacheDirectoryRecursive(FSNode node, int depth, const String& prefix); + // fill cache if not already cached + void ensureCached(); + bool _cached; + int _depth; + +public: + /** + * Create a FSDirectory representing a tree with the specified depth. Will result in an + * unbound FSDirectory if name is not found on the filesystem or if the node is not a + * valid directory. + */ + FSDirectory(const String &name, int depth = 1); + FSDirectory(const FSNode &node, int depth = 1); + + /** + * Create a FSDirectory representing a tree with the specified depth. The parameter + * prefix is prepended to the keys in the cache. See class comment. + */ + FSDirectory(const String &prefix, const String &name, int depth = 1); + FSDirectory(const String &prefix, const FSNode &node, int depth = 1); + + virtual ~FSDirectory(); + + /** + * This return the underlying FSNode of the FSDirectory. + */ + FSNode getFSNode() const; + + /** + * Create a new FSDirectory pointing to a sub directory of the instance. See class comment + * for an explanation of the prefix parameter. + * @return a new FSDirectory instance + */ + FSDirectory *getSubDirectory(const String &name, int depth = 1); + FSDirectory *getSubDirectory(const String &prefix, const String &name, int depth = 1); + + /** + * Checks for existence in the cache. A full match of relative path and filename is needed + * for success. + */ + virtual bool hasFile(const String &name); + + /** + * Returns a list of matching file names. Pattern can use GLOB wildcards. + */ + virtual int listMatchingMembers(ArchiveMemberList &list, const String &pattern); + + /** + * Returns a list of all the files in the cache. + */ + virtual int listMembers(ArchiveMemberList &list); + + /** + * Get a ArchiveMember representation of the specified file. A full match of relative + * path and filename is needed for success. + */ + virtual ArchiveMemberPtr getMember(const String &name); + + /** + * Open the specified file. A full match of relative path and filename is needed + * for success. + */ + virtual SeekableReadStream *openFile(const String &name); +}; + + } // End of namespace Common #endif //COMMON_FS_H diff --git a/common/xmlparser.cpp b/common/xmlparser.cpp index 3e1a7dd451..91cd6aa458 100644 --- a/common/xmlparser.cpp +++ b/common/xmlparser.cpp @@ -26,6 +26,7 @@ #include "common/xmlparser.h" #include "common/util.h" #include "common/archive.h" +#include "common/fs.h" namespace Common { diff --git a/graphics/imageman.cpp b/graphics/imageman.cpp index ab99ae256c..42fc01b3eb 100644 --- a/graphics/imageman.cpp +++ b/graphics/imageman.cpp @@ -26,6 +26,7 @@ #include "graphics/imageman.h" #include "graphics/surface.h" +#include "common/fs.h" #include "common/unzip.h" DECLARE_SINGLETON(Graphics::ImageManager); |