xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/7z/7zIn.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // 7zIn.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_7Z_IN_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_7Z_IN_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
7*f6dc9357SAndroid Build Coastguard Worker 
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Windows/PropVariant.h"
9*f6dc9357SAndroid Build Coastguard Worker 
10*f6dc9357SAndroid Build Coastguard Worker #include "../../IPassword.h"
11*f6dc9357SAndroid Build Coastguard Worker #include "../../IStream.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/CreateCoder.h"
14*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/InBuffer.h"
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker #include "7zItem.h"
17*f6dc9357SAndroid Build Coastguard Worker 
18*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
19*f6dc9357SAndroid Build Coastguard Worker namespace N7z {
20*f6dc9357SAndroid Build Coastguard Worker 
21*f6dc9357SAndroid Build Coastguard Worker /*
22*f6dc9357SAndroid Build Coastguard Worker   We don't need to init isEncrypted and passwordIsDefined
23*f6dc9357SAndroid Build Coastguard Worker   We must upgrade them only */
24*f6dc9357SAndroid Build Coastguard Worker 
25*f6dc9357SAndroid Build Coastguard Worker #ifdef Z7_NO_CRYPTO
26*f6dc9357SAndroid Build Coastguard Worker #define Z7_7Z_DECODER_CRYPRO_VARS_DECL
27*f6dc9357SAndroid Build Coastguard Worker #define Z7_7Z_DECODER_CRYPRO_VARS
28*f6dc9357SAndroid Build Coastguard Worker #else
29*f6dc9357SAndroid Build Coastguard Worker #define Z7_7Z_DECODER_CRYPRO_VARS_DECL , ICryptoGetTextPassword *getTextPassword, bool &isEncrypted, bool &passwordIsDefined, UString &password
30*f6dc9357SAndroid Build Coastguard Worker #define Z7_7Z_DECODER_CRYPRO_VARS , getTextPassword, isEncrypted, passwordIsDefined, password
31*f6dc9357SAndroid Build Coastguard Worker #endif
32*f6dc9357SAndroid Build Coastguard Worker 
33*f6dc9357SAndroid Build Coastguard Worker struct CParsedMethods
34*f6dc9357SAndroid Build Coastguard Worker {
35*f6dc9357SAndroid Build Coastguard Worker   Byte Lzma2Prop;
36*f6dc9357SAndroid Build Coastguard Worker   UInt32 LzmaDic;
37*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt64> IDs;
38*f6dc9357SAndroid Build Coastguard Worker 
CParsedMethodsCParsedMethods39*f6dc9357SAndroid Build Coastguard Worker   CParsedMethods(): Lzma2Prop(0), LzmaDic(0) {}
40*f6dc9357SAndroid Build Coastguard Worker };
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker struct CFolderEx: public CFolder
43*f6dc9357SAndroid Build Coastguard Worker {
44*f6dc9357SAndroid Build Coastguard Worker   unsigned UnpackCoder;
45*f6dc9357SAndroid Build Coastguard Worker };
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker struct CFolders
48*f6dc9357SAndroid Build Coastguard Worker {
49*f6dc9357SAndroid Build Coastguard Worker   CNum NumPackStreams;
50*f6dc9357SAndroid Build Coastguard Worker   CNum NumFolders;
51*f6dc9357SAndroid Build Coastguard Worker 
52*f6dc9357SAndroid Build Coastguard Worker   CObjArray<UInt64> PackPositions; // NumPackStreams + 1
53*f6dc9357SAndroid Build Coastguard Worker   // CUInt32DefVector PackCRCs; // we don't use PackCRCs now
54*f6dc9357SAndroid Build Coastguard Worker 
55*f6dc9357SAndroid Build Coastguard Worker   CUInt32DefVector FolderCRCs;             // NumFolders
56*f6dc9357SAndroid Build Coastguard Worker   CObjArray<CNum> NumUnpackStreamsVector;  // NumFolders
57*f6dc9357SAndroid Build Coastguard Worker 
58*f6dc9357SAndroid Build Coastguard Worker   CObjArray<UInt64> CoderUnpackSizes;      // including unpack sizes of bond coders
59*f6dc9357SAndroid Build Coastguard Worker   CObjArray<CNum> FoToCoderUnpackSizes;    // NumFolders + 1
60*f6dc9357SAndroid Build Coastguard Worker   CObjArray<CNum> FoStartPackStreamIndex;  // NumFolders + 1
61*f6dc9357SAndroid Build Coastguard Worker   CObjArray<Byte> FoToMainUnpackSizeIndex; // NumFolders
62*f6dc9357SAndroid Build Coastguard Worker 
63*f6dc9357SAndroid Build Coastguard Worker   CObjArray<size_t> FoCodersDataOffset;    // NumFolders + 1
64*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer CodersData;
65*f6dc9357SAndroid Build Coastguard Worker 
66*f6dc9357SAndroid Build Coastguard Worker   CParsedMethods ParsedMethods;
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker   void ParseFolderInfo(unsigned folderIndex, CFolder &folder) const;
ParseFolderExCFolders69*f6dc9357SAndroid Build Coastguard Worker   void ParseFolderEx(unsigned folderIndex, CFolderEx &folder) const
70*f6dc9357SAndroid Build Coastguard Worker   {
71*f6dc9357SAndroid Build Coastguard Worker     ParseFolderInfo(folderIndex, folder);
72*f6dc9357SAndroid Build Coastguard Worker     folder.UnpackCoder = FoToMainUnpackSizeIndex[folderIndex];
73*f6dc9357SAndroid Build Coastguard Worker   }
74*f6dc9357SAndroid Build Coastguard Worker 
GetNumFolderUnpackSizesCFolders75*f6dc9357SAndroid Build Coastguard Worker   unsigned GetNumFolderUnpackSizes(unsigned folderIndex) const
76*f6dc9357SAndroid Build Coastguard Worker   {
77*f6dc9357SAndroid Build Coastguard Worker     return (unsigned)(FoToCoderUnpackSizes[folderIndex + 1] - FoToCoderUnpackSizes[folderIndex]);
78*f6dc9357SAndroid Build Coastguard Worker   }
79*f6dc9357SAndroid Build Coastguard Worker 
GetFolderUnpackSizeCFolders80*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetFolderUnpackSize(unsigned folderIndex) const
81*f6dc9357SAndroid Build Coastguard Worker   {
82*f6dc9357SAndroid Build Coastguard Worker     return CoderUnpackSizes[FoToCoderUnpackSizes[folderIndex] + FoToMainUnpackSizeIndex[folderIndex]];
83*f6dc9357SAndroid Build Coastguard Worker   }
84*f6dc9357SAndroid Build Coastguard Worker 
GetStreamPackSizeCFolders85*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetStreamPackSize(unsigned index) const
86*f6dc9357SAndroid Build Coastguard Worker   {
87*f6dc9357SAndroid Build Coastguard Worker     return PackPositions[index + 1] - PackPositions[index];
88*f6dc9357SAndroid Build Coastguard Worker   }
89*f6dc9357SAndroid Build Coastguard Worker 
CFoldersCFolders90*f6dc9357SAndroid Build Coastguard Worker   CFolders(): NumPackStreams(0), NumFolders(0) {}
91*f6dc9357SAndroid Build Coastguard Worker 
ClearCFolders92*f6dc9357SAndroid Build Coastguard Worker   void Clear()
93*f6dc9357SAndroid Build Coastguard Worker   {
94*f6dc9357SAndroid Build Coastguard Worker     NumPackStreams = 0;
95*f6dc9357SAndroid Build Coastguard Worker     PackPositions.Free();
96*f6dc9357SAndroid Build Coastguard Worker     // PackCRCs.Clear();
97*f6dc9357SAndroid Build Coastguard Worker 
98*f6dc9357SAndroid Build Coastguard Worker     NumFolders = 0;
99*f6dc9357SAndroid Build Coastguard Worker     FolderCRCs.Clear();
100*f6dc9357SAndroid Build Coastguard Worker     NumUnpackStreamsVector.Free();
101*f6dc9357SAndroid Build Coastguard Worker     CoderUnpackSizes.Free();
102*f6dc9357SAndroid Build Coastguard Worker     FoToCoderUnpackSizes.Free();
103*f6dc9357SAndroid Build Coastguard Worker     FoStartPackStreamIndex.Free();
104*f6dc9357SAndroid Build Coastguard Worker     FoToMainUnpackSizeIndex.Free();
105*f6dc9357SAndroid Build Coastguard Worker     FoCodersDataOffset.Free();
106*f6dc9357SAndroid Build Coastguard Worker     CodersData.Free();
107*f6dc9357SAndroid Build Coastguard Worker   }
108*f6dc9357SAndroid Build Coastguard Worker };
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker struct CDatabase: public CFolders
111*f6dc9357SAndroid Build Coastguard Worker {
112*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CFileItem> Files;
113*f6dc9357SAndroid Build Coastguard Worker 
114*f6dc9357SAndroid Build Coastguard Worker   CUInt64DefVector CTime;
115*f6dc9357SAndroid Build Coastguard Worker   CUInt64DefVector ATime;
116*f6dc9357SAndroid Build Coastguard Worker   CUInt64DefVector MTime;
117*f6dc9357SAndroid Build Coastguard Worker   CUInt64DefVector StartPos;
118*f6dc9357SAndroid Build Coastguard Worker   CUInt32DefVector Attrib;
119*f6dc9357SAndroid Build Coastguard Worker   CBoolVector IsAnti;
120*f6dc9357SAndroid Build Coastguard Worker   /*
121*f6dc9357SAndroid Build Coastguard Worker   CBoolVector IsAux;
122*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer SecureBuf;
123*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt32> SecureIDs;
124*f6dc9357SAndroid Build Coastguard Worker   */
125*f6dc9357SAndroid Build Coastguard Worker 
126*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer NamesBuf;
127*f6dc9357SAndroid Build Coastguard Worker   CObjArray<size_t> NameOffsets; // numFiles + 1, offsets of utf-16 symbols
128*f6dc9357SAndroid Build Coastguard Worker 
129*f6dc9357SAndroid Build Coastguard Worker   /*
130*f6dc9357SAndroid Build Coastguard Worker   void ClearSecure()
131*f6dc9357SAndroid Build Coastguard Worker   {
132*f6dc9357SAndroid Build Coastguard Worker     SecureBuf.Free();
133*f6dc9357SAndroid Build Coastguard Worker     SecureIDs.Clear();
134*f6dc9357SAndroid Build Coastguard Worker   }
135*f6dc9357SAndroid Build Coastguard Worker   */
136*f6dc9357SAndroid Build Coastguard Worker 
ClearCDatabase137*f6dc9357SAndroid Build Coastguard Worker   void Clear()
138*f6dc9357SAndroid Build Coastguard Worker   {
139*f6dc9357SAndroid Build Coastguard Worker     CFolders::Clear();
140*f6dc9357SAndroid Build Coastguard Worker     // ClearSecure();
141*f6dc9357SAndroid Build Coastguard Worker 
142*f6dc9357SAndroid Build Coastguard Worker     NamesBuf.Free();
143*f6dc9357SAndroid Build Coastguard Worker     NameOffsets.Free();
144*f6dc9357SAndroid Build Coastguard Worker 
145*f6dc9357SAndroid Build Coastguard Worker     Files.Clear();
146*f6dc9357SAndroid Build Coastguard Worker     CTime.Clear();
147*f6dc9357SAndroid Build Coastguard Worker     ATime.Clear();
148*f6dc9357SAndroid Build Coastguard Worker     MTime.Clear();
149*f6dc9357SAndroid Build Coastguard Worker     StartPos.Clear();
150*f6dc9357SAndroid Build Coastguard Worker     Attrib.Clear();
151*f6dc9357SAndroid Build Coastguard Worker     IsAnti.Clear();
152*f6dc9357SAndroid Build Coastguard Worker     // IsAux.Clear();
153*f6dc9357SAndroid Build Coastguard Worker   }
154*f6dc9357SAndroid Build Coastguard Worker 
IsSolidCDatabase155*f6dc9357SAndroid Build Coastguard Worker   bool IsSolid() const
156*f6dc9357SAndroid Build Coastguard Worker   {
157*f6dc9357SAndroid Build Coastguard Worker     for (CNum i = 0; i < NumFolders; i++)
158*f6dc9357SAndroid Build Coastguard Worker       if (NumUnpackStreamsVector[i] > 1)
159*f6dc9357SAndroid Build Coastguard Worker         return true;
160*f6dc9357SAndroid Build Coastguard Worker     return false;
161*f6dc9357SAndroid Build Coastguard Worker   }
IsItemAntiCDatabase162*f6dc9357SAndroid Build Coastguard Worker   bool IsItemAnti(unsigned index) const { return (index < IsAnti.Size() && IsAnti[index]); }
163*f6dc9357SAndroid Build Coastguard Worker   // bool IsItemAux(unsigned index) const { return (index < IsAux.Size() && IsAux[index]); }
164*f6dc9357SAndroid Build Coastguard Worker 
165*f6dc9357SAndroid Build Coastguard Worker   /*
166*f6dc9357SAndroid Build Coastguard Worker   const void* GetName(unsigned index) const
167*f6dc9357SAndroid Build Coastguard Worker   {
168*f6dc9357SAndroid Build Coastguard Worker     if (!NameOffsets || !NamesBuf)
169*f6dc9357SAndroid Build Coastguard Worker       return NULL;
170*f6dc9357SAndroid Build Coastguard Worker     return (void *)((const Byte *)NamesBuf + NameOffsets[index] * 2);
171*f6dc9357SAndroid Build Coastguard Worker   };
172*f6dc9357SAndroid Build Coastguard Worker   */
173*f6dc9357SAndroid Build Coastguard Worker   void GetPath(unsigned index, UString &path) const;
174*f6dc9357SAndroid Build Coastguard Worker   HRESULT GetPath_Prop(unsigned index, PROPVARIANT *path) const throw();
175*f6dc9357SAndroid Build Coastguard Worker };
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker 
178*f6dc9357SAndroid Build Coastguard Worker struct CInArchiveInfo
179*f6dc9357SAndroid Build Coastguard Worker {
180*f6dc9357SAndroid Build Coastguard Worker   CArchiveVersion Version;
181*f6dc9357SAndroid Build Coastguard Worker   UInt64 StartPosition;               // in stream
182*f6dc9357SAndroid Build Coastguard Worker   UInt64 StartPositionAfterHeader;    // in stream
183*f6dc9357SAndroid Build Coastguard Worker   UInt64 DataStartPosition;           // in stream
184*f6dc9357SAndroid Build Coastguard Worker   UInt64 DataStartPosition2;          // in stream. it's for headers
185*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<UInt64> FileInfoPopIDs;
186*f6dc9357SAndroid Build Coastguard Worker 
ClearCInArchiveInfo187*f6dc9357SAndroid Build Coastguard Worker   void Clear()
188*f6dc9357SAndroid Build Coastguard Worker   {
189*f6dc9357SAndroid Build Coastguard Worker     StartPosition = 0;
190*f6dc9357SAndroid Build Coastguard Worker     StartPositionAfterHeader = 0;
191*f6dc9357SAndroid Build Coastguard Worker     DataStartPosition = 0;
192*f6dc9357SAndroid Build Coastguard Worker     DataStartPosition2 = 0;
193*f6dc9357SAndroid Build Coastguard Worker     FileInfoPopIDs.Clear();
194*f6dc9357SAndroid Build Coastguard Worker   }
195*f6dc9357SAndroid Build Coastguard Worker };
196*f6dc9357SAndroid Build Coastguard Worker 
197*f6dc9357SAndroid Build Coastguard Worker 
198*f6dc9357SAndroid Build Coastguard Worker struct CDbEx: public CDatabase
199*f6dc9357SAndroid Build Coastguard Worker {
200*f6dc9357SAndroid Build Coastguard Worker   CInArchiveInfo ArcInfo;
201*f6dc9357SAndroid Build Coastguard Worker 
202*f6dc9357SAndroid Build Coastguard Worker   CObjArray<CNum> FolderStartFileIndex;
203*f6dc9357SAndroid Build Coastguard Worker   CObjArray<CNum> FileIndexToFolderIndexMap;
204*f6dc9357SAndroid Build Coastguard Worker 
205*f6dc9357SAndroid Build Coastguard Worker   UInt64 HeadersSize;
206*f6dc9357SAndroid Build Coastguard Worker   UInt64 PhySize;
207*f6dc9357SAndroid Build Coastguard Worker   // UInt64 EndHeaderOffset; // relative to position after StartHeader (32 bytes)
208*f6dc9357SAndroid Build Coastguard Worker 
209*f6dc9357SAndroid Build Coastguard Worker   /*
210*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<size_t> SecureOffsets;
211*f6dc9357SAndroid Build Coastguard Worker   bool IsTree;
212*f6dc9357SAndroid Build Coastguard Worker   bool ThereAreAltStreams;
213*f6dc9357SAndroid Build Coastguard Worker   */
214*f6dc9357SAndroid Build Coastguard Worker 
215*f6dc9357SAndroid Build Coastguard Worker   bool IsArc;
216*f6dc9357SAndroid Build Coastguard Worker   bool PhySizeWasConfirmed;
217*f6dc9357SAndroid Build Coastguard Worker 
218*f6dc9357SAndroid Build Coastguard Worker   bool ThereIsHeaderError;
219*f6dc9357SAndroid Build Coastguard Worker   bool UnexpectedEnd;
220*f6dc9357SAndroid Build Coastguard Worker   // bool UnsupportedVersion;
221*f6dc9357SAndroid Build Coastguard Worker 
222*f6dc9357SAndroid Build Coastguard Worker   bool StartHeaderWasRecovered;
223*f6dc9357SAndroid Build Coastguard Worker   bool UnsupportedFeatureWarning;
224*f6dc9357SAndroid Build Coastguard Worker   bool UnsupportedFeatureError;
225*f6dc9357SAndroid Build Coastguard Worker 
226*f6dc9357SAndroid Build Coastguard Worker   /*
227*f6dc9357SAndroid Build Coastguard Worker   void ClearSecureEx()
228*f6dc9357SAndroid Build Coastguard Worker   {
229*f6dc9357SAndroid Build Coastguard Worker     ClearSecure();
230*f6dc9357SAndroid Build Coastguard Worker     SecureOffsets.Clear();
231*f6dc9357SAndroid Build Coastguard Worker   }
232*f6dc9357SAndroid Build Coastguard Worker   */
233*f6dc9357SAndroid Build Coastguard Worker 
ClearCDbEx234*f6dc9357SAndroid Build Coastguard Worker   void Clear()
235*f6dc9357SAndroid Build Coastguard Worker   {
236*f6dc9357SAndroid Build Coastguard Worker     IsArc = false;
237*f6dc9357SAndroid Build Coastguard Worker     PhySizeWasConfirmed = false;
238*f6dc9357SAndroid Build Coastguard Worker 
239*f6dc9357SAndroid Build Coastguard Worker     ThereIsHeaderError = false;
240*f6dc9357SAndroid Build Coastguard Worker     UnexpectedEnd = false;
241*f6dc9357SAndroid Build Coastguard Worker     // UnsupportedVersion = false;
242*f6dc9357SAndroid Build Coastguard Worker 
243*f6dc9357SAndroid Build Coastguard Worker     StartHeaderWasRecovered = false;
244*f6dc9357SAndroid Build Coastguard Worker     UnsupportedFeatureError = false;
245*f6dc9357SAndroid Build Coastguard Worker     UnsupportedFeatureWarning = false;
246*f6dc9357SAndroid Build Coastguard Worker 
247*f6dc9357SAndroid Build Coastguard Worker     /*
248*f6dc9357SAndroid Build Coastguard Worker     IsTree = false;
249*f6dc9357SAndroid Build Coastguard Worker     ThereAreAltStreams = false;
250*f6dc9357SAndroid Build Coastguard Worker     */
251*f6dc9357SAndroid Build Coastguard Worker 
252*f6dc9357SAndroid Build Coastguard Worker     CDatabase::Clear();
253*f6dc9357SAndroid Build Coastguard Worker 
254*f6dc9357SAndroid Build Coastguard Worker     // SecureOffsets.Clear();
255*f6dc9357SAndroid Build Coastguard Worker     ArcInfo.Clear();
256*f6dc9357SAndroid Build Coastguard Worker     FolderStartFileIndex.Free();
257*f6dc9357SAndroid Build Coastguard Worker     FileIndexToFolderIndexMap.Free();
258*f6dc9357SAndroid Build Coastguard Worker 
259*f6dc9357SAndroid Build Coastguard Worker     HeadersSize = 0;
260*f6dc9357SAndroid Build Coastguard Worker     PhySize = 0;
261*f6dc9357SAndroid Build Coastguard Worker     // EndHeaderOffset = 0;
262*f6dc9357SAndroid Build Coastguard Worker   }
263*f6dc9357SAndroid Build Coastguard Worker 
CanUpdateCDbEx264*f6dc9357SAndroid Build Coastguard Worker   bool CanUpdate() const
265*f6dc9357SAndroid Build Coastguard Worker   {
266*f6dc9357SAndroid Build Coastguard Worker     if (ThereIsHeaderError
267*f6dc9357SAndroid Build Coastguard Worker         || UnexpectedEnd
268*f6dc9357SAndroid Build Coastguard Worker         || StartHeaderWasRecovered
269*f6dc9357SAndroid Build Coastguard Worker         || UnsupportedFeatureError)
270*f6dc9357SAndroid Build Coastguard Worker       return false;
271*f6dc9357SAndroid Build Coastguard Worker     return true;
272*f6dc9357SAndroid Build Coastguard Worker   }
273*f6dc9357SAndroid Build Coastguard Worker 
274*f6dc9357SAndroid Build Coastguard Worker   void FillLinks();
275*f6dc9357SAndroid Build Coastguard Worker 
GetFolderStreamPosCDbEx276*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetFolderStreamPos(size_t folderIndex, size_t indexInFolder) const
277*f6dc9357SAndroid Build Coastguard Worker   {
278*f6dc9357SAndroid Build Coastguard Worker     return ArcInfo.DataStartPosition + PackPositions.ConstData()
279*f6dc9357SAndroid Build Coastguard Worker         [FoStartPackStreamIndex.ConstData()[folderIndex] + indexInFolder];
280*f6dc9357SAndroid Build Coastguard Worker   }
281*f6dc9357SAndroid Build Coastguard Worker 
GetFolderFullPackSizeCDbEx282*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetFolderFullPackSize(size_t folderIndex) const
283*f6dc9357SAndroid Build Coastguard Worker   {
284*f6dc9357SAndroid Build Coastguard Worker     return
285*f6dc9357SAndroid Build Coastguard Worker       PackPositions[FoStartPackStreamIndex.ConstData()[folderIndex + 1]] -
286*f6dc9357SAndroid Build Coastguard Worker       PackPositions[FoStartPackStreamIndex.ConstData()[folderIndex]];
287*f6dc9357SAndroid Build Coastguard Worker   }
288*f6dc9357SAndroid Build Coastguard Worker 
GetFolderPackStreamSizeCDbEx289*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetFolderPackStreamSize(size_t folderIndex, size_t streamIndex) const
290*f6dc9357SAndroid Build Coastguard Worker   {
291*f6dc9357SAndroid Build Coastguard Worker     const size_t i = FoStartPackStreamIndex.ConstData()[folderIndex] + streamIndex;
292*f6dc9357SAndroid Build Coastguard Worker     return PackPositions.ConstData()[i + 1] -
293*f6dc9357SAndroid Build Coastguard Worker            PackPositions.ConstData()[i];
294*f6dc9357SAndroid Build Coastguard Worker   }
295*f6dc9357SAndroid Build Coastguard Worker 
296*f6dc9357SAndroid Build Coastguard Worker   /*
297*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetFilePackSize(size_t fileIndex) const
298*f6dc9357SAndroid Build Coastguard Worker   {
299*f6dc9357SAndroid Build Coastguard Worker     const CNum folderIndex = FileIndexToFolderIndexMap[fileIndex];
300*f6dc9357SAndroid Build Coastguard Worker     if (folderIndex != kNumNoIndex)
301*f6dc9357SAndroid Build Coastguard Worker       if (FolderStartFileIndex[folderIndex] == fileIndex)
302*f6dc9357SAndroid Build Coastguard Worker         return GetFolderFullPackSize(folderIndex);
303*f6dc9357SAndroid Build Coastguard Worker     return 0;
304*f6dc9357SAndroid Build Coastguard Worker   }
305*f6dc9357SAndroid Build Coastguard Worker   */
306*f6dc9357SAndroid Build Coastguard Worker };
307*f6dc9357SAndroid Build Coastguard Worker 
308*f6dc9357SAndroid Build Coastguard Worker const unsigned kNumBufLevelsMax = 4;
309*f6dc9357SAndroid Build Coastguard Worker 
310*f6dc9357SAndroid Build Coastguard Worker struct CInByte2
311*f6dc9357SAndroid Build Coastguard Worker {
312*f6dc9357SAndroid Build Coastguard Worker   const Byte *_buffer;
313*f6dc9357SAndroid Build Coastguard Worker public:
314*f6dc9357SAndroid Build Coastguard Worker   size_t _size;
315*f6dc9357SAndroid Build Coastguard Worker   size_t _pos;
316*f6dc9357SAndroid Build Coastguard Worker 
GetRemCInByte2317*f6dc9357SAndroid Build Coastguard Worker   size_t GetRem() const { return _size - _pos; }
GetPtrCInByte2318*f6dc9357SAndroid Build Coastguard Worker   const Byte *GetPtr() const { return _buffer + _pos; }
InitCInByte2319*f6dc9357SAndroid Build Coastguard Worker   void Init(const Byte *buffer, size_t size)
320*f6dc9357SAndroid Build Coastguard Worker   {
321*f6dc9357SAndroid Build Coastguard Worker     _buffer = buffer;
322*f6dc9357SAndroid Build Coastguard Worker     _size = size;
323*f6dc9357SAndroid Build Coastguard Worker     _pos = 0;
324*f6dc9357SAndroid Build Coastguard Worker   }
325*f6dc9357SAndroid Build Coastguard Worker   Byte ReadByte();
326*f6dc9357SAndroid Build Coastguard Worker   void ReadBytes(Byte *data, size_t size);
SkipDataNoCheckCInByte2327*f6dc9357SAndroid Build Coastguard Worker   void SkipDataNoCheck(UInt64 size) { _pos += (size_t)size; }
328*f6dc9357SAndroid Build Coastguard Worker   void SkipData(UInt64 size);
329*f6dc9357SAndroid Build Coastguard Worker 
330*f6dc9357SAndroid Build Coastguard Worker   void SkipData();
SkipRemCInByte2331*f6dc9357SAndroid Build Coastguard Worker   void SkipRem() { _pos = _size; }
332*f6dc9357SAndroid Build Coastguard Worker   UInt64 ReadNumber();
333*f6dc9357SAndroid Build Coastguard Worker   CNum ReadNum();
334*f6dc9357SAndroid Build Coastguard Worker   UInt32 ReadUInt32();
335*f6dc9357SAndroid Build Coastguard Worker   UInt64 ReadUInt64();
336*f6dc9357SAndroid Build Coastguard Worker 
337*f6dc9357SAndroid Build Coastguard Worker   void ParseFolder(CFolder &folder);
338*f6dc9357SAndroid Build Coastguard Worker };
339*f6dc9357SAndroid Build Coastguard Worker 
340*f6dc9357SAndroid Build Coastguard Worker class CStreamSwitch;
341*f6dc9357SAndroid Build Coastguard Worker 
342*f6dc9357SAndroid Build Coastguard Worker const UInt32 kHeaderSize = 32;
343*f6dc9357SAndroid Build Coastguard Worker 
344*f6dc9357SAndroid Build Coastguard Worker class CInArchive
345*f6dc9357SAndroid Build Coastguard Worker {
346*f6dc9357SAndroid Build Coastguard Worker   friend class CStreamSwitch;
347*f6dc9357SAndroid Build Coastguard Worker 
348*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> _stream;
349*f6dc9357SAndroid Build Coastguard Worker 
350*f6dc9357SAndroid Build Coastguard Worker   unsigned _numInByteBufs;
351*f6dc9357SAndroid Build Coastguard Worker   CInByte2 _inByteVector[kNumBufLevelsMax];
352*f6dc9357SAndroid Build Coastguard Worker 
353*f6dc9357SAndroid Build Coastguard Worker   CInByte2 *_inByteBack;
354*f6dc9357SAndroid Build Coastguard Worker   bool ThereIsHeaderError;
355*f6dc9357SAndroid Build Coastguard Worker 
356*f6dc9357SAndroid Build Coastguard Worker   UInt64 _arhiveBeginStreamPosition;
357*f6dc9357SAndroid Build Coastguard Worker   UInt64 _fileEndPosition;
358*f6dc9357SAndroid Build Coastguard Worker 
359*f6dc9357SAndroid Build Coastguard Worker   UInt64 _rangeLimit; // relative to position after StartHeader (32 bytes)
360*f6dc9357SAndroid Build Coastguard Worker 
361*f6dc9357SAndroid Build Coastguard Worker   Byte _header[kHeaderSize];
362*f6dc9357SAndroid Build Coastguard Worker 
363*f6dc9357SAndroid Build Coastguard Worker   UInt64 HeadersSize;
364*f6dc9357SAndroid Build Coastguard Worker 
365*f6dc9357SAndroid Build Coastguard Worker   bool _useMixerMT;
366*f6dc9357SAndroid Build Coastguard Worker 
367*f6dc9357SAndroid Build Coastguard Worker   void AddByteStream(const Byte *buffer, size_t size);
368*f6dc9357SAndroid Build Coastguard Worker 
DeleteByteStream(bool needUpdatePos)369*f6dc9357SAndroid Build Coastguard Worker   void DeleteByteStream(bool needUpdatePos)
370*f6dc9357SAndroid Build Coastguard Worker   {
371*f6dc9357SAndroid Build Coastguard Worker     _numInByteBufs--;
372*f6dc9357SAndroid Build Coastguard Worker     if (_numInByteBufs > 0)
373*f6dc9357SAndroid Build Coastguard Worker     {
374*f6dc9357SAndroid Build Coastguard Worker       _inByteBack = &_inByteVector[_numInByteBufs - 1];
375*f6dc9357SAndroid Build Coastguard Worker       if (needUpdatePos)
376*f6dc9357SAndroid Build Coastguard Worker         _inByteBack->_pos += _inByteVector[_numInByteBufs]._pos;
377*f6dc9357SAndroid Build Coastguard Worker     }
378*f6dc9357SAndroid Build Coastguard Worker   }
379*f6dc9357SAndroid Build Coastguard Worker 
380*f6dc9357SAndroid Build Coastguard Worker   HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
381*f6dc9357SAndroid Build Coastguard Worker 
ReadBytes(Byte * data,size_t size)382*f6dc9357SAndroid Build Coastguard Worker   void ReadBytes(Byte *data, size_t size) { _inByteBack->ReadBytes(data, size); }
ReadByte()383*f6dc9357SAndroid Build Coastguard Worker   Byte ReadByte() { return _inByteBack->ReadByte(); }
ReadNumber()384*f6dc9357SAndroid Build Coastguard Worker   UInt64 ReadNumber() { return _inByteBack->ReadNumber(); }
ReadNum()385*f6dc9357SAndroid Build Coastguard Worker   CNum ReadNum() { return _inByteBack->ReadNum(); }
ReadID()386*f6dc9357SAndroid Build Coastguard Worker   UInt64 ReadID() { return _inByteBack->ReadNumber(); }
ReadUInt32()387*f6dc9357SAndroid Build Coastguard Worker   UInt32 ReadUInt32() { return _inByteBack->ReadUInt32(); }
ReadUInt64()388*f6dc9357SAndroid Build Coastguard Worker   UInt64 ReadUInt64() { return _inByteBack->ReadUInt64(); }
SkipData(UInt64 size)389*f6dc9357SAndroid Build Coastguard Worker   void SkipData(UInt64 size) { _inByteBack->SkipData(size); }
SkipData()390*f6dc9357SAndroid Build Coastguard Worker   void SkipData() { _inByteBack->SkipData(); }
391*f6dc9357SAndroid Build Coastguard Worker   void WaitId(UInt64 id);
392*f6dc9357SAndroid Build Coastguard Worker 
393*f6dc9357SAndroid Build Coastguard Worker   void Read_UInt32_Vector(CUInt32DefVector &v);
394*f6dc9357SAndroid Build Coastguard Worker 
395*f6dc9357SAndroid Build Coastguard Worker   void ReadArchiveProperties(CInArchiveInfo &archiveInfo);
396*f6dc9357SAndroid Build Coastguard Worker   void ReadHashDigests(unsigned numItems, CUInt32DefVector &crcs);
397*f6dc9357SAndroid Build Coastguard Worker 
398*f6dc9357SAndroid Build Coastguard Worker   void ReadPackInfo(CFolders &f);
399*f6dc9357SAndroid Build Coastguard Worker 
400*f6dc9357SAndroid Build Coastguard Worker   void ReadUnpackInfo(
401*f6dc9357SAndroid Build Coastguard Worker       const CObjectVector<CByteBuffer> *dataVector,
402*f6dc9357SAndroid Build Coastguard Worker       CFolders &folders);
403*f6dc9357SAndroid Build Coastguard Worker 
404*f6dc9357SAndroid Build Coastguard Worker   void ReadSubStreamsInfo(
405*f6dc9357SAndroid Build Coastguard Worker       CFolders &folders,
406*f6dc9357SAndroid Build Coastguard Worker       CRecordVector<UInt64> &unpackSizes,
407*f6dc9357SAndroid Build Coastguard Worker       CUInt32DefVector &digests);
408*f6dc9357SAndroid Build Coastguard Worker 
409*f6dc9357SAndroid Build Coastguard Worker   void ReadStreamsInfo(
410*f6dc9357SAndroid Build Coastguard Worker       const CObjectVector<CByteBuffer> *dataVector,
411*f6dc9357SAndroid Build Coastguard Worker       UInt64 &dataOffset,
412*f6dc9357SAndroid Build Coastguard Worker       CFolders &folders,
413*f6dc9357SAndroid Build Coastguard Worker       CRecordVector<UInt64> &unpackSizes,
414*f6dc9357SAndroid Build Coastguard Worker       CUInt32DefVector &digests);
415*f6dc9357SAndroid Build Coastguard Worker 
416*f6dc9357SAndroid Build Coastguard Worker   void ReadBoolVector(unsigned numItems, CBoolVector &v);
417*f6dc9357SAndroid Build Coastguard Worker   void ReadBoolVector2(unsigned numItems, CBoolVector &v);
418*f6dc9357SAndroid Build Coastguard Worker   void ReadUInt64DefVector(const CObjectVector<CByteBuffer> &dataVector,
419*f6dc9357SAndroid Build Coastguard Worker       CUInt64DefVector &v, unsigned numItems);
420*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadAndDecodePackedStreams(
421*f6dc9357SAndroid Build Coastguard Worker       DECL_EXTERNAL_CODECS_LOC_VARS
422*f6dc9357SAndroid Build Coastguard Worker       UInt64 baseOffset, UInt64 &dataOffset,
423*f6dc9357SAndroid Build Coastguard Worker       CObjectVector<CByteBuffer> &dataVector
424*f6dc9357SAndroid Build Coastguard Worker       Z7_7Z_DECODER_CRYPRO_VARS_DECL
425*f6dc9357SAndroid Build Coastguard Worker       );
426*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadHeader(
427*f6dc9357SAndroid Build Coastguard Worker       DECL_EXTERNAL_CODECS_LOC_VARS
428*f6dc9357SAndroid Build Coastguard Worker       CDbEx &db
429*f6dc9357SAndroid Build Coastguard Worker       Z7_7Z_DECODER_CRYPRO_VARS_DECL
430*f6dc9357SAndroid Build Coastguard Worker       );
431*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadDatabase2(
432*f6dc9357SAndroid Build Coastguard Worker       DECL_EXTERNAL_CODECS_LOC_VARS
433*f6dc9357SAndroid Build Coastguard Worker       CDbEx &db
434*f6dc9357SAndroid Build Coastguard Worker       Z7_7Z_DECODER_CRYPRO_VARS_DECL
435*f6dc9357SAndroid Build Coastguard Worker       );
436*f6dc9357SAndroid Build Coastguard Worker public:
CInArchive(bool useMixerMT)437*f6dc9357SAndroid Build Coastguard Worker   CInArchive(bool useMixerMT):
438*f6dc9357SAndroid Build Coastguard Worker       _numInByteBufs(0),
439*f6dc9357SAndroid Build Coastguard Worker       _useMixerMT(useMixerMT)
440*f6dc9357SAndroid Build Coastguard Worker       {}
441*f6dc9357SAndroid Build Coastguard Worker 
442*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive
443*f6dc9357SAndroid Build Coastguard Worker   void Close();
444*f6dc9357SAndroid Build Coastguard Worker 
445*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadDatabase(
446*f6dc9357SAndroid Build Coastguard Worker       DECL_EXTERNAL_CODECS_LOC_VARS
447*f6dc9357SAndroid Build Coastguard Worker       CDbEx &db
448*f6dc9357SAndroid Build Coastguard Worker       Z7_7Z_DECODER_CRYPRO_VARS_DECL
449*f6dc9357SAndroid Build Coastguard Worker       );
450*f6dc9357SAndroid Build Coastguard Worker };
451*f6dc9357SAndroid Build Coastguard Worker 
452*f6dc9357SAndroid Build Coastguard Worker }}
453*f6dc9357SAndroid Build Coastguard Worker 
454*f6dc9357SAndroid Build Coastguard Worker #endif
455