rlm@1
|
1 // 7zIn.h
|
rlm@1
|
2
|
rlm@1
|
3 #ifndef __7Z_IN_H
|
rlm@1
|
4 #define __7Z_IN_H
|
rlm@1
|
5
|
rlm@1
|
6 #include "../../../Common/MyCom.h"
|
rlm@1
|
7
|
rlm@1
|
8 #include "../../IPassword.h"
|
rlm@1
|
9 #include "../../IStream.h"
|
rlm@1
|
10
|
rlm@1
|
11 #include "../../Common/CreateCoder.h"
|
rlm@1
|
12 #include "../../Common/InBuffer.h"
|
rlm@1
|
13
|
rlm@1
|
14 #include "7zItem.h"
|
rlm@1
|
15
|
rlm@1
|
16 namespace NArchive {
|
rlm@1
|
17 namespace N7z {
|
rlm@1
|
18
|
rlm@1
|
19 struct CInArchiveInfo
|
rlm@1
|
20 {
|
rlm@1
|
21 CArchiveVersion Version;
|
rlm@1
|
22 UInt64 StartPosition;
|
rlm@1
|
23 UInt64 StartPositionAfterHeader;
|
rlm@1
|
24 UInt64 DataStartPosition;
|
rlm@1
|
25 UInt64 DataStartPosition2;
|
rlm@1
|
26 CRecordVector<UInt64> FileInfoPopIDs;
|
rlm@1
|
27 void Clear()
|
rlm@1
|
28 {
|
rlm@1
|
29 FileInfoPopIDs.Clear();
|
rlm@1
|
30 }
|
rlm@1
|
31 };
|
rlm@1
|
32
|
rlm@1
|
33 struct CArchiveDatabaseEx: public CArchiveDatabase
|
rlm@1
|
34 {
|
rlm@1
|
35 CInArchiveInfo ArchiveInfo;
|
rlm@1
|
36 CRecordVector<UInt64> PackStreamStartPositions;
|
rlm@1
|
37 CRecordVector<CNum> FolderStartPackStreamIndex;
|
rlm@1
|
38 CRecordVector<CNum> FolderStartFileIndex;
|
rlm@1
|
39 CRecordVector<CNum> FileIndexToFolderIndexMap;
|
rlm@1
|
40
|
rlm@1
|
41 UInt64 HeadersSize;
|
rlm@1
|
42 UInt64 PhySize;
|
rlm@1
|
43
|
rlm@1
|
44 void Clear()
|
rlm@1
|
45 {
|
rlm@1
|
46 CArchiveDatabase::Clear();
|
rlm@1
|
47 ArchiveInfo.Clear();
|
rlm@1
|
48 PackStreamStartPositions.Clear();
|
rlm@1
|
49 FolderStartPackStreamIndex.Clear();
|
rlm@1
|
50 FolderStartFileIndex.Clear();
|
rlm@1
|
51 FileIndexToFolderIndexMap.Clear();
|
rlm@1
|
52
|
rlm@1
|
53 HeadersSize = 0;
|
rlm@1
|
54 PhySize = 0;
|
rlm@1
|
55 }
|
rlm@1
|
56
|
rlm@1
|
57 void FillFolderStartPackStream();
|
rlm@1
|
58 void FillStartPos();
|
rlm@1
|
59 void FillFolderStartFileIndex();
|
rlm@1
|
60
|
rlm@1
|
61 void Fill()
|
rlm@1
|
62 {
|
rlm@1
|
63 FillFolderStartPackStream();
|
rlm@1
|
64 FillStartPos();
|
rlm@1
|
65 FillFolderStartFileIndex();
|
rlm@1
|
66 }
|
rlm@1
|
67
|
rlm@1
|
68 UInt64 GetFolderStreamPos(int folderIndex, int indexInFolder) const
|
rlm@1
|
69 {
|
rlm@1
|
70 return ArchiveInfo.DataStartPosition +
|
rlm@1
|
71 PackStreamStartPositions[FolderStartPackStreamIndex[folderIndex] + indexInFolder];
|
rlm@1
|
72 }
|
rlm@1
|
73
|
rlm@1
|
74 UInt64 GetFolderFullPackSize(int folderIndex) const
|
rlm@1
|
75 {
|
rlm@1
|
76 CNum packStreamIndex = FolderStartPackStreamIndex[folderIndex];
|
rlm@1
|
77 const CFolder &folder = Folders[folderIndex];
|
rlm@1
|
78 UInt64 size = 0;
|
rlm@1
|
79 for (int i = 0; i < folder.PackStreams.Size(); i++)
|
rlm@1
|
80 size += PackSizes[packStreamIndex + i];
|
rlm@1
|
81 return size;
|
rlm@1
|
82 }
|
rlm@1
|
83
|
rlm@1
|
84 UInt64 GetFolderPackStreamSize(int folderIndex, int streamIndex) const
|
rlm@1
|
85 {
|
rlm@1
|
86 return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex];
|
rlm@1
|
87 }
|
rlm@1
|
88
|
rlm@1
|
89 UInt64 GetFilePackSize(CNum fileIndex) const
|
rlm@1
|
90 {
|
rlm@1
|
91 CNum folderIndex = FileIndexToFolderIndexMap[fileIndex];
|
rlm@1
|
92 if (folderIndex != kNumNoIndex)
|
rlm@1
|
93 if (FolderStartFileIndex[folderIndex] == fileIndex)
|
rlm@1
|
94 return GetFolderFullPackSize(folderIndex);
|
rlm@1
|
95 return 0;
|
rlm@1
|
96 }
|
rlm@1
|
97 };
|
rlm@1
|
98
|
rlm@1
|
99 class CInByte2
|
rlm@1
|
100 {
|
rlm@1
|
101 const Byte *_buffer;
|
rlm@1
|
102 size_t _size;
|
rlm@1
|
103 public:
|
rlm@1
|
104 size_t _pos;
|
rlm@1
|
105 void Init(const Byte *buffer, size_t size)
|
rlm@1
|
106 {
|
rlm@1
|
107 _buffer = buffer;
|
rlm@1
|
108 _size = size;
|
rlm@1
|
109 _pos = 0;
|
rlm@1
|
110 }
|
rlm@1
|
111 Byte ReadByte();
|
rlm@1
|
112 void ReadBytes(Byte *data, size_t size);
|
rlm@1
|
113 void SkeepData(UInt64 size);
|
rlm@1
|
114 void SkeepData();
|
rlm@1
|
115 UInt64 ReadNumber();
|
rlm@1
|
116 CNum ReadNum();
|
rlm@1
|
117 UInt32 ReadUInt32();
|
rlm@1
|
118 UInt64 ReadUInt64();
|
rlm@1
|
119 void ReadString(UString &s);
|
rlm@1
|
120 };
|
rlm@1
|
121
|
rlm@1
|
122 class CStreamSwitch;
|
rlm@1
|
123
|
rlm@1
|
124 const UInt32 kHeaderSize = 32;
|
rlm@1
|
125
|
rlm@1
|
126 class CInArchive
|
rlm@1
|
127 {
|
rlm@1
|
128 friend class CStreamSwitch;
|
rlm@1
|
129
|
rlm@1
|
130 CMyComPtr<IInStream> _stream;
|
rlm@1
|
131
|
rlm@1
|
132 CObjectVector<CInByte2> _inByteVector;
|
rlm@1
|
133 CInByte2 *_inByteBack;
|
rlm@1
|
134
|
rlm@1
|
135 UInt64 _arhiveBeginStreamPosition;
|
rlm@1
|
136
|
rlm@1
|
137 Byte _header[kHeaderSize];
|
rlm@1
|
138
|
rlm@1
|
139 UInt64 HeadersSize;
|
rlm@1
|
140
|
rlm@1
|
141 void AddByteStream(const Byte *buffer, size_t size)
|
rlm@1
|
142 {
|
rlm@1
|
143 _inByteVector.Add(CInByte2());
|
rlm@1
|
144 _inByteBack = &_inByteVector.Back();
|
rlm@1
|
145 _inByteBack->Init(buffer, size);
|
rlm@1
|
146 }
|
rlm@1
|
147
|
rlm@1
|
148 void DeleteByteStream()
|
rlm@1
|
149 {
|
rlm@1
|
150 _inByteVector.DeleteBack();
|
rlm@1
|
151 if (!_inByteVector.IsEmpty())
|
rlm@1
|
152 _inByteBack = &_inByteVector.Back();
|
rlm@1
|
153 }
|
rlm@1
|
154
|
rlm@1
|
155 private:
|
rlm@1
|
156 HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
|
rlm@1
|
157
|
rlm@1
|
158 void ReadBytes(Byte *data, size_t size) { _inByteBack->ReadBytes(data, size); }
|
rlm@1
|
159 Byte ReadByte() { return _inByteBack->ReadByte(); }
|
rlm@1
|
160 UInt64 ReadNumber() { return _inByteBack->ReadNumber(); }
|
rlm@1
|
161 CNum ReadNum() { return _inByteBack->ReadNum(); }
|
rlm@1
|
162 UInt64 ReadID() { return _inByteBack->ReadNumber(); }
|
rlm@1
|
163 UInt32 ReadUInt32() { return _inByteBack->ReadUInt32(); }
|
rlm@1
|
164 UInt64 ReadUInt64() { return _inByteBack->ReadUInt64(); }
|
rlm@1
|
165 void SkeepData(UInt64 size) { _inByteBack->SkeepData(size); }
|
rlm@1
|
166 void SkeepData() { _inByteBack->SkeepData(); }
|
rlm@1
|
167 void WaitAttribute(UInt64 attribute);
|
rlm@1
|
168
|
rlm@1
|
169 void ReadArchiveProperties(CInArchiveInfo &archiveInfo);
|
rlm@1
|
170 void GetNextFolderItem(CFolder &itemInfo);
|
rlm@1
|
171 void ReadHashDigests(int numItems,
|
rlm@1
|
172 CBoolVector &digestsDefined, CRecordVector<UInt32> &digests);
|
rlm@1
|
173
|
rlm@1
|
174 void ReadPackInfo(
|
rlm@1
|
175 UInt64 &dataOffset,
|
rlm@1
|
176 CRecordVector<UInt64> &packSizes,
|
rlm@1
|
177 CBoolVector &packCRCsDefined,
|
rlm@1
|
178 CRecordVector<UInt32> &packCRCs);
|
rlm@1
|
179
|
rlm@1
|
180 void ReadUnpackInfo(
|
rlm@1
|
181 const CObjectVector<CByteBuffer> *dataVector,
|
rlm@1
|
182 CObjectVector<CFolder> &folders);
|
rlm@1
|
183
|
rlm@1
|
184 void ReadSubStreamsInfo(
|
rlm@1
|
185 const CObjectVector<CFolder> &folders,
|
rlm@1
|
186 CRecordVector<CNum> &numUnpackStreamsInFolders,
|
rlm@1
|
187 CRecordVector<UInt64> &unpackSizes,
|
rlm@1
|
188 CBoolVector &digestsDefined,
|
rlm@1
|
189 CRecordVector<UInt32> &digests);
|
rlm@1
|
190
|
rlm@1
|
191 void ReadStreamsInfo(
|
rlm@1
|
192 const CObjectVector<CByteBuffer> *dataVector,
|
rlm@1
|
193 UInt64 &dataOffset,
|
rlm@1
|
194 CRecordVector<UInt64> &packSizes,
|
rlm@1
|
195 CBoolVector &packCRCsDefined,
|
rlm@1
|
196 CRecordVector<UInt32> &packCRCs,
|
rlm@1
|
197 CObjectVector<CFolder> &folders,
|
rlm@1
|
198 CRecordVector<CNum> &numUnpackStreamsInFolders,
|
rlm@1
|
199 CRecordVector<UInt64> &unpackSizes,
|
rlm@1
|
200 CBoolVector &digestsDefined,
|
rlm@1
|
201 CRecordVector<UInt32> &digests);
|
rlm@1
|
202
|
rlm@1
|
203
|
rlm@1
|
204 void ReadBoolVector(int numItems, CBoolVector &v);
|
rlm@1
|
205 void ReadBoolVector2(int numItems, CBoolVector &v);
|
rlm@1
|
206 void ReadUInt64DefVector(const CObjectVector<CByteBuffer> &dataVector,
|
rlm@1
|
207 CUInt64DefVector &v, int numFiles);
|
rlm@1
|
208 HRESULT ReadAndDecodePackedStreams(
|
rlm@1
|
209 DECL_EXTERNAL_CODECS_LOC_VARS
|
rlm@1
|
210 UInt64 baseOffset, UInt64 &dataOffset,
|
rlm@1
|
211 CObjectVector<CByteBuffer> &dataVector
|
rlm@1
|
212 #ifndef _NO_CRYPTO
|
rlm@1
|
213 , ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined
|
rlm@1
|
214 #endif
|
rlm@1
|
215 );
|
rlm@1
|
216 HRESULT ReadHeader(
|
rlm@1
|
217 DECL_EXTERNAL_CODECS_LOC_VARS
|
rlm@1
|
218 CArchiveDatabaseEx &db
|
rlm@1
|
219 #ifndef _NO_CRYPTO
|
rlm@1
|
220 ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined
|
rlm@1
|
221 #endif
|
rlm@1
|
222 );
|
rlm@1
|
223 HRESULT ReadDatabase2(
|
rlm@1
|
224 DECL_EXTERNAL_CODECS_LOC_VARS
|
rlm@1
|
225 CArchiveDatabaseEx &db
|
rlm@1
|
226 #ifndef _NO_CRYPTO
|
rlm@1
|
227 ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined
|
rlm@1
|
228 #endif
|
rlm@1
|
229 );
|
rlm@1
|
230 public:
|
rlm@1
|
231 HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive
|
rlm@1
|
232 void Close();
|
rlm@1
|
233
|
rlm@1
|
234 HRESULT ReadDatabase(
|
rlm@1
|
235 DECL_EXTERNAL_CODECS_LOC_VARS
|
rlm@1
|
236 CArchiveDatabaseEx &db
|
rlm@1
|
237 #ifndef _NO_CRYPTO
|
rlm@1
|
238 ,ICryptoGetTextPassword *getTextPassword, bool &passwordIsDefined
|
rlm@1
|
239 #endif
|
rlm@1
|
240 );
|
rlm@1
|
241 };
|
rlm@1
|
242
|
rlm@1
|
243 }}
|
rlm@1
|
244
|
rlm@1
|
245 #endif
|