xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Cab/CabIn.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Archive/CabIn.h
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_CAB_IN_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_CAB_IN_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
8*f6dc9357SAndroid Build Coastguard Worker 
9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/InBuffer.h"
10*f6dc9357SAndroid Build Coastguard Worker 
11*f6dc9357SAndroid Build Coastguard Worker #include "CabItem.h"
12*f6dc9357SAndroid Build Coastguard Worker 
13*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
14*f6dc9357SAndroid Build Coastguard Worker namespace NCab {
15*f6dc9357SAndroid Build Coastguard Worker 
16*f6dc9357SAndroid Build Coastguard Worker struct COtherArc
17*f6dc9357SAndroid Build Coastguard Worker {
18*f6dc9357SAndroid Build Coastguard Worker   AString FileName;
19*f6dc9357SAndroid Build Coastguard Worker   AString DiskName;
20*f6dc9357SAndroid Build Coastguard Worker 
ClearCOtherArc21*f6dc9357SAndroid Build Coastguard Worker   void Clear()
22*f6dc9357SAndroid Build Coastguard Worker   {
23*f6dc9357SAndroid Build Coastguard Worker     FileName.Empty();
24*f6dc9357SAndroid Build Coastguard Worker     DiskName.Empty();
25*f6dc9357SAndroid Build Coastguard Worker   }
26*f6dc9357SAndroid Build Coastguard Worker };
27*f6dc9357SAndroid Build Coastguard Worker 
28*f6dc9357SAndroid Build Coastguard Worker 
29*f6dc9357SAndroid Build Coastguard Worker struct CArchInfo
30*f6dc9357SAndroid Build Coastguard Worker {
31*f6dc9357SAndroid Build Coastguard Worker   Byte VersionMinor; // cabinet file format version, minor
32*f6dc9357SAndroid Build Coastguard Worker   Byte VersionMajor; // cabinet file format version, major
33*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumFolders; // number of CFFOLDER entries in this cabinet
34*f6dc9357SAndroid Build Coastguard Worker   UInt32 NumFiles;   // number of CFFILE entries in this cabinet
35*f6dc9357SAndroid Build Coastguard Worker   UInt32 Flags;      // cabinet file option indicators
36*f6dc9357SAndroid Build Coastguard Worker   UInt32 SetID;      // must be the same for all cabinets in a set
37*f6dc9357SAndroid Build Coastguard Worker   UInt32 CabinetNumber; // number of this cabinet file in a set
38*f6dc9357SAndroid Build Coastguard Worker 
39*f6dc9357SAndroid Build Coastguard Worker   UInt16 PerCabinet_AreaSize; // (optional) size of per-cabinet reserved area
40*f6dc9357SAndroid Build Coastguard Worker   Byte PerFolder_AreaSize;    // (optional) size of per-folder reserved area
41*f6dc9357SAndroid Build Coastguard Worker   Byte PerDataBlock_AreaSize; // (optional) size of per-datablock reserved area
42*f6dc9357SAndroid Build Coastguard Worker 
43*f6dc9357SAndroid Build Coastguard Worker   COtherArc PrevArc; // prev link can skip some volumes !!!
44*f6dc9357SAndroid Build Coastguard Worker   COtherArc NextArc;
45*f6dc9357SAndroid Build Coastguard Worker 
ReserveBlockPresentCArchInfo46*f6dc9357SAndroid Build Coastguard Worker   bool ReserveBlockPresent() const { return (Flags & NHeader::NArcFlags::kReservePresent) != 0; }
IsTherePrevCArchInfo47*f6dc9357SAndroid Build Coastguard Worker   bool IsTherePrev() const { return (Flags & NHeader::NArcFlags::kPrevCabinet) != 0; }
IsThereNextCArchInfo48*f6dc9357SAndroid Build Coastguard Worker   bool IsThereNext() const { return (Flags & NHeader::NArcFlags::kNextCabinet) != 0; }
GetDataBlockReserveSizeCArchInfo49*f6dc9357SAndroid Build Coastguard Worker   Byte GetDataBlockReserveSize() const { return (Byte)(ReserveBlockPresent() ? PerDataBlock_AreaSize : 0); }
50*f6dc9357SAndroid Build Coastguard Worker 
CArchInfoCArchInfo51*f6dc9357SAndroid Build Coastguard Worker   CArchInfo()
52*f6dc9357SAndroid Build Coastguard Worker   {
53*f6dc9357SAndroid Build Coastguard Worker     PerCabinet_AreaSize = 0;
54*f6dc9357SAndroid Build Coastguard Worker     PerFolder_AreaSize = 0;
55*f6dc9357SAndroid Build Coastguard Worker     PerDataBlock_AreaSize = 0;
56*f6dc9357SAndroid Build Coastguard Worker   }
57*f6dc9357SAndroid Build Coastguard Worker 
ClearCArchInfo58*f6dc9357SAndroid Build Coastguard Worker   void Clear()
59*f6dc9357SAndroid Build Coastguard Worker   {
60*f6dc9357SAndroid Build Coastguard Worker     PerCabinet_AreaSize = 0;
61*f6dc9357SAndroid Build Coastguard Worker     PerFolder_AreaSize = 0;
62*f6dc9357SAndroid Build Coastguard Worker     PerDataBlock_AreaSize = 0;
63*f6dc9357SAndroid Build Coastguard Worker 
64*f6dc9357SAndroid Build Coastguard Worker     PrevArc.Clear();
65*f6dc9357SAndroid Build Coastguard Worker     NextArc.Clear();
66*f6dc9357SAndroid Build Coastguard Worker   }
67*f6dc9357SAndroid Build Coastguard Worker };
68*f6dc9357SAndroid Build Coastguard Worker 
69*f6dc9357SAndroid Build Coastguard Worker 
70*f6dc9357SAndroid Build Coastguard Worker struct CInArcInfo: public CArchInfo
71*f6dc9357SAndroid Build Coastguard Worker {
72*f6dc9357SAndroid Build Coastguard Worker   UInt32 Size; // size of this cabinet file in bytes
73*f6dc9357SAndroid Build Coastguard Worker   UInt32 FileHeadersOffset; // offset of the first CFFILE entry
74*f6dc9357SAndroid Build Coastguard Worker 
75*f6dc9357SAndroid Build Coastguard Worker   bool Parse(const Byte *p);
76*f6dc9357SAndroid Build Coastguard Worker };
77*f6dc9357SAndroid Build Coastguard Worker 
78*f6dc9357SAndroid Build Coastguard Worker 
79*f6dc9357SAndroid Build Coastguard Worker struct CDatabase
80*f6dc9357SAndroid Build Coastguard Worker {
81*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CFolder> Folders;
82*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CItem> Items;
83*f6dc9357SAndroid Build Coastguard Worker   UInt64 StartPosition;
84*f6dc9357SAndroid Build Coastguard Worker   CInArcInfo ArcInfo;
85*f6dc9357SAndroid Build Coastguard Worker 
ClearCDatabase86*f6dc9357SAndroid Build Coastguard Worker   void Clear()
87*f6dc9357SAndroid Build Coastguard Worker   {
88*f6dc9357SAndroid Build Coastguard Worker     ArcInfo.Clear();
89*f6dc9357SAndroid Build Coastguard Worker     Folders.Clear();
90*f6dc9357SAndroid Build Coastguard Worker     Items.Clear();
91*f6dc9357SAndroid Build Coastguard Worker   }
92*f6dc9357SAndroid Build Coastguard Worker 
IsTherePrevFolderCDatabase93*f6dc9357SAndroid Build Coastguard Worker   bool IsTherePrevFolder() const
94*f6dc9357SAndroid Build Coastguard Worker   {
95*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Items)
96*f6dc9357SAndroid Build Coastguard Worker       if (Items[i].ContinuedFromPrev())
97*f6dc9357SAndroid Build Coastguard Worker         return true;
98*f6dc9357SAndroid Build Coastguard Worker     return false;
99*f6dc9357SAndroid Build Coastguard Worker   }
100*f6dc9357SAndroid Build Coastguard Worker 
GetNumberOfNewFoldersCDatabase101*f6dc9357SAndroid Build Coastguard Worker   int GetNumberOfNewFolders() const
102*f6dc9357SAndroid Build Coastguard Worker   {
103*f6dc9357SAndroid Build Coastguard Worker     int res = (int)Folders.Size();
104*f6dc9357SAndroid Build Coastguard Worker     if (IsTherePrevFolder())
105*f6dc9357SAndroid Build Coastguard Worker       res--;
106*f6dc9357SAndroid Build Coastguard Worker     return res;
107*f6dc9357SAndroid Build Coastguard Worker   }
108*f6dc9357SAndroid Build Coastguard Worker };
109*f6dc9357SAndroid Build Coastguard Worker 
110*f6dc9357SAndroid Build Coastguard Worker 
111*f6dc9357SAndroid Build Coastguard Worker struct CDatabaseEx: public CDatabase
112*f6dc9357SAndroid Build Coastguard Worker {
113*f6dc9357SAndroid Build Coastguard Worker   CMyComPtr<IInStream> Stream;
114*f6dc9357SAndroid Build Coastguard Worker };
115*f6dc9357SAndroid Build Coastguard Worker 
116*f6dc9357SAndroid Build Coastguard Worker 
117*f6dc9357SAndroid Build Coastguard Worker struct CMvItem
118*f6dc9357SAndroid Build Coastguard Worker {
119*f6dc9357SAndroid Build Coastguard Worker   unsigned VolumeIndex;
120*f6dc9357SAndroid Build Coastguard Worker   unsigned ItemIndex;
121*f6dc9357SAndroid Build Coastguard Worker };
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker 
124*f6dc9357SAndroid Build Coastguard Worker class CMvDatabaseEx
125*f6dc9357SAndroid Build Coastguard Worker {
126*f6dc9357SAndroid Build Coastguard Worker   bool AreItemsEqual(unsigned i1, unsigned i2);
127*f6dc9357SAndroid Build Coastguard Worker 
128*f6dc9357SAndroid Build Coastguard Worker public:
129*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CDatabaseEx> Volumes;
130*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CMvItem> Items;
131*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<int> StartFolderOfVol; // can be negative
132*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<unsigned> FolderStartFileIndex;
133*f6dc9357SAndroid Build Coastguard Worker 
GetFolderIndex(const CMvItem * mvi)134*f6dc9357SAndroid Build Coastguard Worker   int GetFolderIndex(const CMvItem *mvi) const
135*f6dc9357SAndroid Build Coastguard Worker   {
136*f6dc9357SAndroid Build Coastguard Worker     const CDatabaseEx &db = Volumes[mvi->VolumeIndex];
137*f6dc9357SAndroid Build Coastguard Worker     return StartFolderOfVol[mvi->VolumeIndex] +
138*f6dc9357SAndroid Build Coastguard Worker         db.Items[mvi->ItemIndex].GetFolderIndex(db.Folders.Size());
139*f6dc9357SAndroid Build Coastguard Worker   }
140*f6dc9357SAndroid Build Coastguard Worker 
Clear()141*f6dc9357SAndroid Build Coastguard Worker   void Clear()
142*f6dc9357SAndroid Build Coastguard Worker   {
143*f6dc9357SAndroid Build Coastguard Worker     Volumes.Clear();
144*f6dc9357SAndroid Build Coastguard Worker     Items.Clear();
145*f6dc9357SAndroid Build Coastguard Worker     StartFolderOfVol.Clear();
146*f6dc9357SAndroid Build Coastguard Worker     FolderStartFileIndex.Clear();
147*f6dc9357SAndroid Build Coastguard Worker   }
148*f6dc9357SAndroid Build Coastguard Worker 
149*f6dc9357SAndroid Build Coastguard Worker   void FillSortAndShrink();
150*f6dc9357SAndroid Build Coastguard Worker   bool Check();
151*f6dc9357SAndroid Build Coastguard Worker };
152*f6dc9357SAndroid Build Coastguard Worker 
153*f6dc9357SAndroid Build Coastguard Worker 
154*f6dc9357SAndroid Build Coastguard Worker class CInArchive
155*f6dc9357SAndroid Build Coastguard Worker {
156*f6dc9357SAndroid Build Coastguard Worker   CInBufferBase _inBuffer;
157*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer _tempBuf;
158*f6dc9357SAndroid Build Coastguard Worker 
159*f6dc9357SAndroid Build Coastguard Worker   void Skip(unsigned size);
160*f6dc9357SAndroid Build Coastguard Worker   void Read(Byte *data, unsigned size);
161*f6dc9357SAndroid Build Coastguard Worker   void ReadName(AString &s);
162*f6dc9357SAndroid Build Coastguard Worker   void ReadOtherArc(COtherArc &oa);
163*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open2(CDatabaseEx &db, const UInt64 *searchHeaderSizeLimit);
164*f6dc9357SAndroid Build Coastguard Worker 
165*f6dc9357SAndroid Build Coastguard Worker public:
166*f6dc9357SAndroid Build Coastguard Worker   bool IsArc;
167*f6dc9357SAndroid Build Coastguard Worker   bool ErrorInNames;
168*f6dc9357SAndroid Build Coastguard Worker   bool UnexpectedEnd;
169*f6dc9357SAndroid Build Coastguard Worker   bool HeaderError;
170*f6dc9357SAndroid Build Coastguard Worker 
171*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open(CDatabaseEx &db, const UInt64 *searchHeaderSizeLimit);
172*f6dc9357SAndroid Build Coastguard Worker };
173*f6dc9357SAndroid Build Coastguard Worker 
174*f6dc9357SAndroid Build Coastguard Worker }}
175*f6dc9357SAndroid Build Coastguard Worker 
176*f6dc9357SAndroid Build Coastguard Worker #endif
177