1baa3858d3f5d128a5c8466b700098109edcad5f2repo sync// InStreamWithCRC.cpp
2baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
3baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "StdAfx.h"
4baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
5baa3858d3f5d128a5c8466b700098109edcad5f2repo sync#include "InStreamWithCRC.h"
6baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
7baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CSequentialInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize)
8baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
9baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt32 realProcessedSize;
10baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  HRESULT result = _stream->Read(data, size, &realProcessedSize);
11baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _size += realProcessedSize;
12baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (size > 0 && realProcessedSize == 0)
13baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _wasFinished = true;
14baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _crc = CrcUpdate(_crc, data, realProcessedSize);
15baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if(processedSize != NULL)
16baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    *processedSize = realProcessedSize;
17baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return result;
18baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
19baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
20baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize)
21baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
22baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  UInt32 realProcessedSize;
23baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  HRESULT result = _stream->Read(data, size, &realProcessedSize);
24baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  /*
25baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (size > 0 && realProcessedSize == 0)
26baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    _wasFinished = true;
27baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  */
28baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _size += realProcessedSize;
29baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _crc = CrcUpdate(_crc, data, realProcessedSize);
30baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if(processedSize != NULL)
31baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    *processedSize = realProcessedSize;
32baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return result;
33baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
34baa3858d3f5d128a5c8466b700098109edcad5f2repo sync
35baa3858d3f5d128a5c8466b700098109edcad5f2repo syncSTDMETHODIMP CInStreamWithCRC::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition)
36baa3858d3f5d128a5c8466b700098109edcad5f2repo sync{
37baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  if (seekOrigin != STREAM_SEEK_SET || offset != 0)
38baa3858d3f5d128a5c8466b700098109edcad5f2repo sync    return E_FAIL;
39baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _size = 0;
40baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  _crc = CRC_INIT_VAL;
41baa3858d3f5d128a5c8466b700098109edcad5f2repo sync  return _stream->Seek(offset, seekOrigin, newPosition);
42baa3858d3f5d128a5c8466b700098109edcad5f2repo sync}
43