1*f6dc9357SAndroid Build Coastguard Worker // CWrappers.c
2*f6dc9357SAndroid Build Coastguard Worker
3*f6dc9357SAndroid Build Coastguard Worker #include "StdAfx.h"
4*f6dc9357SAndroid Build Coastguard Worker
5*f6dc9357SAndroid Build Coastguard Worker #include "../../../C/Alloc.h"
6*f6dc9357SAndroid Build Coastguard Worker
7*f6dc9357SAndroid Build Coastguard Worker #include "CWrappers.h"
8*f6dc9357SAndroid Build Coastguard Worker
9*f6dc9357SAndroid Build Coastguard Worker #include "StreamUtils.h"
10*f6dc9357SAndroid Build Coastguard Worker
HRESULT_To_SRes(HRESULT res,SRes defaultRes)11*f6dc9357SAndroid Build Coastguard Worker SRes HRESULT_To_SRes(HRESULT res, SRes defaultRes) throw()
12*f6dc9357SAndroid Build Coastguard Worker {
13*f6dc9357SAndroid Build Coastguard Worker switch (res)
14*f6dc9357SAndroid Build Coastguard Worker {
15*f6dc9357SAndroid Build Coastguard Worker case S_OK: return SZ_OK;
16*f6dc9357SAndroid Build Coastguard Worker case E_OUTOFMEMORY: return SZ_ERROR_MEM;
17*f6dc9357SAndroid Build Coastguard Worker case E_INVALIDARG: return SZ_ERROR_PARAM;
18*f6dc9357SAndroid Build Coastguard Worker case E_ABORT: return SZ_ERROR_PROGRESS;
19*f6dc9357SAndroid Build Coastguard Worker case S_FALSE: return SZ_ERROR_DATA;
20*f6dc9357SAndroid Build Coastguard Worker case E_NOTIMPL: return SZ_ERROR_UNSUPPORTED;
21*f6dc9357SAndroid Build Coastguard Worker default: break;
22*f6dc9357SAndroid Build Coastguard Worker }
23*f6dc9357SAndroid Build Coastguard Worker return defaultRes;
24*f6dc9357SAndroid Build Coastguard Worker }
25*f6dc9357SAndroid Build Coastguard Worker
26*f6dc9357SAndroid Build Coastguard Worker
SResToHRESULT(SRes res)27*f6dc9357SAndroid Build Coastguard Worker HRESULT SResToHRESULT(SRes res) throw()
28*f6dc9357SAndroid Build Coastguard Worker {
29*f6dc9357SAndroid Build Coastguard Worker switch (res)
30*f6dc9357SAndroid Build Coastguard Worker {
31*f6dc9357SAndroid Build Coastguard Worker case SZ_OK: return S_OK;
32*f6dc9357SAndroid Build Coastguard Worker
33*f6dc9357SAndroid Build Coastguard Worker case SZ_ERROR_DATA:
34*f6dc9357SAndroid Build Coastguard Worker case SZ_ERROR_CRC:
35*f6dc9357SAndroid Build Coastguard Worker case SZ_ERROR_INPUT_EOF:
36*f6dc9357SAndroid Build Coastguard Worker case SZ_ERROR_ARCHIVE:
37*f6dc9357SAndroid Build Coastguard Worker case SZ_ERROR_NO_ARCHIVE:
38*f6dc9357SAndroid Build Coastguard Worker return S_FALSE;
39*f6dc9357SAndroid Build Coastguard Worker
40*f6dc9357SAndroid Build Coastguard Worker case SZ_ERROR_MEM: return E_OUTOFMEMORY;
41*f6dc9357SAndroid Build Coastguard Worker case SZ_ERROR_PARAM: return E_INVALIDARG;
42*f6dc9357SAndroid Build Coastguard Worker case SZ_ERROR_PROGRESS: return E_ABORT;
43*f6dc9357SAndroid Build Coastguard Worker case SZ_ERROR_UNSUPPORTED: return E_NOTIMPL;
44*f6dc9357SAndroid Build Coastguard Worker // case SZ_ERROR_OUTPUT_EOF:
45*f6dc9357SAndroid Build Coastguard Worker // case SZ_ERROR_READ:
46*f6dc9357SAndroid Build Coastguard Worker // case SZ_ERROR_WRITE:
47*f6dc9357SAndroid Build Coastguard Worker // case SZ_ERROR_THREAD:
48*f6dc9357SAndroid Build Coastguard Worker // case SZ_ERROR_ARCHIVE:
49*f6dc9357SAndroid Build Coastguard Worker // case SZ_ERROR_NO_ARCHIVE:
50*f6dc9357SAndroid Build Coastguard Worker // return E_FAIL;
51*f6dc9357SAndroid Build Coastguard Worker default: break;
52*f6dc9357SAndroid Build Coastguard Worker }
53*f6dc9357SAndroid Build Coastguard Worker if (res < 0)
54*f6dc9357SAndroid Build Coastguard Worker return res;
55*f6dc9357SAndroid Build Coastguard Worker return E_FAIL;
56*f6dc9357SAndroid Build Coastguard Worker }
57*f6dc9357SAndroid Build Coastguard Worker
58*f6dc9357SAndroid Build Coastguard Worker
59*f6dc9357SAndroid Build Coastguard Worker #define PROGRESS_UNKNOWN_VALUE ((UInt64)(Int64)-1)
60*f6dc9357SAndroid Build Coastguard Worker
61*f6dc9357SAndroid Build Coastguard Worker #define CONVERT_PR_VAL(x) (x == PROGRESS_UNKNOWN_VALUE ? NULL : &x)
62*f6dc9357SAndroid Build Coastguard Worker
63*f6dc9357SAndroid Build Coastguard Worker
CompressProgress(ICompressProgressPtr pp,UInt64 inSize,UInt64 outSize)64*f6dc9357SAndroid Build Coastguard Worker static SRes CompressProgress(ICompressProgressPtr pp, UInt64 inSize, UInt64 outSize) throw()
65*f6dc9357SAndroid Build Coastguard Worker {
66*f6dc9357SAndroid Build Coastguard Worker Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CCompressProgressWrap)
67*f6dc9357SAndroid Build Coastguard Worker p->Res = p->Progress->SetRatioInfo(CONVERT_PR_VAL(inSize), CONVERT_PR_VAL(outSize));
68*f6dc9357SAndroid Build Coastguard Worker return HRESULT_To_SRes(p->Res, SZ_ERROR_PROGRESS);
69*f6dc9357SAndroid Build Coastguard Worker }
70*f6dc9357SAndroid Build Coastguard Worker
Init(ICompressProgressInfo * progress)71*f6dc9357SAndroid Build Coastguard Worker void CCompressProgressWrap::Init(ICompressProgressInfo *progress) throw()
72*f6dc9357SAndroid Build Coastguard Worker {
73*f6dc9357SAndroid Build Coastguard Worker vt.Progress = CompressProgress;
74*f6dc9357SAndroid Build Coastguard Worker Progress = progress;
75*f6dc9357SAndroid Build Coastguard Worker Res = SZ_OK;
76*f6dc9357SAndroid Build Coastguard Worker }
77*f6dc9357SAndroid Build Coastguard Worker
78*f6dc9357SAndroid Build Coastguard Worker static const UInt32 kStreamStepSize = (UInt32)1 << 31;
79*f6dc9357SAndroid Build Coastguard Worker
MyRead(ISeqInStreamPtr pp,void * data,size_t * size)80*f6dc9357SAndroid Build Coastguard Worker static SRes MyRead(ISeqInStreamPtr pp, void *data, size_t *size) throw()
81*f6dc9357SAndroid Build Coastguard Worker {
82*f6dc9357SAndroid Build Coastguard Worker Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CSeqInStreamWrap)
83*f6dc9357SAndroid Build Coastguard Worker UInt32 curSize = ((*size < kStreamStepSize) ? (UInt32)*size : kStreamStepSize);
84*f6dc9357SAndroid Build Coastguard Worker p->Res = (p->Stream->Read(data, curSize, &curSize));
85*f6dc9357SAndroid Build Coastguard Worker *size = curSize;
86*f6dc9357SAndroid Build Coastguard Worker p->Processed += curSize;
87*f6dc9357SAndroid Build Coastguard Worker if (p->Res == S_OK)
88*f6dc9357SAndroid Build Coastguard Worker return SZ_OK;
89*f6dc9357SAndroid Build Coastguard Worker return HRESULT_To_SRes(p->Res, SZ_ERROR_READ);
90*f6dc9357SAndroid Build Coastguard Worker }
91*f6dc9357SAndroid Build Coastguard Worker
MyWrite(ISeqOutStreamPtr pp,const void * data,size_t size)92*f6dc9357SAndroid Build Coastguard Worker static size_t MyWrite(ISeqOutStreamPtr pp, const void *data, size_t size) throw()
93*f6dc9357SAndroid Build Coastguard Worker {
94*f6dc9357SAndroid Build Coastguard Worker Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CSeqOutStreamWrap)
95*f6dc9357SAndroid Build Coastguard Worker if (p->Stream)
96*f6dc9357SAndroid Build Coastguard Worker {
97*f6dc9357SAndroid Build Coastguard Worker p->Res = WriteStream(p->Stream, data, size);
98*f6dc9357SAndroid Build Coastguard Worker if (p->Res != 0)
99*f6dc9357SAndroid Build Coastguard Worker return 0;
100*f6dc9357SAndroid Build Coastguard Worker }
101*f6dc9357SAndroid Build Coastguard Worker else
102*f6dc9357SAndroid Build Coastguard Worker p->Res = S_OK;
103*f6dc9357SAndroid Build Coastguard Worker p->Processed += size;
104*f6dc9357SAndroid Build Coastguard Worker return size;
105*f6dc9357SAndroid Build Coastguard Worker }
106*f6dc9357SAndroid Build Coastguard Worker
107*f6dc9357SAndroid Build Coastguard Worker
Init(ISequentialInStream * stream)108*f6dc9357SAndroid Build Coastguard Worker void CSeqInStreamWrap::Init(ISequentialInStream *stream) throw()
109*f6dc9357SAndroid Build Coastguard Worker {
110*f6dc9357SAndroid Build Coastguard Worker vt.Read = MyRead;
111*f6dc9357SAndroid Build Coastguard Worker Stream = stream;
112*f6dc9357SAndroid Build Coastguard Worker Processed = 0;
113*f6dc9357SAndroid Build Coastguard Worker Res = S_OK;
114*f6dc9357SAndroid Build Coastguard Worker }
115*f6dc9357SAndroid Build Coastguard Worker
Init(ISequentialOutStream * stream)116*f6dc9357SAndroid Build Coastguard Worker void CSeqOutStreamWrap::Init(ISequentialOutStream *stream) throw()
117*f6dc9357SAndroid Build Coastguard Worker {
118*f6dc9357SAndroid Build Coastguard Worker vt.Write = MyWrite;
119*f6dc9357SAndroid Build Coastguard Worker Stream = stream;
120*f6dc9357SAndroid Build Coastguard Worker Res = SZ_OK;
121*f6dc9357SAndroid Build Coastguard Worker Processed = 0;
122*f6dc9357SAndroid Build Coastguard Worker }
123*f6dc9357SAndroid Build Coastguard Worker
124*f6dc9357SAndroid Build Coastguard Worker
InStreamWrap_Read(ISeekInStreamPtr pp,void * data,size_t * size)125*f6dc9357SAndroid Build Coastguard Worker static SRes InStreamWrap_Read(ISeekInStreamPtr pp, void *data, size_t *size) throw()
126*f6dc9357SAndroid Build Coastguard Worker {
127*f6dc9357SAndroid Build Coastguard Worker Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CSeekInStreamWrap)
128*f6dc9357SAndroid Build Coastguard Worker UInt32 curSize = ((*size < kStreamStepSize) ? (UInt32)*size : kStreamStepSize);
129*f6dc9357SAndroid Build Coastguard Worker p->Res = p->Stream->Read(data, curSize, &curSize);
130*f6dc9357SAndroid Build Coastguard Worker *size = curSize;
131*f6dc9357SAndroid Build Coastguard Worker return (p->Res == S_OK) ? SZ_OK : SZ_ERROR_READ;
132*f6dc9357SAndroid Build Coastguard Worker }
133*f6dc9357SAndroid Build Coastguard Worker
InStreamWrap_Seek(ISeekInStreamPtr pp,Int64 * offset,ESzSeek origin)134*f6dc9357SAndroid Build Coastguard Worker static SRes InStreamWrap_Seek(ISeekInStreamPtr pp, Int64 *offset, ESzSeek origin) throw()
135*f6dc9357SAndroid Build Coastguard Worker {
136*f6dc9357SAndroid Build Coastguard Worker Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CSeekInStreamWrap)
137*f6dc9357SAndroid Build Coastguard Worker UInt32 moveMethod;
138*f6dc9357SAndroid Build Coastguard Worker /* we need (int)origin to eliminate the clang warning:
139*f6dc9357SAndroid Build Coastguard Worker default label in switch which covers all enumeration values
140*f6dc9357SAndroid Build Coastguard Worker [-Wcovered-switch-default */
141*f6dc9357SAndroid Build Coastguard Worker switch ((int)origin)
142*f6dc9357SAndroid Build Coastguard Worker {
143*f6dc9357SAndroid Build Coastguard Worker case SZ_SEEK_SET: moveMethod = STREAM_SEEK_SET; break;
144*f6dc9357SAndroid Build Coastguard Worker case SZ_SEEK_CUR: moveMethod = STREAM_SEEK_CUR; break;
145*f6dc9357SAndroid Build Coastguard Worker case SZ_SEEK_END: moveMethod = STREAM_SEEK_END; break;
146*f6dc9357SAndroid Build Coastguard Worker default: return SZ_ERROR_PARAM;
147*f6dc9357SAndroid Build Coastguard Worker }
148*f6dc9357SAndroid Build Coastguard Worker UInt64 newPosition;
149*f6dc9357SAndroid Build Coastguard Worker p->Res = p->Stream->Seek(*offset, moveMethod, &newPosition);
150*f6dc9357SAndroid Build Coastguard Worker *offset = (Int64)newPosition;
151*f6dc9357SAndroid Build Coastguard Worker return (p->Res == S_OK) ? SZ_OK : SZ_ERROR_READ;
152*f6dc9357SAndroid Build Coastguard Worker }
153*f6dc9357SAndroid Build Coastguard Worker
Init(IInStream * stream)154*f6dc9357SAndroid Build Coastguard Worker void CSeekInStreamWrap::Init(IInStream *stream) throw()
155*f6dc9357SAndroid Build Coastguard Worker {
156*f6dc9357SAndroid Build Coastguard Worker Stream = stream;
157*f6dc9357SAndroid Build Coastguard Worker vt.Read = InStreamWrap_Read;
158*f6dc9357SAndroid Build Coastguard Worker vt.Seek = InStreamWrap_Seek;
159*f6dc9357SAndroid Build Coastguard Worker Res = S_OK;
160*f6dc9357SAndroid Build Coastguard Worker }
161*f6dc9357SAndroid Build Coastguard Worker
162*f6dc9357SAndroid Build Coastguard Worker
163*f6dc9357SAndroid Build Coastguard Worker /* ---------- CByteInBufWrap ---------- */
164*f6dc9357SAndroid Build Coastguard Worker
Free()165*f6dc9357SAndroid Build Coastguard Worker void CByteInBufWrap::Free() throw()
166*f6dc9357SAndroid Build Coastguard Worker {
167*f6dc9357SAndroid Build Coastguard Worker ::MidFree(Buf);
168*f6dc9357SAndroid Build Coastguard Worker Buf = NULL;
169*f6dc9357SAndroid Build Coastguard Worker }
170*f6dc9357SAndroid Build Coastguard Worker
Alloc(UInt32 size)171*f6dc9357SAndroid Build Coastguard Worker bool CByteInBufWrap::Alloc(UInt32 size) throw()
172*f6dc9357SAndroid Build Coastguard Worker {
173*f6dc9357SAndroid Build Coastguard Worker if (!Buf || size != Size)
174*f6dc9357SAndroid Build Coastguard Worker {
175*f6dc9357SAndroid Build Coastguard Worker Free();
176*f6dc9357SAndroid Build Coastguard Worker Lim = Cur = Buf = (Byte *)::MidAlloc((size_t)size);
177*f6dc9357SAndroid Build Coastguard Worker Size = size;
178*f6dc9357SAndroid Build Coastguard Worker }
179*f6dc9357SAndroid Build Coastguard Worker return (Buf != NULL);
180*f6dc9357SAndroid Build Coastguard Worker }
181*f6dc9357SAndroid Build Coastguard Worker
ReadByteFromNewBlock()182*f6dc9357SAndroid Build Coastguard Worker Byte CByteInBufWrap::ReadByteFromNewBlock() throw()
183*f6dc9357SAndroid Build Coastguard Worker {
184*f6dc9357SAndroid Build Coastguard Worker if (!Extra && Res == S_OK)
185*f6dc9357SAndroid Build Coastguard Worker {
186*f6dc9357SAndroid Build Coastguard Worker UInt32 avail;
187*f6dc9357SAndroid Build Coastguard Worker Res = Stream->Read(Buf, Size, &avail);
188*f6dc9357SAndroid Build Coastguard Worker Processed += (size_t)(Cur - Buf);
189*f6dc9357SAndroid Build Coastguard Worker Cur = Buf;
190*f6dc9357SAndroid Build Coastguard Worker Lim = Buf + avail;
191*f6dc9357SAndroid Build Coastguard Worker if (avail != 0)
192*f6dc9357SAndroid Build Coastguard Worker return *Cur++;
193*f6dc9357SAndroid Build Coastguard Worker }
194*f6dc9357SAndroid Build Coastguard Worker Extra = true;
195*f6dc9357SAndroid Build Coastguard Worker return 0;
196*f6dc9357SAndroid Build Coastguard Worker }
197*f6dc9357SAndroid Build Coastguard Worker
198*f6dc9357SAndroid Build Coastguard Worker // #pragma GCC diagnostic ignored "-Winvalid-offsetof"
199*f6dc9357SAndroid Build Coastguard Worker
Wrap_ReadByte(IByteInPtr pp)200*f6dc9357SAndroid Build Coastguard Worker static Byte Wrap_ReadByte(IByteInPtr pp) throw()
201*f6dc9357SAndroid Build Coastguard Worker {
202*f6dc9357SAndroid Build Coastguard Worker CByteInBufWrap *p = Z7_CONTAINER_FROM_VTBL_CLS(pp, CByteInBufWrap, vt);
203*f6dc9357SAndroid Build Coastguard Worker // Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CByteInBufWrap)
204*f6dc9357SAndroid Build Coastguard Worker if (p->Cur != p->Lim)
205*f6dc9357SAndroid Build Coastguard Worker return *p->Cur++;
206*f6dc9357SAndroid Build Coastguard Worker return p->ReadByteFromNewBlock();
207*f6dc9357SAndroid Build Coastguard Worker }
208*f6dc9357SAndroid Build Coastguard Worker
CByteInBufWrap()209*f6dc9357SAndroid Build Coastguard Worker CByteInBufWrap::CByteInBufWrap() throw(): Buf(NULL)
210*f6dc9357SAndroid Build Coastguard Worker {
211*f6dc9357SAndroid Build Coastguard Worker vt.Read = Wrap_ReadByte;
212*f6dc9357SAndroid Build Coastguard Worker }
213*f6dc9357SAndroid Build Coastguard Worker
214*f6dc9357SAndroid Build Coastguard Worker
215*f6dc9357SAndroid Build Coastguard Worker
216*f6dc9357SAndroid Build Coastguard Worker /* ---------- CByteOutBufWrap ---------- */
217*f6dc9357SAndroid Build Coastguard Worker
218*f6dc9357SAndroid Build Coastguard Worker /*
219*f6dc9357SAndroid Build Coastguard Worker void CLookToSequentialWrap::Free() throw()
220*f6dc9357SAndroid Build Coastguard Worker {
221*f6dc9357SAndroid Build Coastguard Worker ::MidFree(BufBase);
222*f6dc9357SAndroid Build Coastguard Worker BufBase = NULL;
223*f6dc9357SAndroid Build Coastguard Worker }
224*f6dc9357SAndroid Build Coastguard Worker
225*f6dc9357SAndroid Build Coastguard Worker bool CLookToSequentialWrap::Alloc(UInt32 size) throw()
226*f6dc9357SAndroid Build Coastguard Worker {
227*f6dc9357SAndroid Build Coastguard Worker if (!BufBase || size != Size)
228*f6dc9357SAndroid Build Coastguard Worker {
229*f6dc9357SAndroid Build Coastguard Worker Free();
230*f6dc9357SAndroid Build Coastguard Worker BufBase = (Byte *)::MidAlloc((size_t)size);
231*f6dc9357SAndroid Build Coastguard Worker Size = size;
232*f6dc9357SAndroid Build Coastguard Worker }
233*f6dc9357SAndroid Build Coastguard Worker return (BufBase != NULL);
234*f6dc9357SAndroid Build Coastguard Worker }
235*f6dc9357SAndroid Build Coastguard Worker */
236*f6dc9357SAndroid Build Coastguard Worker
237*f6dc9357SAndroid Build Coastguard Worker /*
238*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_BEGIN
239*f6dc9357SAndroid Build Coastguard Worker
240*f6dc9357SAndroid Build Coastguard Worker void CLookToSequentialWrap_Look(ILookInSeqStreamPtr pp)
241*f6dc9357SAndroid Build Coastguard Worker {
242*f6dc9357SAndroid Build Coastguard Worker CLookToSequentialWrap *p = (CLookToSequentialWrap *)pp->Obj;
243*f6dc9357SAndroid Build Coastguard Worker
244*f6dc9357SAndroid Build Coastguard Worker if (p->Extra || p->Res != S_OK)
245*f6dc9357SAndroid Build Coastguard Worker return;
246*f6dc9357SAndroid Build Coastguard Worker {
247*f6dc9357SAndroid Build Coastguard Worker UInt32 avail;
248*f6dc9357SAndroid Build Coastguard Worker p->Res = p->Stream->Read(p->BufBase, p->Size, &avail);
249*f6dc9357SAndroid Build Coastguard Worker p->Processed += avail;
250*f6dc9357SAndroid Build Coastguard Worker pp->Buf = p->BufBase;
251*f6dc9357SAndroid Build Coastguard Worker pp->Limit = pp->Buf + avail;
252*f6dc9357SAndroid Build Coastguard Worker if (avail == 0)
253*f6dc9357SAndroid Build Coastguard Worker p->Extra = true;
254*f6dc9357SAndroid Build Coastguard Worker }
255*f6dc9357SAndroid Build Coastguard Worker }
256*f6dc9357SAndroid Build Coastguard Worker
257*f6dc9357SAndroid Build Coastguard Worker EXTERN_C_END
258*f6dc9357SAndroid Build Coastguard Worker */
259*f6dc9357SAndroid Build Coastguard Worker
260*f6dc9357SAndroid Build Coastguard Worker
261*f6dc9357SAndroid Build Coastguard Worker /* ---------- CByteOutBufWrap ---------- */
262*f6dc9357SAndroid Build Coastguard Worker
Free()263*f6dc9357SAndroid Build Coastguard Worker void CByteOutBufWrap::Free() throw()
264*f6dc9357SAndroid Build Coastguard Worker {
265*f6dc9357SAndroid Build Coastguard Worker ::MidFree(Buf);
266*f6dc9357SAndroid Build Coastguard Worker Buf = NULL;
267*f6dc9357SAndroid Build Coastguard Worker }
268*f6dc9357SAndroid Build Coastguard Worker
Alloc(size_t size)269*f6dc9357SAndroid Build Coastguard Worker bool CByteOutBufWrap::Alloc(size_t size) throw()
270*f6dc9357SAndroid Build Coastguard Worker {
271*f6dc9357SAndroid Build Coastguard Worker if (!Buf || size != Size)
272*f6dc9357SAndroid Build Coastguard Worker {
273*f6dc9357SAndroid Build Coastguard Worker Free();
274*f6dc9357SAndroid Build Coastguard Worker Buf = (Byte *)::MidAlloc(size);
275*f6dc9357SAndroid Build Coastguard Worker Size = size;
276*f6dc9357SAndroid Build Coastguard Worker }
277*f6dc9357SAndroid Build Coastguard Worker return (Buf != NULL);
278*f6dc9357SAndroid Build Coastguard Worker }
279*f6dc9357SAndroid Build Coastguard Worker
Flush()280*f6dc9357SAndroid Build Coastguard Worker HRESULT CByteOutBufWrap::Flush() throw()
281*f6dc9357SAndroid Build Coastguard Worker {
282*f6dc9357SAndroid Build Coastguard Worker if (Res == S_OK)
283*f6dc9357SAndroid Build Coastguard Worker {
284*f6dc9357SAndroid Build Coastguard Worker const size_t size = (size_t)(Cur - Buf);
285*f6dc9357SAndroid Build Coastguard Worker Res = WriteStream(Stream, Buf, size);
286*f6dc9357SAndroid Build Coastguard Worker if (Res == S_OK)
287*f6dc9357SAndroid Build Coastguard Worker Processed += size;
288*f6dc9357SAndroid Build Coastguard Worker // else throw 11;
289*f6dc9357SAndroid Build Coastguard Worker }
290*f6dc9357SAndroid Build Coastguard Worker Cur = Buf; // reset pointer for later Wrap_WriteByte()
291*f6dc9357SAndroid Build Coastguard Worker return Res;
292*f6dc9357SAndroid Build Coastguard Worker }
293*f6dc9357SAndroid Build Coastguard Worker
Wrap_WriteByte(IByteOutPtr pp,Byte b)294*f6dc9357SAndroid Build Coastguard Worker static void Wrap_WriteByte(IByteOutPtr pp, Byte b) throw()
295*f6dc9357SAndroid Build Coastguard Worker {
296*f6dc9357SAndroid Build Coastguard Worker CByteOutBufWrap *p = Z7_CONTAINER_FROM_VTBL_CLS(pp, CByteOutBufWrap, vt);
297*f6dc9357SAndroid Build Coastguard Worker // Z7_CONTAINER_FROM_VTBL_TO_DECL_VAR_pp_vt_p(CByteOutBufWrap)
298*f6dc9357SAndroid Build Coastguard Worker Byte *dest = p->Cur;
299*f6dc9357SAndroid Build Coastguard Worker *dest = b;
300*f6dc9357SAndroid Build Coastguard Worker p->Cur = ++dest;
301*f6dc9357SAndroid Build Coastguard Worker if (dest == p->Lim)
302*f6dc9357SAndroid Build Coastguard Worker p->Flush();
303*f6dc9357SAndroid Build Coastguard Worker }
304*f6dc9357SAndroid Build Coastguard Worker
CByteOutBufWrap()305*f6dc9357SAndroid Build Coastguard Worker CByteOutBufWrap::CByteOutBufWrap() throw(): Buf(NULL), Size(0)
306*f6dc9357SAndroid Build Coastguard Worker {
307*f6dc9357SAndroid Build Coastguard Worker vt.Write = Wrap_WriteByte;
308*f6dc9357SAndroid Build Coastguard Worker }
309*f6dc9357SAndroid Build Coastguard Worker
310*f6dc9357SAndroid Build Coastguard Worker
311*f6dc9357SAndroid Build Coastguard Worker /* ---------- CLookOutWrap ---------- */
312*f6dc9357SAndroid Build Coastguard Worker
313*f6dc9357SAndroid Build Coastguard Worker /*
314*f6dc9357SAndroid Build Coastguard Worker void CLookOutWrap::Free() throw()
315*f6dc9357SAndroid Build Coastguard Worker {
316*f6dc9357SAndroid Build Coastguard Worker ::MidFree(Buf);
317*f6dc9357SAndroid Build Coastguard Worker Buf = NULL;
318*f6dc9357SAndroid Build Coastguard Worker }
319*f6dc9357SAndroid Build Coastguard Worker
320*f6dc9357SAndroid Build Coastguard Worker bool CLookOutWrap::Alloc(size_t size) throw()
321*f6dc9357SAndroid Build Coastguard Worker {
322*f6dc9357SAndroid Build Coastguard Worker if (!Buf || size != Size)
323*f6dc9357SAndroid Build Coastguard Worker {
324*f6dc9357SAndroid Build Coastguard Worker Free();
325*f6dc9357SAndroid Build Coastguard Worker Buf = (Byte *)::MidAlloc(size);
326*f6dc9357SAndroid Build Coastguard Worker Size = size;
327*f6dc9357SAndroid Build Coastguard Worker }
328*f6dc9357SAndroid Build Coastguard Worker return (Buf != NULL);
329*f6dc9357SAndroid Build Coastguard Worker }
330*f6dc9357SAndroid Build Coastguard Worker
331*f6dc9357SAndroid Build Coastguard Worker static size_t LookOutWrap_GetOutBuf(ILookOutStreamPtr pp, void **buf) throw()
332*f6dc9357SAndroid Build Coastguard Worker {
333*f6dc9357SAndroid Build Coastguard Worker CLookOutWrap *p = Z7_CONTAINER_FROM_VTBL_CLS(pp, CLookOutWrap, vt);
334*f6dc9357SAndroid Build Coastguard Worker *buf = p->Buf;
335*f6dc9357SAndroid Build Coastguard Worker return p->Size;
336*f6dc9357SAndroid Build Coastguard Worker }
337*f6dc9357SAndroid Build Coastguard Worker
338*f6dc9357SAndroid Build Coastguard Worker static size_t LookOutWrap_Write(ILookOutStreamPtr pp, size_t size) throw()
339*f6dc9357SAndroid Build Coastguard Worker {
340*f6dc9357SAndroid Build Coastguard Worker CLookOutWrap *p = Z7_CONTAINER_FROM_VTBL_CLS(pp, CLookOutWrap, vt);
341*f6dc9357SAndroid Build Coastguard Worker if (p->Res == S_OK && size != 0)
342*f6dc9357SAndroid Build Coastguard Worker {
343*f6dc9357SAndroid Build Coastguard Worker p->Res = WriteStream(p->Stream, p->Buf, size);
344*f6dc9357SAndroid Build Coastguard Worker if (p->Res == S_OK)
345*f6dc9357SAndroid Build Coastguard Worker {
346*f6dc9357SAndroid Build Coastguard Worker p->Processed += size;
347*f6dc9357SAndroid Build Coastguard Worker return size;
348*f6dc9357SAndroid Build Coastguard Worker }
349*f6dc9357SAndroid Build Coastguard Worker }
350*f6dc9357SAndroid Build Coastguard Worker return 0;
351*f6dc9357SAndroid Build Coastguard Worker }
352*f6dc9357SAndroid Build Coastguard Worker
353*f6dc9357SAndroid Build Coastguard Worker CLookOutWrap::CLookOutWrap() throw(): Buf(NULL), Size(0)
354*f6dc9357SAndroid Build Coastguard Worker {
355*f6dc9357SAndroid Build Coastguard Worker vt.GetOutBuf = LookOutWrap_GetOutBuf;
356*f6dc9357SAndroid Build Coastguard Worker vt.Write = LookOutWrap_Write;
357*f6dc9357SAndroid Build Coastguard Worker }
358*f6dc9357SAndroid Build Coastguard Worker */
359