xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Rar/Rar5Handler.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Rar5Handler.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_RAR5_HANDLER_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_RAR5_HANDLER_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../../C/Blake2.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/CreateCoder.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker #include "../IArchive.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
17*f6dc9357SAndroid Build Coastguard Worker namespace NRar5 {
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker namespace NHeaderFlags
20*f6dc9357SAndroid Build Coastguard Worker {
21*f6dc9357SAndroid Build Coastguard Worker   const unsigned kExtra   = 1 << 0;
22*f6dc9357SAndroid Build Coastguard Worker   const unsigned kData    = 1 << 1;
23*f6dc9357SAndroid Build Coastguard Worker   // const unsigned kUnknown = 1 << 2;
24*f6dc9357SAndroid Build Coastguard Worker   const unsigned kPrevVol = 1 << 3;
25*f6dc9357SAndroid Build Coastguard Worker   const unsigned kNextVol = 1 << 4;
26*f6dc9357SAndroid Build Coastguard Worker   // const unsigned kIsChild = 1 << 5;
27*f6dc9357SAndroid Build Coastguard Worker   // const unsigned kPreserveChild = 1 << 6;
28*f6dc9357SAndroid Build Coastguard Worker }
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker namespace NHeaderType
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker   enum
33*f6dc9357SAndroid Build Coastguard Worker   {
34*f6dc9357SAndroid Build Coastguard Worker     kArc = 1,
35*f6dc9357SAndroid Build Coastguard Worker     kFile,
36*f6dc9357SAndroid Build Coastguard Worker     kService,
37*f6dc9357SAndroid Build Coastguard Worker     kArcEncrypt,
38*f6dc9357SAndroid Build Coastguard Worker     kEndOfArc
39*f6dc9357SAndroid Build Coastguard Worker   };
40*f6dc9357SAndroid Build Coastguard Worker }
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker namespace NArcFlags
43*f6dc9357SAndroid Build Coastguard Worker {
44*f6dc9357SAndroid Build Coastguard Worker   const unsigned kVol       = 1 << 0;
45*f6dc9357SAndroid Build Coastguard Worker   const unsigned kVolNumber = 1 << 1;
46*f6dc9357SAndroid Build Coastguard Worker   const unsigned kSolid     = 1 << 2;
47*f6dc9357SAndroid Build Coastguard Worker   // const unsigned kRecovery  = 1 << 3;
48*f6dc9357SAndroid Build Coastguard Worker   // const unsigned kLocked    = 1 << 4;
49*f6dc9357SAndroid Build Coastguard Worker }
50*f6dc9357SAndroid Build Coastguard Worker 
51*f6dc9357SAndroid Build Coastguard Worker const unsigned kArcExtraRecordType_Locator  = 1;
52*f6dc9357SAndroid Build Coastguard Worker const unsigned kArcExtraRecordType_Metadata = 2;
53*f6dc9357SAndroid Build Coastguard Worker 
54*f6dc9357SAndroid Build Coastguard Worker namespace NLocatorFlags
55*f6dc9357SAndroid Build Coastguard Worker {
56*f6dc9357SAndroid Build Coastguard Worker   const unsigned kQuickOpen  = 1 << 0;
57*f6dc9357SAndroid Build Coastguard Worker   const unsigned kRecovery   = 1 << 1;
58*f6dc9357SAndroid Build Coastguard Worker }
59*f6dc9357SAndroid Build Coastguard Worker 
60*f6dc9357SAndroid Build Coastguard Worker namespace NMetadataFlags
61*f6dc9357SAndroid Build Coastguard Worker {
62*f6dc9357SAndroid Build Coastguard Worker   const unsigned kArcName   = 1 << 0;
63*f6dc9357SAndroid Build Coastguard Worker   const unsigned kCTime     = 1 << 1;
64*f6dc9357SAndroid Build Coastguard Worker   const unsigned kUnixTime  = 1 << 2;
65*f6dc9357SAndroid Build Coastguard Worker   const unsigned kNanoSec   = 1 << 3;
66*f6dc9357SAndroid Build Coastguard Worker }
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker namespace NFileFlags
69*f6dc9357SAndroid Build Coastguard Worker {
70*f6dc9357SAndroid Build Coastguard Worker   const unsigned kIsDir    = 1 << 0;
71*f6dc9357SAndroid Build Coastguard Worker   const unsigned kUnixTime = 1 << 1;
72*f6dc9357SAndroid Build Coastguard Worker   const unsigned kCrc32    = 1 << 2;
73*f6dc9357SAndroid Build Coastguard Worker   const unsigned kUnknownSize = 1 << 3;
74*f6dc9357SAndroid Build Coastguard Worker }
75*f6dc9357SAndroid Build Coastguard Worker 
76*f6dc9357SAndroid Build Coastguard Worker namespace NMethodFlags
77*f6dc9357SAndroid Build Coastguard Worker {
78*f6dc9357SAndroid Build Coastguard Worker   // const unsigned kVersionMask = 0x3F;
79*f6dc9357SAndroid Build Coastguard Worker   const unsigned kSolid = 1 << 6;
80*f6dc9357SAndroid Build Coastguard Worker   const unsigned kRar5_Compat = 1u << 20;
81*f6dc9357SAndroid Build Coastguard Worker }
82*f6dc9357SAndroid Build Coastguard Worker 
83*f6dc9357SAndroid Build Coastguard Worker namespace NArcEndFlags
84*f6dc9357SAndroid Build Coastguard Worker {
85*f6dc9357SAndroid Build Coastguard Worker   const unsigned kMoreVols = 1 << 0;
86*f6dc9357SAndroid Build Coastguard Worker }
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker enum EHostOS
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker   kHost_Windows = 0,
91*f6dc9357SAndroid Build Coastguard Worker   kHost_Unix
92*f6dc9357SAndroid Build Coastguard Worker };
93*f6dc9357SAndroid Build Coastguard Worker 
94*f6dc9357SAndroid Build Coastguard Worker 
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker // ---------- Extra ----------
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker namespace NExtraID
99*f6dc9357SAndroid Build Coastguard Worker {
100*f6dc9357SAndroid Build Coastguard Worker   enum
101*f6dc9357SAndroid Build Coastguard Worker   {
102*f6dc9357SAndroid Build Coastguard Worker     kCrypto = 1,
103*f6dc9357SAndroid Build Coastguard Worker     kHash,
104*f6dc9357SAndroid Build Coastguard Worker     kTime,
105*f6dc9357SAndroid Build Coastguard Worker     kVersion,
106*f6dc9357SAndroid Build Coastguard Worker     kLink,
107*f6dc9357SAndroid Build Coastguard Worker     kUnixOwner,
108*f6dc9357SAndroid Build Coastguard Worker     kSubdata
109*f6dc9357SAndroid Build Coastguard Worker   };
110*f6dc9357SAndroid Build Coastguard Worker }
111*f6dc9357SAndroid Build Coastguard Worker 
112*f6dc9357SAndroid Build Coastguard Worker const unsigned kCryptoAlgo_AES = 0;
113*f6dc9357SAndroid Build Coastguard Worker 
114*f6dc9357SAndroid Build Coastguard Worker namespace NCryptoFlags
115*f6dc9357SAndroid Build Coastguard Worker {
116*f6dc9357SAndroid Build Coastguard Worker   const unsigned kPswCheck = 1 << 0;
117*f6dc9357SAndroid Build Coastguard Worker   const unsigned kUseMAC   = 1 << 1;
118*f6dc9357SAndroid Build Coastguard Worker }
119*f6dc9357SAndroid Build Coastguard Worker 
120*f6dc9357SAndroid Build Coastguard Worker struct CCryptoInfo
121*f6dc9357SAndroid Build Coastguard Worker {
122*f6dc9357SAndroid Build Coastguard Worker   UInt64 Algo;
123*f6dc9357SAndroid Build Coastguard Worker   UInt64 Flags;
124*f6dc9357SAndroid Build Coastguard Worker   Byte Cnt;
125*f6dc9357SAndroid Build Coastguard Worker 
UseMACCCryptoInfo126*f6dc9357SAndroid Build Coastguard Worker   bool UseMAC()       const { return (Flags & NCryptoFlags::kUseMAC) != 0; }
IsThereCheckCCryptoInfo127*f6dc9357SAndroid Build Coastguard Worker   bool IsThereCheck() const { return (Flags & NCryptoFlags::kPswCheck) != 0; }
128*f6dc9357SAndroid Build Coastguard Worker   bool Parse(const Byte *p, size_t size);
129*f6dc9357SAndroid Build Coastguard Worker };
130*f6dc9357SAndroid Build Coastguard Worker 
131*f6dc9357SAndroid Build Coastguard Worker const unsigned kHashID_Blake2sp = 0;
132*f6dc9357SAndroid Build Coastguard Worker 
133*f6dc9357SAndroid Build Coastguard Worker namespace NTimeRecord
134*f6dc9357SAndroid Build Coastguard Worker {
135*f6dc9357SAndroid Build Coastguard Worker   enum
136*f6dc9357SAndroid Build Coastguard Worker   {
137*f6dc9357SAndroid Build Coastguard Worker     k_Index_MTime = 0,
138*f6dc9357SAndroid Build Coastguard Worker     k_Index_CTime,
139*f6dc9357SAndroid Build Coastguard Worker     k_Index_ATime
140*f6dc9357SAndroid Build Coastguard Worker   };
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker   namespace NFlags
143*f6dc9357SAndroid Build Coastguard Worker   {
144*f6dc9357SAndroid Build Coastguard Worker     const unsigned kUnixTime = 1 << 0;
145*f6dc9357SAndroid Build Coastguard Worker     const unsigned kMTime    = 1 << 1;
146*f6dc9357SAndroid Build Coastguard Worker     const unsigned kCTime    = 1 << 2;
147*f6dc9357SAndroid Build Coastguard Worker     const unsigned kATime    = 1 << 3;
148*f6dc9357SAndroid Build Coastguard Worker     const unsigned kUnixNs   = 1 << 4;
149*f6dc9357SAndroid Build Coastguard Worker   }
150*f6dc9357SAndroid Build Coastguard Worker }
151*f6dc9357SAndroid Build Coastguard Worker 
152*f6dc9357SAndroid Build Coastguard Worker namespace NLinkType
153*f6dc9357SAndroid Build Coastguard Worker {
154*f6dc9357SAndroid Build Coastguard Worker   enum
155*f6dc9357SAndroid Build Coastguard Worker   {
156*f6dc9357SAndroid Build Coastguard Worker     kUnixSymLink = 1,
157*f6dc9357SAndroid Build Coastguard Worker     kWinSymLink,
158*f6dc9357SAndroid Build Coastguard Worker     kWinJunction,
159*f6dc9357SAndroid Build Coastguard Worker     kHardLink,
160*f6dc9357SAndroid Build Coastguard Worker     kFileCopy
161*f6dc9357SAndroid Build Coastguard Worker   };
162*f6dc9357SAndroid Build Coastguard Worker }
163*f6dc9357SAndroid Build Coastguard Worker 
164*f6dc9357SAndroid Build Coastguard Worker namespace NLinkFlags
165*f6dc9357SAndroid Build Coastguard Worker {
166*f6dc9357SAndroid Build Coastguard Worker   const unsigned kTargetIsDir = 1 << 0;
167*f6dc9357SAndroid Build Coastguard Worker }
168*f6dc9357SAndroid Build Coastguard Worker 
169*f6dc9357SAndroid Build Coastguard Worker 
170*f6dc9357SAndroid Build Coastguard Worker struct CLinkInfo
171*f6dc9357SAndroid Build Coastguard Worker {
172*f6dc9357SAndroid Build Coastguard Worker   UInt64 Type;
173*f6dc9357SAndroid Build Coastguard Worker   UInt64 Flags;
174*f6dc9357SAndroid Build Coastguard Worker   unsigned NameOffset;
175*f6dc9357SAndroid Build Coastguard Worker   unsigned NameLen;
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker   bool Parse(const Byte *p, unsigned size);
178*f6dc9357SAndroid Build Coastguard Worker };
179*f6dc9357SAndroid Build Coastguard Worker 
180*f6dc9357SAndroid Build Coastguard Worker 
181*f6dc9357SAndroid Build Coastguard Worker struct CItem
182*f6dc9357SAndroid Build Coastguard Worker {
183*f6dc9357SAndroid Build Coastguard Worker   UInt32 CommonFlags;
184*f6dc9357SAndroid Build Coastguard Worker   UInt32 Flags;
185*f6dc9357SAndroid Build Coastguard Worker 
186*f6dc9357SAndroid Build Coastguard Worker   Byte RecordType;
187*f6dc9357SAndroid Build Coastguard Worker   bool Version_Defined;
188*f6dc9357SAndroid Build Coastguard Worker 
189*f6dc9357SAndroid Build Coastguard Worker   int ACL;
190*f6dc9357SAndroid Build Coastguard Worker 
191*f6dc9357SAndroid Build Coastguard Worker   AString Name;
192*f6dc9357SAndroid Build Coastguard Worker 
193*f6dc9357SAndroid Build Coastguard Worker   unsigned VolIndex;
194*f6dc9357SAndroid Build Coastguard Worker   int NextItem;        // in _items{}
195*f6dc9357SAndroid Build Coastguard Worker 
196*f6dc9357SAndroid Build Coastguard Worker   UInt32 UnixMTime;
197*f6dc9357SAndroid Build Coastguard Worker   UInt32 CRC;
198*f6dc9357SAndroid Build Coastguard Worker   UInt32 Attrib;
199*f6dc9357SAndroid Build Coastguard Worker   UInt32 Method;
200*f6dc9357SAndroid Build Coastguard Worker 
201*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer Extra;
202*f6dc9357SAndroid Build Coastguard Worker 
203*f6dc9357SAndroid Build Coastguard Worker   UInt64 Size;
204*f6dc9357SAndroid Build Coastguard Worker   UInt64 PackSize;
205*f6dc9357SAndroid Build Coastguard Worker   UInt64 HostOS;
206*f6dc9357SAndroid Build Coastguard Worker 
207*f6dc9357SAndroid Build Coastguard Worker   UInt64 DataPos;
208*f6dc9357SAndroid Build Coastguard Worker   UInt64 Version;
209*f6dc9357SAndroid Build Coastguard Worker 
CItemCItem210*f6dc9357SAndroid Build Coastguard Worker   CItem() { Clear(); }
211*f6dc9357SAndroid Build Coastguard Worker 
ClearCItem212*f6dc9357SAndroid Build Coastguard Worker   void Clear()
213*f6dc9357SAndroid Build Coastguard Worker   {
214*f6dc9357SAndroid Build Coastguard Worker     // CommonFlags = 0;
215*f6dc9357SAndroid Build Coastguard Worker     // Flags = 0;
216*f6dc9357SAndroid Build Coastguard Worker 
217*f6dc9357SAndroid Build Coastguard Worker     // UnixMTime = 0;
218*f6dc9357SAndroid Build Coastguard Worker     // CRC = 0;
219*f6dc9357SAndroid Build Coastguard Worker 
220*f6dc9357SAndroid Build Coastguard Worker     VolIndex = 0;
221*f6dc9357SAndroid Build Coastguard Worker     NextItem = -1;
222*f6dc9357SAndroid Build Coastguard Worker 
223*f6dc9357SAndroid Build Coastguard Worker     Version_Defined = false;
224*f6dc9357SAndroid Build Coastguard Worker     Version = 0;
225*f6dc9357SAndroid Build Coastguard Worker 
226*f6dc9357SAndroid Build Coastguard Worker     Name.Empty();
227*f6dc9357SAndroid Build Coastguard Worker     Extra.Free();
228*f6dc9357SAndroid Build Coastguard Worker     ACL = -1;
229*f6dc9357SAndroid Build Coastguard Worker   }
230*f6dc9357SAndroid Build Coastguard Worker 
IsSplitBeforeCItem231*f6dc9357SAndroid Build Coastguard Worker   bool IsSplitBefore()  const { return (CommonFlags & NHeaderFlags::kPrevVol) != 0; }
IsSplitAfterCItem232*f6dc9357SAndroid Build Coastguard Worker   bool IsSplitAfter()   const { return (CommonFlags & NHeaderFlags::kNextVol) != 0; }
IsSplitCItem233*f6dc9357SAndroid Build Coastguard Worker   bool IsSplit()        const { return (CommonFlags & (NHeaderFlags::kPrevVol | NHeaderFlags::kNextVol)) != 0; }
234*f6dc9357SAndroid Build Coastguard Worker 
IsDirCItem235*f6dc9357SAndroid Build Coastguard Worker   bool IsDir()          const { return (Flags & NFileFlags::kIsDir) != 0; }
Has_UnixMTimeCItem236*f6dc9357SAndroid Build Coastguard Worker   bool Has_UnixMTime()  const { return (Flags & NFileFlags::kUnixTime) != 0; }
Has_CRCCItem237*f6dc9357SAndroid Build Coastguard Worker   bool Has_CRC()        const { return (Flags & NFileFlags::kCrc32) != 0; }
Is_UnknownSizeCItem238*f6dc9357SAndroid Build Coastguard Worker   bool Is_UnknownSize() const { return (Flags & NFileFlags::kUnknownSize) != 0; }
239*f6dc9357SAndroid Build Coastguard Worker 
IsNextForItemCItem240*f6dc9357SAndroid Build Coastguard Worker   bool IsNextForItem(const CItem &prev) const
241*f6dc9357SAndroid Build Coastguard Worker   {
242*f6dc9357SAndroid Build Coastguard Worker     return !IsDir() && !prev.IsDir() && IsSplitBefore() && prev.IsSplitAfter() && (Name == prev.Name);
243*f6dc9357SAndroid Build Coastguard Worker       // && false;
244*f6dc9357SAndroid Build Coastguard Worker   }
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker   // rar docs: Solid flag can be set only for file headers and is never set for service headers.
IsSolidCItem247*f6dc9357SAndroid Build Coastguard Worker   bool IsSolid()        const { return ((UInt32)Method & NMethodFlags::kSolid) != 0; }
Is_Rar5_CompatCItem248*f6dc9357SAndroid Build Coastguard Worker   bool Is_Rar5_Compat() const { return ((UInt32)Method & NMethodFlags::kRar5_Compat) != 0; }
Get_Rar5_CompatBitCItem249*f6dc9357SAndroid Build Coastguard Worker   unsigned Get_Rar5_CompatBit() const { return ((UInt32)Method >> 20) & 1; }
250*f6dc9357SAndroid Build Coastguard Worker 
Get_AlgoVersion_RawBitsCItem251*f6dc9357SAndroid Build Coastguard Worker   unsigned Get_AlgoVersion_RawBits() const { return (unsigned)Method & 0x3F; }
Get_AlgoVersion_HuffRevCItem252*f6dc9357SAndroid Build Coastguard Worker   unsigned Get_AlgoVersion_HuffRev() const
253*f6dc9357SAndroid Build Coastguard Worker   {
254*f6dc9357SAndroid Build Coastguard Worker     unsigned w = (unsigned)Method & 0x3F;
255*f6dc9357SAndroid Build Coastguard Worker     if (w == 1 && Is_Rar5_Compat())
256*f6dc9357SAndroid Build Coastguard Worker       w = 0;
257*f6dc9357SAndroid Build Coastguard Worker     return w;
258*f6dc9357SAndroid Build Coastguard Worker   }
Get_MethodCItem259*f6dc9357SAndroid Build Coastguard Worker   unsigned Get_Method() const { return ((unsigned)Method >> 7) & 0x7; }
260*f6dc9357SAndroid Build Coastguard Worker 
Get_DictSize_MainCItem261*f6dc9357SAndroid Build Coastguard Worker   unsigned Get_DictSize_Main() const
262*f6dc9357SAndroid Build Coastguard Worker     { return ((UInt32)Method >> 10) & (Get_AlgoVersion_RawBits() == 0 ? 0xf : 0x1f); }
Get_DictSize_FracCItem263*f6dc9357SAndroid Build Coastguard Worker   unsigned Get_DictSize_Frac() const
264*f6dc9357SAndroid Build Coastguard Worker   {
265*f6dc9357SAndroid Build Coastguard Worker     // original-unrar ignores Frac, if (algo==0) (rar5):
266*f6dc9357SAndroid Build Coastguard Worker     if (Get_AlgoVersion_RawBits() == 0)
267*f6dc9357SAndroid Build Coastguard Worker       return 0;
268*f6dc9357SAndroid Build Coastguard Worker     return ((UInt32)Method >> 15) & 0x1f;
269*f6dc9357SAndroid Build Coastguard Worker   }
Get_DictSize64CItem270*f6dc9357SAndroid Build Coastguard Worker   UInt64 Get_DictSize64() const
271*f6dc9357SAndroid Build Coastguard Worker   {
272*f6dc9357SAndroid Build Coastguard Worker     // ver 6.* check
273*f6dc9357SAndroid Build Coastguard Worker     // return (((UInt32)Method >> 10) & 0xF);
274*f6dc9357SAndroid Build Coastguard Worker     UInt64 winSize = 0;
275*f6dc9357SAndroid Build Coastguard Worker     const unsigned algo = Get_AlgoVersion_RawBits();
276*f6dc9357SAndroid Build Coastguard Worker     if (algo <= 1)
277*f6dc9357SAndroid Build Coastguard Worker     {
278*f6dc9357SAndroid Build Coastguard Worker       UInt32 w = 32;
279*f6dc9357SAndroid Build Coastguard Worker       if (algo == 1)
280*f6dc9357SAndroid Build Coastguard Worker         w += Get_DictSize_Frac();
281*f6dc9357SAndroid Build Coastguard Worker       winSize = (UInt64)w << (12 + Get_DictSize_Main());
282*f6dc9357SAndroid Build Coastguard Worker     }
283*f6dc9357SAndroid Build Coastguard Worker     return winSize;
284*f6dc9357SAndroid Build Coastguard Worker   }
285*f6dc9357SAndroid Build Coastguard Worker 
286*f6dc9357SAndroid Build Coastguard Worker 
IsServiceCItem287*f6dc9357SAndroid Build Coastguard Worker   bool IsService() const { return RecordType == NHeaderType::kService; }
288*f6dc9357SAndroid Build Coastguard Worker 
Is_STMCItem289*f6dc9357SAndroid Build Coastguard Worker   bool Is_STM() const { return IsService() && Name == "STM"; }
Is_CMTCItem290*f6dc9357SAndroid Build Coastguard Worker   bool Is_CMT() const { return IsService() && Name == "CMT"; }
Is_ACLCItem291*f6dc9357SAndroid Build Coastguard Worker   bool Is_ACL() const { return IsService() && Name == "ACL"; }
292*f6dc9357SAndroid Build Coastguard Worker   // bool Is_QO()  const { return IsService() && Name == "QO"; }
293*f6dc9357SAndroid Build Coastguard Worker 
294*f6dc9357SAndroid Build Coastguard Worker   int FindExtra(unsigned extraID, unsigned &recordDataSize) const;
295*f6dc9357SAndroid Build Coastguard Worker   void PrintInfo(AString &s) const;
296*f6dc9357SAndroid Build Coastguard Worker 
297*f6dc9357SAndroid Build Coastguard Worker 
IsEncryptedCItem298*f6dc9357SAndroid Build Coastguard Worker   bool IsEncrypted() const
299*f6dc9357SAndroid Build Coastguard Worker   {
300*f6dc9357SAndroid Build Coastguard Worker     unsigned size;
301*f6dc9357SAndroid Build Coastguard Worker     return FindExtra(NExtraID::kCrypto, size) >= 0;
302*f6dc9357SAndroid Build Coastguard Worker   }
303*f6dc9357SAndroid Build Coastguard Worker 
FindExtra_BlakeCItem304*f6dc9357SAndroid Build Coastguard Worker   int FindExtra_Blake() const
305*f6dc9357SAndroid Build Coastguard Worker   {
306*f6dc9357SAndroid Build Coastguard Worker     unsigned size = 0;
307*f6dc9357SAndroid Build Coastguard Worker     const int offset = FindExtra(NExtraID::kHash, size);
308*f6dc9357SAndroid Build Coastguard Worker     if (offset >= 0
309*f6dc9357SAndroid Build Coastguard Worker         && size == Z7_BLAKE2S_DIGEST_SIZE + 1
310*f6dc9357SAndroid Build Coastguard Worker         && Extra[(unsigned)offset] == kHashID_Blake2sp)
311*f6dc9357SAndroid Build Coastguard Worker       return offset + 1;
312*f6dc9357SAndroid Build Coastguard Worker     return -1;
313*f6dc9357SAndroid Build Coastguard Worker   }
314*f6dc9357SAndroid Build Coastguard Worker 
315*f6dc9357SAndroid Build Coastguard Worker   bool FindExtra_Version(UInt64 &version) const;
316*f6dc9357SAndroid Build Coastguard Worker 
317*f6dc9357SAndroid Build Coastguard Worker   bool FindExtra_Link(CLinkInfo &link) const;
318*f6dc9357SAndroid Build Coastguard Worker   void Link_to_Prop(unsigned linkType, NWindows::NCOM::CPropVariant &prop) const;
319*f6dc9357SAndroid Build Coastguard Worker   bool Is_CopyLink() const;
320*f6dc9357SAndroid Build Coastguard Worker   bool Is_HardLink() const;
321*f6dc9357SAndroid Build Coastguard Worker   bool Is_CopyLink_or_HardLink() const;
322*f6dc9357SAndroid Build Coastguard Worker 
NeedUse_as_CopyLinkCItem323*f6dc9357SAndroid Build Coastguard Worker   bool NeedUse_as_CopyLink() const { return PackSize == 0 && Is_CopyLink(); }
NeedUse_as_HardLinkCItem324*f6dc9357SAndroid Build Coastguard Worker   bool NeedUse_as_HardLink() const { return PackSize == 0 && Is_HardLink(); }
NeedUse_as_CopyLink_or_HardLinkCItem325*f6dc9357SAndroid Build Coastguard Worker   bool NeedUse_as_CopyLink_or_HardLink() const { return PackSize == 0 && Is_CopyLink_or_HardLink(); }
326*f6dc9357SAndroid Build Coastguard Worker 
327*f6dc9357SAndroid Build Coastguard Worker   bool GetAltStreamName(AString &name) const;
328*f6dc9357SAndroid Build Coastguard Worker 
GetWinAttribCItem329*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetWinAttrib() const
330*f6dc9357SAndroid Build Coastguard Worker   {
331*f6dc9357SAndroid Build Coastguard Worker     UInt32 a;
332*f6dc9357SAndroid Build Coastguard Worker     switch (HostOS)
333*f6dc9357SAndroid Build Coastguard Worker     {
334*f6dc9357SAndroid Build Coastguard Worker       case kHost_Windows:
335*f6dc9357SAndroid Build Coastguard Worker           a = Attrib;
336*f6dc9357SAndroid Build Coastguard Worker           break;
337*f6dc9357SAndroid Build Coastguard Worker       case kHost_Unix:
338*f6dc9357SAndroid Build Coastguard Worker           a = Attrib << 16;
339*f6dc9357SAndroid Build Coastguard Worker           a |= 0x8000; // add posix mode marker
340*f6dc9357SAndroid Build Coastguard Worker           break;
341*f6dc9357SAndroid Build Coastguard Worker       default:
342*f6dc9357SAndroid Build Coastguard Worker           a = 0;
343*f6dc9357SAndroid Build Coastguard Worker     }
344*f6dc9357SAndroid Build Coastguard Worker     if (IsDir()) a |= FILE_ATTRIBUTE_DIRECTORY;
345*f6dc9357SAndroid Build Coastguard Worker     return a;
346*f6dc9357SAndroid Build Coastguard Worker   }
347*f6dc9357SAndroid Build Coastguard Worker 
GetDataPositionCItem348*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetDataPosition() const { return DataPos; }
349*f6dc9357SAndroid Build Coastguard Worker };
350*f6dc9357SAndroid Build Coastguard Worker 
351*f6dc9357SAndroid Build Coastguard Worker 
352*f6dc9357SAndroid Build Coastguard Worker struct CInArcInfo
353*f6dc9357SAndroid Build Coastguard Worker {
354*f6dc9357SAndroid Build Coastguard Worker   UInt64 Flags;
355*f6dc9357SAndroid Build Coastguard Worker   UInt64 VolNumber;
356*f6dc9357SAndroid Build Coastguard Worker   UInt64 StartPos;
357*f6dc9357SAndroid Build Coastguard Worker   UInt64 EndPos;
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker   UInt64 EndFlags;
360*f6dc9357SAndroid Build Coastguard Worker   bool EndOfArchive_was_Read;
361*f6dc9357SAndroid Build Coastguard Worker 
362*f6dc9357SAndroid Build Coastguard Worker   bool IsEncrypted;
363*f6dc9357SAndroid Build Coastguard Worker   bool Locator_Defined;
364*f6dc9357SAndroid Build Coastguard Worker   bool Locator_Error;
365*f6dc9357SAndroid Build Coastguard Worker   bool Metadata_Defined;
366*f6dc9357SAndroid Build Coastguard Worker   bool Metadata_Error;
367*f6dc9357SAndroid Build Coastguard Worker   bool UnknownExtraRecord;
368*f6dc9357SAndroid Build Coastguard Worker   bool Extra_Error;
369*f6dc9357SAndroid Build Coastguard Worker   bool UnsupportedFeature;
370*f6dc9357SAndroid Build Coastguard Worker 
371*f6dc9357SAndroid Build Coastguard Worker   struct CLocator
372*f6dc9357SAndroid Build Coastguard Worker   {
373*f6dc9357SAndroid Build Coastguard Worker     UInt64 Flags;
374*f6dc9357SAndroid Build Coastguard Worker     UInt64 QuickOpen;
375*f6dc9357SAndroid Build Coastguard Worker     UInt64 Recovery;
376*f6dc9357SAndroid Build Coastguard Worker 
Is_QuickOpenCInArcInfo::CLocator377*f6dc9357SAndroid Build Coastguard Worker     bool Is_QuickOpen() const { return (Flags & NLocatorFlags::kQuickOpen) != 0; }
Is_RecoveryCInArcInfo::CLocator378*f6dc9357SAndroid Build Coastguard Worker     bool Is_Recovery() const { return (Flags & NLocatorFlags::kRecovery) != 0; }
379*f6dc9357SAndroid Build Coastguard Worker 
380*f6dc9357SAndroid Build Coastguard Worker     bool Parse(const Byte *p, size_t size);
CLocatorCInArcInfo::CLocator381*f6dc9357SAndroid Build Coastguard Worker     CLocator():
382*f6dc9357SAndroid Build Coastguard Worker       Flags(0),
383*f6dc9357SAndroid Build Coastguard Worker       QuickOpen(0),
384*f6dc9357SAndroid Build Coastguard Worker       Recovery(0)
385*f6dc9357SAndroid Build Coastguard Worker       {}
386*f6dc9357SAndroid Build Coastguard Worker   };
387*f6dc9357SAndroid Build Coastguard Worker 
388*f6dc9357SAndroid Build Coastguard Worker   struct CMetadata
389*f6dc9357SAndroid Build Coastguard Worker   {
390*f6dc9357SAndroid Build Coastguard Worker     UInt64 Flags;
391*f6dc9357SAndroid Build Coastguard Worker     UInt64 CTime;
392*f6dc9357SAndroid Build Coastguard Worker     AString ArcName;
393*f6dc9357SAndroid Build Coastguard Worker 
394*f6dc9357SAndroid Build Coastguard Worker     bool Parse(const Byte *p, size_t size);
CMetadataCInArcInfo::CMetadata395*f6dc9357SAndroid Build Coastguard Worker     CMetadata():
396*f6dc9357SAndroid Build Coastguard Worker       Flags(0),
397*f6dc9357SAndroid Build Coastguard Worker       CTime(0)
398*f6dc9357SAndroid Build Coastguard Worker       {}
399*f6dc9357SAndroid Build Coastguard Worker   };
400*f6dc9357SAndroid Build Coastguard Worker 
401*f6dc9357SAndroid Build Coastguard Worker   CLocator Locator;
402*f6dc9357SAndroid Build Coastguard Worker   CMetadata Metadata;
403*f6dc9357SAndroid Build Coastguard Worker 
404*f6dc9357SAndroid Build Coastguard Worker   bool ParseExtra(const Byte *p, size_t size);
405*f6dc9357SAndroid Build Coastguard Worker 
CInArcInfoCInArcInfo406*f6dc9357SAndroid Build Coastguard Worker   CInArcInfo():
407*f6dc9357SAndroid Build Coastguard Worker     Flags(0),
408*f6dc9357SAndroid Build Coastguard Worker     VolNumber(0),
409*f6dc9357SAndroid Build Coastguard Worker     StartPos(0),
410*f6dc9357SAndroid Build Coastguard Worker     EndPos(0),
411*f6dc9357SAndroid Build Coastguard Worker     EndFlags(0),
412*f6dc9357SAndroid Build Coastguard Worker     EndOfArchive_was_Read(false),
413*f6dc9357SAndroid Build Coastguard Worker     IsEncrypted(false),
414*f6dc9357SAndroid Build Coastguard Worker     Locator_Defined(false),
415*f6dc9357SAndroid Build Coastguard Worker     Locator_Error(false),
416*f6dc9357SAndroid Build Coastguard Worker     Metadata_Defined(false),
417*f6dc9357SAndroid Build Coastguard Worker     Metadata_Error(false),
418*f6dc9357SAndroid Build Coastguard Worker     UnknownExtraRecord(false),
419*f6dc9357SAndroid Build Coastguard Worker     Extra_Error(false),
420*f6dc9357SAndroid Build Coastguard Worker     UnsupportedFeature(false)
421*f6dc9357SAndroid Build Coastguard Worker       {}
422*f6dc9357SAndroid Build Coastguard Worker 
423*f6dc9357SAndroid Build Coastguard Worker   /*
424*f6dc9357SAndroid Build Coastguard Worker   void Clear()
425*f6dc9357SAndroid Build Coastguard Worker   {
426*f6dc9357SAndroid Build Coastguard Worker     Flags = 0;
427*f6dc9357SAndroid Build Coastguard Worker     VolNumber = 0;
428*f6dc9357SAndroid Build Coastguard Worker     StartPos = 0;
429*f6dc9357SAndroid Build Coastguard Worker     EndPos = 0;
430*f6dc9357SAndroid Build Coastguard Worker     EndFlags = 0;
431*f6dc9357SAndroid Build Coastguard Worker     EndOfArchive_was_Read = false;
432*f6dc9357SAndroid Build Coastguard Worker   }
433*f6dc9357SAndroid Build Coastguard Worker   */
434*f6dc9357SAndroid Build Coastguard Worker 
GetPhySizeCInArcInfo435*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetPhySize() const { return EndPos - StartPos; }
436*f6dc9357SAndroid Build Coastguard Worker 
AreMoreVolumesCInArcInfo437*f6dc9357SAndroid Build Coastguard Worker   bool AreMoreVolumes()  const { return (EndFlags & NArcEndFlags::kMoreVols) != 0; }
438*f6dc9357SAndroid Build Coastguard Worker 
IsVolumeCInArcInfo439*f6dc9357SAndroid Build Coastguard Worker   bool IsVolume()             const { return (Flags & NArcFlags::kVol) != 0; }
IsSolidCInArcInfo440*f6dc9357SAndroid Build Coastguard Worker   bool IsSolid()              const { return (Flags & NArcFlags::kSolid) != 0; }
Is_VolNumber_DefinedCInArcInfo441*f6dc9357SAndroid Build Coastguard Worker   bool Is_VolNumber_Defined() const { return (Flags & NArcFlags::kVolNumber) != 0; }
442*f6dc9357SAndroid Build Coastguard Worker 
GetVolIndexCInArcInfo443*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetVolIndex() const { return Is_VolNumber_Defined() ? VolNumber : 0; }
444*f6dc9357SAndroid Build Coastguard Worker };
445*f6dc9357SAndroid Build Coastguard Worker 
446*f6dc9357SAndroid Build Coastguard Worker 
447*f6dc9357SAndroid Build Coastguard Worker struct CRefItem
448*f6dc9357SAndroid Build Coastguard Worker {
449*f6dc9357SAndroid Build Coastguard Worker   unsigned Item;   // First item in _items[]
450*f6dc9357SAndroid Build Coastguard Worker   unsigned Last;   // Last  item in _items[]
451*f6dc9357SAndroid Build Coastguard Worker   int Parent;      // in _refs[], if alternate stream
452*f6dc9357SAndroid Build Coastguard Worker   int Link;        // in _refs[]
453*f6dc9357SAndroid Build Coastguard Worker };
454*f6dc9357SAndroid Build Coastguard Worker 
455*f6dc9357SAndroid Build Coastguard Worker 
456*f6dc9357SAndroid Build Coastguard Worker struct CArc
457*f6dc9357SAndroid Build Coastguard Worker {
458*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> Stream;
459*f6dc9357SAndroid Build Coastguard Worker   CInArcInfo Info;
460*f6dc9357SAndroid Build Coastguard Worker };
461*f6dc9357SAndroid Build Coastguard Worker 
462*f6dc9357SAndroid Build Coastguard Worker 
463*f6dc9357SAndroid Build Coastguard Worker class CHandler Z7_final:
464*f6dc9357SAndroid Build Coastguard Worker   public IInArchive,
465*f6dc9357SAndroid Build Coastguard Worker   public IArchiveGetRawProps,
466*f6dc9357SAndroid Build Coastguard Worker   public ISetProperties,
467*f6dc9357SAndroid Build Coastguard Worker   Z7_PUBLIC_ISetCompressCodecsInfo_IFEC
468*f6dc9357SAndroid Build Coastguard Worker   public CMyUnknownImp
469*f6dc9357SAndroid Build Coastguard Worker {
470*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_BEGIN2(IInArchive)
471*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(IArchiveGetRawProps)
472*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY(ISetProperties)
473*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_ENTRY_ISetCompressCodecsInfo_IFEC
474*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_QI_END
475*f6dc9357SAndroid Build Coastguard Worker   Z7_COM_ADDREF_RELEASE
476*f6dc9357SAndroid Build Coastguard Worker 
477*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(IInArchive)
478*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(IArchiveGetRawProps)
479*f6dc9357SAndroid Build Coastguard Worker   Z7_IFACE_COM7_IMP(ISetProperties)
480*f6dc9357SAndroid Build Coastguard Worker   DECL_ISetCompressCodecsInfo
481*f6dc9357SAndroid Build Coastguard Worker 
482*f6dc9357SAndroid Build Coastguard Worker   void InitDefaults();
483*f6dc9357SAndroid Build Coastguard Worker 
484*f6dc9357SAndroid Build Coastguard Worker   bool _isArc;
485*f6dc9357SAndroid Build Coastguard Worker   bool _needChecksumCheck;
486*f6dc9357SAndroid Build Coastguard Worker   bool _memUsage_WasSet;
487*f6dc9357SAndroid Build Coastguard Worker   bool _comment_WasUsedInArc;
488*f6dc9357SAndroid Build Coastguard Worker   bool _acl_Used;
489*f6dc9357SAndroid Build Coastguard Worker   bool _error_in_ACL;
490*f6dc9357SAndroid Build Coastguard Worker   bool _split_Error;
491*f6dc9357SAndroid Build Coastguard Worker public:
492*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CRefItem> _refs;
493*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CItem> _items;
494*f6dc9357SAndroid Build Coastguard Worker 
495*f6dc9357SAndroid Build Coastguard Worker   CHandler();
496*f6dc9357SAndroid Build Coastguard Worker private:
497*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CArc> _arcs;
498*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CByteBuffer> _acls;
499*f6dc9357SAndroid Build Coastguard Worker 
500*f6dc9357SAndroid Build Coastguard Worker   UInt32 _errorFlags;
501*f6dc9357SAndroid Build Coastguard Worker   // UInt32 _warningFlags;
502*f6dc9357SAndroid Build Coastguard Worker 
503*f6dc9357SAndroid Build Coastguard Worker   UInt32 _numBlocks;
504*f6dc9357SAndroid Build Coastguard Worker   unsigned _rar5comapt_mask;
505*f6dc9357SAndroid Build Coastguard Worker   unsigned _methodMasks[2];
506*f6dc9357SAndroid Build Coastguard Worker   UInt64 _algo_Mask;
507*f6dc9357SAndroid Build Coastguard Worker   UInt64 _dictMaxSizes[2];
508*f6dc9357SAndroid Build Coastguard Worker 
509*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer _comment;
510*f6dc9357SAndroid Build Coastguard Worker   UString _missingVolName;
511*f6dc9357SAndroid Build Coastguard Worker 
512*f6dc9357SAndroid Build Coastguard Worker   UInt64 _memUsage_Decompress;
513*f6dc9357SAndroid Build Coastguard Worker 
514*f6dc9357SAndroid Build Coastguard Worker   DECL_EXTERNAL_CODECS_VARS
515*f6dc9357SAndroid Build Coastguard Worker 
516*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetPackSize(unsigned refIndex) const;
517*f6dc9357SAndroid Build Coastguard Worker 
518*f6dc9357SAndroid Build Coastguard Worker   void FillLinks();
519*f6dc9357SAndroid Build Coastguard Worker 
520*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open2(IInStream *stream,
521*f6dc9357SAndroid Build Coastguard Worker       const UInt64 *maxCheckStartPosition,
522*f6dc9357SAndroid Build Coastguard Worker       IArchiveOpenCallback *openCallback);
523*f6dc9357SAndroid Build Coastguard Worker };
524*f6dc9357SAndroid Build Coastguard Worker 
525*f6dc9357SAndroid Build Coastguard Worker }}
526*f6dc9357SAndroid Build Coastguard Worker 
527*f6dc9357SAndroid Build Coastguard Worker #endif
528