1// 7zItem.h 2 3#ifndef __7Z_ITEM_H 4#define __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 13namespace NArchive { 14namespace N7z { 15 16const UInt64 k_AES = 0x06F10701; 17 18typedef UInt32 CNum; 19const CNum kNumMax = 0x7FFFFFFF; 20const CNum kNumNoIndex = 0xFFFFFFFF; 21 22struct CCoderInfo 23{ 24 CMethodId MethodID; 25 CByteBuffer Props; 26 CNum NumInStreams; 27 CNum NumOutStreams; 28 29 bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); } 30}; 31 32struct CBindPair 33{ 34 CNum InIndex; 35 CNum OutIndex; 36}; 37 38struct CFolder 39{ 40 CObjArray2<CCoderInfo> Coders; 41 CObjArray2<CBindPair> BindPairs; 42 CObjArray2<CNum> PackStreams; 43 44 CNum GetNumOutStreams() const 45 { 46 CNum result = 0; 47 FOR_VECTOR(i, Coders) 48 result += Coders[i].NumOutStreams; 49 return result; 50 } 51 52 int FindBindPairForInStream(CNum inStreamIndex) const 53 { 54 FOR_VECTOR(i, BindPairs) 55 if (BindPairs[i].InIndex == inStreamIndex) 56 return i; 57 return -1; 58 } 59 int FindBindPairForOutStream(CNum outStreamIndex) const 60 { 61 FOR_VECTOR(i, BindPairs) 62 if (BindPairs[i].OutIndex == outStreamIndex) 63 return i; 64 return -1; 65 } 66 int FindPackStreamArrayIndex(CNum inStreamIndex) const 67 { 68 FOR_VECTOR(i, PackStreams) 69 if (PackStreams[i] == inStreamIndex) 70 return i; 71 return -1; 72 } 73 74 int GetIndexOfMainOutStream() const 75 { 76 for (int i = (int)GetNumOutStreams() - 1; i >= 0; i--) 77 if (FindBindPairForOutStream(i) < 0) 78 return i; 79 throw 1; 80 } 81 82 bool IsEncrypted() const 83 { 84 for (int i = Coders.Size() - 1; i >= 0; i--) 85 if (Coders[i].MethodID == k_AES) 86 return true; 87 return false; 88 } 89 90 bool CheckStructure(unsigned numUnpackSizes) const; 91}; 92 93struct CUInt32DefVector 94{ 95 CBoolVector Defs; 96 CRecordVector<UInt32> Vals; 97 98 void ClearAndSetSize(unsigned newSize) 99 { 100 Defs.ClearAndSetSize(newSize); 101 Vals.ClearAndSetSize(newSize); 102 } 103 104 void Clear() 105 { 106 Defs.Clear(); 107 Vals.Clear(); 108 } 109 110 void ReserveDown() 111 { 112 Defs.ReserveDown(); 113 Vals.ReserveDown(); 114 } 115 116 bool ValidAndDefined(unsigned i) const { return i < Defs.Size() && Defs[i]; } 117}; 118 119struct CUInt64DefVector 120{ 121 CBoolVector Defs; 122 CRecordVector<UInt64> Vals; 123 124 void Clear() 125 { 126 Defs.Clear(); 127 Vals.Clear(); 128 } 129 130 void ReserveDown() 131 { 132 Defs.ReserveDown(); 133 Vals.ReserveDown(); 134 } 135 136 bool GetItem(unsigned index, UInt64 &value) const 137 { 138 if (index < Defs.Size() && Defs[index]) 139 { 140 value = Vals[index]; 141 return true; 142 } 143 value = 0; 144 return false; 145 } 146 147 void SetItem(unsigned index, bool defined, UInt64 value); 148 149 bool CheckSize(unsigned size) const { return Defs.Size() == size || Defs.Size() == 0; } 150}; 151 152struct CFileItem 153{ 154 UInt64 Size; 155 UInt32 Attrib; 156 UInt32 Crc; 157 /* 158 int Parent; 159 bool IsAltStream; 160 */ 161 bool HasStream; // Test it !!! it means that there is 162 // stream in some folder. It can be empty stream 163 bool IsDir; 164 bool CrcDefined; 165 bool AttribDefined; 166 167 CFileItem(): 168 /* 169 Parent(-1), 170 IsAltStream(false), 171 */ 172 HasStream(true), 173 IsDir(false), 174 CrcDefined(false), 175 AttribDefined(false) 176 {} 177 void SetAttrib(UInt32 attrib) 178 { 179 AttribDefined = true; 180 Attrib = attrib; 181 } 182}; 183 184}} 185 186#endif 187