xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Zip/ZipItem.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Archive/ZipItem.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_ZIP_ITEM_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_ZIP_ITEM_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/CpuArch.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyString.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/UTFConvert.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "ZipHeader.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
15*f6dc9357SAndroid Build Coastguard Worker namespace NZip {
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker /*
18*f6dc9357SAndroid Build Coastguard Worker extern const char *k_SpecName_NTFS_STREAM;
19*f6dc9357SAndroid Build Coastguard Worker extern const char *k_SpecName_MAC_RESOURCE_FORK;
20*f6dc9357SAndroid Build Coastguard Worker */
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker struct CVersion
23*f6dc9357SAndroid Build Coastguard Worker {
24*f6dc9357SAndroid Build Coastguard Worker   Byte Version;
25*f6dc9357SAndroid Build Coastguard Worker   Byte HostOS;
26*f6dc9357SAndroid Build Coastguard Worker };
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker struct CExtraSubBlock
29*f6dc9357SAndroid Build Coastguard Worker {
30*f6dc9357SAndroid Build Coastguard Worker   UInt32 ID;
31*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer Data;
32*f6dc9357SAndroid Build Coastguard Worker 
33*f6dc9357SAndroid Build Coastguard Worker   bool ExtractNtfsTime(unsigned index, FILETIME &ft) const;
34*f6dc9357SAndroid Build Coastguard Worker   bool Extract_UnixTime(bool isCentral, unsigned index, UInt32 &res) const;
35*f6dc9357SAndroid Build Coastguard Worker   bool Extract_Unix01_Time(unsigned index, UInt32 &res) const;
36*f6dc9357SAndroid Build Coastguard Worker   // bool Extract_Unix_Time(unsigned index, UInt32 &res) const;
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker   bool CheckIzUnicode(const AString &s) const;
39*f6dc9357SAndroid Build Coastguard Worker 
40*f6dc9357SAndroid Build Coastguard Worker   void PrintInfo(AString &s) const;
41*f6dc9357SAndroid Build Coastguard Worker };
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker const unsigned k_WzAesExtra_Size = 7;
44*f6dc9357SAndroid Build Coastguard Worker 
45*f6dc9357SAndroid Build Coastguard Worker struct CWzAesExtra
46*f6dc9357SAndroid Build Coastguard Worker {
47*f6dc9357SAndroid Build Coastguard Worker   UInt16 VendorVersion; // 1: AE-1, 2: AE-2,
48*f6dc9357SAndroid Build Coastguard Worker   // UInt16 VendorId; // 'A' 'E'
49*f6dc9357SAndroid Build Coastguard Worker   Byte Strength; // 1: 128-bit, 2: 192-bit, 3: 256-bit
50*f6dc9357SAndroid Build Coastguard Worker   UInt16 Method;
51*f6dc9357SAndroid Build Coastguard Worker 
CWzAesExtraCWzAesExtra52*f6dc9357SAndroid Build Coastguard Worker   CWzAesExtra(): VendorVersion(2), Strength(3), Method(0) {}
53*f6dc9357SAndroid Build Coastguard Worker 
NeedCrcCWzAesExtra54*f6dc9357SAndroid Build Coastguard Worker   bool NeedCrc() const { return (VendorVersion == 1); }
55*f6dc9357SAndroid Build Coastguard Worker 
ParseFromSubBlockCWzAesExtra56*f6dc9357SAndroid Build Coastguard Worker   bool ParseFromSubBlock(const CExtraSubBlock &sb)
57*f6dc9357SAndroid Build Coastguard Worker   {
58*f6dc9357SAndroid Build Coastguard Worker     if (sb.ID != NFileHeader::NExtraID::kWzAES)
59*f6dc9357SAndroid Build Coastguard Worker       return false;
60*f6dc9357SAndroid Build Coastguard Worker     if (sb.Data.Size() < k_WzAesExtra_Size)
61*f6dc9357SAndroid Build Coastguard Worker       return false;
62*f6dc9357SAndroid Build Coastguard Worker     const Byte *p = (const Byte *)sb.Data;
63*f6dc9357SAndroid Build Coastguard Worker     VendorVersion = GetUi16(p);
64*f6dc9357SAndroid Build Coastguard Worker     if (p[2] != 'A' || p[3] != 'E')
65*f6dc9357SAndroid Build Coastguard Worker       return false;
66*f6dc9357SAndroid Build Coastguard Worker     Strength = p[4];
67*f6dc9357SAndroid Build Coastguard Worker     // 9.31: The BUG was fixed:
68*f6dc9357SAndroid Build Coastguard Worker     Method = GetUi16(p + 5);
69*f6dc9357SAndroid Build Coastguard Worker     return true;
70*f6dc9357SAndroid Build Coastguard Worker   }
71*f6dc9357SAndroid Build Coastguard Worker 
SetSubBlockCWzAesExtra72*f6dc9357SAndroid Build Coastguard Worker   void SetSubBlock(CExtraSubBlock &sb) const
73*f6dc9357SAndroid Build Coastguard Worker   {
74*f6dc9357SAndroid Build Coastguard Worker     sb.Data.Alloc(k_WzAesExtra_Size);
75*f6dc9357SAndroid Build Coastguard Worker     sb.ID = NFileHeader::NExtraID::kWzAES;
76*f6dc9357SAndroid Build Coastguard Worker     Byte *p = (Byte *)sb.Data;
77*f6dc9357SAndroid Build Coastguard Worker     p[0] = (Byte)VendorVersion;
78*f6dc9357SAndroid Build Coastguard Worker     p[1] = (Byte)(VendorVersion >> 8);
79*f6dc9357SAndroid Build Coastguard Worker     p[2] = 'A';
80*f6dc9357SAndroid Build Coastguard Worker     p[3] = 'E';
81*f6dc9357SAndroid Build Coastguard Worker     p[4] = Strength;
82*f6dc9357SAndroid Build Coastguard Worker     p[5] = (Byte)Method;
83*f6dc9357SAndroid Build Coastguard Worker     p[6] = (Byte)(Method >> 8);
84*f6dc9357SAndroid Build Coastguard Worker   }
85*f6dc9357SAndroid Build Coastguard Worker };
86*f6dc9357SAndroid Build Coastguard Worker 
87*f6dc9357SAndroid Build Coastguard Worker namespace NStrongCrypto_AlgId
88*f6dc9357SAndroid Build Coastguard Worker {
89*f6dc9357SAndroid Build Coastguard Worker   const UInt16 kDES = 0x6601;
90*f6dc9357SAndroid Build Coastguard Worker   const UInt16 kRC2old = 0x6602;
91*f6dc9357SAndroid Build Coastguard Worker   const UInt16 k3DES168 = 0x6603;
92*f6dc9357SAndroid Build Coastguard Worker   const UInt16 k3DES112 = 0x6609;
93*f6dc9357SAndroid Build Coastguard Worker   const UInt16 kAES128 = 0x660E;
94*f6dc9357SAndroid Build Coastguard Worker   const UInt16 kAES192 = 0x660F;
95*f6dc9357SAndroid Build Coastguard Worker   const UInt16 kAES256 = 0x6610;
96*f6dc9357SAndroid Build Coastguard Worker   const UInt16 kRC2 = 0x6702;
97*f6dc9357SAndroid Build Coastguard Worker   const UInt16 kBlowfish = 0x6720;
98*f6dc9357SAndroid Build Coastguard Worker   const UInt16 kTwofish = 0x6721;
99*f6dc9357SAndroid Build Coastguard Worker   const UInt16 kRC4 = 0x6801;
100*f6dc9357SAndroid Build Coastguard Worker }
101*f6dc9357SAndroid Build Coastguard Worker 
102*f6dc9357SAndroid Build Coastguard Worker struct CStrongCryptoExtra
103*f6dc9357SAndroid Build Coastguard Worker {
104*f6dc9357SAndroid Build Coastguard Worker   UInt16 Format;
105*f6dc9357SAndroid Build Coastguard Worker   UInt16 AlgId;
106*f6dc9357SAndroid Build Coastguard Worker   UInt16 BitLen;
107*f6dc9357SAndroid Build Coastguard Worker   UInt16 Flags;
108*f6dc9357SAndroid Build Coastguard Worker 
ParseFromSubBlockCStrongCryptoExtra109*f6dc9357SAndroid Build Coastguard Worker   bool ParseFromSubBlock(const CExtraSubBlock &sb)
110*f6dc9357SAndroid Build Coastguard Worker   {
111*f6dc9357SAndroid Build Coastguard Worker     if (sb.ID != NFileHeader::NExtraID::kStrongEncrypt)
112*f6dc9357SAndroid Build Coastguard Worker       return false;
113*f6dc9357SAndroid Build Coastguard Worker     const Byte *p = (const Byte *)sb.Data;
114*f6dc9357SAndroid Build Coastguard Worker     if (sb.Data.Size() < 8)
115*f6dc9357SAndroid Build Coastguard Worker       return false;
116*f6dc9357SAndroid Build Coastguard Worker     Format = GetUi16(p + 0);
117*f6dc9357SAndroid Build Coastguard Worker     AlgId  = GetUi16(p + 2);
118*f6dc9357SAndroid Build Coastguard Worker     BitLen = GetUi16(p + 4);
119*f6dc9357SAndroid Build Coastguard Worker     Flags  = GetUi16(p + 6);
120*f6dc9357SAndroid Build Coastguard Worker     return (Format == 2);
121*f6dc9357SAndroid Build Coastguard Worker   }
122*f6dc9357SAndroid Build Coastguard Worker 
CertificateIsUsedCStrongCryptoExtra123*f6dc9357SAndroid Build Coastguard Worker   bool CertificateIsUsed() const { return (Flags > 0x0001); }
124*f6dc9357SAndroid Build Coastguard Worker };
125*f6dc9357SAndroid Build Coastguard Worker 
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker struct CExtraBlock
128*f6dc9357SAndroid Build Coastguard Worker {
129*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CExtraSubBlock> SubBlocks;
130*f6dc9357SAndroid Build Coastguard Worker   bool Error;
131*f6dc9357SAndroid Build Coastguard Worker   bool MinorError;
132*f6dc9357SAndroid Build Coastguard Worker   bool IsZip64;
133*f6dc9357SAndroid Build Coastguard Worker   bool IsZip64_Error;
134*f6dc9357SAndroid Build Coastguard Worker 
CExtraBlockCExtraBlock135*f6dc9357SAndroid Build Coastguard Worker   CExtraBlock(): Error(false), MinorError(false), IsZip64(false), IsZip64_Error(false) {}
136*f6dc9357SAndroid Build Coastguard Worker 
ClearCExtraBlock137*f6dc9357SAndroid Build Coastguard Worker   void Clear()
138*f6dc9357SAndroid Build Coastguard Worker   {
139*f6dc9357SAndroid Build Coastguard Worker     SubBlocks.Clear();
140*f6dc9357SAndroid Build Coastguard Worker     IsZip64 = false;
141*f6dc9357SAndroid Build Coastguard Worker   }
142*f6dc9357SAndroid Build Coastguard Worker 
GetSizeCExtraBlock143*f6dc9357SAndroid Build Coastguard Worker   size_t GetSize() const
144*f6dc9357SAndroid Build Coastguard Worker   {
145*f6dc9357SAndroid Build Coastguard Worker     size_t res = 0;
146*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, SubBlocks)
147*f6dc9357SAndroid Build Coastguard Worker       res += SubBlocks[i].Data.Size() + 2 + 2;
148*f6dc9357SAndroid Build Coastguard Worker     return res;
149*f6dc9357SAndroid Build Coastguard Worker   }
150*f6dc9357SAndroid Build Coastguard Worker 
GetWzAesCExtraBlock151*f6dc9357SAndroid Build Coastguard Worker   bool GetWzAes(CWzAesExtra &e) const
152*f6dc9357SAndroid Build Coastguard Worker   {
153*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, SubBlocks)
154*f6dc9357SAndroid Build Coastguard Worker       if (e.ParseFromSubBlock(SubBlocks[i]))
155*f6dc9357SAndroid Build Coastguard Worker         return true;
156*f6dc9357SAndroid Build Coastguard Worker     return false;
157*f6dc9357SAndroid Build Coastguard Worker   }
158*f6dc9357SAndroid Build Coastguard Worker 
HasWzAesCExtraBlock159*f6dc9357SAndroid Build Coastguard Worker   bool HasWzAes() const
160*f6dc9357SAndroid Build Coastguard Worker   {
161*f6dc9357SAndroid Build Coastguard Worker     CWzAesExtra e;
162*f6dc9357SAndroid Build Coastguard Worker     return GetWzAes(e);
163*f6dc9357SAndroid Build Coastguard Worker   }
164*f6dc9357SAndroid Build Coastguard Worker 
GetStrongCryptoCExtraBlock165*f6dc9357SAndroid Build Coastguard Worker   bool GetStrongCrypto(CStrongCryptoExtra &e) const
166*f6dc9357SAndroid Build Coastguard Worker   {
167*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, SubBlocks)
168*f6dc9357SAndroid Build Coastguard Worker       if (e.ParseFromSubBlock(SubBlocks[i]))
169*f6dc9357SAndroid Build Coastguard Worker         return true;
170*f6dc9357SAndroid Build Coastguard Worker     return false;
171*f6dc9357SAndroid Build Coastguard Worker   }
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker   /*
174*f6dc9357SAndroid Build Coastguard Worker   bool HasStrongCrypto() const
175*f6dc9357SAndroid Build Coastguard Worker   {
176*f6dc9357SAndroid Build Coastguard Worker     CStrongCryptoExtra e;
177*f6dc9357SAndroid Build Coastguard Worker     return GetStrongCrypto(e);
178*f6dc9357SAndroid Build Coastguard Worker   }
179*f6dc9357SAndroid Build Coastguard Worker   */
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker   bool GetNtfsTime(unsigned index, FILETIME &ft) const;
182*f6dc9357SAndroid Build Coastguard Worker   bool GetUnixTime(bool isCentral, unsigned index, UInt32 &res) const;
183*f6dc9357SAndroid Build Coastguard Worker 
184*f6dc9357SAndroid Build Coastguard Worker   void PrintInfo(AString &s) const;
185*f6dc9357SAndroid Build Coastguard Worker 
RemoveUnknownSubBlocksCExtraBlock186*f6dc9357SAndroid Build Coastguard Worker   void RemoveUnknownSubBlocks()
187*f6dc9357SAndroid Build Coastguard Worker   {
188*f6dc9357SAndroid Build Coastguard Worker     for (unsigned i = SubBlocks.Size(); i != 0;)
189*f6dc9357SAndroid Build Coastguard Worker     {
190*f6dc9357SAndroid Build Coastguard Worker       i--;
191*f6dc9357SAndroid Build Coastguard Worker       switch (SubBlocks[i].ID)
192*f6dc9357SAndroid Build Coastguard Worker       {
193*f6dc9357SAndroid Build Coastguard Worker         case NFileHeader::NExtraID::kStrongEncrypt:
194*f6dc9357SAndroid Build Coastguard Worker         case NFileHeader::NExtraID::kWzAES:
195*f6dc9357SAndroid Build Coastguard Worker           break;
196*f6dc9357SAndroid Build Coastguard Worker         default:
197*f6dc9357SAndroid Build Coastguard Worker           SubBlocks.Delete(i);
198*f6dc9357SAndroid Build Coastguard Worker       }
199*f6dc9357SAndroid Build Coastguard Worker     }
200*f6dc9357SAndroid Build Coastguard Worker   }
201*f6dc9357SAndroid Build Coastguard Worker };
202*f6dc9357SAndroid Build Coastguard Worker 
203*f6dc9357SAndroid Build Coastguard Worker 
204*f6dc9357SAndroid Build Coastguard Worker class CLocalItem
205*f6dc9357SAndroid Build Coastguard Worker {
206*f6dc9357SAndroid Build Coastguard Worker public:
207*f6dc9357SAndroid Build Coastguard Worker   UInt16 Flags;
208*f6dc9357SAndroid Build Coastguard Worker   UInt16 Method;
209*f6dc9357SAndroid Build Coastguard Worker 
210*f6dc9357SAndroid Build Coastguard Worker   /*
211*f6dc9357SAndroid Build Coastguard Worker     Zip specification doesn't mention that ExtractVersion field uses HostOS subfield.
212*f6dc9357SAndroid Build Coastguard Worker     18.06: 7-Zip now doesn't use ExtractVersion::HostOS to detect codePage
213*f6dc9357SAndroid Build Coastguard Worker   */
214*f6dc9357SAndroid Build Coastguard Worker 
215*f6dc9357SAndroid Build Coastguard Worker   CVersion ExtractVersion;
216*f6dc9357SAndroid Build Coastguard Worker 
217*f6dc9357SAndroid Build Coastguard Worker   UInt64 Size;
218*f6dc9357SAndroid Build Coastguard Worker   UInt64 PackSize;
219*f6dc9357SAndroid Build Coastguard Worker   UInt32 Time;
220*f6dc9357SAndroid Build Coastguard Worker   UInt32 Crc;
221*f6dc9357SAndroid Build Coastguard Worker 
222*f6dc9357SAndroid Build Coastguard Worker   UInt32 Disk;
223*f6dc9357SAndroid Build Coastguard Worker 
224*f6dc9357SAndroid Build Coastguard Worker   AString Name;
225*f6dc9357SAndroid Build Coastguard Worker 
226*f6dc9357SAndroid Build Coastguard Worker   CExtraBlock LocalExtra;
227*f6dc9357SAndroid Build Coastguard Worker 
GetDescriptorSize()228*f6dc9357SAndroid Build Coastguard Worker   unsigned GetDescriptorSize() const { return LocalExtra.IsZip64 ? kDataDescriptorSize64 : kDataDescriptorSize32; }
229*f6dc9357SAndroid Build Coastguard Worker 
GetPackSizeWithDescriptor()230*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetPackSizeWithDescriptor() const
231*f6dc9357SAndroid Build Coastguard Worker     { return PackSize + (HasDescriptor() ? GetDescriptorSize() : 0); }
232*f6dc9357SAndroid Build Coastguard Worker 
IsUtf8()233*f6dc9357SAndroid Build Coastguard Worker   bool IsUtf8() const { return (Flags & NFileHeader::NFlags::kUtf8) != 0; }
IsEncrypted()234*f6dc9357SAndroid Build Coastguard Worker   bool IsEncrypted() const { return (Flags & NFileHeader::NFlags::kEncrypted) != 0; }
IsStrongEncrypted()235*f6dc9357SAndroid Build Coastguard Worker   bool IsStrongEncrypted() const { return IsEncrypted() && (Flags & NFileHeader::NFlags::kStrongEncrypted) != 0; }
IsAesEncrypted()236*f6dc9357SAndroid Build Coastguard Worker   bool IsAesEncrypted() const { return IsEncrypted() && (IsStrongEncrypted() || Method == NFileHeader::NCompressionMethod::kWzAES); }
IsLzmaEOS()237*f6dc9357SAndroid Build Coastguard Worker   bool IsLzmaEOS() const { return (Flags & NFileHeader::NFlags::kLzmaEOS) != 0; }
HasDescriptor()238*f6dc9357SAndroid Build Coastguard Worker   bool HasDescriptor() const { return (Flags & NFileHeader::NFlags::kDescriptorUsedMask) != 0; }
239*f6dc9357SAndroid Build Coastguard Worker   // bool IsAltStream() const { return (Flags & NFileHeader::NFlags::kAltStream) != 0; }
240*f6dc9357SAndroid Build Coastguard Worker 
GetDeflateLevel()241*f6dc9357SAndroid Build Coastguard Worker   unsigned GetDeflateLevel() const { return (Flags >> 1) & 3; }
242*f6dc9357SAndroid Build Coastguard Worker 
243*f6dc9357SAndroid Build Coastguard Worker   bool IsDir() const;
244*f6dc9357SAndroid Build Coastguard Worker 
245*f6dc9357SAndroid Build Coastguard Worker   /*
246*f6dc9357SAndroid Build Coastguard Worker   void GetUnicodeString(const AString &s, UString &res) const
247*f6dc9357SAndroid Build Coastguard Worker   {
248*f6dc9357SAndroid Build Coastguard Worker     bool isUtf8 = IsUtf8();
249*f6dc9357SAndroid Build Coastguard Worker     if (isUtf8)
250*f6dc9357SAndroid Build Coastguard Worker       if (ConvertUTF8ToUnicode(s, res))
251*f6dc9357SAndroid Build Coastguard Worker         return;
252*f6dc9357SAndroid Build Coastguard Worker     MultiByteToUnicodeString2(res, s, GetCodePage());
253*f6dc9357SAndroid Build Coastguard Worker   }
254*f6dc9357SAndroid Build Coastguard Worker   */
255*f6dc9357SAndroid Build Coastguard Worker 
256*f6dc9357SAndroid Build Coastguard Worker private:
257*f6dc9357SAndroid Build Coastguard Worker 
SetFlag(unsigned bitMask,bool enable)258*f6dc9357SAndroid Build Coastguard Worker   void SetFlag(unsigned bitMask, bool enable)
259*f6dc9357SAndroid Build Coastguard Worker   {
260*f6dc9357SAndroid Build Coastguard Worker     if (enable)
261*f6dc9357SAndroid Build Coastguard Worker       Flags = (UInt16)(Flags | bitMask);
262*f6dc9357SAndroid Build Coastguard Worker     else
263*f6dc9357SAndroid Build Coastguard Worker       Flags = (UInt16)(Flags & ~bitMask);
264*f6dc9357SAndroid Build Coastguard Worker   }
265*f6dc9357SAndroid Build Coastguard Worker 
266*f6dc9357SAndroid Build Coastguard Worker public:
267*f6dc9357SAndroid Build Coastguard Worker 
ClearFlags()268*f6dc9357SAndroid Build Coastguard Worker   void ClearFlags() { Flags = 0; }
SetEncrypted(bool encrypted)269*f6dc9357SAndroid Build Coastguard Worker   void SetEncrypted(bool encrypted) { SetFlag(NFileHeader::NFlags::kEncrypted, encrypted); }
SetUtf8(bool isUtf8)270*f6dc9357SAndroid Build Coastguard Worker   void SetUtf8(bool isUtf8) { SetFlag(NFileHeader::NFlags::kUtf8, isUtf8); }
271*f6dc9357SAndroid Build Coastguard Worker   // void SetFlag_AltStream(bool isAltStream) { SetFlag(NFileHeader::NFlags::kAltStream, isAltStream); }
SetDescriptorMode(bool useDescriptor)272*f6dc9357SAndroid Build Coastguard Worker   void SetDescriptorMode(bool useDescriptor) { SetFlag(NFileHeader::NFlags::kDescriptorUsedMask, useDescriptor); }
273*f6dc9357SAndroid Build Coastguard Worker 
GetCodePage()274*f6dc9357SAndroid Build Coastguard Worker   UINT GetCodePage() const
275*f6dc9357SAndroid Build Coastguard Worker   {
276*f6dc9357SAndroid Build Coastguard Worker     if (IsUtf8())
277*f6dc9357SAndroid Build Coastguard Worker       return CP_UTF8;
278*f6dc9357SAndroid Build Coastguard Worker     return CP_OEMCP;
279*f6dc9357SAndroid Build Coastguard Worker   }
280*f6dc9357SAndroid Build Coastguard Worker };
281*f6dc9357SAndroid Build Coastguard Worker 
282*f6dc9357SAndroid Build Coastguard Worker 
283*f6dc9357SAndroid Build Coastguard Worker class CItem: public CLocalItem
284*f6dc9357SAndroid Build Coastguard Worker {
285*f6dc9357SAndroid Build Coastguard Worker public:
286*f6dc9357SAndroid Build Coastguard Worker   CVersion MadeByVersion;
287*f6dc9357SAndroid Build Coastguard Worker   UInt16 InternalAttrib;
288*f6dc9357SAndroid Build Coastguard Worker   UInt32 ExternalAttrib;
289*f6dc9357SAndroid Build Coastguard Worker 
290*f6dc9357SAndroid Build Coastguard Worker   UInt64 LocalHeaderPos;
291*f6dc9357SAndroid Build Coastguard Worker 
292*f6dc9357SAndroid Build Coastguard Worker   CExtraBlock CentralExtra;
293*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer Comment;
294*f6dc9357SAndroid Build Coastguard Worker 
295*f6dc9357SAndroid Build Coastguard Worker   bool FromLocal;
296*f6dc9357SAndroid Build Coastguard Worker   bool FromCentral;
297*f6dc9357SAndroid Build Coastguard Worker 
298*f6dc9357SAndroid Build Coastguard Worker   // CItem can be used as CLocalItem. So we must clear unused fields
CItem()299*f6dc9357SAndroid Build Coastguard Worker   CItem():
300*f6dc9357SAndroid Build Coastguard Worker       InternalAttrib(0),
301*f6dc9357SAndroid Build Coastguard Worker       ExternalAttrib(0),
302*f6dc9357SAndroid Build Coastguard Worker       FromLocal(false),
303*f6dc9357SAndroid Build Coastguard Worker       FromCentral(false)
304*f6dc9357SAndroid Build Coastguard Worker   {
305*f6dc9357SAndroid Build Coastguard Worker     MadeByVersion.Version = 0;
306*f6dc9357SAndroid Build Coastguard Worker     MadeByVersion.HostOS = 0;
307*f6dc9357SAndroid Build Coastguard Worker   }
308*f6dc9357SAndroid Build Coastguard Worker 
GetMainExtra()309*f6dc9357SAndroid Build Coastguard Worker   const CExtraBlock &GetMainExtra() const { return *(FromCentral ? &CentralExtra : &LocalExtra); }
310*f6dc9357SAndroid Build Coastguard Worker 
311*f6dc9357SAndroid Build Coastguard Worker   bool IsDir() const;
312*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetWinAttrib() const;
313*f6dc9357SAndroid Build Coastguard Worker   bool GetPosixAttrib(UInt32 &attrib) const;
314*f6dc9357SAndroid Build Coastguard Worker 
315*f6dc9357SAndroid Build Coastguard Worker   // 18.06: 0 instead of ExtractVersion.HostOS for local item
GetHostOS()316*f6dc9357SAndroid Build Coastguard Worker   Byte GetHostOS() const { return FromCentral ? MadeByVersion.HostOS : (Byte)0; }
317*f6dc9357SAndroid Build Coastguard Worker 
318*f6dc9357SAndroid Build Coastguard Worker   void GetUnicodeString(UString &res, const AString &s, bool isComment, bool useSpecifiedCodePage, UINT codePage) const;
319*f6dc9357SAndroid Build Coastguard Worker 
IsThereCrc()320*f6dc9357SAndroid Build Coastguard Worker   bool IsThereCrc() const
321*f6dc9357SAndroid Build Coastguard Worker   {
322*f6dc9357SAndroid Build Coastguard Worker     if (Method == NFileHeader::NCompressionMethod::kWzAES)
323*f6dc9357SAndroid Build Coastguard Worker     {
324*f6dc9357SAndroid Build Coastguard Worker       CWzAesExtra aesField;
325*f6dc9357SAndroid Build Coastguard Worker       if (GetMainExtra().GetWzAes(aesField))
326*f6dc9357SAndroid Build Coastguard Worker         return aesField.NeedCrc();
327*f6dc9357SAndroid Build Coastguard Worker     }
328*f6dc9357SAndroid Build Coastguard Worker     return (Crc != 0 || !IsDir());
329*f6dc9357SAndroid Build Coastguard Worker   }
330*f6dc9357SAndroid Build Coastguard Worker 
Is_MadeBy_Unix()331*f6dc9357SAndroid Build Coastguard Worker   bool Is_MadeBy_Unix() const
332*f6dc9357SAndroid Build Coastguard Worker   {
333*f6dc9357SAndroid Build Coastguard Worker     if (!FromCentral)
334*f6dc9357SAndroid Build Coastguard Worker       return false;
335*f6dc9357SAndroid Build Coastguard Worker     return (MadeByVersion.HostOS == NFileHeader::NHostOS::kUnix);
336*f6dc9357SAndroid Build Coastguard Worker   }
337*f6dc9357SAndroid Build Coastguard Worker 
GetCodePage()338*f6dc9357SAndroid Build Coastguard Worker   UINT GetCodePage() const
339*f6dc9357SAndroid Build Coastguard Worker   {
340*f6dc9357SAndroid Build Coastguard Worker     // 18.06: now we use HostOS only from Central::MadeByVersion
341*f6dc9357SAndroid Build Coastguard Worker     if (IsUtf8())
342*f6dc9357SAndroid Build Coastguard Worker       return CP_UTF8;
343*f6dc9357SAndroid Build Coastguard Worker     if (!FromCentral)
344*f6dc9357SAndroid Build Coastguard Worker       return CP_OEMCP;
345*f6dc9357SAndroid Build Coastguard Worker     Byte hostOS = MadeByVersion.HostOS;
346*f6dc9357SAndroid Build Coastguard Worker     return (UINT)((
347*f6dc9357SAndroid Build Coastguard Worker            hostOS == NFileHeader::NHostOS::kFAT
348*f6dc9357SAndroid Build Coastguard Worker         || hostOS == NFileHeader::NHostOS::kNTFS
349*f6dc9357SAndroid Build Coastguard Worker         || hostOS == NFileHeader::NHostOS::kUnix // do we need it?
350*f6dc9357SAndroid Build Coastguard Worker         ) ? CP_OEMCP : CP_ACP);
351*f6dc9357SAndroid Build Coastguard Worker   }
352*f6dc9357SAndroid Build Coastguard Worker };
353*f6dc9357SAndroid Build Coastguard Worker 
354*f6dc9357SAndroid Build Coastguard Worker }}
355*f6dc9357SAndroid Build Coastguard Worker 
356*f6dc9357SAndroid Build Coastguard Worker #endif
357