From 7a591138e89ad71ee1dd9825d7705c94f9bb50d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Sun, 15 Jul 2012 09:07:53 +0200
Subject: Hide ZLib implementation.


diff --git a/Swiften/Compress/ZLibCodecompressor.cpp b/Swiften/Compress/ZLibCodecompressor.cpp
index 0869d6b..125492a 100644
--- a/Swiften/Compress/ZLibCodecompressor.cpp
+++ b/Swiften/Compress/ZLibCodecompressor.cpp
@@ -8,18 +8,21 @@
 
 #include <cassert>
 #include <string.h>
+#include <zlib.h>
 
 #include <Swiften/Compress/ZLibException.h>
+#include <Swiften/Compress/ZLibCodecompressor_Private.h>
 
 namespace Swift {
 
 static const int CHUNK_SIZE = 1024; // If you change this, also change the unittest
 
-ZLibCodecompressor::ZLibCodecompressor() {
-	memset(&stream_, 0, sizeof(z_stream));
-	stream_.zalloc = Z_NULL;
-	stream_.zfree = Z_NULL;
-	stream_.opaque = Z_NULL;
+
+ZLibCodecompressor::ZLibCodecompressor() : p(boost::make_shared<Private>()) {
+	memset(&p->stream, 0, sizeof(z_stream));
+	p->stream.zalloc = Z_NULL;
+	p->stream.zfree = Z_NULL;
+	p->stream.opaque = Z_NULL;
 }
 
 ZLibCodecompressor::~ZLibCodecompressor() {
@@ -27,24 +30,24 @@ ZLibCodecompressor::~ZLibCodecompressor() {
 
 SafeByteArray ZLibCodecompressor::process(const SafeByteArray& input) {
 	SafeByteArray output;
-	stream_.avail_in = input.size();
-	stream_.next_in = reinterpret_cast<Bytef*>(const_cast<unsigned char*>(vecptr(input)));
+	p->stream.avail_in = input.size();
+	p->stream.next_in = reinterpret_cast<Bytef*>(const_cast<unsigned char*>(vecptr(input)));
 	int outputPosition = 0;
 	do {
 		output.resize(outputPosition + CHUNK_SIZE);
-		stream_.avail_out = CHUNK_SIZE;
-		stream_.next_out = reinterpret_cast<Bytef*>(vecptr(output) + outputPosition);
+		p->stream.avail_out = CHUNK_SIZE;
+		p->stream.next_out = reinterpret_cast<Bytef*>(vecptr(output) + outputPosition);
 		int result = processZStream();
 		if (result != Z_OK && result != Z_BUF_ERROR) {
-			throw ZLibException(/* stream_.msg */);
+			throw ZLibException(/* p->stream.msg */);
 		}
 		outputPosition += CHUNK_SIZE;
 	}
-	while (stream_.avail_out == 0);
-	if (stream_.avail_in != 0) {
+	while (p->stream.avail_out == 0);
+	if (p->stream.avail_in != 0) {
 		throw ZLibException();
 	}
-	output.resize(outputPosition - stream_.avail_out);
+	output.resize(outputPosition - p->stream.avail_out);
 	return output;
 }
 
diff --git a/Swiften/Compress/ZLibCodecompressor.h b/Swiften/Compress/ZLibCodecompressor.h
index 93babf0..a125fc1 100644
--- a/Swiften/Compress/ZLibCodecompressor.h
+++ b/Swiften/Compress/ZLibCodecompressor.h
@@ -6,8 +6,6 @@
 
 #pragma once
 
-#include <zlib.h>
-
 #include <Swiften/Base/SafeByteArray.h>
 
 namespace Swift {
@@ -20,6 +18,7 @@ namespace Swift {
 			virtual int processZStream() = 0;
 
 		protected:
-			z_stream stream_;
+			class Private;
+			boost::shared_ptr<Private> p;
 	};
 }
diff --git a/Swiften/Compress/ZLibCodecompressor_Private.h b/Swiften/Compress/ZLibCodecompressor_Private.h
new file mode 100644
index 0000000..1f24b83
--- /dev/null
+++ b/Swiften/Compress/ZLibCodecompressor_Private.h
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2012 Remko Tronçon
+ * Licensed under the GNU General Public License v3.
+ * See Documentation/Licenses/GPLv3.txt for more information.
+ */
+
+#pragma once
+
+#include <Swiften/Compress/ZLibCodecompressor.h>
+
+#include <zlib.h>
+
+namespace Swift {
+	struct ZLibCodecompressor::Private {
+		z_stream stream;
+	};
+}
diff --git a/Swiften/Compress/ZLibCompressor.cpp b/Swiften/Compress/ZLibCompressor.cpp
index 5d98e38..6af8d83 100644
--- a/Swiften/Compress/ZLibCompressor.cpp
+++ b/Swiften/Compress/ZLibCompressor.cpp
@@ -7,15 +7,26 @@
 #include <Swiften/Compress/ZLibCompressor.h>
 
 #include <cassert>
+#include <zlib.h>
+
+#include <Swiften/Compress/ZLibCodecompressor_Private.h>
 
 #pragma GCC diagnostic ignored "-Wold-style-cast"
 
 namespace Swift {
 
 ZLibCompressor::ZLibCompressor() {
-	int result = deflateInit(&stream_, COMPRESSION_LEVEL);
+	int result = deflateInit(&p->stream, COMPRESSION_LEVEL);
 	assert(result == Z_OK);
 	(void) result;
 }
 
+ZLibCompressor::~ZLibCompressor() {
+	deflateEnd(&p->stream);
+}
+
+int ZLibCompressor::processZStream() {
+	return deflate(&p->stream, Z_SYNC_FLUSH);
+}
+
 }
diff --git a/Swiften/Compress/ZLibCompressor.h b/Swiften/Compress/ZLibCompressor.h
index 1add725..f4a8d2f 100644
--- a/Swiften/Compress/ZLibCompressor.h
+++ b/Swiften/Compress/ZLibCompressor.h
@@ -7,20 +7,14 @@
 #pragma once
 
 #include <Swiften/Compress/ZLibCodecompressor.h>
-#include <Swiften/Base/ByteArray.h>
 
 namespace Swift {
 	class ZLibCompressor : public ZLibCodecompressor {
 		public:
 			ZLibCompressor();
+			~ZLibCompressor();
 
-			~ZLibCompressor() {
-				deflateEnd(&stream_);
-			}
-
-			virtual int processZStream() {
-				return deflate(&stream_, Z_SYNC_FLUSH);
-			}
+			virtual int processZStream();
 
 		private:
 			static const int COMPRESSION_LEVEL = 9;
diff --git a/Swiften/Compress/ZLibDecompressor.cpp b/Swiften/Compress/ZLibDecompressor.cpp
index ab954f4..f5df9fe 100644
--- a/Swiften/Compress/ZLibDecompressor.cpp
+++ b/Swiften/Compress/ZLibDecompressor.cpp
@@ -6,16 +6,27 @@
 
 #include <Swiften/Compress/ZLibDecompressor.h>
 
+#include <zlib.h>
 #include <cassert>
 
+#include <Swiften/Compress/ZLibCodecompressor_Private.h>
+
 #pragma GCC diagnostic ignored "-Wold-style-cast"
 
 namespace Swift {
 
 ZLibDecompressor::ZLibDecompressor() {
-	int result = inflateInit(&stream_);
+	int result = inflateInit(&p->stream);
 	assert(result == Z_OK);
 	(void) result;
 }
 
+ZLibDecompressor::~ZLibDecompressor() {
+	inflateEnd(&p->stream);
+}
+
+int ZLibDecompressor::processZStream() {
+	return inflate(&p->stream, Z_SYNC_FLUSH);
+}
+
 }
diff --git a/Swiften/Compress/ZLibDecompressor.h b/Swiften/Compress/ZLibDecompressor.h
index 67994d1..0726c8b 100644
--- a/Swiften/Compress/ZLibDecompressor.h
+++ b/Swiften/Compress/ZLibDecompressor.h
@@ -7,19 +7,13 @@
 #pragma once
 
 #include <Swiften/Compress/ZLibCodecompressor.h>
-#include <Swiften/Base/ByteArray.h>
 
 namespace Swift {
 	class ZLibDecompressor : public ZLibCodecompressor {
 		public:
 			ZLibDecompressor();
+			~ZLibDecompressor();
 
-			~ZLibDecompressor() {
-				inflateEnd(&stream_);
-			}
-
-			virtual int processZStream() {
-				return inflate(&stream_, Z_SYNC_FLUSH);
-			}
+			virtual int processZStream();
 	};
 }
-- 
cgit v0.10.2-6-g49f6