rlm@1
|
1 // 7zItem.h
|
rlm@1
|
2
|
rlm@1
|
3 #ifndef __7Z_ITEM_H
|
rlm@1
|
4 #define __7Z_ITEM_H
|
rlm@1
|
5
|
rlm@1
|
6 #include "../../../Common/Buffer.h"
|
rlm@1
|
7 #include "../../../Common/MyString.h"
|
rlm@1
|
8
|
rlm@1
|
9 #include "../../Common/MethodId.h"
|
rlm@1
|
10
|
rlm@1
|
11 #include "7zHeader.h"
|
rlm@1
|
12
|
rlm@1
|
13 namespace NArchive {
|
rlm@1
|
14 namespace N7z {
|
rlm@1
|
15
|
rlm@1
|
16 typedef UInt32 CNum;
|
rlm@1
|
17 const CNum kNumMax = 0x7FFFFFFF;
|
rlm@1
|
18 const CNum kNumNoIndex = 0xFFFFFFFF;
|
rlm@1
|
19
|
rlm@1
|
20 struct CCoderInfo
|
rlm@1
|
21 {
|
rlm@1
|
22 CMethodId MethodID;
|
rlm@1
|
23 CByteBuffer Props;
|
rlm@1
|
24 CNum NumInStreams;
|
rlm@1
|
25 CNum NumOutStreams;
|
rlm@1
|
26 bool IsSimpleCoder() const { return (NumInStreams == 1) && (NumOutStreams == 1); }
|
rlm@1
|
27 };
|
rlm@1
|
28
|
rlm@1
|
29 struct CBindPair
|
rlm@1
|
30 {
|
rlm@1
|
31 CNum InIndex;
|
rlm@1
|
32 CNum OutIndex;
|
rlm@1
|
33 };
|
rlm@1
|
34
|
rlm@1
|
35 struct CFolder
|
rlm@1
|
36 {
|
rlm@1
|
37 CObjectVector<CCoderInfo> Coders;
|
rlm@1
|
38 CRecordVector<CBindPair> BindPairs;
|
rlm@1
|
39 CRecordVector<CNum> PackStreams;
|
rlm@1
|
40 CRecordVector<UInt64> UnpackSizes;
|
rlm@1
|
41 UInt32 UnpackCRC;
|
rlm@1
|
42 bool UnpackCRCDefined;
|
rlm@1
|
43
|
rlm@1
|
44 CFolder(): UnpackCRCDefined(false) {}
|
rlm@1
|
45
|
rlm@1
|
46 UInt64 GetUnpackSize() const // test it
|
rlm@1
|
47 {
|
rlm@1
|
48 if (UnpackSizes.IsEmpty())
|
rlm@1
|
49 return 0;
|
rlm@1
|
50 for (int i = UnpackSizes.Size() - 1; i >= 0; i--)
|
rlm@1
|
51 if (FindBindPairForOutStream(i) < 0)
|
rlm@1
|
52 return UnpackSizes[i];
|
rlm@1
|
53 throw 1;
|
rlm@1
|
54 }
|
rlm@1
|
55
|
rlm@1
|
56 CNum GetNumOutStreams() const
|
rlm@1
|
57 {
|
rlm@1
|
58 CNum result = 0;
|
rlm@1
|
59 for (int i = 0; i < Coders.Size(); i++)
|
rlm@1
|
60 result += Coders[i].NumOutStreams;
|
rlm@1
|
61 return result;
|
rlm@1
|
62 }
|
rlm@1
|
63
|
rlm@1
|
64 int FindBindPairForInStream(CNum inStreamIndex) const
|
rlm@1
|
65 {
|
rlm@1
|
66 for(int i = 0; i < BindPairs.Size(); i++)
|
rlm@1
|
67 if (BindPairs[i].InIndex == inStreamIndex)
|
rlm@1
|
68 return i;
|
rlm@1
|
69 return -1;
|
rlm@1
|
70 }
|
rlm@1
|
71 int FindBindPairForOutStream(CNum outStreamIndex) const
|
rlm@1
|
72 {
|
rlm@1
|
73 for(int i = 0; i < BindPairs.Size(); i++)
|
rlm@1
|
74 if (BindPairs[i].OutIndex == outStreamIndex)
|
rlm@1
|
75 return i;
|
rlm@1
|
76 return -1;
|
rlm@1
|
77 }
|
rlm@1
|
78 int FindPackStreamArrayIndex(CNum inStreamIndex) const
|
rlm@1
|
79 {
|
rlm@1
|
80 for(int i = 0; i < PackStreams.Size(); i++)
|
rlm@1
|
81 if (PackStreams[i] == inStreamIndex)
|
rlm@1
|
82 return i;
|
rlm@1
|
83 return -1;
|
rlm@1
|
84 }
|
rlm@1
|
85
|
rlm@1
|
86 bool CheckStructure() const;
|
rlm@1
|
87 };
|
rlm@1
|
88
|
rlm@1
|
89 struct CUInt64DefVector
|
rlm@1
|
90 {
|
rlm@1
|
91 CRecordVector<UInt64> Values;
|
rlm@1
|
92 CRecordVector<bool> Defined;
|
rlm@1
|
93
|
rlm@1
|
94 void Clear()
|
rlm@1
|
95 {
|
rlm@1
|
96 Values.Clear();
|
rlm@1
|
97 Defined.Clear();
|
rlm@1
|
98 }
|
rlm@1
|
99
|
rlm@1
|
100 void ReserveDown()
|
rlm@1
|
101 {
|
rlm@1
|
102 Values.ReserveDown();
|
rlm@1
|
103 Values.ReserveDown();
|
rlm@1
|
104 }
|
rlm@1
|
105
|
rlm@1
|
106 bool GetItem(int index, UInt64 &value) const
|
rlm@1
|
107 {
|
rlm@1
|
108 if (index < Defined.Size() && Defined[index])
|
rlm@1
|
109 {
|
rlm@1
|
110 value = Values[index];
|
rlm@1
|
111 return true;
|
rlm@1
|
112 }
|
rlm@1
|
113 value = 0;
|
rlm@1
|
114 return false;
|
rlm@1
|
115 }
|
rlm@1
|
116
|
rlm@1
|
117 void SetItem(int index, bool defined, UInt64 value)
|
rlm@1
|
118 {
|
rlm@1
|
119 while (index >= Defined.Size())
|
rlm@1
|
120 Defined.Add(false);
|
rlm@1
|
121 Defined[index] = defined;
|
rlm@1
|
122 if (!defined)
|
rlm@1
|
123 return;
|
rlm@1
|
124 while (index >= Values.Size())
|
rlm@1
|
125 Values.Add(0);
|
rlm@1
|
126 Values[index] = value;
|
rlm@1
|
127 }
|
rlm@1
|
128
|
rlm@1
|
129 bool CheckSize(int size) const { return Defined.Size() == size || Defined.Size() == 0; }
|
rlm@1
|
130 };
|
rlm@1
|
131
|
rlm@1
|
132 struct CFileItem
|
rlm@1
|
133 {
|
rlm@1
|
134 UInt64 Size;
|
rlm@1
|
135 UInt32 Attrib;
|
rlm@1
|
136 UInt32 Crc;
|
rlm@1
|
137 UString Name;
|
rlm@1
|
138
|
rlm@1
|
139 bool HasStream; // Test it !!! it means that there is
|
rlm@1
|
140 // stream in some folder. It can be empty stream
|
rlm@1
|
141 bool IsDir;
|
rlm@1
|
142 bool CrcDefined;
|
rlm@1
|
143 bool AttribDefined;
|
rlm@1
|
144
|
rlm@1
|
145 CFileItem():
|
rlm@1
|
146 HasStream(true),
|
rlm@1
|
147 IsDir(false),
|
rlm@1
|
148 CrcDefined(false),
|
rlm@1
|
149 AttribDefined(false)
|
rlm@1
|
150 {}
|
rlm@1
|
151 void SetAttrib(UInt32 attrib)
|
rlm@1
|
152 {
|
rlm@1
|
153 AttribDefined = true;
|
rlm@1
|
154 Attrib = attrib;
|
rlm@1
|
155 }
|
rlm@1
|
156 };
|
rlm@1
|
157
|
rlm@1
|
158 struct CFileItem2
|
rlm@1
|
159 {
|
rlm@1
|
160 UInt64 CTime;
|
rlm@1
|
161 UInt64 ATime;
|
rlm@1
|
162 UInt64 MTime;
|
rlm@1
|
163 UInt64 StartPos;
|
rlm@1
|
164 bool CTimeDefined;
|
rlm@1
|
165 bool ATimeDefined;
|
rlm@1
|
166 bool MTimeDefined;
|
rlm@1
|
167 bool StartPosDefined;
|
rlm@1
|
168 bool IsAnti;
|
rlm@1
|
169 };
|
rlm@1
|
170
|
rlm@1
|
171 struct CArchiveDatabase
|
rlm@1
|
172 {
|
rlm@1
|
173 CRecordVector<UInt64> PackSizes;
|
rlm@1
|
174 CRecordVector<bool> PackCRCsDefined;
|
rlm@1
|
175 CRecordVector<UInt32> PackCRCs;
|
rlm@1
|
176 CObjectVector<CFolder> Folders;
|
rlm@1
|
177 CRecordVector<CNum> NumUnpackStreamsVector;
|
rlm@1
|
178 CObjectVector<CFileItem> Files;
|
rlm@1
|
179
|
rlm@1
|
180 CUInt64DefVector CTime;
|
rlm@1
|
181 CUInt64DefVector ATime;
|
rlm@1
|
182 CUInt64DefVector MTime;
|
rlm@1
|
183 CUInt64DefVector StartPos;
|
rlm@1
|
184 CRecordVector<bool> IsAnti;
|
rlm@1
|
185
|
rlm@1
|
186 void Clear()
|
rlm@1
|
187 {
|
rlm@1
|
188 PackSizes.Clear();
|
rlm@1
|
189 PackCRCsDefined.Clear();
|
rlm@1
|
190 PackCRCs.Clear();
|
rlm@1
|
191 Folders.Clear();
|
rlm@1
|
192 NumUnpackStreamsVector.Clear();
|
rlm@1
|
193 Files.Clear();
|
rlm@1
|
194 CTime.Clear();
|
rlm@1
|
195 ATime.Clear();
|
rlm@1
|
196 MTime.Clear();
|
rlm@1
|
197 StartPos.Clear();
|
rlm@1
|
198 IsAnti.Clear();
|
rlm@1
|
199 }
|
rlm@1
|
200
|
rlm@1
|
201 void ReserveDown()
|
rlm@1
|
202 {
|
rlm@1
|
203 PackSizes.ReserveDown();
|
rlm@1
|
204 PackCRCsDefined.ReserveDown();
|
rlm@1
|
205 PackCRCs.ReserveDown();
|
rlm@1
|
206 Folders.ReserveDown();
|
rlm@1
|
207 NumUnpackStreamsVector.ReserveDown();
|
rlm@1
|
208 Files.ReserveDown();
|
rlm@1
|
209 CTime.ReserveDown();
|
rlm@1
|
210 ATime.ReserveDown();
|
rlm@1
|
211 MTime.ReserveDown();
|
rlm@1
|
212 StartPos.ReserveDown();
|
rlm@1
|
213 IsAnti.ReserveDown();
|
rlm@1
|
214 }
|
rlm@1
|
215
|
rlm@1
|
216 bool IsEmpty() const
|
rlm@1
|
217 {
|
rlm@1
|
218 return (PackSizes.IsEmpty() &&
|
rlm@1
|
219 PackCRCsDefined.IsEmpty() &&
|
rlm@1
|
220 PackCRCs.IsEmpty() &&
|
rlm@1
|
221 Folders.IsEmpty() &&
|
rlm@1
|
222 NumUnpackStreamsVector.IsEmpty() &&
|
rlm@1
|
223 Files.IsEmpty());
|
rlm@1
|
224 }
|
rlm@1
|
225
|
rlm@1
|
226 bool CheckNumFiles() const
|
rlm@1
|
227 {
|
rlm@1
|
228 int size = Files.Size();
|
rlm@1
|
229 return (
|
rlm@1
|
230 CTime.CheckSize(size) &&
|
rlm@1
|
231 ATime.CheckSize(size) &&
|
rlm@1
|
232 MTime.CheckSize(size) &&
|
rlm@1
|
233 StartPos.CheckSize(size) &&
|
rlm@1
|
234 (size == IsAnti.Size() || IsAnti.Size() == 0));
|
rlm@1
|
235 }
|
rlm@1
|
236
|
rlm@1
|
237 bool IsSolid() const
|
rlm@1
|
238 {
|
rlm@1
|
239 for (int i = 0; i < NumUnpackStreamsVector.Size(); i++)
|
rlm@1
|
240 if (NumUnpackStreamsVector[i] > 1)
|
rlm@1
|
241 return true;
|
rlm@1
|
242 return false;
|
rlm@1
|
243 }
|
rlm@1
|
244 bool IsItemAnti(int index) const { return (index < IsAnti.Size() && IsAnti[index]); }
|
rlm@1
|
245 void SetItemAnti(int index, bool isAnti)
|
rlm@1
|
246 {
|
rlm@1
|
247 while (index >= IsAnti.Size())
|
rlm@1
|
248 IsAnti.Add(false);
|
rlm@1
|
249 IsAnti[index] = isAnti;
|
rlm@1
|
250 }
|
rlm@1
|
251
|
rlm@1
|
252 void GetFile(int index, CFileItem &file, CFileItem2 &file2) const;
|
rlm@1
|
253 void AddFile(const CFileItem &file, const CFileItem2 &file2);
|
rlm@1
|
254 };
|
rlm@1
|
255
|
rlm@1
|
256 }}
|
rlm@1
|
257
|
rlm@1
|
258 #endif
|