Ticket #8933: archive_getfile_v1.patch

File archive_getfile_v1.patch, 7.1 KB (added by lordhoto, 12 years ago)

Patch against r34861.

  • common/unzip.cpp

     
    14161416        return matches;
    14171417}
    14181418
     1419ArchiveMemberPtr ZipArchive::getFile(const String &name) {
     1420        if (!_zipFile || !hasFile(name))
     1421                return ArchiveMemberPtr();
     1422
     1423        return ArchiveMemberPtr(new GenericArchiveMember(name, this));
     1424}
     1425
    14191426Common::SeekableReadStream *ZipArchive::openFile(const Common::String &name) {
    14201427        if (!_zipFile)
    14211428                return 0;
  • common/archive.cpp

     
    153153        return node.exists();
    154154}
    155155
     156ArchiveMemberPtr FSDirectory::getFile(const String &name) {
     157        if (name.empty() || !_node.isDirectory()) {
     158                return ArchiveMemberPtr();
     159        }
     160
     161        FSNode node = lookupCache(_fileCache, name);
     162
     163        if (!node.exists()) {
     164                warning("FSDirectory::getFile: FSNode does not exist");
     165                return ArchiveMemberPtr();
     166        } else if (node.isDirectory()) {
     167                warning("FSDirectory::getFile: FSNode is a directory");
     168                return ArchiveMemberPtr();
     169        }
     170
     171        return ArchiveMemberPtr(new FSDirectoryMember(node));
     172}
     173
    156174SeekableReadStream *FSDirectory::openFile(const String &name) {
    157175        if (name.empty() || !_node.isDirectory()) {
    158176                return 0;
     
    367385        return matches;
    368386}
    369387
     388ArchiveMemberPtr SearchSet::getFile(const String &name) {
     389        if (name.empty()) {
     390                return ArchiveMemberPtr();
     391        }
     392
     393        ArchiveList::iterator it = _list.begin();
     394        for ( ; it != _list.end(); it++) {
     395                if ((*it)._arc->hasFile(name)) {
     396                        return (*it)._arc->getFile(name);
     397                }
     398        }
     399
     400        return ArchiveMemberPtr();
     401}
     402
    370403SeekableReadStream *SearchSet::openFile(const String &name) {
    371404        if (name.empty()) {
    372405                return 0;
  • common/unzip.h

     
    3939
    4040public:
    4141        ZipArchive(const String &name);
    42         ZipArchive(const Common::FSNode &node);
     42        ZipArchive(const FSNode &node);
    4343        ~ZipArchive();
    4444       
    4545        bool isOpen() const;
    4646
    4747        virtual bool hasFile(const String &name);
    48         virtual int listMembers(Common::ArchiveMemberList &list);
    49         virtual Common::SeekableReadStream *openFile(const Common::String &name);
     48        virtual int listMembers(ArchiveMemberList &list);
     49        virtual ArchiveMemberPtr getFile(const String &name);
     50        virtual SeekableReadStream *openFile(const String &name);
    5051};
    5152
    5253}       // End of namespace Common
  • common/archive.h

     
    5151        virtual SeekableReadStream *open() = 0;
    5252};
    5353
    54 typedef List<SharedPtr<ArchiveMember> > ArchiveMemberList;
     54typedef SharedPtr<ArchiveMember> ArchiveMemberPtr;
     55typedef List<ArchiveMemberPtr> ArchiveMemberList;
    5556
    5657class Archive;
    5758
     
    107108        virtual int listMembers(ArchiveMemberList &list) = 0;
    108109
    109110        /**
     111         * Returns a ArchiveMember representation of the given file.
     112         */
     113        virtual ArchiveMemberPtr getFile(const String &name) = 0;
     114
     115        /**
    110116         * Create a stream bound to a file in the archive.
    111117         * @return the newly created input stream
    112118         */
     
    209215        virtual int listMembers(ArchiveMemberList &list);
    210216
    211217        /**
     218         * Get a ArchiveMember representation of the specified file. A full match of relative
     219         * path and filename is needed for success.
     220         */
     221        virtual ArchiveMemberPtr getFile(const String &name);
     222
     223        /**
    212224         * Open the specified file. A full match of relative path and filename is needed
    213225         * for success.
    214226         */
     
    273285        virtual int listMatchingMembers(ArchiveMemberList &list, const String &pattern);
    274286        virtual int listMembers(ArchiveMemberList &list);
    275287
     288        virtual ArchiveMemberPtr getFile(const String &name);
     289
    276290        /**
    277291         * Implements openFile from Archive base class. The current policy is
    278292         * opening the first file encountered that matches the name.
  • engines/kyra/resource_intern.cpp

     
    6262        return count;
    6363}
    6464
     65Common::ArchiveMemberPtr PlainArchive::getFile(const Common::String &name) {
     66        if (!hasFile(name))
     67                return Common::ArchiveMemberPtr();
     68
     69        return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
     70}
     71
    6572Common::SeekableReadStream *PlainArchive::openFile(const Common::String &name) {
    6673        FileMap::const_iterator fDesc = _files.find(name);
    6774        if (fDesc == _files.end())
     
    110117        return count;
    111118}
    112119
     120Common::ArchiveMemberPtr CachedArchive::getFile(const Common::String &name) {
     121        if (!hasFile(name))
     122                return Common::ArchiveMemberPtr();
     123
     124        return Common::ArchiveMemberPtr(new Common::GenericArchiveMember(name, this));
     125}
     126
    113127Common::SeekableReadStream *CachedArchive::openFile(const Common::String &name) {
    114128        FileMap::const_iterator fDesc = _files.find(name);
    115129        if (fDesc == _files.end())
  • engines/kyra/resource_intern.h

     
    5151
    5252        bool hasFile(const Common::String &name);
    5353        int listMembers(Common::ArchiveMemberList &list);
     54        Common::ArchiveMemberPtr getFile(const Common::String &name);
    5455        Common::SeekableReadStream *openFile(const Common::String &name);
    5556private:
    5657        struct Entry {
     
    8081
    8182        bool hasFile(const Common::String &name);
    8283        int listMembers(Common::ArchiveMemberList &list);
     84        Common::ArchiveMemberPtr getFile(const Common::String &name);
    8385        Common::SeekableReadStream *openFile(const Common::String &name);
    8486private:
    8587        struct Entry {
  • engines/kyra/resource.cpp

     
    107107                };
    108108
    109109                for (uint i = 0; i < ARRAYSIZE(list); ++i) {
    110                         Common::ArchiveMemberList fileList;
    111                         listFiles(list[i], fileList);
     110                        Common::ArchiveMemberPtr file = _files.getFile(list[i]);
     111                        if (!file)
     112                                error("Couldn't find PAK file '%s'", list[i]);
    112113
    113                         if (fileList.empty())
    114                                 error("Couldn't load PAK file '%s'", list[i]);
    115 
    116                         Common::Archive *archive = loadArchive(list[i], *fileList.begin());
     114                        Common::Archive *archive = loadArchive(list[i], file);
    117115                        if (archive)
    118116                                _protectedFiles.add(list[i], archive, 0, false);
     117                        else
     118                                error("Couldn't load PAK file '%s'", list[i]);
    119119                }
    120120        } else {
    121121                for (Common::FSList::const_iterator file = fslist.begin(); file != fslist.end(); ++file) {
     
    142142bool Resource::loadPakFile(Common::String filename) {
    143143        filename.toUppercase();
    144144
    145         Common::ArchiveMemberList list;
    146         _files.listMatchingMembers(list, filename);
    147145
    148         if (list.empty())
     146        Common::ArchiveMemberPtr file = _files.getFile(filename);
     147        if (!file)
    149148                return false;
    150149
    151         return loadPakFile(filename, *list.begin());
     150        return loadPakFile(filename, file);
    152151}
    153152
    154153bool Resource::loadPakFile(Common::String name, Common::SharedPtr<Common::ArchiveMember> file) {