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 == NULL) || (*vStream==NULL)) {
+ 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)
case eZLibEncode:
{
z_enc_stream *stream = (z_enc_stream *)vStream;
- int org_outbuf_len = stream->zstream.total_out;
+ int org_outbuf_len = stream->OutBuf.BufUsed;
int err;
unsigned int chunkavail;
err = deflate(&stream->zstream, (LastChunk) ? Z_FINISH : Z_NO_FLUSH);
stream->OutBuf.BufUsed += (chunkavail - stream->zstream.avail_out);
- /// todo + org_outbuf_len;
- if (Target) SwapBuffers(Target->Buf, &stream->OutBuf);
+ if (Target &&
+ (LastChunk ||
+ (stream->OutBuf.BufUsed != org_outbuf_len)
+ ))
+ {
+ SwapBuffers(Target->Buf, &stream->OutBuf);
+ }
if (stream->zstream.avail_in == 0)
{
(In->Buf->BufUsed - stream->zstream.avail_in);
}
}
-
+ return (LastChunk && (err != Z_FINISH));
+
}
break;
case eZLibDecode: {
}
break; /// TODO
}
+ return 0;
}
/**