ZipFile.h revision 03589cc65355220e0a4a0c816189a9fa25cc81fc
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)/* 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright (C) 2006 The Android Open Source Project 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Licensed under the Apache License, Version 2.0 (the "License"); 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * you may not use this file except in compliance with the License. 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * You may obtain a copy of the License at 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * http://www.apache.org/licenses/LICENSE-2.0 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Unless required by applicable law or agreed to in writing, software 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * distributed under the License is distributed on an "AS IS" BASIS, 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * See the License for the specific language governing permissions and 14010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * limitations under the License. 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) */ 16010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// 18010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// General-purpose Zip archive access. This class allows both reading and 197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// writing to Zip archives, including deletion of existing entries. 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef __LIBS_ZIPFILE_H 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define __LIBS_ZIPFILE_H 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include <utils/Vector.h> 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <utils/Errors.h> 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <stdio.h> 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ZipEntry.h" 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)namespace android { 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/* 334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Manipulate a Zip archive. 344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Some changes will not be visible in the until until "flush" is called. 364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * The correct way to update a file archive is to make all changes to a 384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * copy of the archive in a temporary file, and then unlink/rename over 394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * the original after everything completes. Because we're only interested 404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * in using this for packaging, we don't worry about such things. Crashing 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * after making changes and before flush() completes could leave us with 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * an unusable Zip archive. 4346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) */ 444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class ZipFile { 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)public: 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ZipFile(void) 4746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) : mZipFp(NULL), mReadOnly(false), mNeedCDRewrite(false) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) {} 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ~ZipFile(void) { 5046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (!mReadOnly) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) flush(); 5246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) if (mZipFp != NULL) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) fclose(mZipFp); 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) discardEntries(); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Open a new or existing archive. 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef enum { 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kOpenReadOnly = 0x01, 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kOpenReadWrite = 0x02, 63010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kOpenCreate = 0x04, // create if it doesn't exist 64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kOpenTruncate = 0x08, // if it exists, empty it 65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) }; 66010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) status_t open(const char* zipFileName, int flags); 67010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /* 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Add a file to the end of the archive. Specify whether you want the 70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * library to try to store it compressed. 71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * 72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * If "storageName" is specified, the archive will use that instead 73010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * of "fileName". 74010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * 75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * If there is already an entry with the same name, the call fails. 76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * Existing entries with the same name must be removed first. 77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) * 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * If "ppEntry" is non-NULL, a pointer to the new entry will be returned. 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) */ 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) status_t add(const char* fileName, int compressionMethod, 81010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ZipEntry** ppEntry) 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return add(fileName, fileName, compressionMethod, ppEntry); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 85b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) status_t add(const char* fileName, const char* storageName, 86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch int compressionMethod, ZipEntry** ppEntry) 87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch { 88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) return addCommon(fileName, NULL, 0, storageName, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZipEntry::kCompressStored, 90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch compressionMethod, ppEntry); 914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) } 92ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch 934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) /* 94f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) * Add a file that is already compressed with gzip. 954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * If "ppEntry" is non-NULL, a pointer to the new entry will be returned. 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_t addGzip(const char* fileName, const char* storageName, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZipEntry** ppEntry) 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return addCommon(fileName, NULL, 0, storageName, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ZipEntry::kCompressDeflated, 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ZipEntry::kCompressDeflated, ppEntry); 1041e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /* 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * Add a file from an in-memory data buffer. 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * 109c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch * If "ppEntry" is non-NULL, a pointer to the new entry will be returned. 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch */ 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch status_t add(const void* data, size_t size, const char* storageName, 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int compressionMethod, ZipEntry** ppEntry) 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch { 114010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) return addCommon(NULL, data, size, storageName, 115010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) ZipEntry::kCompressStored, 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) compressionMethod, ppEntry); 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /* 120a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) * Add an entry by copying it from another zip file. If "padding" is 1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * nonzero, the specified number of bytes will be added to the "extra" 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * field in the header. 1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) * If "ppEntry" is non-NULL, a pointer to the new entry will be returned. 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t add(const ZipFile* pSourceZip, const ZipEntry* pSourceEntry, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int padding, ZipEntry** ppEntry); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Mark an entry as having been removed. It is not actually deleted 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * from the archive or our internal data structures until flush() is 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * called. 133ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch */ 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t remove(ZipEntry* pEntry); 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* 137ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch * Flush changes. If mNeedCDRewrite is set, this writes the central dir. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_t flush(void); 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* 142b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * Expand the data into the buffer provided. The buffer must hold 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * at least <uncompressed len> bytes. Variation expands directly 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to a file. 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * 146b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * Returns "false" if an error was encountered in the compressed data. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */ 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) //bool uncompress(const ZipEntry* pEntry, void* buf) const; 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) //bool uncompress(const ZipEntry* pEntry, FILE* fp) const; 150ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch void* uncompress(const ZipEntry* pEntry); 1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Get an entry, by name. Returns NULL if not found. 154b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * 1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * Does not return entries pending deletion. 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ZipEntry* getEntryByName(const char* fileName) const; 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 159b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) /* 160b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) * Get the Nth entry in the archive. 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) * This will return an entry that is pending deletion. 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) */ 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int getNumEntries(void) const { return mEntries.size(); } 165ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch ZipEntry* getEntryByIndex(int idx) const; 166ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch 167ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochprivate: 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) /* these are private and not defined */ 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ZipFile(const ZipFile& src); 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ZipFile& operator=(const ZipFile& src); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class EndOfCentralDir { 173ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch public: 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EndOfCentralDir(void) : 1750529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch mDiskNumber(0), 1760529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch mDiskWithCentralDir(0), 1770529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch mNumEntries(0), 1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) mTotalNumEntries(0), 179ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch mCentralDirSize(0), 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mCentralDirOffset(0), 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mCommentLen(0), 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mComment(NULL) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) {} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~EndOfCentralDir(void) { 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delete[] mComment; 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t readBuf(const unsigned char* buf, int len); 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_t write(FILE* fp); 1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) //unsigned long mSignature; 1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned short mDiskNumber; 1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned short mDiskWithCentralDir; 1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned short mNumEntries; 1952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned short mTotalNumEntries; 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned long mCentralDirSize; 1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) unsigned long mCentralDirOffset; // offset from first disk 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) unsigned short mCommentLen; 1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) unsigned char* mComment; 2002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum { 2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kSignature = 0x06054b50, 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) kEOCDLen = 22, // EndOfCentralDir len, excl. comment 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kMaxCommentLen = 65535, // longest possible in ushort 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kMaxEOCDSearch = kMaxCommentLen + EndOfCentralDir::kEOCDLen, 2074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }; 2094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) void dump(void) const; 2114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) }; 2124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* read all entries in the central dir */ 2151e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) status_t readCentralDir(void); 2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* crunch deleted entries out */ 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t crunchArchive(void); 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* clean up mEntries */ 221010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) void discardEntries(void); 222010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 223010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /* common handler for all "add" functions */ 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) status_t addCommon(const char* fileName, const void* data, size_t size, 2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const char* storageName, int sourceType, int compressionMethod, 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ZipEntry** ppEntry); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /* copy all of "srcFp" into "dstFp" */ 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) status_t copyFpToFp(FILE* dstFp, FILE* srcFp, unsigned long* pCRC32); 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /* copy all of "data" into "dstFp" */ 231 status_t copyDataToFp(FILE* dstFp, 232 const void* data, size_t size, unsigned long* pCRC32); 233 /* copy some of "srcFp" into "dstFp" */ 234 status_t copyPartialFpToFp(FILE* dstFp, FILE* srcFp, long length, 235 unsigned long* pCRC32); 236 /* like memmove(), but on parts of a single file */ 237 status_t filemove(FILE* fp, off_t dest, off_t src, size_t n); 238 /* compress all of "srcFp" into "dstFp", using Deflate */ 239 status_t compressFpToFp(FILE* dstFp, FILE* srcFp, 240 const void* data, size_t size, unsigned long* pCRC32); 241 242 /* get modification date from a file descriptor */ 243 time_t getModTime(int fd); 244 245 /* 246 * We use stdio FILE*, which gives us buffering but makes dealing 247 * with files >2GB awkward. Until we support Zip64, we're fine. 248 */ 249 FILE* mZipFp; // Zip file pointer 250 251 /* one of these per file */ 252 EndOfCentralDir mEOCD; 253 254 /* did we open this read-only? */ 255 bool mReadOnly; 256 257 /* set this when we trash the central dir */ 258 bool mNeedCDRewrite; 259 260 /* 261 * One ZipEntry per entry in the zip file. I'm using pointers instead 262 * of objects because it's easier than making operator= work for the 263 * classes and sub-classes. 264 */ 265 Vector<ZipEntry*> mEntries; 266}; 267 268}; // namespace android 269 270#endif // __LIBS_ZIPFILE_H 271