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