]> code.citadel.org Git - citadel.git/blobdiff - libcitadel/lib/stringbuf.c
Its the job of the stream lib to suppress chunks just consisting of the gzip header.
[citadel.git] / libcitadel / lib / stringbuf.c
index 9ebc2dd593616ef94b2c9f94cd46563e8d188c87..97260c42f1c9d97408c9f7ea62d41f13af208226 100644 (file)
@@ -2884,8 +2884,10 @@ void *StrBufNewStreamContext(eStreamType type)
 
                err = inflateInit(&stream->zstream);
 
-               if (err != Z_OK)
-                       return NULL;/// tODO cleanup
+               if (err != Z_OK) {
+                       StrBufDestroyStreamContext(type, (void**)&stream);
+                       return NULL;
+               }
                return stream;
 
        }
@@ -2913,8 +2915,10 @@ void *StrBufNewStreamContext(eStreamType type)
                                   -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:
@@ -2927,6 +2931,9 @@ void *StrBufNewStreamContext(eStreamType type)
 
 void StrBufDestroyStreamContext(eStreamType type, void **vStream)
 {
+       if ((vStream == NULL) || (*vStream==NULL)) {
+               return;
+       }
        switch (type)
        {
        case eBase64Encode:
@@ -2955,7 +2962,7 @@ void StrBufDestroyStreamContext(eStreamType type, void **vStream)
        }
 }
 
-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)
@@ -3018,7 +3025,7 @@ void StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, con
        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;
 
@@ -3040,9 +3047,14 @@ void StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, con
                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)
                {
@@ -3067,7 +3079,8 @@ void StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, con
                                        (In->Buf->BufUsed - stream->zstream.avail_in);
                        }
                }
-
+               return (LastChunk && (err != Z_FINISH));
+               
        }
        break;
        case eZLibDecode: {
@@ -3140,6 +3153,7 @@ void StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, con
        }
                break; /// TODO
        }
+       return 0;
 }
 
 /**