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// General-purpose Zip archive access. This class allows both reading and 19282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// writing to Zip archives, including deletion of existing entries. 20282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski// 21282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#ifndef __LIBS_ZIPFILE_H 22282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#define __LIBS_ZIPFILE_H 23282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 24282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/Vector.h> 25282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <utils/Errors.h> 26282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include <stdio.h> 27282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 28282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#include "ZipEntry.h" 29282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 30282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskinamespace android { 31282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 32282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski/* 33282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Manipulate a Zip archive. 34282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 35282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Some changes will not be visible in the until until "flush" is called. 36282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 37282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * The correct way to update a file archive is to make all changes to a 38282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * copy of the archive in a temporary file, and then unlink/rename over 39282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * the original after everything completes. Because we're only interested 40282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * in using this for packaging, we don't worry about such things. Crashing 41282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * after making changes and before flush() completes could leave us with 42282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * an unusable Zip archive. 43282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 44282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiclass ZipFile { 45282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskipublic: 46282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipFile(void) 47282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski : mZipFp(NULL), mReadOnly(false), mNeedCDRewrite(false) 48282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski {} 49282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ~ZipFile(void) { 50282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (!mReadOnly) 51282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski flush(); 52282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski if (mZipFp != NULL) 53282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski fclose(mZipFp); 54282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski discardEntries(); 55282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 56282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 57282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 58282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Open a new or existing archive. 59282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 60282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski enum { 61282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski kOpenReadOnly = 0x01, 62282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski kOpenReadWrite = 0x02, 63282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski kOpenCreate = 0x04, // create if it doesn't exist 64282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski kOpenTruncate = 0x08, // if it exists, empty it 65282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 66282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t open(const char* zipFileName, int flags); 67282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 68282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 69282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Add a file to the end of the archive. Specify whether you want the 70282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * library to try to store it compressed. 71282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 72282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * If "storageName" is specified, the archive will use that instead 73282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * of "fileName". 74282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 75282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * If there is already an entry with the same name, the call fails. 76282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Existing entries with the same name must be removed first. 77282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 78282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * If "ppEntry" is non-NULL, a pointer to the new entry will be returned. 79282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 80282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t add(const char* fileName, int compressionMethod, 81282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipEntry** ppEntry) 82282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski { 83282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return add(fileName, fileName, compressionMethod, ppEntry); 84282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 85282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t add(const char* fileName, const char* storageName, 86282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int compressionMethod, ZipEntry** ppEntry) 87282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski { 88282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return addCommon(fileName, NULL, 0, storageName, 89282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipEntry::kCompressStored, 90282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski compressionMethod, ppEntry); 91282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 92282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 93282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 94282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Add a file that is already compressed with gzip. 95282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 96282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * If "ppEntry" is non-NULL, a pointer to the new entry will be returned. 97282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 98282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t addGzip(const char* fileName, const char* storageName, 99282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipEntry** ppEntry) 100282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski { 101282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return addCommon(fileName, NULL, 0, storageName, 102282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipEntry::kCompressDeflated, 103282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipEntry::kCompressDeflated, ppEntry); 104282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 105282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 106282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 107282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Add a file from an in-memory data buffer. 108282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 109282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * If "ppEntry" is non-NULL, a pointer to the new entry will be returned. 110282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 111282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t add(const void* data, size_t size, const char* storageName, 112282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int compressionMethod, ZipEntry** ppEntry) 113282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski { 114282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski return addCommon(NULL, data, size, storageName, 115282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipEntry::kCompressStored, 116282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski compressionMethod, ppEntry); 117282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 118282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 119282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 120282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Add an entry by copying it from another zip file. If "padding" is 121282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * nonzero, the specified number of bytes will be added to the "extra" 122282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * field in the header. 123282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 124282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * If "ppEntry" is non-NULL, a pointer to the new entry will be returned. 125282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 126282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t add(const ZipFile* pSourceZip, const ZipEntry* pSourceEntry, 127282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int padding, ZipEntry** ppEntry); 128282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 129282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 130282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Mark an entry as having been removed. It is not actually deleted 131282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * from the archive or our internal data structures until flush() is 132282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * called. 133282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 134282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t remove(ZipEntry* pEntry); 135282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 136282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 137282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Flush changes. If mNeedCDRewrite is set, this writes the central dir. 138282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 139282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t flush(void); 140282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 141282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 142282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Expand the data into the buffer provided. The buffer must hold 143282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * at least <uncompressed len> bytes. Variation expands directly 144282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * to a file. 145282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 146282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Returns "false" if an error was encountered in the compressed data. 147282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 148282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski //bool uncompress(const ZipEntry* pEntry, void* buf) const; 149282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski //bool uncompress(const ZipEntry* pEntry, FILE* fp) const; 150282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void* uncompress(const ZipEntry* pEntry); 151282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 152282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 153282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Get an entry, by name. Returns NULL if not found. 154282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 155282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Does not return entries pending deletion. 156282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 157282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipEntry* getEntryByName(const char* fileName) const; 158282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 159282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 160282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * Get the Nth entry in the archive. 161282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * 162282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * This will return an entry that is pending deletion. 163282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 164282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski int getNumEntries(void) const { return mEntries.size(); } 165282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipEntry* getEntryByIndex(int idx) const; 166282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 167282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinskiprivate: 168282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* these are private and not defined */ 169282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipFile(const ZipFile& src); 170282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipFile& operator=(const ZipFile& src); 171282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 172282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski class EndOfCentralDir { 173282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski public: 174282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski EndOfCentralDir(void) : 175282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mDiskNumber(0), 176282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mDiskWithCentralDir(0), 177282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mNumEntries(0), 178282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mTotalNumEntries(0), 179282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mCentralDirSize(0), 180282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mCentralDirOffset(0), 181282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mCommentLen(0), 182282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski mComment(NULL) 183282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski {} 184282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski virtual ~EndOfCentralDir(void) { 185282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski delete[] mComment; 186282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski } 187282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 188282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t readBuf(const unsigned char* buf, int len); 189282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t write(FILE* fp); 190282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 191282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski //unsigned long mSignature; 192282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned short mDiskNumber; 193282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned short mDiskWithCentralDir; 194282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned short mNumEntries; 195282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned short mTotalNumEntries; 196282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned long mCentralDirSize; 197282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned long mCentralDirOffset; // offset from first disk 198282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned short mCommentLen; 199282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned char* mComment; 200282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 201282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski enum { 202282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski kSignature = 0x06054b50, 203282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski kEOCDLen = 22, // EndOfCentralDir len, excl. comment 204282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 205282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski kMaxCommentLen = 65535, // longest possible in ushort 206282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski kMaxEOCDSearch = kMaxCommentLen + EndOfCentralDir::kEOCDLen, 207282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 208282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 209282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 210282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void dump(void) const; 211282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski }; 212282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 213282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 214282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* read all entries in the central dir */ 215282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t readCentralDir(void); 216282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 217282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* crunch deleted entries out */ 218282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t crunchArchive(void); 219282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 220282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* clean up mEntries */ 221282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski void discardEntries(void); 222282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 223282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* common handler for all "add" functions */ 224282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t addCommon(const char* fileName, const void* data, size_t size, 225282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const char* storageName, int sourceType, int compressionMethod, 226282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski ZipEntry** ppEntry); 227282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 228282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* copy all of "srcFp" into "dstFp" */ 229282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t copyFpToFp(FILE* dstFp, FILE* srcFp, unsigned long* pCRC32); 230282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* copy all of "data" into "dstFp" */ 231282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t copyDataToFp(FILE* dstFp, 232282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const void* data, size_t size, unsigned long* pCRC32); 233282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* copy some of "srcFp" into "dstFp" */ 234282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t copyPartialFpToFp(FILE* dstFp, FILE* srcFp, long length, 235282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski unsigned long* pCRC32); 236282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* like memmove(), but on parts of a single file */ 237282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t filemove(FILE* fp, off_t dest, off_t src, size_t n); 238282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* compress all of "srcFp" into "dstFp", using Deflate */ 239282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski status_t compressFpToFp(FILE* dstFp, FILE* srcFp, 240282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski const void* data, size_t size, unsigned long* pCRC32); 241282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 242282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* get modification date from a file descriptor */ 243282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski time_t getModTime(int fd); 244282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 245282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 246282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * We use stdio FILE*, which gives us buffering but makes dealing 247282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * with files >2GB awkward. Until we support Zip64, we're fine. 248282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 249282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski FILE* mZipFp; // Zip file pointer 250282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 251282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* one of these per file */ 252282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski EndOfCentralDir mEOCD; 253282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 254282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* did we open this read-only? */ 255282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool mReadOnly; 256282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 257282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* set this when we trash the central dir */ 258282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski bool mNeedCDRewrite; 259282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 260282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski /* 261282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * One ZipEntry per entry in the zip file. I'm using pointers instead 262282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * of objects because it's easier than making operator= work for the 263282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski * classes and sub-classes. 264282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski */ 265282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski Vector<ZipEntry*> mEntries; 266282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; 267282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 268282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski}; // namespace android 269282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski 270282e181b58cf72b6ca770dc7ca5f91f135444502Adam Lesinski#endif // __LIBS_ZIPFILE_H 271