aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Horn2008-12-27 18:03:27 +0000
committerMax Horn2008-12-27 18:03:27 +0000
commit87a27477441ac9812406eb441465a5b9fddae85d (patch)
tree71d07df9a18ab186c8628e26136a723c983b222c
parentdb1a4b478940677c5a8d9128a283b74ad1c49104 (diff)
downloadscummvm-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.cpp30
-rw-r--r--common/archive.h121
-rw-r--r--common/fs.h136
-rw-r--r--common/xmlparser.cpp1
-rw-r--r--graphics/imageman.cpp1
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);