diff options
author | Johannes Schickel | 2012-04-30 00:09:56 +0200 |
---|---|---|
committer | Johannes Schickel | 2012-04-30 00:09:56 +0200 |
commit | f23ca8b62b6be15e570311dcaad301067c8e052a (patch) | |
tree | 8b39fe48807384322f35d2ce510b9cf031fdf6ba | |
parent | e41e412c9ee6c277233ef9f7a5304f8cc40fa370 (diff) | |
download | scummvm-rg350-f23ca8b62b6be15e570311dcaad301067c8e052a.tar.gz scummvm-rg350-f23ca8b62b6be15e570311dcaad301067c8e052a.tar.bz2 scummvm-rg350-f23ca8b62b6be15e570311dcaad301067c8e052a.zip |
COMMON: Use the file cache in ZipArchive::listMembers for performance.
This avoids a new iteration through the .zip file for every listMember call.
Instead it uses the "_hash" HashMap, which already contains all the filenames
and is filled on initializing the ZipArchive by unzOpen.
-rw-r--r-- | common/unzip.cpp | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/common/unzip.cpp b/common/unzip.cpp index 8cfcd605fa..ab659343a2 100644 --- a/common/unzip.cpp +++ b/common/unzip.cpp @@ -1463,22 +1463,16 @@ bool ZipArchive::hasFile(const String &name) const { } int ZipArchive::listMembers(ArchiveMemberList &list) const { - int matches = 0; - int err = unzGoToFirstFile(_zipFile); + int members = 0; - while (err == UNZ_OK) { - char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1]; - if (unzGetCurrentFileInfo(_zipFile, NULL, - szCurrentFileName, sizeof(szCurrentFileName)-1, - NULL, 0, NULL, 0) == UNZ_OK) { - list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(szCurrentFileName, this))); - matches++; - } - - err = unzGoToNextFile(_zipFile); + const unz_s *const archive = (const unz_s *)_zipFile; + for (ZipHash::const_iterator i = archive->_hash.begin(), end = archive->_hash.end(); + i != end; ++i) { + list.push_back(ArchiveMemberList::value_type(new GenericArchiveMember(i->_key, this))); + ++members; } - return matches; + return members; } const ArchiveMemberPtr ZipArchive::getMember(const String &name) const { |