1*f6dc9357SAndroid Build Coastguard Worker // 7zItem.h 2*f6dc9357SAndroid Build Coastguard Worker 3*f6dc9357SAndroid Build Coastguard Worker #ifndef ZIP7_INC_7Z_ITEM_H 4*f6dc9357SAndroid Build Coastguard Worker #define ZIP7_INC_7Z_ITEM_H 5*f6dc9357SAndroid Build Coastguard Worker 6*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyBuffer.h" 7*f6dc9357SAndroid Build Coastguard Worker #include "../../../Common/MyString.h" 8*f6dc9357SAndroid Build Coastguard Worker 9*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MethodId.h" 10*f6dc9357SAndroid Build Coastguard Worker 11*f6dc9357SAndroid Build Coastguard Worker #include "7zHeader.h" 12*f6dc9357SAndroid Build Coastguard Worker 13*f6dc9357SAndroid Build Coastguard Worker namespace NArchive { 14*f6dc9357SAndroid Build Coastguard Worker namespace N7z { 15*f6dc9357SAndroid Build Coastguard Worker 16*f6dc9357SAndroid Build Coastguard Worker typedef UInt32 CNum; 17*f6dc9357SAndroid Build Coastguard Worker const CNum kNumMax = 0x7FFFFFFF; 18*f6dc9357SAndroid Build Coastguard Worker const CNum kNumNoIndex = 0xFFFFFFFF; 19*f6dc9357SAndroid Build Coastguard Worker 20*f6dc9357SAndroid Build Coastguard Worker struct CCoderInfo 21*f6dc9357SAndroid Build Coastguard Worker { 22*f6dc9357SAndroid Build Coastguard Worker CMethodId MethodID; 23*f6dc9357SAndroid Build Coastguard Worker CByteBuffer Props; 24*f6dc9357SAndroid Build Coastguard Worker UInt32 NumStreams; 25*f6dc9357SAndroid Build Coastguard Worker IsSimpleCoderCCoderInfo26*f6dc9357SAndroid Build Coastguard Worker bool IsSimpleCoder() const { return NumStreams == 1; } 27*f6dc9357SAndroid Build Coastguard Worker }; 28*f6dc9357SAndroid Build Coastguard Worker 29*f6dc9357SAndroid Build Coastguard Worker 30*f6dc9357SAndroid Build Coastguard Worker struct CBond 31*f6dc9357SAndroid Build Coastguard Worker { 32*f6dc9357SAndroid Build Coastguard Worker UInt32 PackIndex; 33*f6dc9357SAndroid Build Coastguard Worker UInt32 UnpackIndex; 34*f6dc9357SAndroid Build Coastguard Worker }; 35*f6dc9357SAndroid Build Coastguard Worker 36*f6dc9357SAndroid Build Coastguard Worker 37*f6dc9357SAndroid Build Coastguard Worker struct CFolder 38*f6dc9357SAndroid Build Coastguard Worker { 39*f6dc9357SAndroid Build Coastguard Worker Z7_CLASS_NO_COPY(CFolder) 40*f6dc9357SAndroid Build Coastguard Worker public: 41*f6dc9357SAndroid Build Coastguard Worker CObjArray2<CCoderInfo> Coders; 42*f6dc9357SAndroid Build Coastguard Worker CObjArray2<CBond> Bonds; 43*f6dc9357SAndroid Build Coastguard Worker CObjArray2<UInt32> PackStreams; 44*f6dc9357SAndroid Build Coastguard Worker CFolderCFolder45*f6dc9357SAndroid Build Coastguard Worker CFolder() {} 46*f6dc9357SAndroid Build Coastguard Worker IsDecodingSupportedCFolder47*f6dc9357SAndroid Build Coastguard Worker bool IsDecodingSupported() const { return Coders.Size() <= 32; } 48*f6dc9357SAndroid Build Coastguard Worker Find_in_PackStreamsCFolder49*f6dc9357SAndroid Build Coastguard Worker int Find_in_PackStreams(UInt32 packStream) const 50*f6dc9357SAndroid Build Coastguard Worker { 51*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, PackStreams) 52*f6dc9357SAndroid Build Coastguard Worker if (PackStreams[i] == packStream) 53*f6dc9357SAndroid Build Coastguard Worker return (int)i; 54*f6dc9357SAndroid Build Coastguard Worker return -1; 55*f6dc9357SAndroid Build Coastguard Worker } 56*f6dc9357SAndroid Build Coastguard Worker FindBond_for_PackStreamCFolder57*f6dc9357SAndroid Build Coastguard Worker int FindBond_for_PackStream(UInt32 packStream) const 58*f6dc9357SAndroid Build Coastguard Worker { 59*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, Bonds) 60*f6dc9357SAndroid Build Coastguard Worker if (Bonds[i].PackIndex == packStream) 61*f6dc9357SAndroid Build Coastguard Worker return (int)i; 62*f6dc9357SAndroid Build Coastguard Worker return -1; 63*f6dc9357SAndroid Build Coastguard Worker } 64*f6dc9357SAndroid Build Coastguard Worker 65*f6dc9357SAndroid Build Coastguard Worker /* 66*f6dc9357SAndroid Build Coastguard Worker int FindBond_for_UnpackStream(UInt32 unpackStream) const 67*f6dc9357SAndroid Build Coastguard Worker { 68*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, Bonds) 69*f6dc9357SAndroid Build Coastguard Worker if (Bonds[i].UnpackIndex == unpackStream) 70*f6dc9357SAndroid Build Coastguard Worker return i; 71*f6dc9357SAndroid Build Coastguard Worker return -1; 72*f6dc9357SAndroid Build Coastguard Worker } 73*f6dc9357SAndroid Build Coastguard Worker 74*f6dc9357SAndroid Build Coastguard Worker int FindOutCoder() const 75*f6dc9357SAndroid Build Coastguard Worker { 76*f6dc9357SAndroid Build Coastguard Worker for (int i = (int)Coders.Size() - 1; i >= 0; i--) 77*f6dc9357SAndroid Build Coastguard Worker if (FindBond_for_UnpackStream(i) < 0) 78*f6dc9357SAndroid Build Coastguard Worker return i; 79*f6dc9357SAndroid Build Coastguard Worker return -1; 80*f6dc9357SAndroid Build Coastguard Worker } 81*f6dc9357SAndroid Build Coastguard Worker */ 82*f6dc9357SAndroid Build Coastguard Worker IsEncryptedCFolder83*f6dc9357SAndroid Build Coastguard Worker bool IsEncrypted() const 84*f6dc9357SAndroid Build Coastguard Worker { 85*f6dc9357SAndroid Build Coastguard Worker FOR_VECTOR(i, Coders) 86*f6dc9357SAndroid Build Coastguard Worker if (Coders[i].MethodID == k_AES) 87*f6dc9357SAndroid Build Coastguard Worker return true; 88*f6dc9357SAndroid Build Coastguard Worker return false; 89*f6dc9357SAndroid Build Coastguard Worker } 90*f6dc9357SAndroid Build Coastguard Worker }; 91*f6dc9357SAndroid Build Coastguard Worker 92*f6dc9357SAndroid Build Coastguard Worker 93*f6dc9357SAndroid Build Coastguard Worker struct CUInt32DefVector 94*f6dc9357SAndroid Build Coastguard Worker { 95*f6dc9357SAndroid Build Coastguard Worker CBoolVector Defs; 96*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt32> Vals; 97*f6dc9357SAndroid Build Coastguard Worker ClearAndSetSizeCUInt32DefVector98*f6dc9357SAndroid Build Coastguard Worker void ClearAndSetSize(unsigned newSize) 99*f6dc9357SAndroid Build Coastguard Worker { 100*f6dc9357SAndroid Build Coastguard Worker Defs.ClearAndSetSize(newSize); 101*f6dc9357SAndroid Build Coastguard Worker Vals.ClearAndSetSize(newSize); 102*f6dc9357SAndroid Build Coastguard Worker } 103*f6dc9357SAndroid Build Coastguard Worker ClearCUInt32DefVector104*f6dc9357SAndroid Build Coastguard Worker void Clear() 105*f6dc9357SAndroid Build Coastguard Worker { 106*f6dc9357SAndroid Build Coastguard Worker Defs.Clear(); 107*f6dc9357SAndroid Build Coastguard Worker Vals.Clear(); 108*f6dc9357SAndroid Build Coastguard Worker } 109*f6dc9357SAndroid Build Coastguard Worker ReserveDownCUInt32DefVector110*f6dc9357SAndroid Build Coastguard Worker void ReserveDown() 111*f6dc9357SAndroid Build Coastguard Worker { 112*f6dc9357SAndroid Build Coastguard Worker Defs.ReserveDown(); 113*f6dc9357SAndroid Build Coastguard Worker Vals.ReserveDown(); 114*f6dc9357SAndroid Build Coastguard Worker } 115*f6dc9357SAndroid Build Coastguard Worker GetItemCUInt32DefVector116*f6dc9357SAndroid Build Coastguard Worker bool GetItem(unsigned index, UInt32 &value) const 117*f6dc9357SAndroid Build Coastguard Worker { 118*f6dc9357SAndroid Build Coastguard Worker if (index < Defs.Size() && Defs[index]) 119*f6dc9357SAndroid Build Coastguard Worker { 120*f6dc9357SAndroid Build Coastguard Worker value = Vals[index]; 121*f6dc9357SAndroid Build Coastguard Worker return true; 122*f6dc9357SAndroid Build Coastguard Worker } 123*f6dc9357SAndroid Build Coastguard Worker value = 0; 124*f6dc9357SAndroid Build Coastguard Worker return false; 125*f6dc9357SAndroid Build Coastguard Worker } 126*f6dc9357SAndroid Build Coastguard Worker ValidAndDefinedCUInt32DefVector127*f6dc9357SAndroid Build Coastguard Worker bool ValidAndDefined(unsigned i) const { return i < Defs.Size() && Defs[i]; } 128*f6dc9357SAndroid Build Coastguard Worker CheckSizeCUInt32DefVector129*f6dc9357SAndroid Build Coastguard Worker bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; } 130*f6dc9357SAndroid Build Coastguard Worker 131*f6dc9357SAndroid Build Coastguard Worker void SetItem(unsigned index, bool defined, UInt32 value); if_NonEmpty_FillResidue_with_falseCUInt32DefVector132*f6dc9357SAndroid Build Coastguard Worker void if_NonEmpty_FillResidue_with_false(unsigned numItems) 133*f6dc9357SAndroid Build Coastguard Worker { 134*f6dc9357SAndroid Build Coastguard Worker if (Defs.Size() != 0 && Defs.Size() < numItems) 135*f6dc9357SAndroid Build Coastguard Worker SetItem(numItems - 1, false, 0); 136*f6dc9357SAndroid Build Coastguard Worker } 137*f6dc9357SAndroid Build Coastguard Worker }; 138*f6dc9357SAndroid Build Coastguard Worker 139*f6dc9357SAndroid Build Coastguard Worker 140*f6dc9357SAndroid Build Coastguard Worker struct CUInt64DefVector 141*f6dc9357SAndroid Build Coastguard Worker { 142*f6dc9357SAndroid Build Coastguard Worker CBoolVector Defs; 143*f6dc9357SAndroid Build Coastguard Worker CRecordVector<UInt64> Vals; 144*f6dc9357SAndroid Build Coastguard Worker ClearCUInt64DefVector145*f6dc9357SAndroid Build Coastguard Worker void Clear() 146*f6dc9357SAndroid Build Coastguard Worker { 147*f6dc9357SAndroid Build Coastguard Worker Defs.Clear(); 148*f6dc9357SAndroid Build Coastguard Worker Vals.Clear(); 149*f6dc9357SAndroid Build Coastguard Worker } 150*f6dc9357SAndroid Build Coastguard Worker ReserveDownCUInt64DefVector151*f6dc9357SAndroid Build Coastguard Worker void ReserveDown() 152*f6dc9357SAndroid Build Coastguard Worker { 153*f6dc9357SAndroid Build Coastguard Worker Defs.ReserveDown(); 154*f6dc9357SAndroid Build Coastguard Worker Vals.ReserveDown(); 155*f6dc9357SAndroid Build Coastguard Worker } 156*f6dc9357SAndroid Build Coastguard Worker GetItemCUInt64DefVector157*f6dc9357SAndroid Build Coastguard Worker bool GetItem(unsigned index, UInt64 &value) const 158*f6dc9357SAndroid Build Coastguard Worker { 159*f6dc9357SAndroid Build Coastguard Worker if (index < Defs.Size() && Defs[index]) 160*f6dc9357SAndroid Build Coastguard Worker { 161*f6dc9357SAndroid Build Coastguard Worker value = Vals[index]; 162*f6dc9357SAndroid Build Coastguard Worker return true; 163*f6dc9357SAndroid Build Coastguard Worker } 164*f6dc9357SAndroid Build Coastguard Worker value = 0; 165*f6dc9357SAndroid Build Coastguard Worker return false; 166*f6dc9357SAndroid Build Coastguard Worker } 167*f6dc9357SAndroid Build Coastguard Worker CheckSizeCUInt64DefVector168*f6dc9357SAndroid Build Coastguard Worker bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; } 169*f6dc9357SAndroid Build Coastguard Worker 170*f6dc9357SAndroid Build Coastguard Worker void SetItem(unsigned index, bool defined, UInt64 value); 171*f6dc9357SAndroid Build Coastguard Worker }; 172*f6dc9357SAndroid Build Coastguard Worker 173*f6dc9357SAndroid Build Coastguard Worker 174*f6dc9357SAndroid Build Coastguard Worker struct CFileItem 175*f6dc9357SAndroid Build Coastguard Worker { 176*f6dc9357SAndroid Build Coastguard Worker UInt64 Size; 177*f6dc9357SAndroid Build Coastguard Worker UInt32 Crc; 178*f6dc9357SAndroid Build Coastguard Worker /* 179*f6dc9357SAndroid Build Coastguard Worker int Parent; 180*f6dc9357SAndroid Build Coastguard Worker bool IsAltStream; 181*f6dc9357SAndroid Build Coastguard Worker */ 182*f6dc9357SAndroid Build Coastguard Worker bool HasStream; // Test it !!! it means that there is 183*f6dc9357SAndroid Build Coastguard Worker // stream in some folder. It can be empty stream 184*f6dc9357SAndroid Build Coastguard Worker bool IsDir; 185*f6dc9357SAndroid Build Coastguard Worker bool CrcDefined; 186*f6dc9357SAndroid Build Coastguard Worker 187*f6dc9357SAndroid Build Coastguard Worker /* 188*f6dc9357SAndroid Build Coastguard Worker void Clear() 189*f6dc9357SAndroid Build Coastguard Worker { 190*f6dc9357SAndroid Build Coastguard Worker HasStream = true; 191*f6dc9357SAndroid Build Coastguard Worker IsDir = false; 192*f6dc9357SAndroid Build Coastguard Worker CrcDefined = false; 193*f6dc9357SAndroid Build Coastguard Worker } 194*f6dc9357SAndroid Build Coastguard Worker 195*f6dc9357SAndroid Build Coastguard Worker CFileItem(): 196*f6dc9357SAndroid Build Coastguard Worker // Parent(-1), 197*f6dc9357SAndroid Build Coastguard Worker // IsAltStream(false), 198*f6dc9357SAndroid Build Coastguard Worker HasStream(true), 199*f6dc9357SAndroid Build Coastguard Worker IsDir(false), 200*f6dc9357SAndroid Build Coastguard Worker CrcDefined(false), 201*f6dc9357SAndroid Build Coastguard Worker {} 202*f6dc9357SAndroid Build Coastguard Worker */ 203*f6dc9357SAndroid Build Coastguard Worker }; 204*f6dc9357SAndroid Build Coastguard Worker 205*f6dc9357SAndroid Build Coastguard Worker }} 206*f6dc9357SAndroid Build Coastguard Worker 207*f6dc9357SAndroid Build Coastguard Worker #endif 208