author | ulf69 <ulf69> | 2004-09-15 17:53:22 (UTC) |
---|---|---|
committer | ulf69 <ulf69> | 2004-09-15 17:53:22 (UTC) |
commit | d3925ba5bd25224bc4a60d3d6a107c464994a1ea (patch) (side-by-side diff) | |
tree | 60f69da1d2b79ee3081e7ef5c09a46470ca6eda0 /pwmanager/pwmanager/compressgzip.cpp | |
parent | ce83a3479d23b9e8a59c745ccd0a0b14f64ef4e8 (diff) | |
download | kdepimpi-d3925ba5bd25224bc4a60d3d6a107c464994a1ea.zip kdepimpi-d3925ba5bd25224bc4a60d3d6a107c464994a1ea.tar.gz kdepimpi-d3925ba5bd25224bc4a60d3d6a107c464994a1ea.tar.bz2 |
initial revision
Diffstat (limited to 'pwmanager/pwmanager/compressgzip.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | pwmanager/pwmanager/compressgzip.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/pwmanager/pwmanager/compressgzip.cpp b/pwmanager/pwmanager/compressgzip.cpp new file mode 100644 index 0000000..0a325c6 --- a/dev/null +++ b/pwmanager/pwmanager/compressgzip.cpp @@ -0,0 +1,115 @@ +/*************************************************************************** + * * + * copyright (C) 2003, 2004 by Michael Buesch * + * email: mbuesch@freenet.de * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License version 2 * + * as published by the Free Software Foundation. * + * * + ***************************************************************************/ + +/*************************************************************************** + * copyright (C) 2004 by Ulf Schenk + * This file is originaly based on version 1.0.1 of pwmanager + * and was modified to run on embedded devices that run microkde + * + * $Id$ + **************************************************************************/ + +#include "compressgzip.h" + +#include <stdlib.h> +#include <zlib.h> + +#define COMPRESSION_LEVEL Z_BEST_COMPRESSION +#define EXPAND_COMPRESS_DESTBUF_BYTES 1024 +#define EXPAND_DECOMPRESS_DESTBUF_BYTES (1024 * 10) + + +bool CompressGzip::compress(string *d) +{ + int ret; + Bytef *dest; + const Bytef *source; + unsigned long sourceLen, destLen; + + source = reinterpret_cast<const Bytef *>(d->c_str()); + sourceLen = d->length(); + destLen = calcCompressDestLen(sourceLen); + dest = static_cast<Bytef *>(malloc(destLen)); + if (!dest) + return false; + while (1) { + ret = compress2(dest, + static_cast<uLongf *>(&destLen), + source, + static_cast<uLong>(sourceLen), + COMPRESSION_LEVEL); + switch (ret) { + case Z_OK: + goto out; + case Z_BUF_ERROR: + /* we don't use realloc(), because it may + * (in this case) unneccessarily copy the old block + * to the new allocated block. + */ + free(dest); + destLen += EXPAND_COMPRESS_DESTBUF_BYTES; + dest = static_cast<Bytef *>(malloc(destLen)); + if (!dest) + return false; + break; + default: + free(dest); + return false; + } + } +out: + d->assign(reinterpret_cast<char *>(dest), destLen); + free(dest); + return true; +} + +bool CompressGzip::decompress(string *d) +{ + int ret; + Bytef *dest; + const Bytef *source; + unsigned long sourceLen, destLen; + + source = reinterpret_cast<const Bytef *>(d->c_str()); + sourceLen = d->length(); + destLen = calcDecompressDestLen(sourceLen); + dest = static_cast<Bytef *>(malloc(destLen)); + if (!dest) + return false; + while (1) { + ret = uncompress(dest, + static_cast<uLongf *>(&destLen), + source, + static_cast<uLong>(sourceLen)); + switch (ret) { + case Z_OK: + goto out; + case Z_BUF_ERROR: + /* we don't use realloc(), because it may + * (in this case) unneccessarily copy the old block + * to the new allocated block. + */ + free(dest); + destLen += EXPAND_DECOMPRESS_DESTBUF_BYTES; + dest = static_cast<Bytef *>(malloc(destLen)); + if (!dest) + return false; + break; + default: + free(dest); + return false; + } + } +out: + d->assign(reinterpret_cast<char *>(dest), destLen); + free(dest); + return true; +} |