xref: /aosp_15_r20/external/lzma/CPP/7zip/Archive/Udf/UdfIn.h (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
1*f6dc9357SAndroid Build Coastguard Worker // Archive/UdfIn.h -- UDF / ECMA-167
2*f6dc9357SAndroid Build Coastguard Worker 
3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_ARCHIVE_UDF_IN_H
4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_ARCHIVE_UDF_IN_H
5*f6dc9357SAndroid Build Coastguard Worker 
6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/IntToString.h"
7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h"
8*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyCom.h"
9*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyMap.h"
10*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyString.h"
11*f6dc9357SAndroid Build Coastguard Worker 
12*f6dc9357SAndroid Build Coastguard Worker #include "../../IStream.h"
13*f6dc9357SAndroid Build Coastguard Worker 
14*f6dc9357SAndroid Build Coastguard Worker namespace NArchive {
15*f6dc9357SAndroid Build Coastguard Worker namespace NUdf {
16*f6dc9357SAndroid Build Coastguard Worker 
17*f6dc9357SAndroid Build Coastguard Worker // ---------- ECMA Part 1 ----------
18*f6dc9357SAndroid Build Coastguard Worker 
19*f6dc9357SAndroid Build Coastguard Worker // ECMA 1/7.2.12
20*f6dc9357SAndroid Build Coastguard Worker // UDF 2.1.3
21*f6dc9357SAndroid Build Coastguard Worker 
22*f6dc9357SAndroid Build Coastguard Worker struct CDString32
23*f6dc9357SAndroid Build Coastguard Worker {
24*f6dc9357SAndroid Build Coastguard Worker   Byte Data[32];
25*f6dc9357SAndroid Build Coastguard Worker 
ParseCDString3226*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *buf) { memcpy(Data, buf, sizeof(Data)); }
27*f6dc9357SAndroid Build Coastguard Worker   UString GetString() const;
28*f6dc9357SAndroid Build Coastguard Worker };
29*f6dc9357SAndroid Build Coastguard Worker 
30*f6dc9357SAndroid Build Coastguard Worker struct CDString128
31*f6dc9357SAndroid Build Coastguard Worker {
32*f6dc9357SAndroid Build Coastguard Worker   Byte Data[128];
33*f6dc9357SAndroid Build Coastguard Worker 
ParseCDString12834*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *buf) { memcpy(Data, buf, sizeof(Data)); }
35*f6dc9357SAndroid Build Coastguard Worker   UString GetString() const;
36*f6dc9357SAndroid Build Coastguard Worker };
37*f6dc9357SAndroid Build Coastguard Worker 
38*f6dc9357SAndroid Build Coastguard Worker struct CDString
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer Data;
41*f6dc9357SAndroid Build Coastguard Worker 
42*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *p, unsigned size);
43*f6dc9357SAndroid Build Coastguard Worker   UString GetString() const;
44*f6dc9357SAndroid Build Coastguard Worker };
45*f6dc9357SAndroid Build Coastguard Worker 
46*f6dc9357SAndroid Build Coastguard Worker 
47*f6dc9357SAndroid Build Coastguard Worker // ECMA 1/7.3
48*f6dc9357SAndroid Build Coastguard Worker // UDF 2.1.4 timestamp
49*f6dc9357SAndroid Build Coastguard Worker 
50*f6dc9357SAndroid Build Coastguard Worker struct CTime
51*f6dc9357SAndroid Build Coastguard Worker {
52*f6dc9357SAndroid Build Coastguard Worker   Byte Data[12];
53*f6dc9357SAndroid Build Coastguard Worker 
GetTypeCTime54*f6dc9357SAndroid Build Coastguard Worker   unsigned GetType() const { return Data[1] >> 4; }
IsLocalCTime55*f6dc9357SAndroid Build Coastguard Worker   bool IsLocal() const { return GetType() == 1; }
GetMinutesOffsetCTime56*f6dc9357SAndroid Build Coastguard Worker   int GetMinutesOffset() const
57*f6dc9357SAndroid Build Coastguard Worker   {
58*f6dc9357SAndroid Build Coastguard Worker     int t = (Data[0] | ((unsigned)Data[1] << 8)) & 0xFFF;
59*f6dc9357SAndroid Build Coastguard Worker     if ((t >> 11) != 0)
60*f6dc9357SAndroid Build Coastguard Worker       t -= (1 << 12);
61*f6dc9357SAndroid Build Coastguard Worker     return (t > (60 * 24) || t < -(60 * 24)) ? 0 : t;
62*f6dc9357SAndroid Build Coastguard Worker   }
GetYearCTime63*f6dc9357SAndroid Build Coastguard Worker   unsigned GetYear() const { return (Data[2] | ((unsigned)Data[3] << 8)); }
64*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *buf);
65*f6dc9357SAndroid Build Coastguard Worker };
66*f6dc9357SAndroid Build Coastguard Worker 
67*f6dc9357SAndroid Build Coastguard Worker 
68*f6dc9357SAndroid Build Coastguard Worker // ECMA 1/7.4 regid
69*f6dc9357SAndroid Build Coastguard Worker // UDF 2.1.5 EntityID
70*f6dc9357SAndroid Build Coastguard Worker 
71*f6dc9357SAndroid Build Coastguard Worker struct CRegId
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker   Byte Flags;
74*f6dc9357SAndroid Build Coastguard Worker   char Id[23];
75*f6dc9357SAndroid Build Coastguard Worker   Byte Suffix[8];
76*f6dc9357SAndroid Build Coastguard Worker 
77*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *buf);
78*f6dc9357SAndroid Build Coastguard Worker   void AddCommentTo(UString &s) const;
79*f6dc9357SAndroid Build Coastguard Worker   void AddUdfVersionTo(UString &s) const;
80*f6dc9357SAndroid Build Coastguard Worker };
81*f6dc9357SAndroid Build Coastguard Worker 
82*f6dc9357SAndroid Build Coastguard Worker 
83*f6dc9357SAndroid Build Coastguard Worker 
84*f6dc9357SAndroid Build Coastguard Worker // ---------- ECMA Part 3: Volume Structure ----------
85*f6dc9357SAndroid Build Coastguard Worker 
86*f6dc9357SAndroid Build Coastguard Worker // ECMA 3/7.1
87*f6dc9357SAndroid Build Coastguard Worker 
88*f6dc9357SAndroid Build Coastguard Worker struct CExtent
89*f6dc9357SAndroid Build Coastguard Worker {
90*f6dc9357SAndroid Build Coastguard Worker   UInt32 Len;
91*f6dc9357SAndroid Build Coastguard Worker   UInt32 Pos; // logical sector number
92*f6dc9357SAndroid Build Coastguard Worker 
93*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *p);
94*f6dc9357SAndroid Build Coastguard Worker };
95*f6dc9357SAndroid Build Coastguard Worker 
96*f6dc9357SAndroid Build Coastguard Worker 
97*f6dc9357SAndroid Build Coastguard Worker // ECMA 3/10.1
98*f6dc9357SAndroid Build Coastguard Worker // UDF 2.2.2 PrimaryVolumeDescriptor
99*f6dc9357SAndroid Build Coastguard Worker 
100*f6dc9357SAndroid Build Coastguard Worker struct CPrimeVol
101*f6dc9357SAndroid Build Coastguard Worker {
102*f6dc9357SAndroid Build Coastguard Worker   // UInt32 VolumeDescriptorSequenceNumber;
103*f6dc9357SAndroid Build Coastguard Worker   UInt32 PrimaryVolumeDescriptorNumber;
104*f6dc9357SAndroid Build Coastguard Worker   CDString32 VolumeId;
105*f6dc9357SAndroid Build Coastguard Worker   UInt16 VolumeSequenceNumber;
106*f6dc9357SAndroid Build Coastguard Worker   UInt16 MaximumVolumeSequenceNumber;
107*f6dc9357SAndroid Build Coastguard Worker   // UInt16 InterchangeLevel;
108*f6dc9357SAndroid Build Coastguard Worker   // UInt16 MaximumInterchangeLevel;
109*f6dc9357SAndroid Build Coastguard Worker   // UInt32 CharacterSetList;
110*f6dc9357SAndroid Build Coastguard Worker   // UInt32 MaximumCharacterSetList;
111*f6dc9357SAndroid Build Coastguard Worker   CDString128 VolumeSetId;
112*f6dc9357SAndroid Build Coastguard Worker   // charspec DescriptorCharacterSet; // (1/7.2.1)
113*f6dc9357SAndroid Build Coastguard Worker   // charspec ExplanatoryCharacterSet; // (1/7.2.1)
114*f6dc9357SAndroid Build Coastguard Worker   // CExtent VolumeAbstract;
115*f6dc9357SAndroid Build Coastguard Worker   // CExtent VolumeCopyrightNotice;
116*f6dc9357SAndroid Build Coastguard Worker   CRegId ApplicationId;
117*f6dc9357SAndroid Build Coastguard Worker   CTime RecordingTime;
118*f6dc9357SAndroid Build Coastguard Worker   CRegId ImplId;
119*f6dc9357SAndroid Build Coastguard Worker   // bytes ImplementationUse
120*f6dc9357SAndroid Build Coastguard Worker   // UInt32 PredecessorVolumeDescriptorSequenceLocation;
121*f6dc9357SAndroid Build Coastguard Worker   // UInt16 Flags;
122*f6dc9357SAndroid Build Coastguard Worker 
123*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *p);
124*f6dc9357SAndroid Build Coastguard Worker };
125*f6dc9357SAndroid Build Coastguard Worker 
126*f6dc9357SAndroid Build Coastguard Worker 
127*f6dc9357SAndroid Build Coastguard Worker // ECMA 3/10.5
128*f6dc9357SAndroid Build Coastguard Worker // UDF 2.2.14 PartitionDescriptor
129*f6dc9357SAndroid Build Coastguard Worker 
130*f6dc9357SAndroid Build Coastguard Worker struct CPartition
131*f6dc9357SAndroid Build Coastguard Worker {
132*f6dc9357SAndroid Build Coastguard Worker   UInt32 Pos;
133*f6dc9357SAndroid Build Coastguard Worker   UInt32 Len;
134*f6dc9357SAndroid Build Coastguard Worker 
135*f6dc9357SAndroid Build Coastguard Worker   UInt16 Flags;
136*f6dc9357SAndroid Build Coastguard Worker   UInt16 Number;
137*f6dc9357SAndroid Build Coastguard Worker   CRegId ContentsId;
138*f6dc9357SAndroid Build Coastguard Worker   // Byte ContentsUse[128];
139*f6dc9357SAndroid Build Coastguard Worker   UInt32 AccessType;
140*f6dc9357SAndroid Build Coastguard Worker 
141*f6dc9357SAndroid Build Coastguard Worker   CRegId ImplId;
142*f6dc9357SAndroid Build Coastguard Worker   // Byte ImplUse[128];
143*f6dc9357SAndroid Build Coastguard Worker 
144*f6dc9357SAndroid Build Coastguard Worker   // int VolIndex;
145*f6dc9357SAndroid Build Coastguard Worker   CMap32 Map;
146*f6dc9357SAndroid Build Coastguard Worker 
147*f6dc9357SAndroid Build Coastguard Worker   bool IsMetadata;
148*f6dc9357SAndroid Build Coastguard Worker 
CPartitionCPartition149*f6dc9357SAndroid Build Coastguard Worker   CPartition():
150*f6dc9357SAndroid Build Coastguard Worker     //  VolIndex(-1),
151*f6dc9357SAndroid Build Coastguard Worker     IsMetadata(false) {}
152*f6dc9357SAndroid Build Coastguard Worker 
153*f6dc9357SAndroid Build Coastguard Worker   // bool IsNsr() const { return (strncmp(ContentsId.Id, "+NSR0", 5) == 0); }
154*f6dc9357SAndroid Build Coastguard Worker   // bool IsAllocated() const { return ((Flags & 1) != 0); }
155*f6dc9357SAndroid Build Coastguard Worker };
156*f6dc9357SAndroid Build Coastguard Worker 
157*f6dc9357SAndroid Build Coastguard Worker 
158*f6dc9357SAndroid Build Coastguard Worker // ECMA 4/7.1 lb_addr
159*f6dc9357SAndroid Build Coastguard Worker 
160*f6dc9357SAndroid Build Coastguard Worker struct CLogBlockAddr
161*f6dc9357SAndroid Build Coastguard Worker {
162*f6dc9357SAndroid Build Coastguard Worker   UInt32 Pos;
163*f6dc9357SAndroid Build Coastguard Worker   UInt16 PartitionRef;
164*f6dc9357SAndroid Build Coastguard Worker 
165*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *p);
166*f6dc9357SAndroid Build Coastguard Worker };
167*f6dc9357SAndroid Build Coastguard Worker 
168*f6dc9357SAndroid Build Coastguard Worker 
169*f6dc9357SAndroid Build Coastguard Worker enum EShortAllocDescType
170*f6dc9357SAndroid Build Coastguard Worker {
171*f6dc9357SAndroid Build Coastguard Worker   SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated = 0,
172*f6dc9357SAndroid Build Coastguard Worker   SHORT_ALLOC_DESC_TYPE_NotRecordedButAllocated = 1,
173*f6dc9357SAndroid Build Coastguard Worker   SHORT_ALLOC_DESC_TYPE_NotRecordedAndNotAllocated = 2,
174*f6dc9357SAndroid Build Coastguard Worker   SHORT_ALLOC_DESC_TYPE_NextExtent = 3
175*f6dc9357SAndroid Build Coastguard Worker };
176*f6dc9357SAndroid Build Coastguard Worker 
177*f6dc9357SAndroid Build Coastguard Worker 
178*f6dc9357SAndroid Build Coastguard Worker // ECMA 4/14.14.1 short_ad
179*f6dc9357SAndroid Build Coastguard Worker 
180*f6dc9357SAndroid Build Coastguard Worker struct CShortAllocDesc
181*f6dc9357SAndroid Build Coastguard Worker {
182*f6dc9357SAndroid Build Coastguard Worker   UInt32 Len;
183*f6dc9357SAndroid Build Coastguard Worker   UInt32 Pos;
184*f6dc9357SAndroid Build Coastguard Worker 
185*f6dc9357SAndroid Build Coastguard Worker   // UInt32 GetLen() const { return Len & 0x3FFFFFFF; }
186*f6dc9357SAndroid Build Coastguard Worker   // UInt32 GetType() const { return Len >> 30; }
187*f6dc9357SAndroid Build Coastguard Worker   // bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }
188*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *p);
189*f6dc9357SAndroid Build Coastguard Worker };
190*f6dc9357SAndroid Build Coastguard Worker 
191*f6dc9357SAndroid Build Coastguard Worker /*
192*f6dc9357SAndroid Build Coastguard Worker struct CADImpUse
193*f6dc9357SAndroid Build Coastguard Worker {
194*f6dc9357SAndroid Build Coastguard Worker   UInt16 Flags;
195*f6dc9357SAndroid Build Coastguard Worker   UInt32 UdfUniqueId;
196*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *p);
197*f6dc9357SAndroid Build Coastguard Worker };
198*f6dc9357SAndroid Build Coastguard Worker */
199*f6dc9357SAndroid Build Coastguard Worker 
200*f6dc9357SAndroid Build Coastguard Worker // ECMA 4/14.14.2 long_ad
201*f6dc9357SAndroid Build Coastguard Worker // UDF 2.3.10.1
202*f6dc9357SAndroid Build Coastguard Worker 
203*f6dc9357SAndroid Build Coastguard Worker struct CLongAllocDesc
204*f6dc9357SAndroid Build Coastguard Worker {
205*f6dc9357SAndroid Build Coastguard Worker   UInt32 Len;
206*f6dc9357SAndroid Build Coastguard Worker   CLogBlockAddr Location;
207*f6dc9357SAndroid Build Coastguard Worker 
208*f6dc9357SAndroid Build Coastguard Worker   // Byte ImplUse[6];
209*f6dc9357SAndroid Build Coastguard Worker   // CADImpUse adImpUse; // UDF
210*f6dc9357SAndroid Build Coastguard Worker 
GetLenCLongAllocDesc211*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetLen() const { return Len & 0x3FFFFFFF; }
GetTypeCLongAllocDesc212*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetType() const { return Len >> 30; }
IsRecAndAllocCLongAllocDesc213*f6dc9357SAndroid Build Coastguard Worker   bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }
214*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *p);
215*f6dc9357SAndroid Build Coastguard Worker };
216*f6dc9357SAndroid Build Coastguard Worker 
217*f6dc9357SAndroid Build Coastguard Worker 
218*f6dc9357SAndroid Build Coastguard Worker // ECMA 3/10.7 Partition maps
219*f6dc9357SAndroid Build Coastguard Worker // UDF 2.2.8-2.2.10 Partition Maps
220*f6dc9357SAndroid Build Coastguard Worker 
221*f6dc9357SAndroid Build Coastguard Worker struct CPartitionMap
222*f6dc9357SAndroid Build Coastguard Worker {
223*f6dc9357SAndroid Build Coastguard Worker   unsigned PartitionIndex;
224*f6dc9357SAndroid Build Coastguard Worker 
225*f6dc9357SAndroid Build Coastguard Worker   Byte Type;
226*f6dc9357SAndroid Build Coastguard Worker   // Byte Len;
227*f6dc9357SAndroid Build Coastguard Worker 
228*f6dc9357SAndroid Build Coastguard Worker   // ECMA 10.7.2
229*f6dc9357SAndroid Build Coastguard Worker   UInt16 VolumeSequenceNumber;
230*f6dc9357SAndroid Build Coastguard Worker   UInt16 PartitionNumber;
231*f6dc9357SAndroid Build Coastguard Worker 
232*f6dc9357SAndroid Build Coastguard Worker   CRegId PartitionTypeId;
233*f6dc9357SAndroid Build Coastguard Worker 
234*f6dc9357SAndroid Build Coastguard Worker   // UDF 2.2.10 Metadata Partition Map
235*f6dc9357SAndroid Build Coastguard Worker   UInt32 MetadataFileLocation;
236*f6dc9357SAndroid Build Coastguard Worker   // UInt32 MetadataMirrorFileLocation;
237*f6dc9357SAndroid Build Coastguard Worker   // UInt32 MetadataBitmapFileLocation;
238*f6dc9357SAndroid Build Coastguard Worker   // UInt32 AllocationUnitSize; // (Blocks)
239*f6dc9357SAndroid Build Coastguard Worker   // UInt16 AlignmentUnitSize; // (Blocks)
240*f6dc9357SAndroid Build Coastguard Worker   // Byte Flags;
241*f6dc9357SAndroid Build Coastguard Worker 
242*f6dc9357SAndroid Build Coastguard Worker   // Byte Data[256];
243*f6dc9357SAndroid Build Coastguard Worker   // CPartitionMap(): PartitionIndex(-1) {}
244*f6dc9357SAndroid Build Coastguard Worker };
245*f6dc9357SAndroid Build Coastguard Worker 
246*f6dc9357SAndroid Build Coastguard Worker 
247*f6dc9357SAndroid Build Coastguard Worker // ECMA 4/14.6.6
248*f6dc9357SAndroid Build Coastguard Worker 
249*f6dc9357SAndroid Build Coastguard Worker enum EIcbFileType
250*f6dc9357SAndroid Build Coastguard Worker {
251*f6dc9357SAndroid Build Coastguard Worker   ICB_FILE_TYPE_DIR = 4,
252*f6dc9357SAndroid Build Coastguard Worker   ICB_FILE_TYPE_FILE = 5,
253*f6dc9357SAndroid Build Coastguard Worker 
254*f6dc9357SAndroid Build Coastguard Worker   ICB_FILE_TYPE_METADATA = 250,        // 2.2.13.1 Metadata File
255*f6dc9357SAndroid Build Coastguard Worker   ICB_FILE_TYPE_METADATA_MIRROR = 251
256*f6dc9357SAndroid Build Coastguard Worker };
257*f6dc9357SAndroid Build Coastguard Worker 
258*f6dc9357SAndroid Build Coastguard Worker enum EIcbDescriptorType
259*f6dc9357SAndroid Build Coastguard Worker {
260*f6dc9357SAndroid Build Coastguard Worker   ICB_DESC_TYPE_SHORT = 0,
261*f6dc9357SAndroid Build Coastguard Worker   ICB_DESC_TYPE_LONG = 1,
262*f6dc9357SAndroid Build Coastguard Worker   ICB_DESC_TYPE_EXTENDED = 2,
263*f6dc9357SAndroid Build Coastguard Worker   ICB_DESC_TYPE_INLINE = 3
264*f6dc9357SAndroid Build Coastguard Worker };
265*f6dc9357SAndroid Build Coastguard Worker 
266*f6dc9357SAndroid Build Coastguard Worker // ECMA 4/14.6
267*f6dc9357SAndroid Build Coastguard Worker // UDF 3.3.2
268*f6dc9357SAndroid Build Coastguard Worker 
269*f6dc9357SAndroid Build Coastguard Worker struct CIcbTag
270*f6dc9357SAndroid Build Coastguard Worker {
271*f6dc9357SAndroid Build Coastguard Worker   // UInt32 PriorDirectNum;
272*f6dc9357SAndroid Build Coastguard Worker   // UInt16 StrategyType;
273*f6dc9357SAndroid Build Coastguard Worker   // UInt16 StrategyParam;
274*f6dc9357SAndroid Build Coastguard Worker   // UInt16 MaxNumOfEntries;
275*f6dc9357SAndroid Build Coastguard Worker   Byte FileType;
276*f6dc9357SAndroid Build Coastguard Worker   // CLogBlockAddr ParentIcb;
277*f6dc9357SAndroid Build Coastguard Worker   UInt16 Flags;
278*f6dc9357SAndroid Build Coastguard Worker 
IsDirCIcbTag279*f6dc9357SAndroid Build Coastguard Worker   bool IsDir() const { return FileType == ICB_FILE_TYPE_DIR; }
GetDescriptorTypeCIcbTag280*f6dc9357SAndroid Build Coastguard Worker   int GetDescriptorType() const { return Flags & 3; }
281*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *p);
282*f6dc9357SAndroid Build Coastguard Worker };
283*f6dc9357SAndroid Build Coastguard Worker 
284*f6dc9357SAndroid Build Coastguard Worker 
285*f6dc9357SAndroid Build Coastguard Worker // ECMA 4/14.4.3
286*f6dc9357SAndroid Build Coastguard Worker // UDF 2.3.4.2 FileCharacteristics
287*f6dc9357SAndroid Build Coastguard Worker 
288*f6dc9357SAndroid Build Coastguard Worker // const Byte FILEID_CHARACS_Existance = (1 << 0);
289*f6dc9357SAndroid Build Coastguard Worker const Byte FILEID_CHARACS_Dir     = (1 << 1);
290*f6dc9357SAndroid Build Coastguard Worker const Byte FILEID_CHARACS_Deleted = (1 << 2);
291*f6dc9357SAndroid Build Coastguard Worker const Byte FILEID_CHARACS_Parent  = (1 << 3);
292*f6dc9357SAndroid Build Coastguard Worker // const Byte FILEID_CHARACS_Metadata = (1 << 4);
293*f6dc9357SAndroid Build Coastguard Worker 
294*f6dc9357SAndroid Build Coastguard Worker struct CFile
295*f6dc9357SAndroid Build Coastguard Worker {
296*f6dc9357SAndroid Build Coastguard Worker   int ItemIndex;
297*f6dc9357SAndroid Build Coastguard Worker   // UInt16 FileVersion;
298*f6dc9357SAndroid Build Coastguard Worker   // Byte FileCharacteristics;
299*f6dc9357SAndroid Build Coastguard Worker   // CByteBuffer ImplUse;
300*f6dc9357SAndroid Build Coastguard Worker   CDString Id;
301*f6dc9357SAndroid Build Coastguard Worker 
CFileCFile302*f6dc9357SAndroid Build Coastguard Worker   CFile(): /* FileVersion(0), FileCharacteristics(0), */ ItemIndex(-1) {}
GetNameCFile303*f6dc9357SAndroid Build Coastguard Worker   UString GetName() const { return Id.GetString(); }
304*f6dc9357SAndroid Build Coastguard Worker };
305*f6dc9357SAndroid Build Coastguard Worker 
306*f6dc9357SAndroid Build Coastguard Worker 
307*f6dc9357SAndroid Build Coastguard Worker struct CMyExtent
308*f6dc9357SAndroid Build Coastguard Worker {
309*f6dc9357SAndroid Build Coastguard Worker   UInt32 Pos;
310*f6dc9357SAndroid Build Coastguard Worker   UInt32 Len;
311*f6dc9357SAndroid Build Coastguard Worker   unsigned PartitionRef; // index in CLogVol::PartitionMaps
312*f6dc9357SAndroid Build Coastguard Worker 
GetLenCMyExtent313*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetLen() const { return Len & 0x3FFFFFFF; }
GetTypeCMyExtent314*f6dc9357SAndroid Build Coastguard Worker   UInt32 GetType() const { return Len >> 30; }
IsRecAndAllocCMyExtent315*f6dc9357SAndroid Build Coastguard Worker   bool IsRecAndAlloc() const { return GetType() == SHORT_ALLOC_DESC_TYPE_RecordedAndAllocated; }
316*f6dc9357SAndroid Build Coastguard Worker };
317*f6dc9357SAndroid Build Coastguard Worker 
318*f6dc9357SAndroid Build Coastguard Worker 
319*f6dc9357SAndroid Build Coastguard Worker struct CItem
320*f6dc9357SAndroid Build Coastguard Worker {
321*f6dc9357SAndroid Build Coastguard Worker   CIcbTag IcbTag;
322*f6dc9357SAndroid Build Coastguard Worker 
323*f6dc9357SAndroid Build Coastguard Worker   // UInt32 Uid;
324*f6dc9357SAndroid Build Coastguard Worker   // UInt32 Gid;
325*f6dc9357SAndroid Build Coastguard Worker   // UInt32 Permissions;
326*f6dc9357SAndroid Build Coastguard Worker   UInt16 FileLinkCount;
327*f6dc9357SAndroid Build Coastguard Worker   // Byte RecordFormat;
328*f6dc9357SAndroid Build Coastguard Worker   // Byte RecordDisplayAttr;
329*f6dc9357SAndroid Build Coastguard Worker   // UInt32 RecordLen;
330*f6dc9357SAndroid Build Coastguard Worker   UInt64 Size;
331*f6dc9357SAndroid Build Coastguard Worker   UInt64 NumLogBlockRecorded;
332*f6dc9357SAndroid Build Coastguard Worker   // UInt64 ObjectSize;
333*f6dc9357SAndroid Build Coastguard Worker 
334*f6dc9357SAndroid Build Coastguard Worker   CTime ATime;
335*f6dc9357SAndroid Build Coastguard Worker   CTime MTime;
336*f6dc9357SAndroid Build Coastguard Worker   CTime AttribTime; // Attribute time : most recent date and time of the day of file creation or modification of the attributes of.
337*f6dc9357SAndroid Build Coastguard Worker   CTime CreateTime;
338*f6dc9357SAndroid Build Coastguard Worker   // UInt32 CheckPoint;
339*f6dc9357SAndroid Build Coastguard Worker   // CLongAllocDesc ExtendedAttrIcb;
340*f6dc9357SAndroid Build Coastguard Worker   // CRegId ImplId;
341*f6dc9357SAndroid Build Coastguard Worker   // UInt64 UniqueId;
342*f6dc9357SAndroid Build Coastguard Worker 
343*f6dc9357SAndroid Build Coastguard Worker   bool IsExtended;
344*f6dc9357SAndroid Build Coastguard Worker   bool IsInline;
345*f6dc9357SAndroid Build Coastguard Worker   CByteBuffer InlineData;
346*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CMyExtent> Extents;
347*f6dc9357SAndroid Build Coastguard Worker   CUIntVector SubFiles;
348*f6dc9357SAndroid Build Coastguard Worker 
349*f6dc9357SAndroid Build Coastguard Worker   void Parse(const Byte *p);
350*f6dc9357SAndroid Build Coastguard Worker 
IsRecAndAllocCItem351*f6dc9357SAndroid Build Coastguard Worker   bool IsRecAndAlloc() const
352*f6dc9357SAndroid Build Coastguard Worker   {
353*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Extents)
354*f6dc9357SAndroid Build Coastguard Worker       if (!Extents[i].IsRecAndAlloc())
355*f6dc9357SAndroid Build Coastguard Worker         return false;
356*f6dc9357SAndroid Build Coastguard Worker     return true;
357*f6dc9357SAndroid Build Coastguard Worker   }
358*f6dc9357SAndroid Build Coastguard Worker 
GetChunksSumSizeCItem359*f6dc9357SAndroid Build Coastguard Worker   UInt64 GetChunksSumSize() const
360*f6dc9357SAndroid Build Coastguard Worker   {
361*f6dc9357SAndroid Build Coastguard Worker     if (IsInline)
362*f6dc9357SAndroid Build Coastguard Worker       return InlineData.Size();
363*f6dc9357SAndroid Build Coastguard Worker     UInt64 size = 0;
364*f6dc9357SAndroid Build Coastguard Worker     FOR_VECTOR (i, Extents)
365*f6dc9357SAndroid Build Coastguard Worker       size += Extents[i].GetLen();
366*f6dc9357SAndroid Build Coastguard Worker     return size;
367*f6dc9357SAndroid Build Coastguard Worker   }
368*f6dc9357SAndroid Build Coastguard Worker 
CheckChunkSizesCItem369*f6dc9357SAndroid Build Coastguard Worker   bool CheckChunkSizes() const  {  return GetChunksSumSize() == Size; }
370*f6dc9357SAndroid Build Coastguard Worker 
IsDirCItem371*f6dc9357SAndroid Build Coastguard Worker   bool IsDir() const { return IcbTag.IsDir(); }
372*f6dc9357SAndroid Build Coastguard Worker };
373*f6dc9357SAndroid Build Coastguard Worker 
374*f6dc9357SAndroid Build Coastguard Worker 
375*f6dc9357SAndroid Build Coastguard Worker struct CRef
376*f6dc9357SAndroid Build Coastguard Worker {
377*f6dc9357SAndroid Build Coastguard Worker   unsigned FileIndex;
378*f6dc9357SAndroid Build Coastguard Worker   int Parent;
379*f6dc9357SAndroid Build Coastguard Worker };
380*f6dc9357SAndroid Build Coastguard Worker 
381*f6dc9357SAndroid Build Coastguard Worker 
382*f6dc9357SAndroid Build Coastguard Worker // ECMA 4 / 14.1
383*f6dc9357SAndroid Build Coastguard Worker struct CFileSet
384*f6dc9357SAndroid Build Coastguard Worker {
385*f6dc9357SAndroid Build Coastguard Worker   CRecordVector<CRef> Refs;
386*f6dc9357SAndroid Build Coastguard Worker 
387*f6dc9357SAndroid Build Coastguard Worker   CTime RecordingTime;
388*f6dc9357SAndroid Build Coastguard Worker   // UInt16 InterchangeLevel;
389*f6dc9357SAndroid Build Coastguard Worker   // UInt16 MaxInterchangeLevel;
390*f6dc9357SAndroid Build Coastguard Worker   UInt32 FileSetNumber;
391*f6dc9357SAndroid Build Coastguard Worker   UInt32 FileSetDescNumber;
392*f6dc9357SAndroid Build Coastguard Worker   CDString128 LogicalVolumeId;
393*f6dc9357SAndroid Build Coastguard Worker   CDString32 Id;
394*f6dc9357SAndroid Build Coastguard Worker   CDString32 CopyrightId;
395*f6dc9357SAndroid Build Coastguard Worker   CDString32 AbstractId;
396*f6dc9357SAndroid Build Coastguard Worker 
397*f6dc9357SAndroid Build Coastguard Worker   CLongAllocDesc RootDirICB;
398*f6dc9357SAndroid Build Coastguard Worker   CRegId DomainId;
399*f6dc9357SAndroid Build Coastguard Worker   // CLongAllocDesc SystemStreamDirICB;
400*f6dc9357SAndroid Build Coastguard Worker };
401*f6dc9357SAndroid Build Coastguard Worker 
402*f6dc9357SAndroid Build Coastguard Worker 
403*f6dc9357SAndroid Build Coastguard Worker /* 8.3 Volume descriptors
404*f6dc9357SAndroid Build Coastguard Worker 8.4
405*f6dc9357SAndroid Build Coastguard Worker A Volume Descriptor Sequence:
406*f6dc9357SAndroid Build Coastguard Worker  shall contain one or more Primary Volume Descriptors.
407*f6dc9357SAndroid Build Coastguard Worker */
408*f6dc9357SAndroid Build Coastguard Worker 
409*f6dc9357SAndroid Build Coastguard Worker // ECMA 3/10.6
410*f6dc9357SAndroid Build Coastguard Worker // UDF 2.2.4  LogicalVolumeDescriptor
411*f6dc9357SAndroid Build Coastguard Worker 
412*f6dc9357SAndroid Build Coastguard Worker struct CLogVol
413*f6dc9357SAndroid Build Coastguard Worker {
414*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CPartitionMap> PartitionMaps;
415*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CFileSet> FileSets;
416*f6dc9357SAndroid Build Coastguard Worker 
417*f6dc9357SAndroid Build Coastguard Worker   UInt32 BlockSize;
418*f6dc9357SAndroid Build Coastguard Worker   CDString128 Id;
419*f6dc9357SAndroid Build Coastguard Worker   CRegId DomainId;
420*f6dc9357SAndroid Build Coastguard Worker 
421*f6dc9357SAndroid Build Coastguard Worker   // Byte ContentsUse[16];
422*f6dc9357SAndroid Build Coastguard Worker   CLongAllocDesc FileSetLocation; // UDF
423*f6dc9357SAndroid Build Coastguard Worker 
424*f6dc9357SAndroid Build Coastguard Worker   CRegId ImplId;
425*f6dc9357SAndroid Build Coastguard Worker   // Byte ImplUse[128];
426*f6dc9357SAndroid Build Coastguard Worker   // CExtent IntegritySequenceExtent;
427*f6dc9357SAndroid Build Coastguard Worker 
GetNameCLogVol428*f6dc9357SAndroid Build Coastguard Worker   UString GetName() const { return Id.GetString(); }
429*f6dc9357SAndroid Build Coastguard Worker };
430*f6dc9357SAndroid Build Coastguard Worker 
431*f6dc9357SAndroid Build Coastguard Worker 
432*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_BEGIN
433*f6dc9357SAndroid Build Coastguard Worker struct Z7_DECLSPEC_NOVTABLE CProgressVirt
434*f6dc9357SAndroid Build Coastguard Worker {
435*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT SetTotal(UInt64 numBytes) =0; \
436*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT SetCompleted(UInt64 numFiles, UInt64 numBytes) =0; \
437*f6dc9357SAndroid Build Coastguard Worker   virtual HRESULT SetCompleted() =0; \
438*f6dc9357SAndroid Build Coastguard Worker };
439*f6dc9357SAndroid Build Coastguard Worker Z7_PURE_INTERFACES_END
440*f6dc9357SAndroid Build Coastguard Worker 
441*f6dc9357SAndroid Build Coastguard Worker class CInArchive
442*f6dc9357SAndroid Build Coastguard Worker {
443*f6dc9357SAndroid Build Coastguard Worker public:
444*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CLogVol> LogVols;
445*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CItem> Items;
446*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CFile> Files;
447*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CPartition> Partitions;
448*f6dc9357SAndroid Build Coastguard Worker 
449*f6dc9357SAndroid Build Coastguard Worker   unsigned SecLogSize;
450*f6dc9357SAndroid Build Coastguard Worker   UInt64 PhySize;
451*f6dc9357SAndroid Build Coastguard Worker   UInt64 FileSize;
452*f6dc9357SAndroid Build Coastguard Worker 
453*f6dc9357SAndroid Build Coastguard Worker   bool IsArc;
454*f6dc9357SAndroid Build Coastguard Worker   bool Unsupported;
455*f6dc9357SAndroid Build Coastguard Worker   bool UnexpectedEnd;
456*f6dc9357SAndroid Build Coastguard Worker   bool NoEndAnchor;
457*f6dc9357SAndroid Build Coastguard Worker 
458*f6dc9357SAndroid Build Coastguard Worker   CObjectVector<CPrimeVol> PrimeVols;
459*f6dc9357SAndroid Build Coastguard Worker 
460*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open(IInStream *inStream, CProgressVirt *progress);
461*f6dc9357SAndroid Build Coastguard Worker   void Clear();
462*f6dc9357SAndroid Build Coastguard Worker 
463*f6dc9357SAndroid Build Coastguard Worker   UString GetComment() const;
464*f6dc9357SAndroid Build Coastguard Worker   UString GetItemPath(unsigned volIndex, unsigned fsIndex, unsigned refIndex,
465*f6dc9357SAndroid Build Coastguard Worker       bool showVolName, bool showFsName) const;
466*f6dc9357SAndroid Build Coastguard Worker 
467*f6dc9357SAndroid Build Coastguard Worker   bool CheckItemExtents(unsigned volIndex, const CItem &item) const;
468*f6dc9357SAndroid Build Coastguard Worker 
469*f6dc9357SAndroid Build Coastguard Worker private:
470*f6dc9357SAndroid Build Coastguard Worker   IInStream *_stream;
471*f6dc9357SAndroid Build Coastguard Worker   CProgressVirt *_progress;
472*f6dc9357SAndroid Build Coastguard Worker 
473*f6dc9357SAndroid Build Coastguard Worker   HRESULT Read(unsigned volIndex, unsigned partitionRef, UInt32 blockPos, UInt32 len, Byte *buf);
474*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadLad(unsigned volIndex, const CLongAllocDesc &lad, Byte *buf);
475*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadFromFile(unsigned volIndex, const CItem &item, CByteBuffer &buf);
476*f6dc9357SAndroid Build Coastguard Worker 
477*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadFileItem(unsigned volIndex, unsigned fsIndex, const CLongAllocDesc &lad, bool isDir, int numRecurseAllowed);
478*f6dc9357SAndroid Build Coastguard Worker   HRESULT ReadItem(unsigned volIndex, int fsIndex, const CLongAllocDesc &lad, bool isDir, int numRecurseAllowed);
479*f6dc9357SAndroid Build Coastguard Worker 
480*f6dc9357SAndroid Build Coastguard Worker   HRESULT Open2();
481*f6dc9357SAndroid Build Coastguard Worker   HRESULT FillRefs(CFileSet &fs, unsigned fileIndex, int parent, int numRecurseAllowed);
482*f6dc9357SAndroid Build Coastguard Worker 
483*f6dc9357SAndroid Build Coastguard Worker   UInt64 _processedProgressBytes;
484*f6dc9357SAndroid Build Coastguard Worker 
485*f6dc9357SAndroid Build Coastguard Worker   UInt64 _fileNameLengthTotal;
486*f6dc9357SAndroid Build Coastguard Worker   unsigned _numRefs;
487*f6dc9357SAndroid Build Coastguard Worker   UInt32 _numExtents;
488*f6dc9357SAndroid Build Coastguard Worker   UInt64 _inlineExtentsSize;
489*f6dc9357SAndroid Build Coastguard Worker   bool CheckExtent(unsigned volIndex, unsigned partitionRef, UInt32 blockPos, UInt32 len) const;
490*f6dc9357SAndroid Build Coastguard Worker 
UpdatePhySize(UInt64 val)491*f6dc9357SAndroid Build Coastguard Worker   void UpdatePhySize(UInt64 val)
492*f6dc9357SAndroid Build Coastguard Worker   {
493*f6dc9357SAndroid Build Coastguard Worker     if (PhySize < val)
494*f6dc9357SAndroid Build Coastguard Worker       PhySize = val;
495*f6dc9357SAndroid Build Coastguard Worker   }
496*f6dc9357SAndroid Build Coastguard Worker 
UpdatePhySize(const CExtent & e)497*f6dc9357SAndroid Build Coastguard Worker   void UpdatePhySize(const CExtent &e)
498*f6dc9357SAndroid Build Coastguard Worker   {
499*f6dc9357SAndroid Build Coastguard Worker     UpdatePhySize(((UInt64)e.Pos << SecLogSize) + e.Len);
500*f6dc9357SAndroid Build Coastguard Worker   }
501*f6dc9357SAndroid Build Coastguard Worker };
502*f6dc9357SAndroid Build Coastguard Worker 
503*f6dc9357SAndroid Build Coastguard Worker API_FUNC_IsArc IsArc_Udf(const Byte *p, size_t size);
504*f6dc9357SAndroid Build Coastguard Worker 
505*f6dc9357SAndroid Build Coastguard Worker }}
506*f6dc9357SAndroid Build Coastguard Worker 
507*f6dc9357SAndroid Build Coastguard Worker #endif
508