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