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