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