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// Zip archive entries.
19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// The ZipEntry class is tightly meshed with the ZipFile class.
21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski//
22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef __LIBS_ZIPENTRY_H
23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define __LIBS_ZIPENTRY_H
24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/Errors.h>
26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <stdlib.h>
28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <stdio.h>
29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskinamespace android {
31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ZipFile;
33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/*
35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * ZipEntry objects represent a single entry in a Zip archive.
36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * You can use one of these to get or set information about an entry, but
38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * there are no functions here for accessing the data itself.  (We could
39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * tuck a pointer to the ZipFile in here for convenience, but that raises
40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * the likelihood of using ZipEntry objects after discarding the ZipFile.)
41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski *
42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * File information is stored in two places: next to the file data (the Local
43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * File Header, and possibly a Data Descriptor), and at the end of the file
44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * (the Central Directory Entry).  The two must be kept in sync.
45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */
46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ZipEntry {
47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic:
48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    friend class ZipFile;
49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ZipEntry(void)
51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        : mDeleted(false), mMarked(false)
52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {}
53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ~ZipEntry(void) {}
54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Returns "true" if the data is compressed.
57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool isCompressed(void) const {
59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mCDE.mCompressionMethod != kCompressStored;
60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    int getCompressionMethod(void) const { return mCDE.mCompressionMethod; }
62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Return the uncompressed length.
65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    off_t getUncompressedLen(void) const { return mCDE.mUncompressedSize; }
67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Return the compressed length.  For uncompressed data, this returns
70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * the same thing as getUncompresesdLen().
71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    off_t getCompressedLen(void) const { return mCDE.mCompressedSize; }
73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Return the offset of the local file header.
76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    off_t getLFHOffset(void) const { return mCDE.mLocalHeaderRelOffset; }
78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Return the absolute file offset of the start of the compressed or
81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * uncompressed data.
82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    off_t getFileOffset(void) const {
84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return mCDE.mLocalHeaderRelOffset +
85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                LocalFileHeader::kLFHLen +
86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mLFH.mFileNameLength +
87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski                mLFH.mExtraFieldLength;
88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Return the data CRC.
92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    unsigned long getCRC32(void) const { return mCDE.mCRC32; }
94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Return file modification time in UNIX seconds-since-epoch.
97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    time_t getModWhen(void) const;
99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Return the archived file name.
102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    const char* getFileName(void) const { return (const char*) mCDE.mFileName; }
104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Application-defined "mark".  Can be useful when synchronizing the
107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * contents of an archive with contents on disk.
108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool getMarked(void) const { return mMarked; }
110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void setMarked(bool val) { mMarked = val; }
111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Some basic functions for raw data manipulation.  "LE" means
114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Little Endian.
115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static inline unsigned short getShortLE(const unsigned char* buf) {
117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return buf[0] | (buf[1] << 8);
118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static inline unsigned long getLongLE(const unsigned char* buf) {
120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static inline void putShortLE(unsigned char* buf, short val) {
123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        buf[0] = (unsigned char) val;
124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        buf[1] = (unsigned char) (val >> 8);
125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    static inline void putLongLE(unsigned char* buf, long val) {
127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        buf[0] = (unsigned char) val;
128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        buf[1] = (unsigned char) (val >> 8);
129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        buf[2] = (unsigned char) (val >> 16);
130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        buf[3] = (unsigned char) (val >> 24);
131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* defined for Zip archives */
134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    enum {
135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kCompressStored     = 0,        // no compression
136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // shrunk           = 1,
137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // reduced 1        = 2,
138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // reduced 2        = 3,
139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // reduced 3        = 4,
140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // reduced 4        = 5,
141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // imploded         = 6,
142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // tokenized        = 7,
143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kCompressDeflated   = 8,        // standard deflate
144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // Deflate64        = 9,
145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // lib imploded     = 10,
146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // reserved         = 11,
147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // bzip2            = 12,
148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Deletion flag.  If set, the entry will be removed on the next
152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * call to "flush".
153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool getDeleted(void) const { return mDeleted; }
155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprotected:
157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Initialize the structure from the file, which is pointing at
159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * our Central Directory entry.
160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t initFromCDE(FILE* fp);
162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Initialize the structure for a new file.  We need the filename
165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * and comment so that we can properly size the LFH area.  The
166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * filename is mandatory, the comment is optional.
167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void initNew(const char* fileName, const char* comment);
169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Initialize the structure with the contents of a ZipEntry from
172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * another file.
173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t initFromExternal(const ZipFile* pZipFile, const ZipEntry* pEntry);
175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Add some pad bytes to the LFH.  We do this by adding or resizing
178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * the "extra" field.
179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    status_t addPadding(int padding);
181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Set information about the data for this entry.
184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void setDataInfo(long uncompLen, long compLen, unsigned long crc32,
186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        int compressionMethod);
187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Set the modification date.
190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void setModWhen(time_t when);
192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Set the offset of the local file header, relative to the start of
195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * the current file.
196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void setLFHOffset(off_t offset) {
198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        mCDE.mLocalHeaderRelOffset = (long) offset;
199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    }
200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* mark for deletion; used by ZipFile::remove() */
202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void setDeleted(void) { mDeleted = true; }
203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate:
205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* these are private and not defined */
206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ZipEntry(const ZipEntry& src);
207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    ZipEntry& operator=(const ZipEntry& src);
208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /* returns "true" if the CDE and the LFH agree */
210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool compareHeaders(void) const;
211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    void copyCDEtoLFH(void);
212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool        mDeleted;       // set if entry is pending deletion
214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    bool        mMarked;        // app-defined marker
215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Every entry in the Zip archive starts off with one of these.
218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class LocalFileHeader {
220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        LocalFileHeader(void) :
222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mVersionToExtract(0),
223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mGPBitFlag(0),
224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mCompressionMethod(0),
225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLastModFileTime(0),
226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLastModFileDate(0),
227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mCRC32(0),
228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mCompressedSize(0),
229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mUncompressedSize(0),
230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mFileNameLength(0),
231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mExtraFieldLength(0),
232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mFileName(NULL),
233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mExtraField(NULL)
234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {}
235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~LocalFileHeader(void) {
236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete[] mFileName;
237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete[] mExtraField;
238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t read(FILE* fp);
241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t write(FILE* fp);
242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // unsigned long mSignature;
244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mVersionToExtract;
245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mGPBitFlag;
246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mCompressionMethod;
247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mLastModFileTime;
248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mLastModFileDate;
249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long   mCRC32;
250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long   mCompressedSize;
251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long   mUncompressedSize;
252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mFileNameLength;
253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mExtraFieldLength;
254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned char*  mFileName;
255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned char*  mExtraField;
256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        enum {
258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            kSignature      = 0x04034b50,
259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            kLFHLen         = 30,       // LocalFileHdr len, excl. var fields
260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        };
261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void dump(void) const;
263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    /*
266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * Every entry in the Zip archive has one of these in the "central
267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     * directory" at the end of the file.
268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski     */
269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    class CentralDirEntry {
270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    public:
271282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        CentralDirEntry(void) :
272282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mVersionMadeBy(0),
273282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mVersionToExtract(0),
274282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mGPBitFlag(0),
275282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mCompressionMethod(0),
276282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLastModFileTime(0),
277282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLastModFileDate(0),
278282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mCRC32(0),
279282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mCompressedSize(0),
280282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mUncompressedSize(0),
281282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mFileNameLength(0),
282282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mExtraFieldLength(0),
283282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mFileCommentLength(0),
284282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mDiskNumberStart(0),
285282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mInternalAttrs(0),
286282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mExternalAttrs(0),
287282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mLocalHeaderRelOffset(0),
288282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mFileName(NULL),
289282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mExtraField(NULL),
290282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            mFileComment(NULL)
291282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        {}
292282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        virtual ~CentralDirEntry(void) {
293282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete[] mFileName;
294282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete[] mExtraField;
295282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            delete[] mFileComment;
296282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        }
297282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
298282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t read(FILE* fp);
299282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        status_t write(FILE* fp);
300282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
301282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        // unsigned long mSignature;
302282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mVersionMadeBy;
303282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mVersionToExtract;
304282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mGPBitFlag;
305282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mCompressionMethod;
306282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mLastModFileTime;
307282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mLastModFileDate;
308282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long   mCRC32;
309282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long   mCompressedSize;
310282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long   mUncompressedSize;
311282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mFileNameLength;
312282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mExtraFieldLength;
313282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mFileCommentLength;
314282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mDiskNumberStart;
315282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned short  mInternalAttrs;
316282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long   mExternalAttrs;
317282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned long   mLocalHeaderRelOffset;
318282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned char*  mFileName;
319282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned char*  mExtraField;
320282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        unsigned char*  mFileComment;
321282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
322282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        void dump(void) const;
323282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
324282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        enum {
325282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            kSignature      = 0x02014b50,
326282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski            kCDELen         = 46,       // CentralDirEnt len, excl. var fields
327282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        };
328282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
329282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
330282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    enum {
331282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        //kDataDescriptorSignature  = 0x08074b50,   // currently unused
332282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kDataDescriptorLen  = 16,           // four 32-bit fields
333282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
334282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kDefaultVersion     = 20,           // need deflate, nothing much else
335282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kDefaultMadeBy      = 0x0317,       // 03=UNIX, 17=spec v2.3
336282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski        kUsesDataDescr      = 0x0008,       // GPBitFlag bit 3
337282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    };
338282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
339282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    LocalFileHeader     mLFH;
340282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski    CentralDirEntry     mCDE;
341282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski};
342282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
343282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; // namespace android
344282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski
345282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // __LIBS_ZIPENTRY_H
346