annotate src/win32/7zip/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
rev   line source
rlm@1 1 // RarVolumeInStream.cpp
rlm@1 2
rlm@1 3 #include "StdAfx.h"
rlm@1 4
rlm@1 5 #include "RarVolumeInStream.h"
rlm@1 6
rlm@1 7 #include "Windows/Defs.h"
rlm@1 8 #include "Common/Defs.h"
rlm@1 9
rlm@1 10 extern "C"
rlm@1 11 {
rlm@1 12 #include "../../../../C/7zCrc.h"
rlm@1 13 }
rlm@1 14
rlm@1 15 namespace NArchive {
rlm@1 16 namespace NRar {
rlm@1 17
rlm@1 18 void CFolderInStream::Init(
rlm@1 19 CObjectVector<CInArchive> *archives,
rlm@1 20 const CObjectVector<CItemEx> *items,
rlm@1 21 const CRefItem &refItem)
rlm@1 22 {
rlm@1 23 _archives = archives;
rlm@1 24 _items = items;
rlm@1 25 _refItem = refItem;
rlm@1 26 _curIndex = 0;
rlm@1 27 CRCs.Clear();
rlm@1 28 _fileIsOpen = false;
rlm@1 29 }
rlm@1 30
rlm@1 31 HRESULT CFolderInStream::OpenStream()
rlm@1 32 {
rlm@1 33 while (_curIndex < _refItem.NumItems)
rlm@1 34 {
rlm@1 35 const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex];
rlm@1 36 _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex].
rlm@1 37 CreateLimitedStream(item.GetDataPosition(), item.PackSize));
rlm@1 38 _curIndex++;
rlm@1 39 _fileIsOpen = true;
rlm@1 40 _crc = CRC_INIT_VAL;
rlm@1 41 return S_OK;
rlm@1 42 }
rlm@1 43 return S_OK;
rlm@1 44 }
rlm@1 45
rlm@1 46 HRESULT CFolderInStream::CloseStream()
rlm@1 47 {
rlm@1 48 CRCs.Add(CRC_GET_DIGEST(_crc));
rlm@1 49 _stream.Release();
rlm@1 50 _fileIsOpen = false;
rlm@1 51 return S_OK;
rlm@1 52 }
rlm@1 53
rlm@1 54 STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
rlm@1 55 {
rlm@1 56 UInt32 realProcessedSize = 0;
rlm@1 57 while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0)
rlm@1 58 {
rlm@1 59 if (_fileIsOpen)
rlm@1 60 {
rlm@1 61 UInt32 localProcessedSize;
rlm@1 62 RINOK(_stream->Read(
rlm@1 63 ((Byte *)data) + realProcessedSize, size, &localProcessedSize));
rlm@1 64 _crc = CrcUpdate(_crc, ((Byte *)data) + realProcessedSize, localProcessedSize);
rlm@1 65 if (localProcessedSize == 0)
rlm@1 66 {
rlm@1 67 RINOK(CloseStream());
rlm@1 68 continue;
rlm@1 69 }
rlm@1 70 realProcessedSize += localProcessedSize;
rlm@1 71 size -= localProcessedSize;
rlm@1 72 break;
rlm@1 73 }
rlm@1 74 else
rlm@1 75 {
rlm@1 76 RINOK(OpenStream());
rlm@1 77 }
rlm@1 78 }
rlm@1 79 if (processedSize != 0)
rlm@1 80 *processedSize = realProcessedSize;
rlm@1 81 return S_OK;
rlm@1 82 }
rlm@1 83
rlm@1 84 }}