6 #include "../../IStream.h"
7 #include "../../IPassword.h"
8 #include "../../../Common/MyCom.h"
9 #include "../../Common/InBuffer.h"
17 class CInArchiveException
22 kUnsupportedVersion
= 0,
23 kUnexpectedEndOfArchive
= 0,
26 CInArchiveException(CCauseType cause
);
31 CArchiveVersion Version
;
33 UInt64 StartPositionAfterHeader
;
34 UInt64 DataStartPosition
;
35 UInt64 DataStartPosition2
;
36 CRecordVector
<UInt64
> FileInfoPopIDs
;
39 FileInfoPopIDs
.Clear();
44 struct CArchiveDatabaseEx
: public CArchiveDatabase
46 CInArchiveInfo ArchiveInfo
;
47 CRecordVector
<UInt64
> PackStreamStartPositions
;
48 CRecordVector
<CNum
> FolderStartPackStreamIndex
;
49 CRecordVector
<CNum
> FolderStartFileIndex
;
50 CRecordVector
<CNum
> FileIndexToFolderIndexMap
;
54 CArchiveDatabase::Clear();
56 PackStreamStartPositions
.Clear();
57 FolderStartPackStreamIndex
.Clear();
58 FolderStartFileIndex
.Clear();
59 FileIndexToFolderIndexMap
.Clear();
62 void FillFolderStartPackStream();
64 void FillFolderStartFileIndex();
68 FillFolderStartPackStream();
70 FillFolderStartFileIndex();
73 UInt64
GetFolderStreamPos(int folderIndex
, int indexInFolder
) const
75 return ArchiveInfo
.DataStartPosition
+
76 PackStreamStartPositions
[FolderStartPackStreamIndex
[folderIndex
] +
80 UInt64
GetFolderFullPackSize(int folderIndex
) const
82 CNum packStreamIndex
= FolderStartPackStreamIndex
[folderIndex
];
83 const CFolder
&folder
= Folders
[folderIndex
];
85 for (int i
= 0; i
< folder
.PackStreams
.Size(); i
++)
86 size
+= PackSizes
[packStreamIndex
+ i
];
90 UInt64
GetFolderPackStreamSize(int folderIndex
, int streamIndex
) const
92 return PackSizes
[FolderStartPackStreamIndex
[folderIndex
] + streamIndex
];
95 UInt64
GetFilePackSize(CNum fileIndex
) const
97 CNum folderIndex
= FileIndexToFolderIndexMap
[fileIndex
];
100 if (FolderStartFileIndex
[folderIndex
] == fileIndex
)
101 return GetFolderFullPackSize(folderIndex
);
113 void Init(const Byte
*buffer
, size_t size
)
119 bool ReadByte(Byte
&b
)
126 void ReadBytes(void *data
, size_t size
, size_t &processedSize
)
128 for(processedSize
= 0; processedSize
< size
&& _pos
< _size
; processedSize
++)
129 ((Byte
*)data
)[processedSize
] = _buffer
[_pos
++];
132 bool ReadBytes(void *data
, size_t size
)
134 size_t processedSize
;
135 ReadBytes(data
, size
, processedSize
);
136 return (processedSize
== size
);
139 size_t GetProcessedSize() const { return _pos
; }
145 friend class CStreamSwitch
;
147 CMyComPtr
<IInStream
> _stream
;
149 bool _finishSignature
;
152 CObjectVector
<CInByte2
> _inByteVector
;
153 CInByte2
*_inByteBack
;
155 UInt64 _arhiveBeginStreamPosition
;
158 void AddByteStream(const Byte
*buffer
, size_t size
)
160 _inByteVector
.Add(CInByte2());
161 _inByteBack
= &_inByteVector
.Back();
162 _inByteBack
->Init(buffer
, size
);
165 void DeleteByteStream()
167 _inByteVector
.DeleteBack();
168 if (!_inByteVector
.IsEmpty())
169 _inByteBack
= &_inByteVector
.Back();
173 HRESULT
FindAndReadSignature(IInStream
*stream
, const UInt64
*searchHeaderSizeLimit
); // S_FALSE means is not archive
175 HRESULT
FindFinishSignature(IInStream
*stream
, const UInt64
*searchHeaderSizeLimit
); // S_FALSE means is not archive
178 HRESULT
ReadFileNames(CObjectVector
<CFileItem
> &files
);
180 HRESULT
ReadDirect(IInStream
*stream
, void *data
, UInt32 size
,
181 UInt32
*processedSize
);
182 HRESULT
ReadDirect(void *data
, UInt32 size
, UInt32
*processedSize
);
183 HRESULT
SafeReadDirect(void *data
, UInt32 size
);
184 HRESULT
SafeReadDirectByte(Byte
&b
);
185 HRESULT
SafeReadDirectUInt32(UInt32
&value
);
186 HRESULT
SafeReadDirectUInt64(UInt64
&value
);
188 HRESULT
ReadBytes(void *data
, size_t size
)
190 if (!_inByteBack
->ReadBytes(data
, size
))
195 HRESULT
ReadByte(Byte
&b
)
197 if (!_inByteBack
->ReadByte(b
))
202 HRESULT
ReadWideCharLE(wchar_t &c
)
205 if (!_inByteBack
->ReadByte(b1
))
208 if (!_inByteBack
->ReadByte(b2
))
210 c
= (wchar_t(b2
) << 8) + b1
;
214 HRESULT
ReadNumber(UInt64
&value
);
215 HRESULT
ReadNum(CNum
&value
);
216 HRESULT
ReadID(UInt64
&value
) { return ReadNumber(value
); }
217 HRESULT
ReadUInt32(UInt32
&value
);
218 HRESULT
ReadUInt64(UInt64
&value
);
220 HRESULT
SkeepData(UInt64 size
);
222 HRESULT
WaitAttribute(UInt64 attribute
);
224 HRESULT
ReadArchiveProperties(CInArchiveInfo
&archiveInfo
);
225 HRESULT
GetNextFolderItem(CFolder
&itemInfo
);
226 HRESULT
ReadHashDigests(int numItems
,
227 CRecordVector
<bool> &digestsDefined
, CRecordVector
<UInt32
> &digests
);
229 HRESULT
ReadPackInfo(
231 CRecordVector
<UInt64
> &packSizes
,
232 CRecordVector
<bool> &packCRCsDefined
,
233 CRecordVector
<UInt32
> &packCRCs
);
235 HRESULT
ReadUnPackInfo(
236 const CObjectVector
<CByteBuffer
> *dataVector
,
237 CObjectVector
<CFolder
> &folders
);
239 HRESULT
ReadSubStreamsInfo(
240 const CObjectVector
<CFolder
> &folders
,
241 CRecordVector
<CNum
> &numUnPackStreamsInFolders
,
242 CRecordVector
<UInt64
> &unPackSizes
,
243 CRecordVector
<bool> &digestsDefined
,
244 CRecordVector
<UInt32
> &digests
);
246 HRESULT
ReadStreamsInfo(
247 const CObjectVector
<CByteBuffer
> *dataVector
,
249 CRecordVector
<UInt64
> &packSizes
,
250 CRecordVector
<bool> &packCRCsDefined
,
251 CRecordVector
<UInt32
> &packCRCs
,
252 CObjectVector
<CFolder
> &folders
,
253 CRecordVector
<CNum
> &numUnPackStreamsInFolders
,
254 CRecordVector
<UInt64
> &unPackSizes
,
255 CRecordVector
<bool> &digestsDefined
,
256 CRecordVector
<UInt32
> &digests
);
259 HRESULT
GetNextFileItem(CFileItem
&itemInfo
);
260 HRESULT
ReadBoolVector(int numItems
, CBoolVector
&v
);
261 HRESULT
ReadBoolVector2(int numItems
, CBoolVector
&v
);
262 HRESULT
ReadTime(const CObjectVector
<CByteBuffer
> &dataVector
,
263 CObjectVector
<CFileItem
> &files
, UInt64 type
);
264 HRESULT
ReadAndDecodePackedStreams(UInt64 baseOffset
, UInt64
&dataOffset
,
265 CObjectVector
<CByteBuffer
> &dataVector
267 , ICryptoGetTextPassword
*getTextPassword
270 HRESULT
ReadHeader(CArchiveDatabaseEx
&database
272 ,ICryptoGetTextPassword
*getTextPassword
276 HRESULT
Open(IInStream
*stream
, const UInt64
*searchHeaderSizeLimit
); // S_FALSE means is not archive
279 HRESULT
ReadDatabase(CArchiveDatabaseEx
&database
281 ,ICryptoGetTextPassword
*getTextPassword