6 #include "../../../Common/MyCom.h"
7 #include "../../IStream.h"
8 #include "../../IPassword.h"
9 #include "../../Common/CreateCoder.h"
10 #include "../../Common/InBuffer.h"
19 CArchiveVersion Version;
21 UInt64 StartPositionAfterHeader;
22 UInt64 DataStartPosition;
23 UInt64 DataStartPosition2;
24 CRecordVector<UInt64> FileInfoPopIDs;
27 FileInfoPopIDs.Clear();
31 struct CArchiveDatabaseEx: public CArchiveDatabase
33 CInArchiveInfo ArchiveInfo;
34 CRecordVector<UInt64> PackStreamStartPositions;
35 CRecordVector<CNum> FolderStartPackStreamIndex;
36 CRecordVector<CNum> FolderStartFileIndex;
37 CRecordVector<CNum> FileIndexToFolderIndexMap;
41 CArchiveDatabase::Clear();
43 PackStreamStartPositions.Clear();
44 FolderStartPackStreamIndex.Clear();
45 FolderStartFileIndex.Clear();
46 FileIndexToFolderIndexMap.Clear();
49 void FillFolderStartPackStream();
51 void FillFolderStartFileIndex();
55 FillFolderStartPackStream();
57 FillFolderStartFileIndex();
60 UInt64 GetFolderStreamPos(int folderIndex, int indexInFolder) const
62 return ArchiveInfo.DataStartPosition +
63 PackStreamStartPositions[FolderStartPackStreamIndex[folderIndex] + indexInFolder];
66 UInt64 GetFolderFullPackSize(int folderIndex) const
68 CNum packStreamIndex = FolderStartPackStreamIndex[folderIndex];
69 const CFolder &folder = Folders[folderIndex];
71 for (int i = 0; i < folder.PackStreams.Size(); i++)
72 size += PackSizes[packStreamIndex + i];
76 UInt64 GetFolderPackStreamSize(int folderIndex, int streamIndex) const
78 return PackSizes[FolderStartPackStreamIndex[folderIndex] + streamIndex];
81 UInt64 GetFilePackSize(CNum fileIndex) const
83 CNum folderIndex = FileIndexToFolderIndexMap[fileIndex];
84 if (folderIndex != kNumNoIndex)
85 if (FolderStartFileIndex[folderIndex] == fileIndex)
86 return GetFolderFullPackSize(folderIndex);
97 void Init(const Byte *buffer, size_t size)
104 void ReadBytes(Byte *data, size_t size);
105 void SkeepData(UInt64 size);
111 void ReadString(UString &s);
116 const UInt32 kHeaderSize = 32;
120 friend class CStreamSwitch;
122 CMyComPtr<IInStream> _stream;
124 CObjectVector<CInByte2> _inByteVector;
125 CInByte2 *_inByteBack;
127 UInt64 _arhiveBeginStreamPosition;
129 Byte _header[kHeaderSize];
131 void AddByteStream(const Byte *buffer, size_t size)
133 _inByteVector.Add(CInByte2());
134 _inByteBack = &_inByteVector.Back();
135 _inByteBack->Init(buffer, size);
138 void DeleteByteStream()
140 _inByteVector.DeleteBack();
141 if (!_inByteVector.IsEmpty())
142 _inByteBack = &_inByteVector.Back();
146 HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit);
148 void ReadBytes(Byte *data, size_t size) { _inByteBack->ReadBytes(data, size); }
149 Byte ReadByte() { return _inByteBack->ReadByte(); }
150 UInt64 ReadNumber() { return _inByteBack->ReadNumber(); }
151 CNum ReadNum() { return _inByteBack->ReadNum(); }
152 UInt64 ReadID() { return _inByteBack->ReadNumber(); }
153 UInt32 ReadUInt32() { return _inByteBack->ReadUInt32(); }
154 UInt64 ReadUInt64() { return _inByteBack->ReadUInt64(); }
155 void SkeepData(UInt64 size) { _inByteBack->SkeepData(size); }
156 void SkeepData() { _inByteBack->SkeepData(); }
157 void WaitAttribute(UInt64 attribute);
159 void ReadArchiveProperties(CInArchiveInfo &archiveInfo);
160 void GetNextFolderItem(CFolder &itemInfo);
161 void ReadHashDigests(int numItems,
162 CRecordVector<bool> &digestsDefined, CRecordVector<UInt32> &digests);
166 CRecordVector<UInt64> &packSizes,
167 CRecordVector<bool> &packCRCsDefined,
168 CRecordVector<UInt32> &packCRCs);
171 const CObjectVector<CByteBuffer> *dataVector,
172 CObjectVector<CFolder> &folders);
174 void ReadSubStreamsInfo(
175 const CObjectVector<CFolder> &folders,
176 CRecordVector<CNum> &numUnPackStreamsInFolders,
177 CRecordVector<UInt64> &unPackSizes,
178 CRecordVector<bool> &digestsDefined,
179 CRecordVector<UInt32> &digests);
181 void ReadStreamsInfo(
182 const CObjectVector<CByteBuffer> *dataVector,
184 CRecordVector<UInt64> &packSizes,
185 CRecordVector<bool> &packCRCsDefined,
186 CRecordVector<UInt32> &packCRCs,
187 CObjectVector<CFolder> &folders,
188 CRecordVector<CNum> &numUnPackStreamsInFolders,
189 CRecordVector<UInt64> &unPackSizes,
190 CRecordVector<bool> &digestsDefined,
191 CRecordVector<UInt32> &digests);
194 void ReadBoolVector(int numItems, CBoolVector &v);
195 void ReadBoolVector2(int numItems, CBoolVector &v);
196 void ReadTime(const CObjectVector<CByteBuffer> &dataVector,
197 CObjectVector<CFileItem> &files, UInt32 type);
198 HRESULT ReadAndDecodePackedStreams(
199 DECL_EXTERNAL_CODECS_LOC_VARS
200 UInt64 baseOffset, UInt64 &dataOffset,
201 CObjectVector<CByteBuffer> &dataVector
203 , ICryptoGetTextPassword *getTextPassword
207 DECL_EXTERNAL_CODECS_LOC_VARS
208 CArchiveDatabaseEx &database
210 ,ICryptoGetTextPassword *getTextPassword
213 HRESULT ReadDatabase2(
214 DECL_EXTERNAL_CODECS_LOC_VARS
215 CArchiveDatabaseEx &database
217 ,ICryptoGetTextPassword *getTextPassword
221 HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive
224 HRESULT ReadDatabase(
225 DECL_EXTERNAL_CODECS_LOC_VARS
226 CArchiveDatabaseEx &database
228 ,ICryptoGetTextPassword *getTextPassword