diff options
Diffstat (limited to '3rdparty/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp')
-rw-r--r-- | 3rdparty/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp | 135 |
1 files changed, 74 insertions, 61 deletions
diff --git a/3rdparty/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp b/3rdparty/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp index edd276bc116..14cdc436452 100644 --- a/3rdparty/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp +++ b/3rdparty/lzma/CPP/7zip/Archive/7z/7zFolderInStream.cpp @@ -7,96 +7,103 @@ namespace NArchive { namespace N7z { -CFolderInStream::CFolderInStream() -{ - _inStreamWithHashSpec = new CSequentialInStreamWithCRC; - _inStreamWithHash = _inStreamWithHashSpec; -} - void CFolderInStream::Init(IArchiveUpdateCallback *updateCallback, - const UInt32 *fileIndices, UInt32 numFiles) + const UInt32 *indexes, unsigned numFiles) { _updateCallback = updateCallback; + _indexes = indexes; _numFiles = numFiles; - _fileIndex = 0; - _fileIndices = fileIndices; - Processed.Clear(); - CRCs.Clear(); - Sizes.Clear(); - _fileIsOpen = false; - _currentSizeIsDefined = false; + _index = 0; + + Processed.ClearAndReserve(numFiles); + CRCs.ClearAndReserve(numFiles); + Sizes.ClearAndReserve(numFiles); + + _pos = 0; + _crc = CRC_INIT_VAL; + _size_Defined = false; + _size = 0; + + _stream.Release(); } HRESULT CFolderInStream::OpenStream() { - _filePos = 0; - while (_fileIndex < _numFiles) + _pos = 0; + _crc = CRC_INIT_VAL; + _size_Defined = false; + _size = 0; + + while (_index < _numFiles) { CMyComPtr<ISequentialInStream> stream; - HRESULT result = _updateCallback->GetStream(_fileIndices[_fileIndex], &stream); - if (result != S_OK && result != S_FALSE) - return result; - _fileIndex++; - _inStreamWithHashSpec->SetStream(stream); - _inStreamWithHashSpec->Init(); + HRESULT result = _updateCallback->GetStream(_indexes[_index], &stream); + if (result != S_OK) + { + if (result != S_FALSE) + return result; + } + + _stream = stream; + if (stream) { - _fileIsOpen = true; CMyComPtr<IStreamGetSize> streamGetSize; stream.QueryInterface(IID_IStreamGetSize, &streamGetSize); if (streamGetSize) { - RINOK(streamGetSize->GetSize(&_currentSize)); - _currentSizeIsDefined = true; + if (streamGetSize->GetSize(&_size) == S_OK) + _size_Defined = true; } return S_OK; } + + _index++; RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); - Sizes.Add(0); - Processed.Add(result == S_OK); - AddDigest(); + AddFileInfo(result == S_OK); } return S_OK; } -void CFolderInStream::AddDigest() +void CFolderInStream::AddFileInfo(bool isProcessed) { - CRCs.Add(_inStreamWithHashSpec->GetCRC()); -} - -HRESULT CFolderInStream::CloseStream() -{ - RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); - _inStreamWithHashSpec->ReleaseStream(); - _fileIsOpen = false; - _currentSizeIsDefined = false; - Processed.Add(true); - Sizes.Add(_filePos); - AddDigest(); - return S_OK; + Processed.Add(isProcessed); + Sizes.Add(_pos); + CRCs.Add(CRC_GET_DIGEST(_crc)); } STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize) { - if (processedSize != 0) + if (processedSize) *processedSize = 0; - while (size > 0) + while (size != 0) { - if (_fileIsOpen) + if (_stream) { UInt32 processed2; - RINOK(_inStreamWithHash->Read(data, size, &processed2)); - if (processed2 == 0) + RINOK(_stream->Read(data, size, &processed2)); + if (processed2 != 0) { - RINOK(CloseStream()); - continue; + _crc = CrcUpdate(_crc, data, processed2); + _pos += processed2; + if (processedSize) + *processedSize = processed2; + return S_OK; } - if (processedSize != 0) - *processedSize = processed2; - _filePos += processed2; - break; + + _stream.Release(); + _index++; + AddFileInfo(true); + + _pos = 0; + _crc = CRC_INIT_VAL; + _size_Defined = false; + _size = 0; + + RINOK(_updateCallback->SetOperationResult(NArchive::NUpdate::NOperationResult::kOK)); } - if (_fileIndex >= _numFiles) + + if (_index >= _numFiles) break; RINOK(OpenStream()); } @@ -106,17 +113,23 @@ STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSiz STDMETHODIMP CFolderInStream::GetSubStreamSize(UInt64 subStream, UInt64 *value) { *value = 0; - int index2 = (int)subStream; - if (index2 < 0 || subStream > Sizes.Size()) - return E_FAIL; - if (index2 < Sizes.Size()) + if (subStream > Sizes.Size()) + return S_FALSE; // E_FAIL; + + unsigned index = (unsigned)subStream; + if (index < Sizes.Size()) { - *value = Sizes[index2]; + *value = Sizes[index]; return S_OK; } - if (!_currentSizeIsDefined) + + if (!_size_Defined) + { + *value = _pos; return S_FALSE; - *value = _currentSize; + } + + *value = (_pos > _size ? _pos : _size); return S_OK; } |