Bug 470455 - test_database_sync_embed_visits.js leaks, r=sdwilsh
[wine-gecko.git] / other-licenses / 7zstub / src / 7zip / Archive / 7z / 7zIn.h
bloba6c5ef032dbf434a027c5274b5c677dd854e8bf3
1 // 7zIn.h
3 #ifndef __7Z_IN_H
4 #define __7Z_IN_H
6 #include "../../IStream.h"
7 #include "../../IPassword.h"
8 #include "../../../Common/MyCom.h"
9 #include "../../Common/InBuffer.h"
11 #include "7zHeader.h"
12 #include "7zItem.h"
14 namespace NArchive {
15 namespace N7z {
17 class CInArchiveException
19 public:
20 enum CCauseType
22 kUnsupportedVersion = 0,
23 kUnexpectedEndOfArchive = 0,
24 kIncorrectHeader,
25 } Cause;
26 CInArchiveException(CCauseType cause);
29 struct CInArchiveInfo
31 CArchiveVersion Version;
32 UInt64 StartPosition;
33 UInt64 StartPositionAfterHeader;
34 UInt64 DataStartPosition;
35 UInt64 DataStartPosition2;
36 CRecordVector<UInt64> FileInfoPopIDs;
37 void Clear()
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;
52 void Clear()
54 CArchiveDatabase::Clear();
55 ArchiveInfo.Clear();
56 PackStreamStartPositions.Clear();
57 FolderStartPackStreamIndex.Clear();
58 FolderStartFileIndex.Clear();
59 FileIndexToFolderIndexMap.Clear();
62 void FillFolderStartPackStream();
63 void FillStartPos();
64 void FillFolderStartFileIndex();
66 void Fill()
68 FillFolderStartPackStream();
69 FillStartPos();
70 FillFolderStartFileIndex();
73 UInt64 GetFolderStreamPos(int folderIndex, int indexInFolder) const
75 return ArchiveInfo.DataStartPosition +
76 PackStreamStartPositions[FolderStartPackStreamIndex[folderIndex] +
77 indexInFolder];
80 UInt64 GetFolderFullPackSize(int folderIndex) const
82 CNum packStreamIndex = FolderStartPackStreamIndex[folderIndex];
83 const CFolder &folder = Folders[folderIndex];
84 UInt64 size = 0;
85 for (int i = 0; i < folder.PackStreams.Size(); i++)
86 size += PackSizes[packStreamIndex + i];
87 return size;
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];
98 if (folderIndex >= 0)
100 if (FolderStartFileIndex[folderIndex] == fileIndex)
101 return GetFolderFullPackSize(folderIndex);
103 return 0;
107 class CInByte2
109 const Byte *_buffer;
110 size_t _size;
111 size_t _pos;
112 public:
113 void Init(const Byte *buffer, size_t size)
115 _buffer = buffer;
116 _size = size;
117 _pos = 0;
119 bool ReadByte(Byte &b)
121 if(_pos >= _size)
122 return false;
123 b = _buffer[_pos++];
124 return true;
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; }
142 class CStreamSwitch;
143 class CInArchive
145 friend class CStreamSwitch;
147 CMyComPtr<IInStream> _stream;
148 #ifdef _7Z_VOL
149 bool _finishSignature;
150 #endif
152 CObjectVector<CInByte2> _inByteVector;
153 CInByte2 *_inByteBack;
155 UInt64 _arhiveBeginStreamPosition;
156 UInt64 _position;
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();
172 private:
173 HRESULT FindAndReadSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive
174 #ifdef _7Z_VOL
175 HRESULT FindFinishSignature(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive
176 #endif
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))
191 return E_FAIL;
192 return S_OK;
195 HRESULT ReadByte(Byte &b)
197 if (!_inByteBack->ReadByte(b))
198 return E_FAIL;
199 return S_OK;
202 HRESULT ReadWideCharLE(wchar_t &c)
204 Byte b1;
205 if (!_inByteBack->ReadByte(b1))
206 return E_FAIL;
207 Byte b2;
208 if (!_inByteBack->ReadByte(b2))
209 return E_FAIL;
210 c = (wchar_t(b2) << 8) + b1;
211 return S_OK;
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);
221 HRESULT SkeepData();
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(
230 UInt64 &dataOffset,
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,
248 UInt64 &dataOffset,
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
266 #ifndef _NO_CRYPTO
267 , ICryptoGetTextPassword *getTextPassword
268 #endif
270 HRESULT ReadHeader(CArchiveDatabaseEx &database
271 #ifndef _NO_CRYPTO
272 ,ICryptoGetTextPassword *getTextPassword
273 #endif
275 public:
276 HRESULT Open(IInStream *stream, const UInt64 *searchHeaderSizeLimit); // S_FALSE means is not archive
277 void Close();
279 HRESULT ReadDatabase(CArchiveDatabaseEx &database
280 #ifndef _NO_CRYPTO
281 ,ICryptoGetTextPassword *getTextPassword
282 #endif
288 #endif