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 // Class to rewrite zip file headers to remove dynamic timestamps. 19*9e94795aSAndroid Build Coastguard Worker // 20*9e94795aSAndroid Build Coastguard Worker #ifndef __LIBS_ZIPFILE_H 21*9e94795aSAndroid Build Coastguard Worker #define __LIBS_ZIPFILE_H 22*9e94795aSAndroid Build Coastguard Worker 23*9e94795aSAndroid Build Coastguard Worker #include <stdio.h> 24*9e94795aSAndroid Build Coastguard Worker 25*9e94795aSAndroid Build Coastguard Worker #include "ZipEntry.h" 26*9e94795aSAndroid Build Coastguard Worker 27*9e94795aSAndroid Build Coastguard Worker namespace android { 28*9e94795aSAndroid Build Coastguard Worker 29*9e94795aSAndroid Build Coastguard Worker /* 30*9e94795aSAndroid Build Coastguard Worker * Manipulate a Zip archive. 31*9e94795aSAndroid Build Coastguard Worker */ 32*9e94795aSAndroid Build Coastguard Worker class ZipFile { 33*9e94795aSAndroid Build Coastguard Worker public: ZipFile(void)34*9e94795aSAndroid Build Coastguard Worker ZipFile(void) : mZipFp(NULL) {} ~ZipFile(void)35*9e94795aSAndroid Build Coastguard Worker ~ZipFile(void) { 36*9e94795aSAndroid Build Coastguard Worker if (mZipFp != NULL) 37*9e94795aSAndroid Build Coastguard Worker fclose(mZipFp); 38*9e94795aSAndroid Build Coastguard Worker } 39*9e94795aSAndroid Build Coastguard Worker 40*9e94795aSAndroid Build Coastguard Worker /* 41*9e94795aSAndroid Build Coastguard Worker * Rewrite an archive's headers to remove dynamic timestamps. 42*9e94795aSAndroid Build Coastguard Worker */ 43*9e94795aSAndroid Build Coastguard Worker status_t rewrite(const char* zipFileName); 44*9e94795aSAndroid Build Coastguard Worker 45*9e94795aSAndroid Build Coastguard Worker private: 46*9e94795aSAndroid Build Coastguard Worker /* these are private and not defined */ 47*9e94795aSAndroid Build Coastguard Worker ZipFile(const ZipFile& src); 48*9e94795aSAndroid Build Coastguard Worker ZipFile& operator=(const ZipFile& src); 49*9e94795aSAndroid Build Coastguard Worker 50*9e94795aSAndroid Build Coastguard Worker class EndOfCentralDir { 51*9e94795aSAndroid Build Coastguard Worker public: EndOfCentralDir(void)52*9e94795aSAndroid Build Coastguard Worker EndOfCentralDir(void) : mTotalNumEntries(0), mCentralDirOffset(0) {} 53*9e94795aSAndroid Build Coastguard Worker 54*9e94795aSAndroid Build Coastguard Worker status_t readBuf(const uint8_t* buf, int len); 55*9e94795aSAndroid Build Coastguard Worker 56*9e94795aSAndroid Build Coastguard Worker uint16_t mTotalNumEntries; 57*9e94795aSAndroid Build Coastguard Worker uint32_t mCentralDirOffset; // offset from first disk 58*9e94795aSAndroid Build Coastguard Worker 59*9e94795aSAndroid Build Coastguard Worker enum { 60*9e94795aSAndroid Build Coastguard Worker kSignature = 0x06054b50, 61*9e94795aSAndroid Build Coastguard Worker kEOCDLen = 22, // EndOfCentralDir len, excl. comment 62*9e94795aSAndroid Build Coastguard Worker 63*9e94795aSAndroid Build Coastguard Worker kMaxCommentLen = 65535, // longest possible in ushort 64*9e94795aSAndroid Build Coastguard Worker kMaxEOCDSearch = kMaxCommentLen + EndOfCentralDir::kEOCDLen, 65*9e94795aSAndroid Build Coastguard Worker 66*9e94795aSAndroid Build Coastguard Worker }; 67*9e94795aSAndroid Build Coastguard Worker }; 68*9e94795aSAndroid Build Coastguard Worker 69*9e94795aSAndroid Build Coastguard Worker /* read all entries in the central dir */ 70*9e94795aSAndroid Build Coastguard Worker status_t rewriteCentralDir(void); 71*9e94795aSAndroid Build Coastguard Worker 72*9e94795aSAndroid Build Coastguard Worker /* 73*9e94795aSAndroid Build Coastguard Worker * We use stdio FILE*, which gives us buffering but makes dealing 74*9e94795aSAndroid Build Coastguard Worker * with files >2GB awkward. Until we support Zip64, we're fine. 75*9e94795aSAndroid Build Coastguard Worker */ 76*9e94795aSAndroid Build Coastguard Worker FILE* mZipFp; // Zip file pointer 77*9e94795aSAndroid Build Coastguard Worker 78*9e94795aSAndroid Build Coastguard Worker /* one of these per file */ 79*9e94795aSAndroid Build Coastguard Worker EndOfCentralDir mEOCD; 80*9e94795aSAndroid Build Coastguard Worker }; 81*9e94795aSAndroid Build Coastguard Worker 82*9e94795aSAndroid Build Coastguard Worker }; // namespace android 83*9e94795aSAndroid Build Coastguard Worker 84*9e94795aSAndroid Build Coastguard Worker #endif // __LIBS_ZIPFILE_H 85