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