diff 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
line wrap: on
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/src/win32/7zip/7z/CPP/7zip/Archive/Rar/RarVolumeInStream.cpp	Sat Mar 03 10:31:27 2012 -0600
     1.3 @@ -0,0 +1,84 @@
     1.4 +// RarVolumeInStream.cpp
     1.5 +
     1.6 +#include "StdAfx.h"
     1.7 +
     1.8 +#include "RarVolumeInStream.h"
     1.9 +
    1.10 +#include "Windows/Defs.h"
    1.11 +#include "Common/Defs.h"
    1.12 +
    1.13 +extern "C"
    1.14 +{
    1.15 +  #include "../../../../C/7zCrc.h"
    1.16 +}
    1.17 +
    1.18 +namespace NArchive {
    1.19 +namespace NRar {
    1.20 +
    1.21 +void CFolderInStream::Init(
    1.22 +    CObjectVector<CInArchive> *archives,
    1.23 +    const CObjectVector<CItemEx> *items,
    1.24 +    const CRefItem &refItem)
    1.25 +{
    1.26 +  _archives = archives;
    1.27 +  _items = items;
    1.28 +  _refItem = refItem;
    1.29 +  _curIndex = 0;
    1.30 +  CRCs.Clear();
    1.31 +  _fileIsOpen = false;
    1.32 +}
    1.33 +
    1.34 +HRESULT CFolderInStream::OpenStream()
    1.35 +{
    1.36 +  while (_curIndex < _refItem.NumItems)
    1.37 +  {
    1.38 +    const CItemEx &item = (*_items)[_refItem.ItemIndex + _curIndex];
    1.39 +    _stream.Attach((*_archives)[_refItem.VolumeIndex + _curIndex].
    1.40 +        CreateLimitedStream(item.GetDataPosition(), item.PackSize));
    1.41 +    _curIndex++;
    1.42 +    _fileIsOpen = true;
    1.43 +    _crc = CRC_INIT_VAL;
    1.44 +    return S_OK;
    1.45 +  }
    1.46 +  return S_OK;
    1.47 +}
    1.48 +
    1.49 +HRESULT CFolderInStream::CloseStream()
    1.50 +{
    1.51 +  CRCs.Add(CRC_GET_DIGEST(_crc));
    1.52 +  _stream.Release();
    1.53 +  _fileIsOpen = false;
    1.54 +  return S_OK;
    1.55 +}
    1.56 +
    1.57 +STDMETHODIMP CFolderInStream::Read(void *data, UInt32 size, UInt32 *processedSize)
    1.58 +{
    1.59 +  UInt32 realProcessedSize = 0;
    1.60 +  while ((_curIndex < _refItem.NumItems || _fileIsOpen) && size > 0)
    1.61 +  {
    1.62 +    if (_fileIsOpen)
    1.63 +    {
    1.64 +      UInt32 localProcessedSize;
    1.65 +      RINOK(_stream->Read(
    1.66 +          ((Byte *)data) + realProcessedSize, size, &localProcessedSize));
    1.67 +      _crc = CrcUpdate(_crc, ((Byte *)data) + realProcessedSize, localProcessedSize);
    1.68 +      if (localProcessedSize == 0)
    1.69 +      {
    1.70 +        RINOK(CloseStream());
    1.71 +        continue;
    1.72 +      }
    1.73 +      realProcessedSize += localProcessedSize;
    1.74 +      size -= localProcessedSize;
    1.75 +      break;
    1.76 +    }
    1.77 +    else
    1.78 +    {
    1.79 +      RINOK(OpenStream());
    1.80 +    }
    1.81 +  }
    1.82 +  if (processedSize != 0)
    1.83 +    *processedSize = realProcessedSize;
    1.84 +  return S_OK;
    1.85 +}
    1.86 +
    1.87 +}}