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