From 282ebbb0e54211a1a3cef5510287a7c494fce1d2 Mon Sep 17 00:00:00 2001 From: Johannes Schickel Date: Sat, 1 Nov 2008 12:49:29 +0000 Subject: Commit of patch #2207782 "ARCHIVE: New method 'getMember'". svn-id: r34871 --- common/archive.cpp | 33 +++++++++++++++++++++++++++++++++ common/archive.h | 16 +++++++++++++++- common/unzip.cpp | 7 +++++++ common/unzip.h | 7 ++++--- engines/kyra/resource.cpp | 19 +++++++++---------- engines/kyra/resource_intern.cpp | 14 ++++++++++++++ engines/kyra/resource_intern.h | 2 ++ 7 files changed, 84 insertions(+), 14 deletions(-) diff --git a/common/archive.cpp b/common/archive.cpp index 8881d44116..b2113a351c 100644 --- a/common/archive.cpp +++ b/common/archive.cpp @@ -153,6 +153,24 @@ bool FSDirectory::hasFile(const String &name) { 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 @@ int SearchSet::listMembers(ArchiveMemberList &list) { 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; diff --git a/common/archive.h b/common/archive.h index b005090a87..5aca4bd450 100644 --- a/common/archive.h +++ b/common/archive.h @@ -51,7 +51,8 @@ public: virtual SeekableReadStream *open() = 0; }; -typedef List > ArchiveMemberList; +typedef SharedPtr ArchiveMemberPtr; +typedef List ArchiveMemberList; class Archive; @@ -106,6 +107,11 @@ public: */ 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 @@ -208,6 +214,12 @@ public: */ 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 @@ public: 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. diff --git a/common/unzip.cpp b/common/unzip.cpp index ac0d64df8f..3272681628 100644 --- a/common/unzip.cpp +++ b/common/unzip.cpp @@ -1416,6 +1416,13 @@ int ZipArchive::listMembers(Common::ArchiveMemberList &list) { 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; diff --git a/common/unzip.h b/common/unzip.h index 8c9f465b97..d4185155c0 100644 --- a/common/unzip.h +++ b/common/unzip.h @@ -39,14 +39,15 @@ class ZipArchive : public Archive { 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 diff --git a/engines/kyra/resource.cpp b/engines/kyra/resource.cpp index 2b09036b4e..d4b468fed5 100644 --- a/engines/kyra/resource.cpp +++ b/engines/kyra/resource.cpp @@ -107,15 +107,15 @@ bool Resource::reset() { }; 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::reset() { 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 file) { diff --git a/engines/kyra/resource_intern.cpp b/engines/kyra/resource_intern.cpp index fbbfe69186..cbb6dc4f0c 100644 --- a/engines/kyra/resource_intern.cpp +++ b/engines/kyra/resource_intern.cpp @@ -62,6 +62,13 @@ int PlainArchive::listMembers(Common::ArchiveMemberList &list) { 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 @@ int CachedArchive::listMembers(Common::ArchiveMemberList &list) { 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()) diff --git a/engines/kyra/resource_intern.h b/engines/kyra/resource_intern.h index 6347c538fc..f768100afe 100644 --- a/engines/kyra/resource_intern.h +++ b/engines/kyra/resource_intern.h @@ -51,6 +51,7 @@ public: 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 @@ public: 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 { -- cgit v1.2.3