diff options
author | Pixel <Pixel> | 2001-12-03 11:39:34 +0000 |
---|---|---|
committer | Pixel <Pixel> | 2001-12-03 11:39:34 +0000 |
commit | 8fac2c6298c5fd2b06e7e219687766dd8cf965b3 (patch) | |
tree | 6dc9ec0dc0d6a24e528ab67dc7081d069080f1ee /lib/Buffer.cc | |
parent | 84944dbe0dfcadfb5c069e210c0545b88aae57dc (diff) |
Zlib....
Diffstat (limited to 'lib/Buffer.cc')
-rw-r--r-- | lib/Buffer.cc | 43 |
1 files changed, 43 insertions, 0 deletions
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)); +} |