xref: /aosp_15_r20/external/lzma/CPP/7zip/Common/StreamUtils.cpp (revision f6dc9357d832569d4d1f5d24eacdb3935a1ae8e6)
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