1 // 7zFolderInStream.cpp
5 #include "7zFolderInStream.h"
10 CFolderInStream::CFolderInStream()
12 _inStreamWithHashSpec = new CSequentialInStreamWithCRC;
13 _inStreamWithHash = _inStreamWithHashSpec;
16 void CFolderInStream::Init(IArchiveUpdateCallback *updateCallback,
17 const UInt32 *fileIndices, UInt32 numFiles)
19 _updateCallback = updateCallback;
22 _fileIndices = fileIndices;
27 _currentSizeIsDefined = false;
30 HRESULT CFolderInStream::OpenStream()
33 while (_fileIndex < _numFiles)
35 _currentSizeIsDefined = false;
36 CMyComPtr<ISequentialInStream> stream;
37 HRESULT result = _updateCallback->GetStream(_fileIndices[_fileIndex], &stream);
38 if (result != S_OK && result != S_FALSE)
41 _inStreamWithHashSpec->SetStream(stream);
42 _inStreamWithHashSpec->Init();
45 RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
47 Processed.Add(result == S_OK);
51 CMyComPtr<IStreamGetSize> streamGetSize;
52 if (stream.QueryInterface(IID_IStreamGetSize, &streamGetSize) == S_OK)
56 _currentSizeIsDefined = true;
57 RINOK(streamGetSize->GetSize(&_currentSize));
67 void CFolderInStream::AddDigest()
69 CRCs.Add(_inStreamWithHashSpec->GetCRC());
72 HRESULT CFolderInStream::CloseStream()
74 RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK));
75 _inStreamWithHashSpec->ReleaseStream();
83 STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
85 UInt32 realProcessedSize = 0;
86 while ((_fileIndex < _numFiles || _fileIsOpen) && size > 0)
90 UInt32 localProcessedSize;
91 RINOK(_inStreamWithHash->Read(
92 ((Byte *)data) + realProcessedSize, size, &localProcessedSize));
93 if (localProcessedSize == 0)
98 realProcessedSize += localProcessedSize;
99 _filePos += localProcessedSize;
100 size -= localProcessedSize;
108 if (processedSize != 0)
109 *processedSize = realProcessedSize;
113 STDMETHODIMP CFolderInStream::GetSubStreamSize(UInt64 subStream, UInt64 *value)
116 int subStreamIndex = (int)subStream;
117 if (subStreamIndex < 0 || subStream > Sizes.Size())
119 if (subStreamIndex < Sizes.Size())
121 *value= Sizes[subStreamIndex];
124 if (!_currentSizeIsDefined)
126 *value = _currentSize;