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