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