From 8fac2c6298c5fd2b06e7e219687766dd8cf965b3 Mon Sep 17 00:00:00 2001 From: Pixel Date: Mon, 3 Dec 2001 11:39:34 +0000 Subject: Zlib.... --- lib/Buffer.cc | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'lib/Buffer.cc') diff --git a/lib/Buffer.cc b/lib/Buffer.cc index 2c2c955..2318f08 100644 --- a/lib/Buffer.cc +++ b/lib/Buffer.cc @@ -75,3 +75,46 @@ Buffer Buffer::operator=(const Buffer & b) { bool Buffer::CanWatch() { return false; } + +void Buffer::deflate(void) throw (GeneralException) { + int err; + + if (ptr) { + throw GeneralException(_("Can't deflate: buffer has already been read")); + } + + err = deflateInit(&zs, Z_BEST_COMPRESSION); + if (err != Z_OK) { + throw GeneralException(String(_("Can't init Zlib: ")) + zs.msg); + } + + zbuffer = (char *) malloc(realsiz); + + zs.next_in = (Bytef *) buffer; + zs.avail_in = realsiz; + zs.next_out = (Bytef *) zbuffer; + zs.avail_out = realsiz; + zs.zalloc = Z_NULL; + zs.zfree = Z_NULL; + zs.opaque = Z_NULL; + + err = ::deflate(&zs, Z_FINISH); + + if (err != Z_STREAM_END) { + throw GeneralException(String(_("Error during deflate: ")) + zs.msg); + } + + err = deflateEnd(&zs); + if (err != Z_OK) { + throw GeneralException(String(_("Error during deflateEnd: ")) + zs.msg); + } + + free(buffer); + buffer = zbuffer; + + realsiz = zs.total_out; + + int numblocks = realsiz / realloc_threshold; + int remains = realsiz % realloc_threshold; + buffer = (char *) realloc(buffer, bufsiz = ((numblocks + (remains ? 1 : 0)) * realloc_threshold)); +} -- cgit v1.2.3