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