From 6b98253a4127c975bd59b6a49ddb203337a8c32b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Remko=20Tron=C3=A7on?= <git@el-tramo.be>
Date: Fri, 7 Oct 2011 20:09:30 +0200
Subject: Hoist XML parser factory creation out of Swiften.


diff --git a/Limber/Server/ServerFromClientSession.cpp b/Limber/Server/ServerFromClientSession.cpp
index 3a37c65..fd361b7 100644
--- a/Limber/Server/ServerFromClientSession.cpp
+++ b/Limber/Server/ServerFromClientSession.cpp
@@ -28,8 +28,9 @@ ServerFromClientSession::ServerFromClientSession(
 		boost::shared_ptr<Connection> connection, 
 		PayloadParserFactoryCollection* payloadParserFactories, 
 		PayloadSerializerCollection* payloadSerializers,
+		XMLParserFactory* xmlParserFactory,
 		UserRegistry* userRegistry) : 
-			Session(connection, payloadParserFactories, payloadSerializers),
+			Session(connection, payloadParserFactories, payloadSerializers, xmlParserFactory),
 			id_(id),
 			userRegistry_(userRegistry),
 			authenticated_(false),
diff --git a/Limber/Server/ServerFromClientSession.h b/Limber/Server/ServerFromClientSession.h
index 1a0e109..34ea40e 100644
--- a/Limber/Server/ServerFromClientSession.h
+++ b/Limber/Server/ServerFromClientSession.h
@@ -27,6 +27,7 @@ namespace Swift {
 	class XMPPLayer;
 	class ConnectionLayer;
 	class Connection;
+	class XMLParserFactory;
 
 	class ServerFromClientSession : public Session {
 		public:
@@ -35,6 +36,7 @@ namespace Swift {
 					boost::shared_ptr<Connection> connection, 
 					PayloadParserFactoryCollection* payloadParserFactories, 
 					PayloadSerializerCollection* payloadSerializers,
+					XMLParserFactory* xmlParserFactory,
 					UserRegistry* userRegistry);
 
 			boost::signal<void ()> onSessionStarted;
diff --git a/Limber/main.cpp b/Limber/main.cpp
index e6bc45d..350b357 100644
--- a/Limber/main.cpp
+++ b/Limber/main.cpp
@@ -23,6 +23,7 @@
 #include "Limber/Server/SimpleUserRegistry.h"
 #include "Limber/Server/ServerFromClientSession.h"
 #include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h"
+#include "Swiften/Parser/PlatformXMLParserFactory.h"
 #include "Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h"
 
 using namespace Swift;
@@ -37,7 +38,7 @@ class Server {
 
 	private:
 		void handleNewConnection(boost::shared_ptr<Connection> c) {
-			boost::shared_ptr<ServerFromClientSession> session(new ServerFromClientSession(idGenerator_.generateID(), c, &payloadParserFactories_, &payloadSerializers_, userRegistry_));
+			boost::shared_ptr<ServerFromClientSession> session(new ServerFromClientSession(idGenerator_.generateID(), c, &payloadParserFactories_, &payloadSerializers_, &xmlParserFactory, userRegistry_));
 			serverFromClientSessions_.push_back(session);
 			session->onElementReceived.connect(boost::bind(&Server::handleElementReceived, this, _1, session));
 			session->onSessionFinished.connect(boost::bind(&Server::handleSessionFinished, this, session));
@@ -81,6 +82,7 @@ class Server {
 
 	private:
 		IDGenerator idGenerator_;
+		PlatformXMLParserFactory xmlParserFactory;
 		UserRegistry* userRegistry_;
 		BoostIOServiceThread boostIOServiceThread_;
 		boost::shared_ptr<BoostConnectionServer> serverFromClientConnectionServer_;
diff --git a/Slimber/Server.cpp b/Slimber/Server.cpp
index 84b33fa..769217f 100644
--- a/Slimber/Server.cpp
+++ b/Slimber/Server.cpp
@@ -147,7 +147,7 @@ void Server::handleNewClientConnection(boost::shared_ptr<Connection> connection)
 	}
 	serverFromClientSession = boost::shared_ptr<ServerFromClientSession>(
 			new ServerFromClientSession(idGenerator.generateID(), connection, 
-					&payloadParserFactories, &payloadSerializers, &userRegistry));
+					&payloadParserFactories, &payloadSerializers, &xmlParserFactory, &userRegistry));
 	serverFromClientSession->setAllowSASLEXTERNAL();
 	serverFromClientSession->onSessionStarted.connect(
 			boost::bind(&Server::handleSessionStarted, this));
@@ -281,7 +281,7 @@ void Server::handleNewLinkLocalConnection(boost::shared_ptr<Connection> connecti
 	boost::shared_ptr<IncomingLinkLocalSession> session(
 			new IncomingLinkLocalSession(
 				selfJID, connection, 
-				&payloadParserFactories, &payloadSerializers));
+				&payloadParserFactories, &payloadSerializers, &xmlParserFactory));
 	registerLinkLocalSession(session);
 }
 
@@ -312,7 +312,7 @@ void Server::handleConnectFinished(boost::shared_ptr<LinkLocalConnector> connect
 		boost::shared_ptr<OutgoingLinkLocalSession> outgoingSession(
 				new OutgoingLinkLocalSession(
 					selfJID, connector->getService().getJID(), connector->getConnection(),
-					&payloadParserFactories, &payloadSerializers));
+					&payloadParserFactories, &payloadSerializers, &xmlParserFactory));
 		foreach(const boost::shared_ptr<Element> element, connector->getQueuedElements()) {
 			outgoingSession->queueElement(element);
 		}
diff --git a/Slimber/Server.h b/Slimber/Server.h
index 58b1e7c..96401d9 100644
--- a/Slimber/Server.h
+++ b/Slimber/Server.h
@@ -14,6 +14,7 @@
 #include "Swiften/Network/BoostConnectionServer.h"
 #include "Limber/Server/UserRegistry.h"
 #include "Swiften/Base/IDGenerator.h"
+#include "Swiften/Parser/PlatformXMLParserFactory.h"
 #include "Limber/Server/ServerFromClientSession.h"
 #include "Swiften/JID/JID.h"
 #include "Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h"
@@ -98,6 +99,7 @@ namespace Swift {
 			FullPayloadSerializerCollection payloadSerializers;
 			BoostIOServiceThread boostIOServiceThread;
 			DummyUserRegistry userRegistry;
+			PlatformXMLParserFactory xmlParserFactory;
 			bool linkLocalServiceRegistered;
 			bool rosterRequested;
 			int clientConnectionPort;
diff --git a/Swiften/Client/CoreClient.cpp b/Swiften/Client/CoreClient.cpp
index f6a3f20..dbc6de2 100644
--- a/Swiften/Client/CoreClient.cpp
+++ b/Swiften/Client/CoreClient.cpp
@@ -101,7 +101,7 @@ void CoreClient::handleConnectorFinished(boost::shared_ptr<Connection> connectio
 		connection_ = connection;
 
 		assert(!sessionStream_);
-		sessionStream_ = boost::make_shared<BasicSessionStream>(ClientStreamType, connection_, getPayloadParserFactories(), getPayloadSerializers(), tlsFactories->getTLSContextFactory(), networkFactories->getTimerFactory());
+		sessionStream_ = boost::make_shared<BasicSessionStream>(ClientStreamType, connection_, getPayloadParserFactories(), getPayloadSerializers(), tlsFactories->getTLSContextFactory(), networkFactories->getTimerFactory(), networkFactories->getXMLParserFactory());
 		if (!certificate_.empty()) {
 			sessionStream_->setTLSCertificate(PKCS12Certificate(certificate_, password_));
 		}
diff --git a/Swiften/Component/CoreComponent.cpp b/Swiften/Component/CoreComponent.cpp
index 7ee1ff5..e630ddf 100644
--- a/Swiften/Component/CoreComponent.cpp
+++ b/Swiften/Component/CoreComponent.cpp
@@ -63,7 +63,7 @@ void CoreComponent::handleConnectorFinished(boost::shared_ptr<Connection> connec
 		connection_ = connection;
 
 		assert(!sessionStream_);
-		sessionStream_ = boost::shared_ptr<BasicSessionStream>(new BasicSessionStream(ComponentStreamType, connection_, getPayloadParserFactories(), getPayloadSerializers(), NULL, networkFactories->getTimerFactory()));
+		sessionStream_ = boost::shared_ptr<BasicSessionStream>(new BasicSessionStream(ComponentStreamType, connection_, getPayloadParserFactories(), getPayloadSerializers(), NULL, networkFactories->getTimerFactory(), networkFactories->getXMLParserFactory()));
 		sessionStream_->onDataRead.connect(boost::bind(&CoreComponent::handleDataRead, this, _1));
 		sessionStream_->onDataWritten.connect(boost::bind(&CoreComponent::handleDataWritten, this, _1));
 
diff --git a/Swiften/Examples/ParserTester/ParserTester.cpp b/Swiften/Examples/ParserTester/ParserTester.cpp
index 211d44f..009eef4 100644
--- a/Swiften/Examples/ParserTester/ParserTester.cpp
+++ b/Swiften/Examples/ParserTester/ParserTester.cpp
@@ -11,6 +11,7 @@
 #include <Swiften/Parser/UnitTest/ParserTester.h>
 #include <Swiften/Parser/XMPPParser.h>
 #include <Swiften/Parser/XMPPParserClient.h>
+#include <Swiften/Parser/PlatformXMLParserFactory.h>
 #include <Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h>
 
 using namespace Swift;
@@ -35,7 +36,8 @@ int main(int argc, char* argv[]) {
 	}
 	FullPayloadParserFactoryCollection factories;
 	MyXMPPParserClient parserClient;
-	XMPPParser parser(&parserClient, &factories);
+	PlatformXMLParserFactory xmlParserFactory;
+	XMPPParser parser(&parserClient, &factories, &xmlParserFactory);
 	ParserTester<XMLParserClient> tester(&parser);
 
 	std::string line;
diff --git a/Swiften/LinkLocal/IncomingLinkLocalSession.cpp b/Swiften/LinkLocal/IncomingLinkLocalSession.cpp
index c4dea64..b89de81 100644
--- a/Swiften/LinkLocal/IncomingLinkLocalSession.cpp
+++ b/Swiften/LinkLocal/IncomingLinkLocalSession.cpp
@@ -22,8 +22,9 @@ IncomingLinkLocalSession::IncomingLinkLocalSession(
 		const JID& localJID,
 		boost::shared_ptr<Connection> connection, 
 		PayloadParserFactoryCollection* payloadParserFactories, 
-		PayloadSerializerCollection* payloadSerializers) :
-			Session(connection, payloadParserFactories, payloadSerializers),
+		PayloadSerializerCollection* payloadSerializers,
+		XMLParserFactory* xmlParserFactory) :
+			Session(connection, payloadParserFactories, payloadSerializers, xmlParserFactory),
 			initialized(false) {
 	setLocalJID(localJID);
 }
diff --git a/Swiften/LinkLocal/IncomingLinkLocalSession.h b/Swiften/LinkLocal/IncomingLinkLocalSession.h
index 68e21a5..f00c166 100644
--- a/Swiften/LinkLocal/IncomingLinkLocalSession.h
+++ b/Swiften/LinkLocal/IncomingLinkLocalSession.h
@@ -15,7 +15,7 @@
 
 namespace Swift {
 	class ProtocolHeader;
-	
+	class XMLParserFactory;	
 	class Element;
 	class PayloadParserFactoryCollection;
 	class PayloadSerializerCollection;
@@ -26,7 +26,8 @@ namespace Swift {
 					const JID& localJID,
 					boost::shared_ptr<Connection> connection, 
 					PayloadParserFactoryCollection* payloadParserFactories, 
-					PayloadSerializerCollection* payloadSerializers);
+					PayloadSerializerCollection* payloadSerializers,
+					XMLParserFactory* xmlParserFactory);
 
 			boost::signal<void ()> onSessionStarted;
 
diff --git a/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp b/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp
index 9d712f8..7a59715 100644
--- a/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp
+++ b/Swiften/LinkLocal/OutgoingLinkLocalSession.cpp
@@ -21,8 +21,9 @@ OutgoingLinkLocalSession::OutgoingLinkLocalSession(
 		const JID& remoteJID,
 		boost::shared_ptr<Connection> connection,
 		PayloadParserFactoryCollection* payloadParserFactories, 
-		PayloadSerializerCollection* payloadSerializers) :
-			Session(connection, payloadParserFactories, payloadSerializers) {
+		PayloadSerializerCollection* payloadSerializers,
+		XMLParserFactory* xmlParserFactory) :
+			Session(connection, payloadParserFactories, payloadSerializers, xmlParserFactory) {
 	setLocalJID(localJID);
 	setRemoteJID(remoteJID);
 }
diff --git a/Swiften/LinkLocal/OutgoingLinkLocalSession.h b/Swiften/LinkLocal/OutgoingLinkLocalSession.h
index 430c446..b97f2bf 100644
--- a/Swiften/LinkLocal/OutgoingLinkLocalSession.h
+++ b/Swiften/LinkLocal/OutgoingLinkLocalSession.h
@@ -16,7 +16,7 @@
 
 namespace Swift {
 	class ConnectionFactory;
-	
+	class XMLParserFactory;	
 	class Element;
 	class PayloadParserFactoryCollection;
 	class PayloadSerializerCollection;
@@ -28,7 +28,8 @@ namespace Swift {
 					const JID& remoteJID,
 					boost::shared_ptr<Connection> connection,
 					PayloadParserFactoryCollection* payloadParserFactories, 
-					PayloadSerializerCollection* payloadSerializers);
+					PayloadSerializerCollection* payloadSerializers,
+					XMLParserFactory* xmlParserFactory);
 
 			void queueElement(boost::shared_ptr<Element> element);
 
diff --git a/Swiften/Network/BoostNetworkFactories.cpp b/Swiften/Network/BoostNetworkFactories.cpp
index 315290c..56be2b7 100644
--- a/Swiften/Network/BoostNetworkFactories.cpp
+++ b/Swiften/Network/BoostNetworkFactories.cpp
@@ -10,6 +10,7 @@
 #include <Swiften/Network/PlatformDomainNameResolver.h>
 #include <Swiften/Network/BoostConnectionServerFactory.h>
 #include <Swiften/Network/PlatformNATTraversalWorker.h>
+#include <Swiften/Parser/PlatformXMLParserFactory.h>
 #include <Swiften/Network/NullNATTraverser.h>
 
 namespace Swift {
@@ -24,9 +25,11 @@ BoostNetworkFactories::BoostNetworkFactories(EventLoop* eventLoop) {
 #else
 	natTraverser = new NullNATTraverser(eventLoop);
 #endif
+	xmlParserFactory = new PlatformXMLParserFactory();
 }
 
 BoostNetworkFactories::~BoostNetworkFactories() {
+	delete xmlParserFactory;
 	delete natTraverser;
 	delete connectionServerFactory;
 	delete domainNameResolver;
diff --git a/Swiften/Network/BoostNetworkFactories.h b/Swiften/Network/BoostNetworkFactories.h
index bc7a963..c9ecb59 100644
--- a/Swiften/Network/BoostNetworkFactories.h
+++ b/Swiften/Network/BoostNetworkFactories.h
@@ -42,6 +42,10 @@ namespace Swift {
 				return natTraverser;
 			}
 
+			virtual XMLParserFactory* getXMLParserFactory() const {
+				return xmlParserFactory;
+			}
+
 		private:
 			BoostIOServiceThread ioServiceThread;
 			TimerFactory* timerFactory;
@@ -49,5 +53,6 @@ namespace Swift {
 			DomainNameResolver* domainNameResolver;
 			ConnectionServerFactory* connectionServerFactory;
 			NATTraverser* natTraverser;
+			XMLParserFactory* xmlParserFactory;
 	};
 }
diff --git a/Swiften/Network/NetworkFactories.h b/Swiften/Network/NetworkFactories.h
index 05ddfe3..42c9f6a 100644
--- a/Swiften/Network/NetworkFactories.h
+++ b/Swiften/Network/NetworkFactories.h
@@ -12,6 +12,7 @@ namespace Swift {
 	class DomainNameResolver;
 	class ConnectionServerFactory;
 	class NATTraverser;
+	class XMLParserFactory;
 
 	/**
 	 * An interface collecting network factories.
@@ -25,5 +26,6 @@ namespace Swift {
 			virtual DomainNameResolver* getDomainNameResolver() const = 0;
 			virtual ConnectionServerFactory* getConnectionServerFactory() const = 0;
 			virtual NATTraverser* getNATTraverser() const = 0;
+			virtual XMLParserFactory* getXMLParserFactory() const = 0;
 	};
 }
diff --git a/Swiften/Parser/UnitTest/XMPPParserTest.cpp b/Swiften/Parser/UnitTest/XMPPParserTest.cpp
index dbee18a..f8d60f2 100644
--- a/Swiften/Parser/UnitTest/XMPPParserTest.cpp
+++ b/Swiften/Parser/UnitTest/XMPPParserTest.cpp
@@ -14,6 +14,7 @@
 #include <Swiften/Parser/ElementParser.h>
 #include <Swiften/Parser/XMPPParserClient.h>
 #include <Swiften/Parser/PayloadParserFactoryCollection.h>
+#include <Swiften/Parser/PlatformXMLParserFactory.h>
 #include <Swiften/Elements/Presence.h>
 #include <Swiften/Elements/IQ.h>
 #include <Swiften/Elements/Message.h>
@@ -38,7 +39,7 @@ class XMPPParserTest : public CppUnit::TestFixture {
 
 	public:
 		void testParse_SimpleSession() {
-			XMPPParser testling(&client_, &factories_);
+			XMPPParser testling(&client_, &factories_, &xmlParserFactory_);
 
 			CPPUNIT_ASSERT(testling.parse("<?xml version='1.0'?>"));
 			CPPUNIT_ASSERT(testling.parse("<stream:stream to='example.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' >"));
@@ -57,7 +58,7 @@ class XMPPParserTest : public CppUnit::TestFixture {
 		}
 
 		void testParse_SimpleClientFromServerSession() {
-			XMPPParser testling(&client_, &factories_);
+			XMPPParser testling(&client_, &factories_, &xmlParserFactory_);
 
 			CPPUNIT_ASSERT(testling.parse("<?xml version='1.0'?>"));
 			CPPUNIT_ASSERT(testling.parse("<stream:stream from='example.com' xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams' id='aeab'>"));
@@ -70,7 +71,7 @@ class XMPPParserTest : public CppUnit::TestFixture {
 
 
 		void testParse_Presence() {
-			XMPPParser testling(&client_, &factories_);
+			XMPPParser testling(&client_, &factories_, &xmlParserFactory_);
 
 			CPPUNIT_ASSERT(testling.parse("<stream:stream xmlns:stream='http://etherx.jabber.org/streams'>"));
 			CPPUNIT_ASSERT(testling.parse("<presence/>"));
@@ -81,7 +82,7 @@ class XMPPParserTest : public CppUnit::TestFixture {
 		}
 
 		void testParse_IQ() {
-			XMPPParser testling(&client_, &factories_);
+			XMPPParser testling(&client_, &factories_, &xmlParserFactory_);
 
 			CPPUNIT_ASSERT(testling.parse("<stream:stream xmlns:stream='http://etherx.jabber.org/streams'>"));
 			CPPUNIT_ASSERT(testling.parse("<iq/>"));
@@ -92,7 +93,7 @@ class XMPPParserTest : public CppUnit::TestFixture {
 		}
 
 		void testParse_Message() {
-			XMPPParser testling(&client_, &factories_);
+			XMPPParser testling(&client_, &factories_, &xmlParserFactory_);
 
 			CPPUNIT_ASSERT(testling.parse("<stream:stream xmlns:stream='http://etherx.jabber.org/streams'>"));
 			CPPUNIT_ASSERT(testling.parse("<message/>"));
@@ -103,7 +104,7 @@ class XMPPParserTest : public CppUnit::TestFixture {
 		}
 
 		void testParse_StreamFeatures() {
-			XMPPParser testling(&client_, &factories_);
+			XMPPParser testling(&client_, &factories_, &xmlParserFactory_);
 
 			CPPUNIT_ASSERT(testling.parse("<stream:stream xmlns:stream='http://etherx.jabber.org/streams'>"));
 			CPPUNIT_ASSERT(testling.parse("<stream:features/>"));
@@ -114,7 +115,7 @@ class XMPPParserTest : public CppUnit::TestFixture {
 		}
 
 		void testParse_UnknownElement() {
-			XMPPParser testling(&client_, &factories_);
+			XMPPParser testling(&client_, &factories_, &xmlParserFactory_);
 
 			CPPUNIT_ASSERT(testling.parse("<stream:stream xmlns:stream='http://etherx.jabber.org/streams'>"));
 			CPPUNIT_ASSERT(testling.parse("<presence/>"));
@@ -132,7 +133,7 @@ class XMPPParserTest : public CppUnit::TestFixture {
 		}
 
 		void testParse_StrayCharacterData() {
-			XMPPParser testling(&client_, &factories_);
+			XMPPParser testling(&client_, &factories_, &xmlParserFactory_);
 
 			CPPUNIT_ASSERT(testling.parse("<stream:stream xmlns:stream='http://etherx.jabber.org/streams'>"));
 			CPPUNIT_ASSERT(testling.parse("<presence/>"));
@@ -145,13 +146,13 @@ class XMPPParserTest : public CppUnit::TestFixture {
 		}
 
 		void testParse_InvalidStreamStart() {
-			XMPPParser testling(&client_, &factories_);
+			XMPPParser testling(&client_, &factories_, &xmlParserFactory_);
 
 			CPPUNIT_ASSERT(!testling.parse("<tream>"));
 		}
 
 		void testParse_ElementEndAfterInvalidStreamStart() {
-			XMPPParser testling(&client_, &factories_);
+			XMPPParser testling(&client_, &factories_, &xmlParserFactory_);
 
 			CPPUNIT_ASSERT(!testling.parse("<tream/>"));
 		}
@@ -189,6 +190,7 @@ class XMPPParserTest : public CppUnit::TestFixture {
 				std::vector<Event> events;
 		} client_;
 		PayloadParserFactoryCollection factories_;
+		PlatformXMLParserFactory xmlParserFactory_;
 };
 
 CPPUNIT_TEST_SUITE_REGISTRATION(XMPPParserTest);
diff --git a/Swiften/Parser/XMPPParser.cpp b/Swiften/Parser/XMPPParser.cpp
index 6779b86..069a5bd 100644
--- a/Swiften/Parser/XMPPParser.cpp
+++ b/Swiften/Parser/XMPPParser.cpp
@@ -12,7 +12,6 @@
 #include <Swiften/Elements/ProtocolHeader.h>
 #include <string>
 #include <Swiften/Parser/XMLParser.h>
-#include <Swiften/Parser/PlatformXMLParserFactory.h>
 #include <Swiften/Parser/XMPPParserClient.h>
 #include <Swiften/Parser/XMPPParser.h>
 #include <Swiften/Parser/ElementParser.h>
@@ -41,6 +40,7 @@
 #include <Swiften/Parser/UnknownElementParser.h>
 #include <Swiften/Parser/TLSProceedParser.h>
 #include <Swiften/Parser/ComponentHandshakeParser.h>
+#include <Swiften/Parser/XMLParserFactory.h>
 
 // TODO: Whenever an error occurs in the handlers, stop the parser by returing
 // a bool value, and stopping the XML parser
@@ -49,14 +49,15 @@ namespace Swift {
 
 XMPPParser::XMPPParser(
 		XMPPParserClient* client, 
-		PayloadParserFactoryCollection* payloadParserFactories) : 
+		PayloadParserFactoryCollection* payloadParserFactories,
+		XMLParserFactory* xmlParserFactory) : 
 				xmlParser_(0),
 				client_(client), 
 				payloadParserFactories_(payloadParserFactories), 
 				level_(0),
 				currentElementParser_(0),
 				parseErrorOccurred_(false) {
-	xmlParser_ = PlatformXMLParserFactory().createXMLParser(this);
+	xmlParser_ = xmlParserFactory->createXMLParser(this);
 }
 
 XMPPParser::~XMPPParser() {
diff --git a/Swiften/Parser/XMPPParser.h b/Swiften/Parser/XMPPParser.h
index b5d6d24..6cce2bd 100644
--- a/Swiften/Parser/XMPPParser.h
+++ b/Swiften/Parser/XMPPParser.h
@@ -15,7 +15,7 @@
 namespace Swift {
 	class XMLParser;
 	class XMPPParserClient;
-	
+	class XMLParserFactory;	
 	class ElementParser;
 	class PayloadParserFactoryCollection;
 
@@ -23,7 +23,8 @@ namespace Swift {
 		public:
 			XMPPParser(
 					XMPPParserClient* parserClient, 
-					PayloadParserFactoryCollection* payloadParserFactories);
+					PayloadParserFactoryCollection* payloadParserFactories,
+					XMLParserFactory* xmlParserFactory);
 			~XMPPParser();
 
 			bool parse(const std::string&);
diff --git a/Swiften/Session/BasicSessionStream.cpp b/Swiften/Session/BasicSessionStream.cpp
index d08be4f..07a04b8 100644
--- a/Swiften/Session/BasicSessionStream.cpp
+++ b/Swiften/Session/BasicSessionStream.cpp
@@ -25,7 +25,8 @@ BasicSessionStream::BasicSessionStream(
 		PayloadParserFactoryCollection* payloadParserFactories, 
 		PayloadSerializerCollection* payloadSerializers, 
 		TLSContextFactory* tlsContextFactory, 
-		TimerFactory* timerFactory) : 
+		TimerFactory* timerFactory,
+		XMLParserFactory* xmlParserFactory) :
 			available(false), 
 			connection(connection), 
 			payloadParserFactories(payloadParserFactories), 
@@ -36,7 +37,7 @@ BasicSessionStream::BasicSessionStream(
 			compressionLayer(NULL),
 			tlsLayer(NULL),
 			whitespacePingLayer(NULL) {
-	xmppLayer = new XMPPLayer(payloadParserFactories, payloadSerializers, streamType);
+	xmppLayer = new XMPPLayer(payloadParserFactories, payloadSerializers, xmlParserFactory, streamType);
 	xmppLayer->onStreamStart.connect(boost::bind(&BasicSessionStream::handleStreamStartReceived, this, _1));
 	xmppLayer->onElement.connect(boost::bind(&BasicSessionStream::handleElementReceived, this, _1));
 	xmppLayer->onError.connect(boost::bind(&BasicSessionStream::handleXMPPError, this));
diff --git a/Swiften/Session/BasicSessionStream.h b/Swiften/Session/BasicSessionStream.h
index 2a1ed8a..2ed5ac6 100644
--- a/Swiften/Session/BasicSessionStream.h
+++ b/Swiften/Session/BasicSessionStream.h
@@ -24,6 +24,7 @@ namespace Swift {
 	class XMPPLayer;
 	class ConnectionLayer;
 	class CompressionLayer;
+	class XMLParserFactory;
 
 	class BasicSessionStream : public SessionStream {
 		public:
@@ -33,7 +34,8 @@ namespace Swift {
 				PayloadParserFactoryCollection* payloadParserFactories, 
 				PayloadSerializerCollection* payloadSerializers,
 				TLSContextFactory* tlsContextFactory,
-				TimerFactory* whitespacePingLayerFactory
+				TimerFactory* whitespacePingLayerFactory,
+				XMLParserFactory* xmlParserFactory
 			);
 			~BasicSessionStream();
 
diff --git a/Swiften/Session/Session.cpp b/Swiften/Session/Session.cpp
index e8b8308..661cb8d 100644
--- a/Swiften/Session/Session.cpp
+++ b/Swiften/Session/Session.cpp
@@ -16,10 +16,12 @@ namespace Swift {
 Session::Session(
 		boost::shared_ptr<Connection> connection,
 		PayloadParserFactoryCollection* payloadParserFactories, 
-		PayloadSerializerCollection* payloadSerializers) : 
+		PayloadSerializerCollection* payloadSerializers,
+		XMLParserFactory* xmlParserFactory) : 
 			connection(connection),
 			payloadParserFactories(payloadParserFactories),
 			payloadSerializers(payloadSerializers),
+			xmlParserFactory(xmlParserFactory),
 			xmppLayer(NULL),
 			connectionLayer(NULL),
 			streamStack(0),
@@ -64,7 +66,7 @@ void Session::finishSession(const SessionError& error) {
 }
 
 void Session::initializeStreamStack() {
-	xmppLayer = new XMPPLayer(payloadParserFactories, payloadSerializers, ClientStreamType);
+	xmppLayer = new XMPPLayer(payloadParserFactories, payloadSerializers, xmlParserFactory, ClientStreamType);
 	xmppLayer->onStreamStart.connect(
 			boost::bind(&Session::handleStreamStart, shared_from_this(), _1));
 	xmppLayer->onElement.connect(boost::bind(&Session::handleElement, shared_from_this(), _1));
diff --git a/Swiften/Session/Session.h b/Swiften/Session/Session.h
index 9e954c7..c937430 100644
--- a/Swiften/Session/Session.h
+++ b/Swiften/Session/Session.h
@@ -25,6 +25,7 @@ namespace Swift {
 	class PayloadParserFactoryCollection;
 	class PayloadSerializerCollection;
 	class XMPPLayer;
+	class XMLParserFactory;
 
 	class Session : public boost::enable_shared_from_this<Session> {
 		public:
@@ -45,7 +46,8 @@ namespace Swift {
 			Session(
 					boost::shared_ptr<Connection> connection,
 					PayloadParserFactoryCollection* payloadParserFactories, 
-					PayloadSerializerCollection* payloadSerializers);
+					PayloadSerializerCollection* payloadSerializers,
+					XMLParserFactory* xmlParserFactory);
 			virtual ~Session();
 
 			void startSession();
@@ -103,6 +105,7 @@ namespace Swift {
 			boost::shared_ptr<Connection> connection;
 			PayloadParserFactoryCollection* payloadParserFactories;
 			PayloadSerializerCollection* payloadSerializers;
+			XMLParserFactory* xmlParserFactory;
 			XMPPLayer* xmppLayer;
 			ConnectionLayer* connectionLayer;
 			StreamStack* streamStack;
diff --git a/Swiften/StreamStack/UnitTest/StreamStackTest.cpp b/Swiften/StreamStack/UnitTest/StreamStackTest.cpp
index d3c0a7c..213948a 100644
--- a/Swiften/StreamStack/UnitTest/StreamStackTest.cpp
+++ b/Swiften/StreamStack/UnitTest/StreamStackTest.cpp
@@ -19,6 +19,7 @@
 #include <Swiften/StreamStack/LowLayer.h>
 #include <Swiften/StreamStack/XMPPLayer.h>
 #include <Swiften/StreamStack/StreamLayer.h>
+#include <Swiften/Parser/PlatformXMLParserFactory.h>
 #include <Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h>
 #include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h>
 
@@ -38,7 +39,7 @@ class StreamStackTest : public CppUnit::TestFixture {
 	public:
 		void setUp() {
 			physicalStream_ = new TestLowLayer();
-			xmppStream_ = new XMPPLayer(&parserFactories_, &serializers_, ClientStreamType);
+			xmppStream_ = new XMPPLayer(&parserFactories_, &serializers_, &xmlParserFactory_, ClientStreamType);
 			elementsReceived_ = 0;
 			dataWriteReceived_ = 0;
 		}
@@ -172,6 +173,7 @@ class StreamStackTest : public CppUnit::TestFixture {
 		FullPayloadParserFactoryCollection parserFactories_;
 		FullPayloadSerializerCollection serializers_;
 		TestLowLayer* physicalStream_;
+		PlatformXMLParserFactory xmlParserFactory_;
 		XMPPLayer* xmppStream_;
 		int elementsReceived_;
 		int dataWriteReceived_;
diff --git a/Swiften/StreamStack/UnitTest/XMPPLayerTest.cpp b/Swiften/StreamStack/UnitTest/XMPPLayerTest.cpp
index bb0ce61..8123c00 100644
--- a/Swiften/StreamStack/UnitTest/XMPPLayerTest.cpp
+++ b/Swiften/StreamStack/UnitTest/XMPPLayerTest.cpp
@@ -14,6 +14,7 @@
 #include <Swiften/Base/ByteArray.h>
 #include <Swiften/StreamStack/XMPPLayer.h>
 #include <Swiften/StreamStack/LowLayer.h>
+#include <Swiften/Parser/PlatformXMLParserFactory.h>
 #include <Swiften/Parser/PayloadParsers/FullPayloadParserFactoryCollection.h>
 #include <Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h>
 
@@ -32,7 +33,7 @@ class XMPPLayerTest : public CppUnit::TestFixture {
 	public:
 		void setUp() {
 			lowLayer_ = new DummyLowLayer();
-			testling_ = new XMPPLayerExposed(&parserFactories_, &serializers_, ClientStreamType);
+			testling_ = new XMPPLayerExposed(&parserFactories_, &serializers_, &xmlParserFactory_, ClientStreamType);
 			testling_->setChildLayer(lowLayer_);
 			elementsReceived_ = 0;
 			errorReceived_ = 0;
@@ -112,7 +113,8 @@ class XMPPLayerTest : public CppUnit::TestFixture {
 				XMPPLayerExposed(
 								PayloadParserFactoryCollection* payloadParserFactories,
 								PayloadSerializerCollection* payloadSerializers,
-								StreamType streamType) : XMPPLayer(payloadParserFactories, payloadSerializers, streamType) {}
+								XMLParserFactory* xmlParserFactory,
+								StreamType streamType) : XMPPLayer(payloadParserFactories, payloadSerializers, xmlParserFactory, streamType) {}
 
 				using XMPPLayer::handleDataRead;
 				using HighLayer::setChildLayer;
@@ -131,6 +133,7 @@ class XMPPLayerTest : public CppUnit::TestFixture {
 		FullPayloadSerializerCollection serializers_;
 		DummyLowLayer* lowLayer_;
 		XMPPLayerExposed* testling_;
+		PlatformXMLParserFactory xmlParserFactory_;
 		int elementsReceived_;
 		int errorReceived_;
 };
diff --git a/Swiften/StreamStack/XMPPLayer.cpp b/Swiften/StreamStack/XMPPLayer.cpp
index 1dcd84f..94afcf9 100644
--- a/Swiften/StreamStack/XMPPLayer.cpp
+++ b/Swiften/StreamStack/XMPPLayer.cpp
@@ -14,12 +14,14 @@ namespace Swift {
 XMPPLayer::XMPPLayer(
 		PayloadParserFactoryCollection* payloadParserFactories,
 		PayloadSerializerCollection* payloadSerializers,
+		XMLParserFactory* xmlParserFactory,
 		StreamType streamType) :
 			payloadParserFactories_(payloadParserFactories), 
 			payloadSerializers_(payloadSerializers),
+			xmlParserFactory_(xmlParserFactory),
 			resetParserAfterParse_(false),
 			inParser_(false) {
-	xmppParser_ = new XMPPParser(this, payloadParserFactories_);
+	xmppParser_ = new XMPPParser(this, payloadParserFactories_, xmlParserFactory);
 	xmppSerializer_ = new XMPPSerializer(payloadSerializers_, streamType);
 }
 
@@ -68,7 +70,7 @@ void XMPPLayer::handleDataRead(const SafeByteArray& data) {
 
 void XMPPLayer::doResetParser() {
 	delete xmppParser_;
-	xmppParser_ = new XMPPParser(this, payloadParserFactories_);
+	xmppParser_ = new XMPPParser(this, payloadParserFactories_, xmlParserFactory_);
 	resetParserAfterParse_ = false;
 }
 
diff --git a/Swiften/StreamStack/XMPPLayer.h b/Swiften/StreamStack/XMPPLayer.h
index 54bdd42..9be00b2 100644
--- a/Swiften/StreamStack/XMPPLayer.h
+++ b/Swiften/StreamStack/XMPPLayer.h
@@ -22,12 +22,14 @@ namespace Swift {
 	class PayloadParserFactoryCollection;
 	class XMPPSerializer;
 	class PayloadSerializerCollection;
+	class XMLParserFactory;
 
 	class XMPPLayer : public XMPPParserClient, public HighLayer, boost::noncopyable {
 		public:
 			XMPPLayer(
 					PayloadParserFactoryCollection* payloadParserFactories,
 					PayloadSerializerCollection* payloadSerializers,
+					XMLParserFactory* xmlParserFactory,
 					StreamType streamType);
 			~XMPPLayer();
 
@@ -60,6 +62,7 @@ namespace Swift {
 			PayloadParserFactoryCollection* payloadParserFactories_;
 			XMPPParser* xmppParser_;
 			PayloadSerializerCollection* payloadSerializers_;
+			XMLParserFactory* xmlParserFactory_;
 			XMPPSerializer* xmppSerializer_;
 			bool resetParserAfterParse_;
 			bool inParser_;
-- 
cgit v0.10.2-6-g49f6