1370b324cSopenharmony_ci// InStreamWithCRC.cpp
2370b324cSopenharmony_ci
3370b324cSopenharmony_ci#include "StdAfx.h"
4370b324cSopenharmony_ci
5370b324cSopenharmony_ci#include "InStreamWithCRC.h"
6370b324cSopenharmony_ci
7370b324cSopenharmony_ciZ7_COM7F_IMF(CSequentialInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize))
8370b324cSopenharmony_ci{
9370b324cSopenharmony_ci  UInt32 realProcessed = 0;
10370b324cSopenharmony_ci  HRESULT result = S_OK;
11370b324cSopenharmony_ci  if (size != 0)
12370b324cSopenharmony_ci  {
13370b324cSopenharmony_ci    if (_stream)
14370b324cSopenharmony_ci      result = _stream->Read(data, size, &realProcessed);
15370b324cSopenharmony_ci    _size += realProcessed;
16370b324cSopenharmony_ci    if (realProcessed == 0)
17370b324cSopenharmony_ci      _wasFinished = true;
18370b324cSopenharmony_ci    else
19370b324cSopenharmony_ci      _crc = CrcUpdate(_crc, data, realProcessed);
20370b324cSopenharmony_ci  }
21370b324cSopenharmony_ci  if (processedSize)
22370b324cSopenharmony_ci    *processedSize = realProcessed;
23370b324cSopenharmony_ci  return result;
24370b324cSopenharmony_ci}
25370b324cSopenharmony_ci
26370b324cSopenharmony_ciZ7_COM7F_IMF(CSequentialInStreamWithCRC::GetSize(UInt64 *size))
27370b324cSopenharmony_ci{
28370b324cSopenharmony_ci  *size = _fullSize;
29370b324cSopenharmony_ci  return S_OK;
30370b324cSopenharmony_ci}
31370b324cSopenharmony_ci
32370b324cSopenharmony_ci
33370b324cSopenharmony_ciZ7_COM7F_IMF(CInStreamWithCRC::Read(void *data, UInt32 size, UInt32 *processedSize))
34370b324cSopenharmony_ci{
35370b324cSopenharmony_ci  UInt32 realProcessed = 0;
36370b324cSopenharmony_ci  HRESULT result = S_OK;
37370b324cSopenharmony_ci  if (_stream)
38370b324cSopenharmony_ci    result = _stream->Read(data, size, &realProcessed);
39370b324cSopenharmony_ci  _size += realProcessed;
40370b324cSopenharmony_ci  /*
41370b324cSopenharmony_ci  if (size != 0 && realProcessed == 0)
42370b324cSopenharmony_ci    _wasFinished = true;
43370b324cSopenharmony_ci  */
44370b324cSopenharmony_ci  _crc = CrcUpdate(_crc, data, realProcessed);
45370b324cSopenharmony_ci  if (processedSize)
46370b324cSopenharmony_ci    *processedSize = realProcessed;
47370b324cSopenharmony_ci  return result;
48370b324cSopenharmony_ci}
49370b324cSopenharmony_ci
50370b324cSopenharmony_ciZ7_COM7F_IMF(CInStreamWithCRC::Seek(Int64 offset, UInt32 seekOrigin, UInt64 *newPosition))
51370b324cSopenharmony_ci{
52370b324cSopenharmony_ci  if (seekOrigin != STREAM_SEEK_SET || offset != 0)
53370b324cSopenharmony_ci    return E_FAIL;
54370b324cSopenharmony_ci  _size = 0;
55370b324cSopenharmony_ci  _crc = CRC_INIT_VAL;
56370b324cSopenharmony_ci  return _stream->Seek(offset, seekOrigin, newPosition);
57370b324cSopenharmony_ci}
58