xref: /aosp_15_r20/build/make/tools/zipalign/ZipEntry.h (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
1*9e94795aSAndroid Build Coastguard Worker /*
2*9e94795aSAndroid Build Coastguard Worker  * Copyright (C) 2006 The Android Open Source Project
3*9e94795aSAndroid Build Coastguard Worker  *
4*9e94795aSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*9e94795aSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*9e94795aSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*9e94795aSAndroid Build Coastguard Worker  *
8*9e94795aSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*9e94795aSAndroid Build Coastguard Worker  *
10*9e94795aSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*9e94795aSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*9e94795aSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9e94795aSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*9e94795aSAndroid Build Coastguard Worker  * limitations under the License.
15*9e94795aSAndroid Build Coastguard Worker  */
16*9e94795aSAndroid Build Coastguard Worker 
17*9e94795aSAndroid Build Coastguard Worker //
18*9e94795aSAndroid Build Coastguard Worker // Zip archive entries.
19*9e94795aSAndroid Build Coastguard Worker //
20*9e94795aSAndroid Build Coastguard Worker // The ZipEntry class is tightly meshed with the ZipFile class.
21*9e94795aSAndroid Build Coastguard Worker //
22*9e94795aSAndroid Build Coastguard Worker #ifndef __LIBS_ZIPENTRY_H
23*9e94795aSAndroid Build Coastguard Worker #define __LIBS_ZIPENTRY_H
24*9e94795aSAndroid Build Coastguard Worker 
25*9e94795aSAndroid Build Coastguard Worker #include <utils/Errors.h>
26*9e94795aSAndroid Build Coastguard Worker 
27*9e94795aSAndroid Build Coastguard Worker #include <stdlib.h>
28*9e94795aSAndroid Build Coastguard Worker #include <stdint.h>
29*9e94795aSAndroid Build Coastguard Worker #include <stdio.h>
30*9e94795aSAndroid Build Coastguard Worker #include <time.h>
31*9e94795aSAndroid Build Coastguard Worker 
32*9e94795aSAndroid Build Coastguard Worker namespace android {
33*9e94795aSAndroid Build Coastguard Worker 
34*9e94795aSAndroid Build Coastguard Worker class ZipFile;
35*9e94795aSAndroid Build Coastguard Worker 
36*9e94795aSAndroid Build Coastguard Worker /*
37*9e94795aSAndroid Build Coastguard Worker  * ZipEntry objects represent a single entry in a Zip archive.
38*9e94795aSAndroid Build Coastguard Worker  *
39*9e94795aSAndroid Build Coastguard Worker  * You can use one of these to get or set information about an entry, but
40*9e94795aSAndroid Build Coastguard Worker  * there are no functions here for accessing the data itself.  (We could
41*9e94795aSAndroid Build Coastguard Worker  * tuck a pointer to the ZipFile in here for convenience, but that raises
42*9e94795aSAndroid Build Coastguard Worker  * the likelihood of using ZipEntry objects after discarding the ZipFile.)
43*9e94795aSAndroid Build Coastguard Worker  *
44*9e94795aSAndroid Build Coastguard Worker  * File information is stored in two places: next to the file data (the Local
45*9e94795aSAndroid Build Coastguard Worker  * File Header, and possibly a Data Descriptor), and at the end of the file
46*9e94795aSAndroid Build Coastguard Worker  * (the Central Directory Entry).  The two must be kept in sync.
47*9e94795aSAndroid Build Coastguard Worker  */
48*9e94795aSAndroid Build Coastguard Worker class ZipEntry {
49*9e94795aSAndroid Build Coastguard Worker public:
50*9e94795aSAndroid Build Coastguard Worker     friend class ZipFile;
51*9e94795aSAndroid Build Coastguard Worker 
ZipEntry(void)52*9e94795aSAndroid Build Coastguard Worker     ZipEntry(void)
53*9e94795aSAndroid Build Coastguard Worker         : mDeleted(false), mMarked(false)
54*9e94795aSAndroid Build Coastguard Worker         {}
~ZipEntry(void)55*9e94795aSAndroid Build Coastguard Worker     ~ZipEntry(void) {}
56*9e94795aSAndroid Build Coastguard Worker 
57*9e94795aSAndroid Build Coastguard Worker     /*
58*9e94795aSAndroid Build Coastguard Worker      * Returns "true" if the data is compressed.
59*9e94795aSAndroid Build Coastguard Worker      */
isCompressed(void)60*9e94795aSAndroid Build Coastguard Worker     bool isCompressed(void) const {
61*9e94795aSAndroid Build Coastguard Worker         return mCDE.mCompressionMethod != kCompressStored;
62*9e94795aSAndroid Build Coastguard Worker     }
getCompressionMethod(void)63*9e94795aSAndroid Build Coastguard Worker     int getCompressionMethod(void) const { return mCDE.mCompressionMethod; }
64*9e94795aSAndroid Build Coastguard Worker 
65*9e94795aSAndroid Build Coastguard Worker     /*
66*9e94795aSAndroid Build Coastguard Worker      * Return the uncompressed length.
67*9e94795aSAndroid Build Coastguard Worker      */
getUncompressedLen(void)68*9e94795aSAndroid Build Coastguard Worker     off_t getUncompressedLen(void) const { return mCDE.mUncompressedSize; }
69*9e94795aSAndroid Build Coastguard Worker 
70*9e94795aSAndroid Build Coastguard Worker     /*
71*9e94795aSAndroid Build Coastguard Worker      * Return the compressed length.  For uncompressed data, this returns
72*9e94795aSAndroid Build Coastguard Worker      * the same thing as getUncompresesdLen().
73*9e94795aSAndroid Build Coastguard Worker      */
getCompressedLen(void)74*9e94795aSAndroid Build Coastguard Worker     off_t getCompressedLen(void) const { return mCDE.mCompressedSize; }
75*9e94795aSAndroid Build Coastguard Worker 
76*9e94795aSAndroid Build Coastguard Worker     /*
77*9e94795aSAndroid Build Coastguard Worker      * Return the absolute file offset of the start of the compressed or
78*9e94795aSAndroid Build Coastguard Worker      * uncompressed data.
79*9e94795aSAndroid Build Coastguard Worker      */
getFileOffset(void)80*9e94795aSAndroid Build Coastguard Worker     off_t getFileOffset(void) const {
81*9e94795aSAndroid Build Coastguard Worker         return mCDE.mLocalHeaderRelOffset +
82*9e94795aSAndroid Build Coastguard Worker                 LocalFileHeader::kLFHLen +
83*9e94795aSAndroid Build Coastguard Worker                 mLFH.mFileNameLength +
84*9e94795aSAndroid Build Coastguard Worker                 mLFH.mExtraFieldLength;
85*9e94795aSAndroid Build Coastguard Worker     }
86*9e94795aSAndroid Build Coastguard Worker 
87*9e94795aSAndroid Build Coastguard Worker     /*
88*9e94795aSAndroid Build Coastguard Worker      * Return the data CRC.
89*9e94795aSAndroid Build Coastguard Worker      */
getCRC32(void)90*9e94795aSAndroid Build Coastguard Worker     uint32_t getCRC32(void) const { return mCDE.mCRC32; }
91*9e94795aSAndroid Build Coastguard Worker 
92*9e94795aSAndroid Build Coastguard Worker     /*
93*9e94795aSAndroid Build Coastguard Worker      * Return file modification time in UNIX seconds-since-epoch.
94*9e94795aSAndroid Build Coastguard Worker      */
95*9e94795aSAndroid Build Coastguard Worker     time_t getModWhen(void) const;
96*9e94795aSAndroid Build Coastguard Worker 
97*9e94795aSAndroid Build Coastguard Worker     /*
98*9e94795aSAndroid Build Coastguard Worker      * Return the archived file name.
99*9e94795aSAndroid Build Coastguard Worker      */
getFileName(void)100*9e94795aSAndroid Build Coastguard Worker     const char* getFileName(void) const { return (const char*) mCDE.mFileName; }
101*9e94795aSAndroid Build Coastguard Worker 
102*9e94795aSAndroid Build Coastguard Worker     /*
103*9e94795aSAndroid Build Coastguard Worker      * Application-defined "mark".  Can be useful when synchronizing the
104*9e94795aSAndroid Build Coastguard Worker      * contents of an archive with contents on disk.
105*9e94795aSAndroid Build Coastguard Worker      */
getMarked(void)106*9e94795aSAndroid Build Coastguard Worker     bool getMarked(void) const { return mMarked; }
setMarked(bool val)107*9e94795aSAndroid Build Coastguard Worker     void setMarked(bool val) { mMarked = val; }
108*9e94795aSAndroid Build Coastguard Worker 
109*9e94795aSAndroid Build Coastguard Worker     /*
110*9e94795aSAndroid Build Coastguard Worker      * Some basic functions for raw data manipulation.  "LE" means
111*9e94795aSAndroid Build Coastguard Worker      * Little Endian.
112*9e94795aSAndroid Build Coastguard Worker      */
getShortLE(const uint8_t * buf)113*9e94795aSAndroid Build Coastguard Worker     static inline uint16_t getShortLE(const uint8_t* buf) {
114*9e94795aSAndroid Build Coastguard Worker         return buf[0] | (buf[1] << 8);
115*9e94795aSAndroid Build Coastguard Worker     }
getLongLE(const uint8_t * buf)116*9e94795aSAndroid Build Coastguard Worker     static inline uint32_t getLongLE(const uint8_t* buf) {
117*9e94795aSAndroid Build Coastguard Worker         return buf[0] | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24);
118*9e94795aSAndroid Build Coastguard Worker     }
putShortLE(uint8_t * buf,uint16_t val)119*9e94795aSAndroid Build Coastguard Worker     static inline void putShortLE(uint8_t* buf, uint16_t val) {
120*9e94795aSAndroid Build Coastguard Worker         buf[0] = (uint8_t) val;
121*9e94795aSAndroid Build Coastguard Worker         buf[1] = (uint8_t) (val >> 8);
122*9e94795aSAndroid Build Coastguard Worker     }
putLongLE(uint8_t * buf,uint32_t val)123*9e94795aSAndroid Build Coastguard Worker     static inline void putLongLE(uint8_t* buf, uint32_t val) {
124*9e94795aSAndroid Build Coastguard Worker         buf[0] = (uint8_t) val;
125*9e94795aSAndroid Build Coastguard Worker         buf[1] = (uint8_t) (val >> 8);
126*9e94795aSAndroid Build Coastguard Worker         buf[2] = (uint8_t) (val >> 16);
127*9e94795aSAndroid Build Coastguard Worker         buf[3] = (uint8_t) (val >> 24);
128*9e94795aSAndroid Build Coastguard Worker     }
129*9e94795aSAndroid Build Coastguard Worker 
130*9e94795aSAndroid Build Coastguard Worker     /* defined for Zip archives */
131*9e94795aSAndroid Build Coastguard Worker     enum {
132*9e94795aSAndroid Build Coastguard Worker         kCompressStored     = 0,        // no compression
133*9e94795aSAndroid Build Coastguard Worker         // shrunk           = 1,
134*9e94795aSAndroid Build Coastguard Worker         // reduced 1        = 2,
135*9e94795aSAndroid Build Coastguard Worker         // reduced 2        = 3,
136*9e94795aSAndroid Build Coastguard Worker         // reduced 3        = 4,
137*9e94795aSAndroid Build Coastguard Worker         // reduced 4        = 5,
138*9e94795aSAndroid Build Coastguard Worker         // imploded         = 6,
139*9e94795aSAndroid Build Coastguard Worker         // tokenized        = 7,
140*9e94795aSAndroid Build Coastguard Worker         kCompressDeflated   = 8,        // standard deflate
141*9e94795aSAndroid Build Coastguard Worker         // Deflate64        = 9,
142*9e94795aSAndroid Build Coastguard Worker         // lib imploded     = 10,
143*9e94795aSAndroid Build Coastguard Worker         // reserved         = 11,
144*9e94795aSAndroid Build Coastguard Worker         // bzip2            = 12,
145*9e94795aSAndroid Build Coastguard Worker     };
146*9e94795aSAndroid Build Coastguard Worker 
147*9e94795aSAndroid Build Coastguard Worker     /*
148*9e94795aSAndroid Build Coastguard Worker      * Deletion flag.  If set, the entry will be removed on the next
149*9e94795aSAndroid Build Coastguard Worker      * call to "flush".
150*9e94795aSAndroid Build Coastguard Worker      */
getDeleted(void)151*9e94795aSAndroid Build Coastguard Worker     bool getDeleted(void) const { return mDeleted; }
152*9e94795aSAndroid Build Coastguard Worker 
153*9e94795aSAndroid Build Coastguard Worker protected:
154*9e94795aSAndroid Build Coastguard Worker     /*
155*9e94795aSAndroid Build Coastguard Worker      * Initialize the structure from the file, which is pointing at
156*9e94795aSAndroid Build Coastguard Worker      * our Central Directory entry.
157*9e94795aSAndroid Build Coastguard Worker      */
158*9e94795aSAndroid Build Coastguard Worker     status_t initFromCDE(FILE* fp);
159*9e94795aSAndroid Build Coastguard Worker 
160*9e94795aSAndroid Build Coastguard Worker     /*
161*9e94795aSAndroid Build Coastguard Worker      * Initialize the structure for a new file.  We need the filename
162*9e94795aSAndroid Build Coastguard Worker      * and comment so that we can properly size the LFH area.  The
163*9e94795aSAndroid Build Coastguard Worker      * filename is mandatory, the comment is optional.
164*9e94795aSAndroid Build Coastguard Worker      */
165*9e94795aSAndroid Build Coastguard Worker     void initNew(const char* fileName, const char* comment);
166*9e94795aSAndroid Build Coastguard Worker 
167*9e94795aSAndroid Build Coastguard Worker     /*
168*9e94795aSAndroid Build Coastguard Worker      * Initialize the structure with the contents of a ZipEntry from
169*9e94795aSAndroid Build Coastguard Worker      * another file.
170*9e94795aSAndroid Build Coastguard Worker      */
171*9e94795aSAndroid Build Coastguard Worker     status_t initFromExternal(const ZipEntry* pEntry);
172*9e94795aSAndroid Build Coastguard Worker 
173*9e94795aSAndroid Build Coastguard Worker     /*
174*9e94795aSAndroid Build Coastguard Worker      * Add some pad bytes to the LFH.  We do this by adding or resizing
175*9e94795aSAndroid Build Coastguard Worker      * the "extra" field.
176*9e94795aSAndroid Build Coastguard Worker      */
177*9e94795aSAndroid Build Coastguard Worker     status_t addPadding(int padding);
178*9e94795aSAndroid Build Coastguard Worker 
179*9e94795aSAndroid Build Coastguard Worker     /*
180*9e94795aSAndroid Build Coastguard Worker      * Set information about the data for this entry.
181*9e94795aSAndroid Build Coastguard Worker      */
182*9e94795aSAndroid Build Coastguard Worker     void setDataInfo(uint32_t uncompLen, uint32_t compLen, uint32_t crc32,
183*9e94795aSAndroid Build Coastguard Worker         uint32_t compressionMethod);
184*9e94795aSAndroid Build Coastguard Worker 
185*9e94795aSAndroid Build Coastguard Worker     /*
186*9e94795aSAndroid Build Coastguard Worker      * Set the modification date.
187*9e94795aSAndroid Build Coastguard Worker      */
188*9e94795aSAndroid Build Coastguard Worker     void setModWhen(time_t when);
189*9e94795aSAndroid Build Coastguard Worker 
190*9e94795aSAndroid Build Coastguard Worker     /*
191*9e94795aSAndroid Build Coastguard Worker      * Return the offset of the local file header.
192*9e94795aSAndroid Build Coastguard Worker      */
getLFHOffset(void)193*9e94795aSAndroid Build Coastguard Worker     off_t getLFHOffset(void) const { return mCDE.mLocalHeaderRelOffset; }
194*9e94795aSAndroid Build Coastguard Worker 
195*9e94795aSAndroid Build Coastguard Worker     /*
196*9e94795aSAndroid Build Coastguard Worker      * Set the offset of the local file header, relative to the start of
197*9e94795aSAndroid Build Coastguard Worker      * the current file.
198*9e94795aSAndroid Build Coastguard Worker      */
setLFHOffset(off_t offset)199*9e94795aSAndroid Build Coastguard Worker     void setLFHOffset(off_t offset) {
200*9e94795aSAndroid Build Coastguard Worker         mCDE.mLocalHeaderRelOffset = (uint32_t) offset;
201*9e94795aSAndroid Build Coastguard Worker     }
202*9e94795aSAndroid Build Coastguard Worker 
203*9e94795aSAndroid Build Coastguard Worker     /* mark for deletion; used by ZipFile::remove() */
setDeleted(void)204*9e94795aSAndroid Build Coastguard Worker     void setDeleted(void) { mDeleted = true; }
205*9e94795aSAndroid Build Coastguard Worker 
206*9e94795aSAndroid Build Coastguard Worker private:
207*9e94795aSAndroid Build Coastguard Worker     /* these are private and not defined */
208*9e94795aSAndroid Build Coastguard Worker     ZipEntry(const ZipEntry& src);
209*9e94795aSAndroid Build Coastguard Worker     ZipEntry& operator=(const ZipEntry& src);
210*9e94795aSAndroid Build Coastguard Worker 
211*9e94795aSAndroid Build Coastguard Worker     /* returns "true" if the CDE and the LFH agree */
212*9e94795aSAndroid Build Coastguard Worker     bool compareHeaders(void) const;
213*9e94795aSAndroid Build Coastguard Worker     void copyCDEtoLFH(void);
214*9e94795aSAndroid Build Coastguard Worker 
215*9e94795aSAndroid Build Coastguard Worker     bool        mDeleted;       // set if entry is pending deletion
216*9e94795aSAndroid Build Coastguard Worker     bool        mMarked;        // app-defined marker
217*9e94795aSAndroid Build Coastguard Worker 
218*9e94795aSAndroid Build Coastguard Worker     /*
219*9e94795aSAndroid Build Coastguard Worker      * Every entry in the Zip archive starts off with one of these.
220*9e94795aSAndroid Build Coastguard Worker      */
221*9e94795aSAndroid Build Coastguard Worker     class LocalFileHeader {
222*9e94795aSAndroid Build Coastguard Worker     public:
LocalFileHeader(void)223*9e94795aSAndroid Build Coastguard Worker         LocalFileHeader(void) :
224*9e94795aSAndroid Build Coastguard Worker             mVersionToExtract(0),
225*9e94795aSAndroid Build Coastguard Worker             mGPBitFlag(0),
226*9e94795aSAndroid Build Coastguard Worker             mCompressionMethod(0),
227*9e94795aSAndroid Build Coastguard Worker             mLastModFileTime(0),
228*9e94795aSAndroid Build Coastguard Worker             mLastModFileDate(0),
229*9e94795aSAndroid Build Coastguard Worker             mCRC32(0),
230*9e94795aSAndroid Build Coastguard Worker             mCompressedSize(0),
231*9e94795aSAndroid Build Coastguard Worker             mUncompressedSize(0),
232*9e94795aSAndroid Build Coastguard Worker             mFileNameLength(0),
233*9e94795aSAndroid Build Coastguard Worker             mExtraFieldLength(0),
234*9e94795aSAndroid Build Coastguard Worker             mFileName(NULL),
235*9e94795aSAndroid Build Coastguard Worker             mExtraField(NULL)
236*9e94795aSAndroid Build Coastguard Worker         {}
~LocalFileHeader(void)237*9e94795aSAndroid Build Coastguard Worker         virtual ~LocalFileHeader(void) {
238*9e94795aSAndroid Build Coastguard Worker             delete[] mFileName;
239*9e94795aSAndroid Build Coastguard Worker             delete[] mExtraField;
240*9e94795aSAndroid Build Coastguard Worker         }
241*9e94795aSAndroid Build Coastguard Worker 
242*9e94795aSAndroid Build Coastguard Worker         status_t read(FILE* fp);
243*9e94795aSAndroid Build Coastguard Worker         status_t write(FILE* fp);
244*9e94795aSAndroid Build Coastguard Worker 
245*9e94795aSAndroid Build Coastguard Worker         // uint32_t mSignature;
246*9e94795aSAndroid Build Coastguard Worker         uint16_t mVersionToExtract;
247*9e94795aSAndroid Build Coastguard Worker         uint16_t mGPBitFlag;
248*9e94795aSAndroid Build Coastguard Worker         uint16_t mCompressionMethod;
249*9e94795aSAndroid Build Coastguard Worker         uint16_t mLastModFileTime;
250*9e94795aSAndroid Build Coastguard Worker         uint16_t mLastModFileDate;
251*9e94795aSAndroid Build Coastguard Worker         uint32_t mCRC32;
252*9e94795aSAndroid Build Coastguard Worker         uint32_t mCompressedSize;
253*9e94795aSAndroid Build Coastguard Worker         uint32_t mUncompressedSize;
254*9e94795aSAndroid Build Coastguard Worker         uint16_t mFileNameLength;
255*9e94795aSAndroid Build Coastguard Worker         uint16_t mExtraFieldLength;
256*9e94795aSAndroid Build Coastguard Worker         uint8_t* mFileName;
257*9e94795aSAndroid Build Coastguard Worker         uint8_t* mExtraField;
258*9e94795aSAndroid Build Coastguard Worker 
259*9e94795aSAndroid Build Coastguard Worker         enum {
260*9e94795aSAndroid Build Coastguard Worker             kSignature      = 0x04034b50,
261*9e94795aSAndroid Build Coastguard Worker             kLFHLen         = 30,       // LocalFileHdr len, excl. var fields
262*9e94795aSAndroid Build Coastguard Worker         };
263*9e94795aSAndroid Build Coastguard Worker 
264*9e94795aSAndroid Build Coastguard Worker         void dump(void) const;
265*9e94795aSAndroid Build Coastguard Worker     };
266*9e94795aSAndroid Build Coastguard Worker 
267*9e94795aSAndroid Build Coastguard Worker     /*
268*9e94795aSAndroid Build Coastguard Worker      * Every entry in the Zip archive has one of these in the "central
269*9e94795aSAndroid Build Coastguard Worker      * directory" at the end of the file.
270*9e94795aSAndroid Build Coastguard Worker      */
271*9e94795aSAndroid Build Coastguard Worker     class CentralDirEntry {
272*9e94795aSAndroid Build Coastguard Worker     public:
CentralDirEntry(void)273*9e94795aSAndroid Build Coastguard Worker         CentralDirEntry(void) :
274*9e94795aSAndroid Build Coastguard Worker             mVersionMadeBy(0),
275*9e94795aSAndroid Build Coastguard Worker             mVersionToExtract(0),
276*9e94795aSAndroid Build Coastguard Worker             mGPBitFlag(0),
277*9e94795aSAndroid Build Coastguard Worker             mCompressionMethod(0),
278*9e94795aSAndroid Build Coastguard Worker             mLastModFileTime(0),
279*9e94795aSAndroid Build Coastguard Worker             mLastModFileDate(0),
280*9e94795aSAndroid Build Coastguard Worker             mCRC32(0),
281*9e94795aSAndroid Build Coastguard Worker             mCompressedSize(0),
282*9e94795aSAndroid Build Coastguard Worker             mUncompressedSize(0),
283*9e94795aSAndroid Build Coastguard Worker             mFileNameLength(0),
284*9e94795aSAndroid Build Coastguard Worker             mExtraFieldLength(0),
285*9e94795aSAndroid Build Coastguard Worker             mFileCommentLength(0),
286*9e94795aSAndroid Build Coastguard Worker             mDiskNumberStart(0),
287*9e94795aSAndroid Build Coastguard Worker             mInternalAttrs(0),
288*9e94795aSAndroid Build Coastguard Worker             mExternalAttrs(0),
289*9e94795aSAndroid Build Coastguard Worker             mLocalHeaderRelOffset(0),
290*9e94795aSAndroid Build Coastguard Worker             mFileName(NULL),
291*9e94795aSAndroid Build Coastguard Worker             mExtraField(NULL),
292*9e94795aSAndroid Build Coastguard Worker             mFileComment(NULL)
293*9e94795aSAndroid Build Coastguard Worker         {}
~CentralDirEntry(void)294*9e94795aSAndroid Build Coastguard Worker         ~CentralDirEntry(void) {
295*9e94795aSAndroid Build Coastguard Worker             delete[] mFileName;
296*9e94795aSAndroid Build Coastguard Worker             delete[] mExtraField;
297*9e94795aSAndroid Build Coastguard Worker             delete[] mFileComment;
298*9e94795aSAndroid Build Coastguard Worker         }
299*9e94795aSAndroid Build Coastguard Worker 
300*9e94795aSAndroid Build Coastguard Worker         status_t read(FILE* fp);
301*9e94795aSAndroid Build Coastguard Worker         status_t write(FILE* fp);
302*9e94795aSAndroid Build Coastguard Worker 
303*9e94795aSAndroid Build Coastguard Worker         // uint32_t mSignature;
304*9e94795aSAndroid Build Coastguard Worker         uint16_t mVersionMadeBy;
305*9e94795aSAndroid Build Coastguard Worker         uint16_t mVersionToExtract;
306*9e94795aSAndroid Build Coastguard Worker         uint16_t mGPBitFlag;
307*9e94795aSAndroid Build Coastguard Worker         uint16_t mCompressionMethod;
308*9e94795aSAndroid Build Coastguard Worker         uint16_t mLastModFileTime;
309*9e94795aSAndroid Build Coastguard Worker         uint16_t mLastModFileDate;
310*9e94795aSAndroid Build Coastguard Worker         uint32_t mCRC32;
311*9e94795aSAndroid Build Coastguard Worker         uint32_t mCompressedSize;
312*9e94795aSAndroid Build Coastguard Worker         uint32_t mUncompressedSize;
313*9e94795aSAndroid Build Coastguard Worker         uint16_t mFileNameLength;
314*9e94795aSAndroid Build Coastguard Worker         uint16_t mExtraFieldLength;
315*9e94795aSAndroid Build Coastguard Worker         uint16_t mFileCommentLength;
316*9e94795aSAndroid Build Coastguard Worker         uint16_t mDiskNumberStart;
317*9e94795aSAndroid Build Coastguard Worker         uint16_t mInternalAttrs;
318*9e94795aSAndroid Build Coastguard Worker         uint32_t mExternalAttrs;
319*9e94795aSAndroid Build Coastguard Worker         uint32_t mLocalHeaderRelOffset;
320*9e94795aSAndroid Build Coastguard Worker         uint8_t* mFileName;
321*9e94795aSAndroid Build Coastguard Worker         uint8_t* mExtraField;
322*9e94795aSAndroid Build Coastguard Worker         uint8_t* mFileComment;
323*9e94795aSAndroid Build Coastguard Worker 
324*9e94795aSAndroid Build Coastguard Worker         void dump(void) const;
325*9e94795aSAndroid Build Coastguard Worker 
326*9e94795aSAndroid Build Coastguard Worker         enum {
327*9e94795aSAndroid Build Coastguard Worker             kSignature      = 0x02014b50,
328*9e94795aSAndroid Build Coastguard Worker             kCDELen         = 46,       // CentralDirEnt len, excl. var fields
329*9e94795aSAndroid Build Coastguard Worker         };
330*9e94795aSAndroid Build Coastguard Worker     };
331*9e94795aSAndroid Build Coastguard Worker 
332*9e94795aSAndroid Build Coastguard Worker     enum {
333*9e94795aSAndroid Build Coastguard Worker         //kDataDescriptorSignature  = 0x08074b50,   // currently unused
334*9e94795aSAndroid Build Coastguard Worker         kDataDescriptorLen  = 16,           // four 32-bit fields
335*9e94795aSAndroid Build Coastguard Worker 
336*9e94795aSAndroid Build Coastguard Worker         kDefaultVersion     = 20,           // need deflate, nothing much else
337*9e94795aSAndroid Build Coastguard Worker         kDefaultMadeBy      = 0x0317,       // 03=UNIX, 17=spec v2.3
338*9e94795aSAndroid Build Coastguard Worker         kUsesDataDescr      = 0x0008,       // GPBitFlag bit 3
339*9e94795aSAndroid Build Coastguard Worker     };
340*9e94795aSAndroid Build Coastguard Worker 
341*9e94795aSAndroid Build Coastguard Worker     LocalFileHeader     mLFH;
342*9e94795aSAndroid Build Coastguard Worker     CentralDirEntry     mCDE;
343*9e94795aSAndroid Build Coastguard Worker };
344*9e94795aSAndroid Build Coastguard Worker 
345*9e94795aSAndroid Build Coastguard Worker }; // namespace android
346*9e94795aSAndroid Build Coastguard Worker 
347*9e94795aSAndroid Build Coastguard Worker #endif // __LIBS_ZIPENTRY_H
348