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