void *StrBufNewStreamContext(eStreamType type);
void StrBufDestroyStreamContext(eStreamType type, void **Stream);
-void StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *Stream, int LastChunk);
+int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *Stream, int LastChunk);
int StrBufDecodeBase64(StrBuf *Buf);
int StrBufDecodeBase64To(const StrBuf *BufIn, StrBuf *BufOut);
err = inflateInit(&stream->zstream);
- if (err != Z_OK)
- return NULL;/// tODO cleanup
+ if (err != Z_OK) {
+ StrBufDestroyStreamContext(type, (void**)&stream);
+ return NULL;
+ }
return stream;
}
-MAX_WBITS,
DEF_MEM_LEVEL,
Z_DEFAULT_STRATEGY);
- if (err != Z_OK)
- return NULL;/// tODO cleanup
+ if (err != Z_OK) {
+ StrBufDestroyStreamContext(type, (void**) &stream);
+ return NULL;
+ }
return stream;
}
case eEmtyCodec:
void StrBufDestroyStreamContext(eStreamType type, void **vStream)
{
+ if (*vStream) {
+ return;
+ }
switch (type)
{
case eBase64Encode:
}
}
-void StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *vStream, int LastChunk)
+int StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, const char* pIn, long pInLen, void *vStream, int LastChunk)
{
switch (type)
(In->Buf->BufUsed - stream->zstream.avail_in);
}
}
+ return (LastChunk && (err != Z_FINISH));
}
break;
}
break; /// TODO
}
+ return 0;
}
/**
IOBuffer ReadBuffer;
IOBuffer WriteBuffer;
int err;
+ int ret = 0;
int done = 0;
void *vStream;
done = StrBuf_read_one_chunk_callback(fdin,
0,
- &ReadBuffer) < SIZ * 4;
+ &ReadBuffer) < (SIZ * 4) -1 ;
if (IOBufferStrLength(&ReadBuffer) == 0)
{
done = 1;
}
do
{
- StrBufStreamTranscode(ST, &WriteBuffer, &ReadBuffer, NULL, -1, vStream, done);
-
- while (IOBufferStrLength(&WriteBuffer) > 0)
- {
- err = StrBuf_write_one_chunk_callback(fdout,
- 0,
- &WriteBuffer);
- }
+ do {
+ ret = StrBufStreamTranscode(ST, &WriteBuffer, &ReadBuffer, NULL, -1, vStream, done);
+
+ while (IOBufferStrLength(&WriteBuffer) > 0)
+ {
+ err = StrBuf_write_one_chunk_callback(fdout,
+ 0,
+ &WriteBuffer);
+ }
+ } while (ret > 0);
} while (IOBufferStrLength(&ReadBuffer) > 0);
}