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