]> code.citadel.org Git - citadel.git/blobdiff - libcitadel/lib/stringbuf.c
Add error handling to the stream functions
[citadel.git] / libcitadel / lib / stringbuf.c
index 5d196112385d5a11883126692be869720b585d90..813def36a0c553c0cea04e2e5c9133d4ee273225 100644 (file)
@@ -2859,9 +2859,10 @@ typedef struct __z_enc_stream {
        z_stream zstream;
 } z_enc_stream;
 
-void *StrBufNewStreamContext(eStreamType type)
+void *StrBufNewStreamContext(eStreamType type, const char **Err)
 {
        base64_decodestate *state;;
+       *Err = NULL;
 
        switch (type)
        {
@@ -2884,8 +2885,11 @@ void *StrBufNewStreamContext(eStreamType type)
 
                err = inflateInit(&stream->zstream);
 
-               if (err != Z_OK)
-                       return NULL;/// tODO cleanup
+               if (err != Z_OK) {
+                       StrBufDestroyStreamContext(type, (void**)&stream, Err);
+                       *Err = zError(err);
+                       return NULL;
+               }
                return stream;
 
        }
@@ -2898,27 +2902,26 @@ void *StrBufNewStreamContext(eStreamType type)
                memset(stream, 0, sizeof(z_enc_stream));
                stream->OutBuf.BufSize = 4*SIZ; /// todo 64
                stream->OutBuf.buf = (char*)malloc(stream->OutBuf.BufSize);
-               /* write gzip header * /
+               /* write gzip header */
                stream->OutBuf.BufUsed = snprintf
                        (stream->OutBuf.buf,
                         stream->OutBuf.BufSize, 
                         "%c%c%c%c%c%c%c%c%c%c",
                         gz_magic[0], gz_magic[1], Z_DEFLATED,
-                        0 /*flags * / , 0, 0, 0, 0 /*time * / , 0 /* xflags * / ,
+                        0 /*flags */ , 0, 0, 0, 0 /*time */ , 0 /* xflags */ ,
                         OS_CODE);
-/*
+
                err = deflateInit2(&stream->zstream,
                                   ZLibCompressionRatio,
                                   Z_DEFLATED,
                                   -MAX_WBITS,
                                   DEF_MEM_LEVEL,
                                   Z_DEFAULT_STRATEGY);
-*/
-               err = deflateInit(&stream->zstream,
-                                 ZLibCompressionRatio);
-
-               if (err != Z_OK)
-                       return NULL;/// tODO cleanup
+               if (err != Z_OK) {
+                       StrBufDestroyStreamContext(type, (void**) &stream, Err);
+                       *Err = zError(err);
+                       return NULL;
+               }
                return stream;
        }
        case eEmtyCodec:
@@ -2929,8 +2932,16 @@ void *StrBufNewStreamContext(eStreamType type)
        return NULL;
 }
 
-void StrBufDestroyStreamContext(eStreamType type, void **vStream)
+int StrBufDestroyStreamContext(eStreamType type, void **vStream, const char **Err)
 {
+       int err;
+       int rc = 0;
+       *Err = NULL;
+       
+       if ((vStream == NULL) || (*vStream==NULL)) {
+               *Err = strerror(EINVAL);
+               return EINVAL;
+       }
        switch (type)
        {
        case eBase64Encode:
@@ -2948,20 +2959,25 @@ void StrBufDestroyStreamContext(eStreamType type, void **vStream)
        case eZLibEncode:
        {
                z_enc_stream *stream = (z_enc_stream *)*vStream;
+               err = deflateEnd(&stream->zstream);
+               if (err != Z_OK) {
+                       *Err = zError(err);
+                       rc = -1;
+               }
                free(stream->OutBuf.buf);
                free(stream);
-// todo more?
                *vStream = NULL;
                break;
        }
        case eEmtyCodec: 
                break; /// TODO
        }
+       return rc;
 }
 
-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, const char **Err)
 {
-
+       int rc = 0;
        switch (type)
        {
        case eBase64Encode:
@@ -3022,7 +3038,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;
 
@@ -3044,9 +3060,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)
                {
@@ -3071,7 +3092,11 @@ void StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, con
                                        (In->Buf->BufUsed - stream->zstream.avail_in);
                        }
                }
-
+               rc = (LastChunk && (err != Z_FINISH));
+               if (!rc && (err != Z_OK)) {
+                       *Err = zError(err);
+               }
+               
        }
        break;
        case eZLibDecode: {
@@ -3104,7 +3129,7 @@ void StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, con
                        err = Z_DATA_ERROR;     /* and fall through */
 
                case Z_DATA_ERROR:
-                       fprintf(stderr, "sanoteuh\n");
+                       *Err = zError(err);
                case Z_MEM_ERROR:
                        (void)inflateEnd(&stream->zstream);
                        return err;
@@ -3144,6 +3169,7 @@ void StrBufStreamTranscode(eStreamType type, IOBuffer *Target, IOBuffer *In, con
        }
                break; /// TODO
        }
+       return rc;
 }
 
 /**