1 // StreamUtils.cpp
2 
3 #include "StdAfx.h"
4 
5 #include "StreamUtils.h"
6 
7 static const UInt32 kBlockSize = ((UInt32)1 << 31);
8 
ReadStream(ISequentialInStream * stream,void * data,size_t * processedSize)9 HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *processedSize)
10 {
11   size_t size = *processedSize;
12   *processedSize = 0;
13   while (size != 0)
14   {
15     UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize;
16     UInt32 processedSizeLoc;
17     HRESULT res = stream->Read(data, curSize, &processedSizeLoc);
18     *processedSize += processedSizeLoc;
19     data = (void *)((Byte *)data + processedSizeLoc);
20     size -= processedSizeLoc;
21     RINOK(res);
22     if (processedSizeLoc == 0)
23       return S_OK;
24   }
25   return S_OK;
26 }
27 
ReadStream_FALSE(ISequentialInStream * stream,void * data,size_t size)28 HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size)
29 {
30   size_t processedSize = size;
31   RINOK(ReadStream(stream, data, &processedSize));
32   return (size == processedSize) ? S_OK : S_FALSE;
33 }
34 
ReadStream_FAIL(ISequentialInStream * stream,void * data,size_t size)35 HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size)
36 {
37   size_t processedSize = size;
38   RINOK(ReadStream(stream, data, &processedSize));
39   return (size == processedSize) ? S_OK : E_FAIL;
40 }
41 
WriteStream(ISequentialOutStream * stream,const void * data,size_t size)42 HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size)
43 {
44   while (size != 0)
45   {
46     UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize;
47     UInt32 processedSizeLoc;
48     HRESULT res = stream->Write(data, curSize, &processedSizeLoc);
49     data = (const void *)((const Byte *)data + processedSizeLoc);
50     size -= processedSizeLoc;
51     RINOK(res);
52     if (processedSizeLoc == 0)
53       return E_FAIL;
54   }
55   return S_OK;
56 }
57