#define ARGUMENT_ERROR -10
#define IO_ERROR -11
-typedef gint (*read_write_func) (guchar *buffer, gint length);
+typedef gint (*read_write_func) (guchar *buffer, gint length, void *gchandle);
struct _ZStream {
z_stream *stream;
guchar *buffer;
read_write_func func;
+ void *gchandle;
guchar compress;
guchar eof;
};
typedef struct _ZStream ZStream;
-ZStream *CreateZStream (gint compress, guchar gzip, read_write_func func);
+ZStream *CreateZStream (gint compress, guchar gzip, read_write_func func, void *gchandle);
gint CloseZStream (ZStream *zstream);
gint Flush (ZStream *stream);
gint ReadZStream (ZStream *stream, guchar *buffer, gint length);
}
ZStream *
-CreateZStream (gint compress, guchar gzip, read_write_func func)
+CreateZStream (gint compress, guchar gzip, read_write_func func, void *gchandle)
{
z_stream *z;
gint retval;
result = g_new0 (ZStream, 1);
result->stream = z;
result->func = func;
+ result->gchandle = gchandle;
result->compress = compress;
result->buffer = g_new (guchar, BUFFER_SIZE);
return result;
status = 0;
if (zstream->compress) {
- if (zstream->stream->total_out) {
- status = deflate (zstream->stream, Z_FINISH);
- flush_status = Flush (zstream);
- if (status == Z_OK || status == Z_STREAM_END)
+ if (zstream->stream->total_in > 0) {
+ do {
+ status = deflate (zstream->stream, Z_FINISH);
+ flush_status = Flush (zstream);
+ } while (status == Z_OK); /* We want Z_STREAM_END or error here here */
+ if (status == Z_STREAM_END)
status = flush_status;
}
deflateEnd (zstream->stream);
zs = stream->stream;
if (zs->avail_out != BUFFER_SIZE) {
- n = stream->func (stream->buffer, BUFFER_SIZE - zs->avail_out);
+ n = stream->func (stream->buffer, BUFFER_SIZE - zs->avail_out, stream->gchandle);
zs->next_out = stream->buffer;
zs->avail_out = BUFFER_SIZE;
if (n < 0)
zs->avail_out = length;
while (zs->avail_out > 0) {
if (zs->avail_in == 0) {
- n = stream->func (stream->buffer, BUFFER_SIZE);
+ n = stream->func (stream->buffer, BUFFER_SIZE, stream->gchandle);
if (n <= 0) {
stream->eof = TRUE;
break;
}
status = inflate (stream->stream, Z_SYNC_FLUSH);
- if (status != Z_OK && status != Z_STREAM_END)
+ if (status == Z_STREAM_END) {
+ stream->eof = TRUE;
+ break;
+ } else if (status != Z_OK) {
return status;
+ }
}
return length - zs->avail_out;
}
zs->next_out = stream->buffer;
zs->avail_out = BUFFER_SIZE;
}
- status = deflate (stream->stream, Z_SYNC_FLUSH);
+ status = deflate (stream->stream, Z_NO_FLUSH);
if (status != Z_OK && status != Z_STREAM_END)
return status;