summaryrefslogtreecommitdiff
path: root/lib/Buffer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Buffer.cc')
-rw-r--r--lib/Buffer.cc43
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));
+}