summaryrefslogtreecommitdiffabout
path: root/pwmanager/pwmanager/compressgzip.cpp
authorulf69 <ulf69>2004-09-15 17:53:22 (UTC)
committer ulf69 <ulf69>2004-09-15 17:53:22 (UTC)
commitd3925ba5bd25224bc4a60d3d6a107c464994a1ea (patch) (side-by-side diff)
tree60f69da1d2b79ee3081e7ef5c09a46470ca6eda0 /pwmanager/pwmanager/compressgzip.cpp
parentce83a3479d23b9e8a59c745ccd0a0b14f64ef4e8 (diff)
downloadkdepimpi-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.cpp115
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;
+}