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