xref: /aosp_15_r20/build/make/tools/ziptime/ZipFile.h (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
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