rlm@1: // RarVolumeInStream.cpp rlm@1: rlm@1: #include "StdAfx.h" rlm@1: rlm@1: #include "RarVolumeInStream.h" rlm@1: rlm@1: #include "Windows/Defs.h" rlm@1: #include "Common/Defs.h" rlm@1: rlm@1: extern "C" rlm@1: { rlm@1: #include "../../../../C/7zCrc.h" rlm@1: } rlm@1: rlm@1: namespace NArchive { rlm@1: namespace NRar { rlm@1: rlm@1: void CFolderInStream::Init( rlm@1: CObjectVector *archives, rlm@1: const CObjectVector *items, rlm@1: const CRefItem &refItem) rlm@1: { rlm@1: _archives = archives; rlm@1: _items = items; rlm@1: _refItem = refItem; rlm@1: _curIndex = 0; rlm@1: CRCs.Clear(); rlm@1: _fileIsOpen = false; rlm@1: } rlm@1: rlm@1: HRESULT CFolderInStream::OpenStream() rlm@1: { rlm@1: while (_curIndex < _refItem.NumItems) rlm@1: { rlm@1: const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex]; rlm@1: _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex]. rlm@1: CreateLimitedStream(item.GetDataPosition(), item.PackSize)); rlm@1: _curIndex++; rlm@1: _fileIsOpen = true; rlm@1: _crc = CRC_INIT_VAL; rlm@1: return S_OK; rlm@1: } rlm@1: return S_OK; rlm@1: } rlm@1: rlm@1: HRESULT CFolderInStream::CloseStream() rlm@1: { rlm@1: CRCs.Add(CRC_GET_DIGEST(_crc)); rlm@1: _stream.Release(); rlm@1: _fileIsOpen = false; rlm@1: return S_OK; rlm@1: } rlm@1: rlm@1: STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize) rlm@1: { rlm@1: UInt32 realProcessedSize = 0; rlm@1: while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0) rlm@1: { rlm@1: if (_fileIsOpen) rlm@1: { rlm@1: UInt32 localProcessedSize; rlm@1: RINOK(_stream->Read( rlm@1: ((Byte *)data) + realProcessedSize, size, &localProcessedSize)); rlm@1: _crc = CrcUpdate(_crc, ((Byte *)data) + realProcessedSize, localProcessedSize); rlm@1: if (localProcessedSize == 0) rlm@1: { rlm@1: RINOK(CloseStream()); rlm@1: continue; rlm@1: } rlm@1: realProcessedSize += localProcessedSize; rlm@1: size -= localProcessedSize; rlm@1: break; rlm@1: } rlm@1: else rlm@1: { rlm@1: RINOK(OpenStream()); rlm@1: } rlm@1: } rlm@1: if (processedSize != 0) rlm@1: *processedSize = realProcessedSize; rlm@1: return S_OK; rlm@1: } rlm@1: rlm@1: }}