1282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
2282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Copyright (C) 2006 The Android Open Source Project
3282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
4282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Licensed under the Apache License, Version 2.0 (the "License");
5282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * you may not use this file except in compliance with the License.
6282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You may obtain a copy of the License at
7282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
8282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *      http://www.apache.org/licenses/LICENSE-2.0
9282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
10282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Unless required by applicable law or agreed to in writing, software
11282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * distributed under the License is distributed on an "AS IS" BASIS,
12282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * See the License for the specific language governing permissions and
14282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * limitations under the License.
15282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
16282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
17282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
18282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// General-purpose Zip archive access.  This class allows both reading and
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// writing to Zip archives, including deletion of existing entries.
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef __LIBS_ZIPFILE_H
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define __LIBS_ZIPFILE_H
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/Vector.h>
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/Errors.h>
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <stdio.h>
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "ZipEntry.h"
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskinamespace android {
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Manipulate a Zip archive.
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Some changes will not be visible in the until until "flush" is called.
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * The correct way to update a file archive is to make all changes to a
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * copy of the archive in a temporary file, and then unlink/rename over
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * the original after everything completes.  Because we're only interested
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * in using this for packaging, we don't worry about such things.  Crashing
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * after making changes and before flush() completes could leave us with
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * an unusable Zip archive.
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ZipFile {
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic:
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ZipFile(void)
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      : mZipFp(NULL), mReadOnly(false), mNeedCDRewrite(false)
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski      {}
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ~ZipFile(void) {
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (!mReadOnly)
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            flush();
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        if (mZipFp != NULL)
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            fclose(mZipFp);
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        discardEntries();
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Open a new or existing archive.
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    enum {
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kOpenReadOnly   = 0x01,
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kOpenReadWrite  = 0x02,
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kOpenCreate     = 0x04,     // create if it doesn't exist
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kOpenTruncate   = 0x08,     // if it exists, empty it
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t open(const char* zipFileName, int flags);
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Add a file to the end of the archive.  Specify whether you want the
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * library to try to store it compressed.
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If "storageName" is specified, the archive will use that instead
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * of "fileName".
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If there is already an entry with the same name, the call fails.
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Existing entries with the same name must be removed first.
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t add(const char* fileName, int compressionMethod,
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ZipEntry** ppEntry)
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return add(fileName, fileName, compressionMethod, ppEntry);
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t add(const char* fileName, const char* storageName,
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int compressionMethod, ZipEntry** ppEntry)
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return addCommon(fileName, NULL, 0, storageName,
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         ZipEntry::kCompressStored,
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         compressionMethod, ppEntry);
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Add a file that is already compressed with gzip.
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addGzip(const char* fileName, const char* storageName,
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ZipEntry** ppEntry)
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return addCommon(fileName, NULL, 0, storageName,
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         ZipEntry::kCompressDeflated,
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         ZipEntry::kCompressDeflated, ppEntry);
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Add a file from an in-memory data buffer.
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t add(const void* data, size_t size, const char* storageName,
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int compressionMethod, ZipEntry** ppEntry)
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    {
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return addCommon(NULL, data, size, storageName,
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         ZipEntry::kCompressStored,
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                         compressionMethod, ppEntry);
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Add an entry by copying it from another zip file.  If "padding" is
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * nonzero, the specified number of bytes will be added to the "extra"
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * field in the header.
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * If "ppEntry" is non-NULL, a pointer to the new entry will be returned.
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t add(const ZipFile* pSourceZip, const ZipEntry* pSourceEntry,
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int padding, ZipEntry** ppEntry);
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Mark an entry as having been removed.  It is not actually deleted
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * from the archive or our internal data structures until flush() is
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * called.
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t remove(ZipEntry* pEntry);
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Flush changes.  If mNeedCDRewrite is set, this writes the central dir.
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t flush(void);
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Expand the data into the buffer provided.  The buffer must hold
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * at least <uncompressed len> bytes.  Variation expands directly
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * to a file.
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Returns "false" if an error was encountered in the compressed data.
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //bool uncompress(const ZipEntry* pEntry, void* buf) const;
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    //bool uncompress(const ZipEntry* pEntry, FILE* fp) const;
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void* uncompress(const ZipEntry* pEntry);
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Get an entry, by name.  Returns NULL if not found.
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Does not return entries pending deletion.
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ZipEntry* getEntryByName(const char* fileName) const;
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Get the Nth entry in the archive.
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     *
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * This will return an entry that is pending deletion.
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int getNumEntries(void) const { return mEntries.size(); }
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ZipEntry* getEntryByIndex(int idx) const;
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* these are private and not defined */
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ZipFile(const ZipFile& src);
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ZipFile& operator=(const ZipFile& src);
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class EndOfCentralDir {
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        EndOfCentralDir(void) :
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mDiskNumber(0),
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mDiskWithCentralDir(0),
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mNumEntries(0),
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mTotalNumEntries(0),
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mCentralDirSize(0),
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mCentralDirOffset(0),
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mCommentLen(0),
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mComment(NULL)
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            {}
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~EndOfCentralDir(void) {
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete[] mComment;
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t readBuf(const unsigned char* buf, int len);
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t write(FILE* fp);
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //unsigned long   mSignature;
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mDiskNumber;
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mDiskWithCentralDir;
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mNumEntries;
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mTotalNumEntries;
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long   mCentralDirSize;
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long   mCentralDirOffset;      // offset from first disk
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mCommentLen;
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned char*  mComment;
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        enum {
202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            kSignature      = 0x06054b50,
203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            kEOCDLen        = 22,       // EndOfCentralDir len, excl. comment
204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            kMaxCommentLen  = 65535,    // longest possible in ushort
206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            kMaxEOCDSearch  = kMaxCommentLen + EndOfCentralDir::kEOCDLen,
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        };
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void dump(void) const;
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* read all entries in the central dir */
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t readCentralDir(void);
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* crunch deleted entries out */
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t crunchArchive(void);
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* clean up mEntries */
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void discardEntries(void);
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* common handler for all "add" functions */
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addCommon(const char* fileName, const void* data, size_t size,
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const char* storageName, int sourceType, int compressionMethod,
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        ZipEntry** ppEntry);
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* copy all of "srcFp" into "dstFp" */
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t copyFpToFp(FILE* dstFp, FILE* srcFp, unsigned long* pCRC32);
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* copy all of "data" into "dstFp" */
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t copyDataToFp(FILE* dstFp,
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const void* data, size_t size, unsigned long* pCRC32);
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* copy some of "srcFp" into "dstFp" */
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t copyPartialFpToFp(FILE* dstFp, FILE* srcFp, long length,
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long* pCRC32);
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* like memmove(), but on parts of a single file */
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t filemove(FILE* fp, off_t dest, off_t src, size_t n);
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* compress all of "srcFp" into "dstFp", using Deflate */
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t compressFpToFp(FILE* dstFp, FILE* srcFp,
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        const void* data, size_t size, unsigned long* pCRC32);
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* get modification date from a file descriptor */
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    time_t getModTime(int fd);
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * We use stdio FILE*, which gives us buffering but makes dealing
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * with files >2GB awkward.  Until we support Zip64, we're fine.
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    FILE*           mZipFp;             // Zip file pointer
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* one of these per file */
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    EndOfCentralDir mEOCD;
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* did we open this read-only? */
255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool            mReadOnly;
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* set this when we trash the central dir */
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool            mNeedCDRewrite;
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * One ZipEntry per entry in the zip file.  I'm using pointers instead
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * of objects because it's easier than making operator= work for the
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * classes and sub-classes.
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    Vector<ZipEntry*>   mEntries;
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; // namespace android
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // __LIBS_ZIPFILE_H
271