1 // RarVolumeInStream.cpp
\r
5 #include "../../../../C/7zCrc.h"
\r
7 #include "RarVolumeInStream.h"
\r
12 void CFolderInStream::Init(
\r
13 CObjectVector<CInArchive> *archives,
\r
14 const CObjectVector<CItemEx> *items,
\r
15 const CRefItem &refItem)
\r
17 _archives = archives;
\r
22 _fileIsOpen = false;
\r
25 HRESULT CFolderInStream::OpenStream()
\r
27 while (_curIndex < _refItem.NumItems)
\r
29 const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex];
\r
30 _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex].
\r
31 CreateLimitedStream(item.GetDataPosition(), item.PackSize));
\r
34 _crc = CRC_INIT_VAL;
\r
40 HRESULT CFolderInStream::CloseStream()
\r
42 CRCs.Add(CRC_GET_DIGEST(_crc));
\r
44 _fileIsOpen = false;
\r
48 STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
\r
50 UInt32 realProcessedSize = 0;
\r
51 while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0)
\r
55 UInt32 localProcessedSize;
\r
56 RINOK(_stream->Read(
\r
57 ((Byte *)data) + realProcessedSize, size, &localProcessedSize));
\r
58 _crc = CrcUpdate(_crc, ((Byte *)data) + realProcessedSize, localProcessedSize);
\r
59 if (localProcessedSize == 0)
\r
61 RINOK(CloseStream());
\r
64 realProcessedSize += localProcessedSize;
\r
65 size -= localProcessedSize;
\r
70 RINOK(OpenStream());
\r
73 if (processedSize != 0)
\r
74 *processedSize = realProcessedSize;
\r