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

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

Webmaster