1 // 7z/FolderInStream.h |
|
2 |
|
3 #ifndef __7Z_FOLDERINSTREAM_H |
|
4 #define __7Z_FOLDERINSTREAM_H |
|
5 |
|
6 #include "7zItem.h" |
|
7 #include "7zHeader.h" |
|
8 |
|
9 #include "../IArchive.h" |
|
10 #include "../Common/InStreamWithCRC.h" |
|
11 #include "../../IStream.h" |
|
12 #include "../../ICoder.h" |
|
13 |
|
14 namespace NArchive { |
|
15 namespace N7z { |
|
16 |
|
17 class CFolderInStream: |
|
18 public ISequentialInStream, |
|
19 public ICompressGetSubStreamSize, |
|
20 public CMyUnknownImp |
|
21 { |
|
22 public: |
|
23 |
|
24 MY_UNKNOWN_IMP1(ICompressGetSubStreamSize) |
|
25 |
|
26 CFolderInStream(); |
|
27 |
|
28 STDMETHOD(Read)(void *data, UInt32 size, UInt32 *processedSize); |
|
29 |
|
30 STDMETHOD(GetSubStreamSize)(UInt64 subStream, UInt64 *value); |
|
31 private: |
|
32 CSequentialInStreamWithCRC *_inStreamWithHashSpec; |
|
33 CMyComPtr<ISequentialInStream> _inStreamWithHash; |
|
34 CMyComPtr<IArchiveUpdateCallback> _updateCallback; |
|
35 |
|
36 bool _currentSizeIsDefined; |
|
37 UInt64 _currentSize; |
|
38 |
|
39 bool _fileIsOpen; |
|
40 UInt64 _filePos; |
|
41 |
|
42 const UInt32 *_fileIndices; |
|
43 UInt32 _numFiles; |
|
44 UInt32 _fileIndex; |
|
45 |
|
46 HRESULT OpenStream(); |
|
47 HRESULT CloseStream(); |
|
48 void AddDigest(); |
|
49 public: |
|
50 void Init(IArchiveUpdateCallback *updateCallback, |
|
51 const UInt32 *fileIndices, UInt32 numFiles); |
|
52 CRecordVector<bool> Processed; |
|
53 CRecordVector<UInt32> CRCs; |
|
54 CRecordVector<UInt64> Sizes; |
|
55 UInt64 GetFullSize() const |
|
56 { |
|
57 UInt64 size = 0; |
|
58 for (int i = 0; i < Sizes.Size(); i++) |
|
59 size += Sizes[i]; |
|
60 return size; |
|
61 } |
|
62 }; |
|
63 |
|
64 }} |
|
65 |
|
66 #endif |
|