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