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; +} |