xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/7z/7zItem.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // 7zItem.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_7Z_ITEM_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_7Z_ITEM_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyString.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MethodId.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "7zHeader.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
14*f6dc9357SAndroid Build Coastguard Worker namespace N7z {
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker typedef UInt32 CNum;
17*f6dc9357SAndroid Build Coastguard Worker const CNum kNumMax     = 0x7FFFFFFF;
18*f6dc9357SAndroid Build Coastguard Worker const CNum kNumNoIndex = 0xFFFFFFFF;
19*f6dc9357SAndroid Build Coastguard Worker 
20*f6dc9357SAndroid Build Coastguard Worker struct CCoderInfo
21*f6dc9357SAndroid Build Coastguard Worker {
22*f6dc9357SAndroid Build Coastguard Worker   CMethodId MethodID;
23*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer Props;
24*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumStreams;
25*f6dc9357SAndroid Build Coastguard Worker 
IsSimpleCoderCCoderInfo26*f6dc9357SAndroid Build Coastguard Worker   bool IsSimpleCoder() const { return NumStreams == 1; }
27*f6dc9357SAndroid Build Coastguard Worker };
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker struct CBond
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker   UInt32 PackIndex;
33*f6dc9357SAndroid Build Coastguard Worker   UInt32 UnpackIndex;
34*f6dc9357SAndroid Build Coastguard Worker };
35*f6dc9357SAndroid Build Coastguard Worker 
36*f6dc9357SAndroid Build Coastguard Worker 
37*f6dc9357SAndroid Build Coastguard Worker struct CFolder
38*f6dc9357SAndroid Build Coastguard Worker {
39*f6dc9357SAndroid Build Coastguard Worker   Z7_CLASS_NO_COPY(CFolder)
40*f6dc9357SAndroid Build Coastguard Worker public:
41*f6dc9357SAndroid Build Coastguard Worker   CObjArray2<CCoderInfo> Coders;
42*f6dc9357SAndroid Build Coastguard Worker   CObjArray2<CBond> Bonds;
43*f6dc9357SAndroid Build Coastguard Worker   CObjArray2<UInt32> PackStreams;
44*f6dc9357SAndroid Build Coastguard Worker 
CFolderCFolder45*f6dc9357SAndroid Build Coastguard Worker   CFolder() {}
46*f6dc9357SAndroid Build Coastguard Worker 
IsDecodingSupportedCFolder47*f6dc9357SAndroid Build Coastguard Worker   bool IsDecodingSupported() const { return Coders.Size() <= 32; }
48*f6dc9357SAndroid Build Coastguard Worker 
Find_in_PackStreamsCFolder49*f6dc9357SAndroid Build Coastguard Worker   int Find_in_PackStreams(UInt32 packStream) const
50*f6dc9357SAndroid Build Coastguard Worker   {
51*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR(i, PackStreams)
52*f6dc9357SAndroid Build Coastguard Worker       if (PackStreams[i] == packStream)
53*f6dc9357SAndroid Build Coastguard Worker         return (int)i;
54*f6dc9357SAndroid Build Coastguard Worker     return -1;
55*f6dc9357SAndroid Build Coastguard Worker   }
56*f6dc9357SAndroid Build Coastguard Worker 
FindBond_for_PackStreamCFolder57*f6dc9357SAndroid Build Coastguard Worker   int FindBond_for_PackStream(UInt32 packStream) const
58*f6dc9357SAndroid Build Coastguard Worker   {
59*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR(i, Bonds)
60*f6dc9357SAndroid Build Coastguard Worker       if (Bonds[i].PackIndex == packStream)
61*f6dc9357SAndroid Build Coastguard Worker         return (int)i;
62*f6dc9357SAndroid Build Coastguard Worker     return -1;
63*f6dc9357SAndroid Build Coastguard Worker   }
64*f6dc9357SAndroid Build Coastguard Worker 
65*f6dc9357SAndroid Build Coastguard Worker   /*
66*f6dc9357SAndroid Build Coastguard Worker   int FindBond_for_UnpackStream(UInt32 unpackStream) const
67*f6dc9357SAndroid Build Coastguard Worker   {
68*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR(i, Bonds)
69*f6dc9357SAndroid Build Coastguard Worker       if (Bonds[i].UnpackIndex == unpackStream)
70*f6dc9357SAndroid Build Coastguard Worker         return i;
71*f6dc9357SAndroid Build Coastguard Worker     return -1;
72*f6dc9357SAndroid Build Coastguard Worker   }
73*f6dc9357SAndroid Build Coastguard Worker 
74*f6dc9357SAndroid Build Coastguard Worker   int FindOutCoder() const
75*f6dc9357SAndroid Build Coastguard Worker   {
76*f6dc9357SAndroid Build Coastguard Worker     for (int i = (int)Coders.Size() - 1; i >= 0; i--)
77*f6dc9357SAndroid Build Coastguard Worker       if (FindBond_for_UnpackStream(i) < 0)
78*f6dc9357SAndroid Build Coastguard Worker         return i;
79*f6dc9357SAndroid Build Coastguard Worker     return -1;
80*f6dc9357SAndroid Build Coastguard Worker   }
81*f6dc9357SAndroid Build Coastguard Worker   */
82*f6dc9357SAndroid Build Coastguard Worker 
IsEncryptedCFolder83*f6dc9357SAndroid Build Coastguard Worker   bool IsEncrypted() const
84*f6dc9357SAndroid Build Coastguard Worker   {
85*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR(i, Coders)
86*f6dc9357SAndroid Build Coastguard Worker       if (Coders[i].MethodID == k_AES)
87*f6dc9357SAndroid Build Coastguard Worker         return true;
88*f6dc9357SAndroid Build Coastguard Worker     return false;
89*f6dc9357SAndroid Build Coastguard Worker   }
90*f6dc9357SAndroid Build Coastguard Worker };
91*f6dc9357SAndroid Build Coastguard Worker 
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker struct CUInt32DefVector
94*f6dc9357SAndroid Build Coastguard Worker {
95*f6dc9357SAndroid Build Coastguard Worker   CBoolVector Defs;
96*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> Vals;
97*f6dc9357SAndroid Build Coastguard Worker 
ClearAndSetSizeCUInt32DefVector98*f6dc9357SAndroid Build Coastguard Worker   void ClearAndSetSize(unsigned newSize)
99*f6dc9357SAndroid Build Coastguard Worker   {
100*f6dc9357SAndroid Build Coastguard Worker     Defs.ClearAndSetSize(newSize);
101*f6dc9357SAndroid Build Coastguard Worker     Vals.ClearAndSetSize(newSize);
102*f6dc9357SAndroid Build Coastguard Worker   }
103*f6dc9357SAndroid Build Coastguard Worker 
ClearCUInt32DefVector104*f6dc9357SAndroid Build Coastguard Worker   void Clear()
105*f6dc9357SAndroid Build Coastguard Worker   {
106*f6dc9357SAndroid Build Coastguard Worker     Defs.Clear();
107*f6dc9357SAndroid Build Coastguard Worker     Vals.Clear();
108*f6dc9357SAndroid Build Coastguard Worker   }
109*f6dc9357SAndroid Build Coastguard Worker 
ReserveDownCUInt32DefVector110*f6dc9357SAndroid Build Coastguard Worker   void ReserveDown()
111*f6dc9357SAndroid Build Coastguard Worker   {
112*f6dc9357SAndroid Build Coastguard Worker     Defs.ReserveDown();
113*f6dc9357SAndroid Build Coastguard Worker     Vals.ReserveDown();
114*f6dc9357SAndroid Build Coastguard Worker   }
115*f6dc9357SAndroid Build Coastguard Worker 
GetItemCUInt32DefVector116*f6dc9357SAndroid Build Coastguard Worker   bool GetItem(unsigned index, UInt32 &value) const
117*f6dc9357SAndroid Build Coastguard Worker   {
118*f6dc9357SAndroid Build Coastguard Worker     if (index < Defs.Size() && Defs[index])
119*f6dc9357SAndroid Build Coastguard Worker     {
120*f6dc9357SAndroid Build Coastguard Worker       value = Vals[index];
121*f6dc9357SAndroid Build Coastguard Worker       return true;
122*f6dc9357SAndroid Build Coastguard Worker     }
123*f6dc9357SAndroid Build Coastguard Worker     value = 0;
124*f6dc9357SAndroid Build Coastguard Worker     return false;
125*f6dc9357SAndroid Build Coastguard Worker   }
126*f6dc9357SAndroid Build Coastguard Worker 
ValidAndDefinedCUInt32DefVector127*f6dc9357SAndroid Build Coastguard Worker   bool ValidAndDefined(unsigned i) const { return i < Defs.Size() && Defs[i]; }
128*f6dc9357SAndroid Build Coastguard Worker 
CheckSizeCUInt32DefVector129*f6dc9357SAndroid Build Coastguard Worker   bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; }
130*f6dc9357SAndroid Build Coastguard Worker 
131*f6dc9357SAndroid Build Coastguard Worker   void SetItem(unsigned index, bool defined, UInt32 value);
if_NonEmpty_FillResidue_with_falseCUInt32DefVector132*f6dc9357SAndroid Build Coastguard Worker   void if_NonEmpty_FillResidue_with_false(unsigned numItems)
133*f6dc9357SAndroid Build Coastguard Worker   {
134*f6dc9357SAndroid Build Coastguard Worker     if (Defs.Size() != 0 && Defs.Size() < numItems)
135*f6dc9357SAndroid Build Coastguard Worker       SetItem(numItems - 1, false, 0);
136*f6dc9357SAndroid Build Coastguard Worker   }
137*f6dc9357SAndroid Build Coastguard Worker };
138*f6dc9357SAndroid Build Coastguard Worker 
139*f6dc9357SAndroid Build Coastguard Worker 
140*f6dc9357SAndroid Build Coastguard Worker struct CUInt64DefVector
141*f6dc9357SAndroid Build Coastguard Worker {
142*f6dc9357SAndroid Build Coastguard Worker   CBoolVector Defs;
143*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt64> Vals;
144*f6dc9357SAndroid Build Coastguard Worker 
ClearCUInt64DefVector145*f6dc9357SAndroid Build Coastguard Worker   void Clear()
146*f6dc9357SAndroid Build Coastguard Worker   {
147*f6dc9357SAndroid Build Coastguard Worker     Defs.Clear();
148*f6dc9357SAndroid Build Coastguard Worker     Vals.Clear();
149*f6dc9357SAndroid Build Coastguard Worker   }
150*f6dc9357SAndroid Build Coastguard Worker 
ReserveDownCUInt64DefVector151*f6dc9357SAndroid Build Coastguard Worker   void ReserveDown()
152*f6dc9357SAndroid Build Coastguard Worker   {
153*f6dc9357SAndroid Build Coastguard Worker     Defs.ReserveDown();
154*f6dc9357SAndroid Build Coastguard Worker     Vals.ReserveDown();
155*f6dc9357SAndroid Build Coastguard Worker   }
156*f6dc9357SAndroid Build Coastguard Worker 
GetItemCUInt64DefVector157*f6dc9357SAndroid Build Coastguard Worker   bool GetItem(unsigned index, UInt64 &value) const
158*f6dc9357SAndroid Build Coastguard Worker   {
159*f6dc9357SAndroid Build Coastguard Worker     if (index < Defs.Size() && Defs[index])
160*f6dc9357SAndroid Build Coastguard Worker     {
161*f6dc9357SAndroid Build Coastguard Worker       value = Vals[index];
162*f6dc9357SAndroid Build Coastguard Worker       return true;
163*f6dc9357SAndroid Build Coastguard Worker     }
164*f6dc9357SAndroid Build Coastguard Worker     value = 0;
165*f6dc9357SAndroid Build Coastguard Worker     return false;
166*f6dc9357SAndroid Build Coastguard Worker   }
167*f6dc9357SAndroid Build Coastguard Worker 
CheckSizeCUInt64DefVector168*f6dc9357SAndroid Build Coastguard Worker   bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; }
169*f6dc9357SAndroid Build Coastguard Worker 
170*f6dc9357SAndroid Build Coastguard Worker   void SetItem(unsigned index, bool defined, UInt64 value);
171*f6dc9357SAndroid Build Coastguard Worker };
172*f6dc9357SAndroid Build Coastguard Worker 
173*f6dc9357SAndroid Build Coastguard Worker 
174*f6dc9357SAndroid Build Coastguard Worker struct CFileItem
175*f6dc9357SAndroid Build Coastguard Worker {
176*f6dc9357SAndroid Build Coastguard Worker   UInt64 Size;
177*f6dc9357SAndroid Build Coastguard Worker   UInt32 Crc;
178*f6dc9357SAndroid Build Coastguard Worker   /*
179*f6dc9357SAndroid Build Coastguard Worker   int Parent;
180*f6dc9357SAndroid Build Coastguard Worker   bool IsAltStream;
181*f6dc9357SAndroid Build Coastguard Worker   */
182*f6dc9357SAndroid Build Coastguard Worker   bool HasStream; // Test it !!! it means that there is
183*f6dc9357SAndroid Build Coastguard Worker                   // stream in some folder. It can be empty stream
184*f6dc9357SAndroid Build Coastguard Worker   bool IsDir;
185*f6dc9357SAndroid Build Coastguard Worker   bool CrcDefined;
186*f6dc9357SAndroid Build Coastguard Worker 
187*f6dc9357SAndroid Build Coastguard Worker   /*
188*f6dc9357SAndroid Build Coastguard Worker   void Clear()
189*f6dc9357SAndroid Build Coastguard Worker   {
190*f6dc9357SAndroid Build Coastguard Worker     HasStream = true;
191*f6dc9357SAndroid Build Coastguard Worker     IsDir = false;
192*f6dc9357SAndroid Build Coastguard Worker     CrcDefined = false;
193*f6dc9357SAndroid Build Coastguard Worker   }
194*f6dc9357SAndroid Build Coastguard Worker 
195*f6dc9357SAndroid Build Coastguard Worker   CFileItem():
196*f6dc9357SAndroid Build Coastguard Worker     // Parent(-1),
197*f6dc9357SAndroid Build Coastguard Worker     // IsAltStream(false),
198*f6dc9357SAndroid Build Coastguard Worker     HasStream(true),
199*f6dc9357SAndroid Build Coastguard Worker     IsDir(false),
200*f6dc9357SAndroid Build Coastguard Worker     CrcDefined(false),
201*f6dc9357SAndroid Build Coastguard Worker       {}
202*f6dc9357SAndroid Build Coastguard Worker   */
203*f6dc9357SAndroid Build Coastguard Worker };
204*f6dc9357SAndroid Build Coastguard Worker 
205*f6dc9357SAndroid Build Coastguard Worker }}
206*f6dc9357SAndroid Build Coastguard Worker 
207*f6dc9357SAndroid Build Coastguard Worker #endif
208