view src/win32/7zip/7z/CPP/7zip/Common/StreamUtils.cpp @ 1:f9f4f1b99eed

importing src directory
author Robert McIntyre <rlm@mit.edu>
date Sat, 03 Mar 2012 10:31:27 -0600
parents
children
line wrap: on
line source
1 // StreamUtils.cpp
3 #include "StdAfx.h"
5 #include "StreamUtils.h"
7 static const UInt32 kBlockSize = ((UInt32)1 << 31);
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 }
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 }
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 }
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 }