[Scummvm-cvs-logs] SF.net SVN: scummvm:[34871] scummvm/trunk

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Sat Nov 1 13:49:29 CET 2008


Revision: 34871
          http://scummvm.svn.sourceforge.net/scummvm/?rev=34871&view=rev
Author:   lordhoto
Date:     2008-11-01 12:49:29 +0000 (Sat, 01 Nov 2008)

Log Message:
-----------
Commit of patch #2207782 "ARCHIVE: New method 'getMember'".

Modified Paths:
--------------
    scummvm/trunk/common/archive.cpp
    scummvm/trunk/common/archive.h
    scummvm/trunk/common/unzip.cpp
    scummvm/trunk/common/unzip.h
    scummvm/trunk/engines/kyra/resource.cpp
    scummvm/trunk/engines/kyra/resource_intern.cpp
    scummvm/trunk/engines/kyra/resource_intern.h

Modified: scummvm/trunk/common/archive.cpp
===================================================================
--- scummvm/trunk/common/archive.cpp	2008-11-01 12:39:01 UTC (rev 34870)
+++ scummvm/trunk/common/archive.cpp	2008-11-01 12:49:29 UTC (rev 34871)
@@ -153,6 +153,24 @@
 	return node.exists();
 }
 
+ArchiveMemberPtr FSDirectory::getMember(const String &name) {
+	if (name.empty() || !_node.isDirectory()) {
+		return ArchiveMemberPtr();
+	}
+
+	FSNode node = lookupCache(_fileCache, name);
+
+	if (!node.exists()) {
+		warning("FSDirectory::getMember: FSNode does not exist");
+		return ArchiveMemberPtr();
+	} else if (node.isDirectory()) {
+		warning("FSDirectory::getMember: FSNode is a directory");
+		return ArchiveMemberPtr();
+	}
+
+	return ArchiveMemberPtr(new FSDirectoryMember(node));
+}
+
 SeekableReadStream *FSDirectory::openFile(const String &name) {
 	if (name.empty() || !_node.isDirectory()) {
 		return 0;
@@ -367,6 +385,21 @@
 	return matches;
 }
 
+ArchiveMemberPtr SearchSet::getMember(const String &name) {
+	if (name.empty()) {
+		return ArchiveMemberPtr();
+	}
+
+	ArchiveList::iterator it = _list.begin();
+	for ( ; it != _list.end(); it++) {
+		if ((*it)._arc->hasFile(name)) {
+			return (*it)._arc->getMember(name);
+		}
+	}
+
+	return ArchiveMemberPtr();
+}
+
 SeekableReadStream *SearchSet::openFile(const String &name) {
 	if (name.empty()) {
 		return 0;

Modified: scummvm/trunk/common/archive.h
===================================================================
--- scummvm/trunk/common/archive.h	2008-11-01 12:39:01 UTC (rev 34870)
+++ scummvm/trunk/common/archive.h	2008-11-01 12:49:29 UTC (rev 34871)
@@ -51,7 +51,8 @@
 	virtual SeekableReadStream *open() = 0;
 };
 
-typedef List<SharedPtr<ArchiveMember> > ArchiveMemberList;
+typedef SharedPtr<ArchiveMember> ArchiveMemberPtr;
+typedef List<ArchiveMemberPtr> ArchiveMemberList;
 
 class Archive;
 
@@ -107,6 +108,11 @@
 	virtual int listMembers(ArchiveMemberList &list) = 0;
 
 	/**
+	 * Returns a ArchiveMember representation of the given file.
+	 */
+	virtual ArchiveMemberPtr getMember(const String &name) = 0;
+
+	/**
 	 * Create a stream bound to a file in the archive.
 	 * @return the newly created input stream
 	 */
@@ -209,6 +215,12 @@
 	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.
 	 */
@@ -273,6 +285,8 @@
 	virtual int listMatchingMembers(ArchiveMemberList &list, const String &pattern);
 	virtual int listMembers(ArchiveMemberList &list);
 
+	virtual ArchiveMemberPtr getMember(const String &name);
+
 	/**
 	 * Implements openFile from Archive base class. The current policy is
 	 * opening the first file encountered that matches the name.

Modified: scummvm/trunk/common/unzip.cpp
===================================================================
--- scummvm/trunk/common/unzip.cpp	2008-11-01 12:39:01 UTC (rev 34870)
+++ scummvm/trunk/common/unzip.cpp	2008-11-01 12:49:29 UTC (rev 34871)
@@ -1416,6 +1416,13 @@
 	return matches;
 }
 
+ArchiveMemberPtr ZipArchive::getMember(const String &name) {
+	if (!_zipFile || !hasFile(name))
+		return ArchiveMemberPtr();
+
+	return ArchiveMemberPtr(new GenericArchiveMember(name, this));
+}
+
 Common::SeekableReadStream *ZipArchive::openFile(const Common::String &name) {
 	if (!_zipFile)
 		return 0;

Modified: scummvm/trunk/common/unzip.h
===================================================================
--- scummvm/trunk/common/unzip.h	2008-11-01 12:39:01 UTC (rev 34870)
+++ scummvm/trunk/common/unzip.h	2008-11-01 12:49:29 UTC (rev 34871)
@@ -39,14 +39,15 @@
 
 public:
 	ZipArchive(const String &name);
-	ZipArchive(const Common::FSNode &node);
+	ZipArchive(const FSNode &node);
 	~ZipArchive();
 	
 	bool isOpen() const;
 
 	virtual bool hasFile(const String &name);
-	virtual int listMembers(Common::ArchiveMemberList &list);
-	virtual Common::SeekableReadStream *openFile(const Common::String &name);
+	virtual int listMembers(ArchiveMemberList &list);
+	virtual ArchiveMemberPtr getMember(const String &name);
+	virtual SeekableReadStream *openFile(const String &name);
 };
 
 }	// End of namespace Common

Modified: scummvm/trunk/engines/kyra/resource.cpp
===================================================================
--- scummvm/trunk/engines/kyra/resource.cpp	2008-11-01 12:39:01 UTC (rev 34870)
+++ scummvm/trunk/engines/kyra/resource.cpp	2008-11-01 12:49:29 UTC (rev 34871)
@@ -107,15 +107,15 @@
 		};
 
 		for (uint i = 0; i < ARRAYSIZE(list); ++i) {
-			Common::ArchiveMemberList fileList;
-			listFiles(list[i], fileList);
+			Common::ArchiveMemberPtr file = _files.getMember(list[i]);
+			if (!file)
+				error("Couldn't find PAK file '%s'", list[i]);
 
-			if (fileList.empty())
-				error("Couldn't load PAK file '%s'", list[i]);
-
-			Common::Archive *archive = loadArchive(list[i], *fileList.begin());
+			Common::Archive *archive = loadArchive(list[i], file);
 			if (archive)
 				_protectedFiles.add(list[i], archive, 0, false);
+			else
+				error("Couldn't load PAK file '%s'", list[i]);
 		}
 	} else {
 		for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
@@ -142,13 +142,12 @@
 bool Resource::loadPakFile(Common::String filename) {
 	filename.toUppercase();
 
-	Common::ArchiveMemberList list;
-	_files.listMatchingMembers(list, filename);
 
-	if (list.empty())
+	Common::ArchiveMemberPtr file = _files.getMember(filename);
+	if (!file)
 		return false;
 
-	return loadPakFile(filename, *list.begin());
+	return loadPakFile(filename, file);
 }
 
 bool Resource::loadPakFile(Common::String name, Common::SharedPtr<Common::ArchiveMember> file) {

Modified: scummvm/trunk/engines/kyra/resource_intern.cpp
===================================================================
--- scummvm/trunk/engines/kyra/resource_intern.cpp	2008-11-01 12:39:01 UTC (rev 34870)
+++ scummvm/trunk/engines/kyra/resource_intern.cpp	2008-11-01 12:49:29 UTC (rev 34871)
@@ -62,6 +62,13 @@
 	return count;
 }
 
+Common::ArchiveMemberPtr PlainArchive::getMember(const Common::String &name) {
+	if (!hasFile(name))
+		return Common::ArchiveMemberPtr();
+
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+}
+
 Common::SeekableReadStream *PlainArchive::openFile(const Common::String &name) {
 	FileMap::const_iterator fDesc = _files.find(name);
 	if (fDesc == _files.end())
@@ -110,6 +117,13 @@
 	return count;
 }
 
+Common::ArchiveMemberPtr CachedArchive::getMember(const Common::String &name) {
+	if (!hasFile(name))
+		return Common::ArchiveMemberPtr();
+
+	return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
+}
+
 Common::SeekableReadStream *CachedArchive::openFile(const Common::String &name) {
 	FileMap::const_iterator fDesc = _files.find(name);
 	if (fDesc == _files.end())

Modified: scummvm/trunk/engines/kyra/resource_intern.h
===================================================================
--- scummvm/trunk/engines/kyra/resource_intern.h	2008-11-01 12:39:01 UTC (rev 34870)
+++ scummvm/trunk/engines/kyra/resource_intern.h	2008-11-01 12:49:29 UTC (rev 34871)
@@ -51,6 +51,7 @@
 
 	bool hasFile(const Common::String &name);
 	int listMembers(Common::ArchiveMemberList &list);
+	Common::ArchiveMemberPtr getMember(const Common::String &name);
 	Common::SeekableReadStream *openFile(const Common::String &name);
 private:
 	struct Entry {
@@ -80,6 +81,7 @@
 
 	bool hasFile(const Common::String &name);
 	int listMembers(Common::ArchiveMemberList &list);
+	Common::ArchiveMemberPtr getMember(const Common::String &name);
 	Common::SeekableReadStream *openFile(const Common::String &name);
 private:
 	struct Entry {


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list