Annotation of libwww/Library/src/HTZip.c, revision 2.1

2.1     ! frystyk     1: /*
        !             2: **     ZIP ENCODING / DECODING MODULE
        !             3: **
        !             4: **     (c) COPYRIGHT MIT 1995.
        !             5: **     Please first read the full copyright statement in the file COPYRIGH.
        !             6: **     @(#) $Id: Date Author State $
        !             7: **
        !             8: **     This module requires zlib in order to compile/link
        !             9: */
        !            10: 
        !            11: /* Library include files */
        !            12: #include "sysdep.h"
        !            13: #include "WWWUtil.h"
        !            14: #include "WWWCore.h"
        !            15: #include "HTZip.h"                                      /* Implemented here */
        !            16: 
        !            17: #ifdef ZLIB
        !            18: #include "zlib.h"
        !            19: 
        !            20: #define OUTBUF_SIZE    8192
        !            21: 
        !            22: struct _HTStream {
        !            23:     const HTStreamClass *      isa;
        !            24:     int                                state;
        !            25:     HTRequest *                        request;
        !            26:     HTStream *                 target;                 /* Our output target */
        !            27:     z_stream *                 zstream;                      /* Zlib stream */
        !            28:     char                       outbuf [OUTBUF_SIZE];       /* Inflated data */
        !            29: };
        !            30: 
        !            31: PRIVATE int CompressionLevel = Z_DEFAULT_COMPRESSION;
        !            32: #endif /* ZLIB */
        !            33: 
        !            34: /* ------------------------------------------------------------------------- */
        !            35: #ifdef ZLIB
        !            36: 
        !            37: PRIVATE BOOL Zlib_init (HTStream * me, int level)
        !            38: {
        !            39:     if (STREAM_TRACE) HTTrace("ZLib........ Initializing stream %p\n", me);
        !            40:     if (me && me->zstream &&
        !            41:        (level == Z_DEFAULT_COMPRESSION ||
        !            42:         (level >= Z_BEST_SPEED && level <= Z_BEST_COMPRESSION))) {
        !            43:        int status;
        !            44:        if (STREAM_TRACE) HTTrace("ZLib init... Compression level %d\n", level);
        !            45:        if ((status = inflateInit(me->zstream)) != Z_OK) {
        !            46:            if (STREAM_TRACE) HTTrace("ZLib........ Failed with status %d\n", status);
        !            47:            return NO;
        !            48:        }
        !            49:        return YES;
        !            50:     }
        !            51:     return NO;
        !            52: }
        !            53: 
        !            54: PRIVATE BOOL ZLib_terminate (HTStream * me)
        !            55: {
        !            56:     if (STREAM_TRACE) HTTrace("ZLib........ Terminating stream %p\n", me);
        !            57:     if (me) {
        !            58:        int status;
        !            59:        if (STREAM_TRACE)
        !            60:            HTTrace("Results..... Compress incoming: raw data %lu, compressed %lu, factor %.2f\n",
        !            61:                    me->zstream->total_out, me->zstream->total_in,
        !            62:                    me->zstream->total_out == 0 ? 0.0 :
        !            63:                    (double) me->zstream->total_in / me->zstream->total_out);
        !            64:        if ((status = inflateEnd(me->zstream)) != Z_OK) {
        !            65:            if (STREAM_TRACE) HTTrace("ZLib........ Failed with status %d\n", status);
        !            66:            return NO;
        !            67:        }
        !            68:        return YES;
        !            69:     }
        !            70:     return NO;
        !            71: }
        !            72: 
        !            73: PRIVATE int HTZLibInflate_flush (HTStream * me)
        !            74: {
        !            75:     return (*me->target->isa->flush)(me->target);
        !            76: }
        !            77: 
        !            78: PRIVATE int HTZLibInflate_free (HTStream * me)
        !            79: {
        !            80:     int status = HT_OK;
        !            81:     ZLib_terminate(me);
        !            82:     if ((status = (*me->target->isa->_free)(me->target)) == HT_WOULD_BLOCK)
        !            83:        return HT_WOULD_BLOCK;
        !            84:     if (STREAM_TRACE) HTTrace("Inflate..... FREEING...\n");
        !            85:     HT_FREE(me->zstream);
        !            86:     HT_FREE(me);
        !            87:     return status;
        !            88: }
        !            89: 
        !            90: PRIVATE int HTZLibInflate_abort (HTStream * me, HTList * e)
        !            91: {
        !            92:     if (STREAM_TRACE) HTTrace("Inflate..... ABORTING...\n");
        !            93:     ZLib_terminate(me);
        !            94:     (*me->target->isa->abort)(me->target, NULL);
        !            95:     HT_FREE(me->zstream);
        !            96:     HT_FREE(me);
        !            97:     return HT_ERROR;
        !            98: }
        !            99: 
        !           100: PRIVATE int HTZLibInflate_write (HTStream * me, const char * buf, int len)
        !           101: {
        !           102:     if (me->state != HT_OK) {
        !           103:        me->state = (*me->target->isa->put_block)(me->target,
        !           104:                                                   me->outbuf,
        !           105:                                                   OUTBUF_SIZE - me->zstream->avail_out);
        !           106:        if (me->state != HT_OK) return me->state;
        !           107:     }
        !           108: 
        !           109:     /*
        !           110:     **  Setup the zstream buffers to handle the new data
        !           111:     */
        !           112:     me->zstream->next_in = (unsigned char *) buf;
        !           113:     me->zstream->avail_in = len;
        !           114:     me->zstream->next_out = (unsigned char *) me->outbuf;
        !           115:     me->zstream->avail_out = OUTBUF_SIZE;
        !           116:     
        !           117:     /*
        !           118:     ** Now run through the data and inflate it. We use Z_PARTIAL_FLUSH
        !           119:     ** in order to put as much data in the output buffer as quick as
        !           120:     ** possible.
        !           121:     */
        !           122:     for (;;) {
        !           123:        int status = inflate(me->zstream, Z_PARTIAL_FLUSH);
        !           124:        switch (status) {
        !           125:        case Z_OK:
        !           126:            me->state = (*me->target->isa->put_block)(me->target,
        !           127:                                                       me->outbuf,
        !           128:                                                       OUTBUF_SIZE - me->zstream->avail_out);
        !           129:            if (me->state != HT_OK) return me->state;
        !           130: 
        !           131:            /*
        !           132:            **  All data was consumed and we are ready to handle the
        !           133:            **  next data.
        !           134:            */
        !           135:            me->zstream->next_out = (unsigned char *) me->outbuf;
        !           136:            me->zstream->avail_out = OUTBUF_SIZE;
        !           137:            break;
        !           138: 
        !           139:        case Z_MEM_ERROR:
        !           140:            HT_OUTOFMEM("HTZLibInflate_write");
        !           141:            return HT_ERROR;
        !           142: 
        !           143:        case Z_BUF_ERROR:
        !           144:            /*
        !           145:            ** No action was taken anf we can take this as a sign ot it
        !           146:            ** having finished all data in the input buffer.
        !           147:            */
        !           148:            return HT_OK;
        !           149: 
        !           150:        default:
        !           151:            if (STREAM_TRACE) HTTrace("Inflate..... Inflate returned %d\n", status);
        !           152:            return HT_ERROR;
        !           153:        }
        !           154:     }
        !           155:     return HT_OK;
        !           156: }
        !           157: 
        !           158: PRIVATE int HTZLibInflate_put_character (HTStream * me, char c)
        !           159: {
        !           160:     return HTZLibInflate_write(me, &c, 1);
        !           161: }
        !           162: 
        !           163: PRIVATE int HTZLibInflate_put_string (HTStream * me, const char * s)
        !           164: {
        !           165:     return HTZLibInflate_write(me, s, (int) strlen(s));
        !           166: }
        !           167: 
        !           168: PRIVATE const HTStreamClass HTInflate =
        !           169: {              
        !           170:     "ZlibInflate",
        !           171:     HTZLibInflate_flush,
        !           172:     HTZLibInflate_free,
        !           173:     HTZLibInflate_abort,
        !           174:     HTZLibInflate_put_character,
        !           175:     HTZLibInflate_put_string,
        !           176:     HTZLibInflate_write
        !           177: }; 
        !           178: #endif /* ZLIB */
        !           179: 
        !           180: PUBLIC BOOL HTZLib_setCompressionLevel (int level)
        !           181: {
        !           182:     if (level >= Z_BEST_SPEED && level <= Z_BEST_COMPRESSION) {
        !           183:        CompressionLevel = level;
        !           184:        if (STREAM_TRACE) HTTrace("zlib........ Compression level set to %d\n", level);
        !           185:     }
        !           186:     return NO;
        !           187: }
        !           188: 
        !           189: PUBLIC int HTZLib_compressionLevel (void)
        !           190: {
        !           191:     return CompressionLevel;
        !           192: }
        !           193: 
        !           194: PUBLIC HTStream * HTZLib_inflate (HTRequest *  request,
        !           195:                                  void *        param,
        !           196:                                  HTEncoding    coding,
        !           197:                                  HTStream *    target)
        !           198: {
        !           199: #ifdef ZLIB
        !           200:     HTStream * me = NULL;
        !           201:     if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL ||
        !           202:        (me->zstream = (z_stream *) HT_CALLOC(1, sizeof(z_stream))) == NULL)
        !           203:        HT_OUTOFMEM("HTZLib_inflate");
        !           204:     me->isa = &HTInflate;
        !           205:     me->state = HT_OK;
        !           206:     me->request = request;
        !           207:     me->target = target ? target : HTErrorStream();
        !           208:     if (Zlib_init(me, CompressionLevel) != YES) {
        !           209:        HT_FREE(me);
        !           210:        return HTErrorStream();
        !           211:     }
        !           212:     if (STREAM_TRACE) HTTrace("zlib Inflate Stream created\n");
        !           213:     return me;
        !           214: #else
        !           215:     return HTErrorStream();
        !           216: #endif
        !           217: }

Webmaster