1// StreamUtils.cpp
2
3#include "StdAfx.h"
4
5#include "../../Common/MyCom.h"
6#include "StreamUtils.h"
7
8HRESULT ReadStream(ISequentialInStream *stream, void *data, UInt32 size, UInt32 *processedSize)
9{
10  if (processedSize != 0)
11    *processedSize = 0;
12  while(size != 0)
13  {
14    UInt32 processedSizeLoc;
15    HRESULT res = stream->Read(data, size, &processedSizeLoc);
16    if (processedSize != 0)
17      *processedSize += processedSizeLoc;
18    data = (Byte *)((Byte *)data + processedSizeLoc);
19    size -= processedSizeLoc;
20    RINOK(res);
21    if (processedSizeLoc == 0)
22      return S_OK;
23  }
24  return S_OK;
25}
26
27HRESULT WriteStream(ISequentialOutStream *stream, const void *data, UInt32 size, UInt32 *processedSize)
28{
29  if (processedSize != 0)
30    *processedSize = 0;
31  while(size != 0)
32  {
33    UInt32 processedSizeLoc;
34    HRESULT res = stream->Write(data, size, &processedSizeLoc);
35    if (processedSize != 0)
36      *processedSize += processedSizeLoc;
37    data = (const void *)((const Byte *)data + processedSizeLoc);
38    size -= processedSizeLoc;
39    RINOK(res);
40    if (processedSizeLoc == 0)
41      return E_FAIL;
42  }
43  return S_OK;
44}
45