ZLZipEntryCache::ZLZipEntryCache(const std::string &containerName, ZLInputStream &containerStream) : myContainerName(containerName) { //ZLLogger::Instance().println("ZipEntryCache", "creating cache for " + containerName); myLastModifiedTime = ZLFile(containerName).lastModified(); if (!containerStream.open()) { return; } ZLZipHeader header; while (header.readFrom(containerStream)) { Info *infoPtr = 0; if (header.Signature == (unsigned long)ZLZipHeader::SignatureLocalFile) { std::string entryName(header.NameLength, '\0'); if ((unsigned int)containerStream.read((char*)entryName.data(), header.NameLength) == header.NameLength) { entryName = AndroidUtil::convertNonUtfString(entryName); Info &info = myInfoMap[entryName]; info.Offset = containerStream.offset() + header.ExtraLength; info.CompressionMethod = header.CompressionMethod; info.CompressedSize = header.CompressedSize; info.UncompressedSize = header.UncompressedSize; infoPtr = &info; } } ZLZipHeader::skipEntry(containerStream, header); if (infoPtr != 0) { infoPtr->UncompressedSize = header.UncompressedSize; } } containerStream.close(); }
ZLZipEntryCache::ZLZipEntryCache(ZLInputStream &baseStream) { if (!baseStream.open()) { return; } ZLZipHeader header; while (header.readFrom(baseStream)) { Info *infoPtr = 0; if (header.Signature == ZLZipHeader::SignatureLocalFile) { std::string entryName(header.NameLength, '\0'); if ((unsigned int)baseStream.read((char*)entryName.data(), header.NameLength) == header.NameLength) { Info &info = myInfoMap[entryName]; info.Offset = baseStream.offset() + header.ExtraLength; info.CompressionMethod = header.CompressionMethod; info.CompressedSize = header.CompressedSize; info.UncompressedSize = header.UncompressedSize; infoPtr = &info; } } ZLZipHeader::skipEntry(baseStream, header); if (infoPtr != 0) { infoPtr->UncompressedSize = header.UncompressedSize; } } baseStream.close(); }
void ZLZipDir::collectFiles(std::vector<std::string> &names, bool) { shared_ptr<ZLInputStream> stream = ZLFile(path()).inputStream(); if (!stream.isNull() && stream->open()) { ZLZipHeader header; while (header.readFrom(*stream)) { char *buffer = new char[header.NameLength]; if ((unsigned int)stream->read(buffer, header.NameLength) == header.NameLength) { std::string entryName; entryName.append(buffer, header.NameLength); names.push_back(entryName); } delete[] buffer; ZLZipHeader::skipEntry(*stream, header); } stream->close(); } }