1// StreamUtils.cpp 2 3#include "StdAfx.h" 4 5#include "StreamUtils.h" 6 7static const UInt32 kBlockSize = ((UInt32)1 << 31); 8 9HRESULT 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 28HRESULT 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 35HRESULT 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 42HRESULT 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