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