1*f6dc9357SAndroid Build Coastguard Worker // StreamUtils.cpp
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../Common/MyCom.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "StreamUtils.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kBlockSize = ((UInt32)1 << 31);
10*f6dc9357SAndroid Build Coastguard Worker
11*f6dc9357SAndroid Build Coastguard Worker
InStream_SeekToBegin(IInStream * stream)12*f6dc9357SAndroid Build Coastguard Worker HRESULT InStream_SeekToBegin(IInStream *stream) throw()
13*f6dc9357SAndroid Build Coastguard Worker {
14*f6dc9357SAndroid Build Coastguard Worker return InStream_SeekSet(stream, 0);
15*f6dc9357SAndroid Build Coastguard Worker }
16*f6dc9357SAndroid Build Coastguard Worker
17*f6dc9357SAndroid Build Coastguard Worker
InStream_AtBegin_GetSize(IInStream * stream,UInt64 & sizeRes)18*f6dc9357SAndroid Build Coastguard Worker HRESULT InStream_AtBegin_GetSize(IInStream *stream, UInt64 &sizeRes) throw()
19*f6dc9357SAndroid Build Coastguard Worker {
20*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
21*f6dc9357SAndroid Build Coastguard Worker {
22*f6dc9357SAndroid Build Coastguard Worker Z7_DECL_CMyComPtr_QI_FROM(
23*f6dc9357SAndroid Build Coastguard Worker IStreamGetSize,
24*f6dc9357SAndroid Build Coastguard Worker streamGetSize, stream)
25*f6dc9357SAndroid Build Coastguard Worker if (streamGetSize && streamGetSize->GetSize(&sizeRes) == S_OK)
26*f6dc9357SAndroid Build Coastguard Worker return S_OK;
27*f6dc9357SAndroid Build Coastguard Worker }
28*f6dc9357SAndroid Build Coastguard Worker #endif
29*f6dc9357SAndroid Build Coastguard Worker const HRESULT hres = InStream_GetSize_SeekToEnd(stream, sizeRes);
30*f6dc9357SAndroid Build Coastguard Worker const HRESULT hres2 = InStream_SeekToBegin(stream);
31*f6dc9357SAndroid Build Coastguard Worker return hres != S_OK ? hres : hres2;
32*f6dc9357SAndroid Build Coastguard Worker }
33*f6dc9357SAndroid Build Coastguard Worker
34*f6dc9357SAndroid Build Coastguard Worker
InStream_GetPos_GetSize(IInStream * stream,UInt64 & curPosRes,UInt64 & sizeRes)35*f6dc9357SAndroid Build Coastguard Worker HRESULT InStream_GetPos_GetSize(IInStream *stream, UInt64 &curPosRes, UInt64 &sizeRes) throw()
36*f6dc9357SAndroid Build Coastguard Worker {
37*f6dc9357SAndroid Build Coastguard Worker RINOK(InStream_GetPos(stream, curPosRes))
38*f6dc9357SAndroid Build Coastguard Worker #ifdef _WIN32
39*f6dc9357SAndroid Build Coastguard Worker {
40*f6dc9357SAndroid Build Coastguard Worker Z7_DECL_CMyComPtr_QI_FROM(
41*f6dc9357SAndroid Build Coastguard Worker IStreamGetSize,
42*f6dc9357SAndroid Build Coastguard Worker streamGetSize, stream)
43*f6dc9357SAndroid Build Coastguard Worker if (streamGetSize && streamGetSize->GetSize(&sizeRes) == S_OK)
44*f6dc9357SAndroid Build Coastguard Worker return S_OK;
45*f6dc9357SAndroid Build Coastguard Worker }
46*f6dc9357SAndroid Build Coastguard Worker #endif
47*f6dc9357SAndroid Build Coastguard Worker const HRESULT hres = InStream_GetSize_SeekToEnd(stream, sizeRes);
48*f6dc9357SAndroid Build Coastguard Worker const HRESULT hres2 = InStream_SeekSet(stream, curPosRes);
49*f6dc9357SAndroid Build Coastguard Worker return hres != S_OK ? hres : hres2;
50*f6dc9357SAndroid Build Coastguard Worker }
51*f6dc9357SAndroid Build Coastguard Worker
52*f6dc9357SAndroid Build Coastguard Worker
53*f6dc9357SAndroid Build Coastguard Worker
ReadStream(ISequentialInStream * stream,void * data,size_t * processedSize)54*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadStream(ISequentialInStream *stream, void *data, size_t *processedSize) throw()
55*f6dc9357SAndroid Build Coastguard Worker {
56*f6dc9357SAndroid Build Coastguard Worker size_t size = *processedSize;
57*f6dc9357SAndroid Build Coastguard Worker *processedSize = 0;
58*f6dc9357SAndroid Build Coastguard Worker while (size != 0)
59*f6dc9357SAndroid Build Coastguard Worker {
60*f6dc9357SAndroid Build Coastguard Worker UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize;
61*f6dc9357SAndroid Build Coastguard Worker UInt32 processedSizeLoc;
62*f6dc9357SAndroid Build Coastguard Worker HRESULT res = stream->Read(data, curSize, &processedSizeLoc);
63*f6dc9357SAndroid Build Coastguard Worker *processedSize += processedSizeLoc;
64*f6dc9357SAndroid Build Coastguard Worker data = (void *)((Byte *)data + processedSizeLoc);
65*f6dc9357SAndroid Build Coastguard Worker size -= processedSizeLoc;
66*f6dc9357SAndroid Build Coastguard Worker RINOK(res)
67*f6dc9357SAndroid Build Coastguard Worker if (processedSizeLoc == 0)
68*f6dc9357SAndroid Build Coastguard Worker return S_OK;
69*f6dc9357SAndroid Build Coastguard Worker }
70*f6dc9357SAndroid Build Coastguard Worker return S_OK;
71*f6dc9357SAndroid Build Coastguard Worker }
72*f6dc9357SAndroid Build Coastguard Worker
ReadStream_FALSE(ISequentialInStream * stream,void * data,size_t size)73*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadStream_FALSE(ISequentialInStream *stream, void *data, size_t size) throw()
74*f6dc9357SAndroid Build Coastguard Worker {
75*f6dc9357SAndroid Build Coastguard Worker size_t processedSize = size;
76*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadStream(stream, data, &processedSize))
77*f6dc9357SAndroid Build Coastguard Worker return (size == processedSize) ? S_OK : S_FALSE;
78*f6dc9357SAndroid Build Coastguard Worker }
79*f6dc9357SAndroid Build Coastguard Worker
ReadStream_FAIL(ISequentialInStream * stream,void * data,size_t size)80*f6dc9357SAndroid Build Coastguard Worker HRESULT ReadStream_FAIL(ISequentialInStream *stream, void *data, size_t size) throw()
81*f6dc9357SAndroid Build Coastguard Worker {
82*f6dc9357SAndroid Build Coastguard Worker size_t processedSize = size;
83*f6dc9357SAndroid Build Coastguard Worker RINOK(ReadStream(stream, data, &processedSize))
84*f6dc9357SAndroid Build Coastguard Worker return (size == processedSize) ? S_OK : E_FAIL;
85*f6dc9357SAndroid Build Coastguard Worker }
86*f6dc9357SAndroid Build Coastguard Worker
WriteStream(ISequentialOutStream * stream,const void * data,size_t size)87*f6dc9357SAndroid Build Coastguard Worker HRESULT WriteStream(ISequentialOutStream *stream, const void *data, size_t size) throw()
88*f6dc9357SAndroid Build Coastguard Worker {
89*f6dc9357SAndroid Build Coastguard Worker while (size != 0)
90*f6dc9357SAndroid Build Coastguard Worker {
91*f6dc9357SAndroid Build Coastguard Worker UInt32 curSize = (size < kBlockSize) ? (UInt32)size : kBlockSize;
92*f6dc9357SAndroid Build Coastguard Worker UInt32 processedSizeLoc;
93*f6dc9357SAndroid Build Coastguard Worker HRESULT res = stream->Write(data, curSize, &processedSizeLoc);
94*f6dc9357SAndroid Build Coastguard Worker data = (const void *)((const Byte *)data + processedSizeLoc);
95*f6dc9357SAndroid Build Coastguard Worker size -= processedSizeLoc;
96*f6dc9357SAndroid Build Coastguard Worker RINOK(res)
97*f6dc9357SAndroid Build Coastguard Worker if (processedSizeLoc == 0)
98*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
99*f6dc9357SAndroid Build Coastguard Worker }
100*f6dc9357SAndroid Build Coastguard Worker return S_OK;
101*f6dc9357SAndroid Build Coastguard Worker }
102