1 // ZipHeader.h
2 
3 #ifndef __ARCHIVE_ZIP_HEADER_H
4 #define __ARCHIVE_ZIP_HEADER_H
5 
6 #include "../../../Common/MyTypes.h"
7 
8 namespace NArchive {
9 namespace NZip {
10 
11 const unsigned kMarkerSize = 4;
12 
13 namespace NSignature
14 {
15   const UInt32 kLocalFileHeader   = 0x04034B50;
16   const UInt32 kDataDescriptor    = 0x08074B50;
17   const UInt32 kCentralFileHeader = 0x02014B50;
18   const UInt32 kEcd               = 0x06054B50;
19   const UInt32 kEcd64             = 0x06064B50;
20   const UInt32 kEcd64Locator      = 0x07064B50;
21   const UInt32 kSpan              = 0x08074B50;
22   const UInt32 kNoSpan            = 0x30304B50; // PK00, replaces kSpan, if there is only 1 segment
23 }
24 
25 const unsigned kLocalHeaderSize = 4 + 26; // including signature
26 const unsigned kDataDescriptorSize32 = 4 + 4 + 4 * 2;  // including signature
27 const unsigned kDataDescriptorSize64 = 4 + 4 + 8 * 2;  // including signature
28 const unsigned kCentralHeaderSize = 4 + 42; // including signature
29 
30 const unsigned kEcdSize = 22; // including signature
31 const unsigned kEcd64_MainSize = 44;
32 const unsigned kEcd64_FullSize = 12 + kEcd64_MainSize;
33 const unsigned kEcd64Locator_Size = 20;
34 
35 namespace NFileHeader
36 {
37   namespace NCompressionMethod
38   {
39     enum EType
40     {
41       kStore = 0,
42       kShrink = 1,
43       kReduce1 = 2,
44       kReduce2 = 3,
45       kReduce3 = 4,
46       kReduce4 = 5,
47       kImplode = 6,
48       kTokenize = 7,
49       kDeflate = 8,
50       kDeflate64 = 9,
51       kPKImploding = 10,
52 
53       kBZip2 = 12,
54 
55       kLZMA = 14,
56 
57       kTerse = 18,
58       kLz77 = 19,
59 
60       kXz = 95,
61       kJpeg = 96,
62       kWavPack = 97,
63       kPPMd = 98,
64       kWzAES = 99
65     };
66 
67     const Byte kMadeByProgramVersion = 63;
68 
69     const Byte kExtractVersion_Default = 10;
70     const Byte kExtractVersion_Dir = 20;
71     const Byte kExtractVersion_ZipCrypto = 20;
72     const Byte kExtractVersion_Deflate = 20;
73     const Byte kExtractVersion_Deflate64 = 21;
74     const Byte kExtractVersion_Zip64 = 45;
75     const Byte kExtractVersion_BZip2 = 46;
76     const Byte kExtractVersion_Aes = 51;
77     const Byte kExtractVersion_LZMA = 63;
78     const Byte kExtractVersion_PPMd = 63;
79     const Byte kExtractVersion_Xz = 20; // test it
80   }
81 
82   namespace NExtraID
83   {
84     enum
85     {
86       kZip64 = 0x01,
87       kNTFS = 0x0A,
88       kStrongEncrypt = 0x17,
89       kUnixTime = 0x5455,
90       kUnixExtra = 0x5855,
91       kIzUnicodeComment = 0x6375,
92       kIzUnicodeName = 0x7075,
93       kWzAES = 0x9901
94     };
95   }
96 
97   namespace NNtfsExtra
98   {
99     const UInt16 kTagTime = 1;
100     enum
101     {
102       kMTime = 0,
103       kATime,
104       kCTime
105     };
106   }
107 
108   namespace NUnixTime
109   {
110     enum
111     {
112       kMTime = 0,
113       kATime,
114       kCTime
115     };
116   }
117 
118   namespace NUnixExtra
119   {
120     enum
121     {
122       kATime = 0,
123       kMTime
124     };
125   }
126 
127   namespace NFlags
128   {
129     const unsigned kEncrypted = 1 << 0;
130     const unsigned kLzmaEOS = 1 << 1;
131     const unsigned kDescriptorUsedMask = 1 << 3;
132     const unsigned kStrongEncrypted = 1 << 6;
133     const unsigned kUtf8 = 1 << 11;
134     const unsigned kAltStream = 1 << 14;
135 
136     const unsigned kImplodeDictionarySizeMask = 1 << 1;
137     const unsigned kImplodeLiteralsOnMask     = 1 << 2;
138 
139     /*
140     const unsigned kDeflateTypeBitStart = 1;
141     const unsigned kNumDeflateTypeBits = 2;
142     const unsigned kNumDeflateTypes = (1 << kNumDeflateTypeBits);
143     const unsigned kDeflateTypeMask = (1 << kNumDeflateTypeBits) - 1;
144     */
145   }
146 
147   namespace NHostOS
148   {
149     enum EEnum
150     {
151       kFAT      =  0,
152       kAMIGA    =  1,
153       kVMS      =  2,  // VAX/VMS
154       kUnix     =  3,
155       kVM_CMS   =  4,
156       kAtari    =  5,  // what if it's a minix filesystem? [cjh]
157       kHPFS     =  6,  // filesystem used by OS/2 (and NT 3.x)
158       kMac      =  7,
159       kZ_System =  8,
160       kCPM      =  9,
161       kTOPS20   = 10,  // pkzip 2.50 NTFS
162       kNTFS     = 11,  // filesystem used by Windows NT
163       kQDOS     = 12,  // SMS/QDOS
164       kAcorn    = 13,  // Archimedes Acorn RISC OS
165       kVFAT     = 14,  // filesystem used by Windows 95, NT
166       kMVS      = 15,
167       kBeOS     = 16,  // hybrid POSIX/database filesystem
168       kTandem   = 17,
169       kOS400    = 18,
170       kOSX      = 19
171     };
172   }
173 
174 
175   namespace NAmigaAttrib
176   {
177     const UInt32 kIFMT     = 06000;    // Amiga file type mask
178     const UInt32 kIFDIR    = 04000;    // Amiga directory
179     const UInt32 kIFREG    = 02000;    // Amiga regular file
180     const UInt32 kIHIDDEN  = 00200;    // to be supported in AmigaDOS 3.x
181     const UInt32 kISCRIPT  = 00100;    // executable script (text command file)
182     const UInt32 kIPURE    = 00040;    // allow loading into resident memory
183     const UInt32 kIARCHIVE = 00020;    // not modified since bit was last set
184     const UInt32 kIREAD    = 00010;    // can be opened for reading
185     const UInt32 kIWRITE   = 00004;    // can be opened for writing
186     const UInt32 kIEXECUTE = 00002;    // executable image, a loadable runfile
187     const UInt32 kIDELETE  = 00001;    // can be deleted
188   }
189 }
190 
191 }}
192 
193 #endif
194