summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2011-10-07 18:09:30 (GMT)
committerRemko Tronçon <git@el-tramo.be>2011-10-07 18:09:30 (GMT)
commit6b98253a4127c975bd59b6a49ddb203337a8c32b (patch)
tree546a24e1687f50e403215152d65e21971568f166
parentb2f58c4f3eb93e3a32062670df5eb6682aed273a (diff)
downloadswift-contrib-6b98253a4127c975bd59b6a49ddb203337a8c32b.zip
swift-contrib-6b98253a4127c975bd59b6a49ddb203337a8c32b.tar.bz2
Hoist XML parser factory creation out of Swiften.
-rw-r--r--Limber/Server/ServerFromClientSession.cpp3
-rw-r--r--Limber/Server/ServerFromClientSession.h2
-rw-r--r--Limber/main.cpp4
-rw-r--r--Slimber/Server.cpp6
-rw-r--r--Slimber/Server.h2
-rw-r--r--Swiften/Client/CoreClient.cpp2
-rw-r--r--Swiften/Component/CoreComponent.cpp2
-rw-r--r--Swiften/Examples/ParserTester/ParserTester.cpp4
-rw-r--r--Swiften/LinkLocal/IncomingLinkLocalSession.cpp5
-rw-r--r--Swiften/LinkLocal/IncomingLinkLocalSession.h5
-rw-r--r--Swiften/LinkLocal/OutgoingLinkLocalSession.cpp5
-rw-r--r--Swiften/LinkLocal/OutgoingLinkLocalSession.h5
-rw-r--r--Swiften/Network/BoostNetworkFactories.cpp3
-rw-r--r--Swiften/Network/BoostNetworkFactories.h5
-rw-r--r--Swiften/Network/NetworkFactories.h2
-rw-r--r--Swiften/Parser/UnitTest/XMPPParserTest.cpp22
-rw-r--r--Swiften/Parser/XMPPParser.cpp7
-rw-r--r--Swiften/Parser/XMPPParser.h5
-rw-r--r--Swiften/Session/BasicSessionStream.cpp5
-rw-r--r--Swiften/Session/BasicSessionStream.h4
-rw-r--r--Swiften/Session/Session.cpp6
-rw-r--r--Swiften/Session/Session.h5
-rw-r--r--Swiften/StreamStack/UnitTest/StreamStackTest.cpp4
-rw-r--r--Swiften/StreamStack/UnitTest/XMPPLayerTest.cpp7
-rw-r--r--Swiften/StreamStack/XMPPLayer.cpp6
-rw-r--r--Swiften/StreamStack/XMPPLayer.h3
26 files changed, 87 insertions, 42 deletions
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
@@ -22,20 +22,21 @@
#include "Swiften/SASL/PLAINMessage.h"
namespace Swift {
ServerFromClientSession::ServerFromClientSession(
const std::string& id,
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),
initialized(false),
allowSASLEXTERNAL(false) {
}
void ServerFromClientSession::handleElement(boost::shared_ptr<Element> element) {
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
@@ -21,26 +21,28 @@ namespace Swift {
class Element;
class Stanza;
class PayloadParserFactoryCollection;
class PayloadSerializerCollection;
class StreamStack;
class UserRegistry;
class XMPPLayer;
class ConnectionLayer;
class Connection;
+ class XMLParserFactory;
class ServerFromClientSession : public Session {
public:
ServerFromClientSession(
const std::string& id,
boost::shared_ptr<Connection> connection,
PayloadParserFactoryCollection* payloadParserFactories,
PayloadSerializerCollection* payloadSerializers,
+ XMLParserFactory* xmlParserFactory,
UserRegistry* userRegistry);
boost::signal<void ()> onSessionStarted;
void setAllowSASLEXTERNAL();
private:
void handleElement(boost::shared_ptr<Element>);
void handleStreamStart(const ProtocolHeader& header);
diff --git a/Limber/main.cpp b/Limber/main.cpp
index e6bc45d..350b357 100644
--- a/Limber/main.cpp
+++ b/Limber/main.cpp
@@ -17,33 +17,34 @@
#include "Swiften/EventLoop/EventOwner.h"
#include "Swiften/Elements/Stanza.h"
#include "Swiften/Network/ConnectionServer.h"
#include "Swiften/Network/BoostConnection.h"
#include "Swiften/Network/BoostIOServiceThread.h"
#include "Swiften/Network/BoostConnectionServer.h"
#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;
class Server {
public:
Server(UserRegistry* userRegistry, EventLoop* eventLoop) : userRegistry_(userRegistry) {
serverFromClientConnectionServer_ = BoostConnectionServer::create(5222, boostIOServiceThread_.getIOService(), eventLoop);
serverFromClientConnectionServer_->onNewConnection.connect(boost::bind(&Server::handleNewConnection, this, _1));
serverFromClientConnectionServer_->start();
}
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));
session->startSession();
}
void handleSessionFinished(boost::shared_ptr<ServerFromClientSession> session) {
serverFromClientSessions_.erase(std::remove(serverFromClientSessions_.begin(), serverFromClientSessions_.end(), session), serverFromClientSessions_.end());
}
@@ -75,18 +76,19 @@ class Server {
else {
session->sendElement(IQ::createError(iq->getFrom(), iq->getID(), ErrorPayload::FeatureNotImplemented, ErrorPayload::Cancel));
}
}
}
}
private:
IDGenerator idGenerator_;
+ PlatformXMLParserFactory xmlParserFactory;
UserRegistry* userRegistry_;
BoostIOServiceThread boostIOServiceThread_;
boost::shared_ptr<BoostConnectionServer> serverFromClientConnectionServer_;
std::vector< boost::shared_ptr<ServerFromClientSession> > serverFromClientSessions_;
FullPayloadParserFactoryCollection payloadParserFactories_;
FullPayloadSerializerCollection payloadSerializers_;
};
int main() {
diff --git a/Slimber/Server.cpp b/Slimber/Server.cpp
index 84b33fa..769217f 100644
--- a/Slimber/Server.cpp
+++ b/Slimber/Server.cpp
@@ -141,19 +141,19 @@ void Server::stop(boost::optional<ServerError> e) {
onStopped(e);
}
void Server::handleNewClientConnection(boost::shared_ptr<Connection> connection) {
if (serverFromClientSession) {
connection->disconnect();
}
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));
serverFromClientSession->onElementReceived.connect(
boost::bind(&Server::handleElementReceived, this, _1,
serverFromClientSession));
serverFromClientSession->onSessionFinished.connect(
boost::bind(&Server::handleSessionFinished, this,
serverFromClientSession));
@@ -275,19 +275,19 @@ void Server::handleElementReceived(boost::shared_ptr<Element> element, boost::sh
}
}
}
}
void Server::handleNewLinkLocalConnection(boost::shared_ptr<Connection> connection) {
boost::shared_ptr<IncomingLinkLocalSession> session(
new IncomingLinkLocalSession(
selfJID, connection,
- &payloadParserFactories, &payloadSerializers));
+ &payloadParserFactories, &payloadSerializers, &xmlParserFactory));
registerLinkLocalSession(session);
}
void Server::handleLinkLocalSessionFinished(boost::shared_ptr<Session> session) {
//std::cout << "Link local session from " << session->getRemoteJID() << " ended" << std::endl;
linkLocalSessions.erase(
std::remove(linkLocalSessions.begin(), linkLocalSessions.end(), session),
linkLocalSessions.end());
}
@@ -306,19 +306,19 @@ void Server::handleLinkLocalElementReceived(boost::shared_ptr<Element> element,
void Server::handleConnectFinished(boost::shared_ptr<LinkLocalConnector> connector, bool error) {
if (error) {
std::cerr << "Error connecting" << std::endl;
// TODO: Send back queued stanzas
}
else {
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);
}
registerLinkLocalSession(outgoingSession);
}
connectors.erase(std::remove(connectors.begin(), connectors.end(), connector), connectors.end());
}
void Server::registerLinkLocalSession(boost::shared_ptr<Session> session) {
diff --git a/Slimber/Server.h b/Slimber/Server.h
index 58b1e7c..96401d9 100644
--- a/Slimber/Server.h
+++ b/Slimber/Server.h
@@ -8,18 +8,19 @@
#include <boost/shared_ptr.hpp>
#include <boost/optional.hpp>
#include <vector>
#include "Swiften/Network/BoostIOServiceThread.h"
#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"
#include "Swiften/Serializer/PayloadSerializers/FullPayloadSerializerCollection.h"
#include "Swiften/LinkLocal/LinkLocalServiceInfo.h"
#include "Slimber/ServerError.h"
namespace Swift {
class DNSSDServiceID;
@@ -92,18 +93,19 @@ namespace Swift {
}
};
private:
IDGenerator idGenerator;
FullPayloadParserFactoryCollection payloadParserFactories;
FullPayloadSerializerCollection payloadSerializers;
BoostIOServiceThread boostIOServiceThread;
DummyUserRegistry userRegistry;
+ PlatformXMLParserFactory xmlParserFactory;
bool linkLocalServiceRegistered;
bool rosterRequested;
int clientConnectionPort;
int linkLocalConnectionPort;
LinkLocalServiceBrowser* linkLocalServiceBrowser;
VCardCollection* vCardCollection;
EventLoop* eventLoop;
LinkLocalPresenceManager* presenceManager;
bool stopping;
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
@@ -95,19 +95,19 @@ void CoreClient::handleConnectorFinished(boost::shared_ptr<Connection> connectio
purgePassword();
}
onDisconnected(disconnectRequested_ ? boost::optional<ClientError>() : boost::optional<ClientError>(ClientError::ConnectionError));
}
else {
assert(!connection_);
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_));
}
sessionStream_->onDataRead.connect(boost::bind(&CoreClient::handleDataRead, this, _1));
sessionStream_->onDataWritten.connect(boost::bind(&CoreClient::handleDataWritten, this, _1));
session_ = ClientSession::create(jid_, sessionStream_);
session_->setCertificateTrustChecker(certificateTrustChecker);
session_->setUseStreamCompression(options.useStreamCompression);
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
@@ -57,19 +57,19 @@ void CoreComponent::handleConnectorFinished(boost::shared_ptr<Connection> connec
if (!disconnectRequested_) {
onError(ComponentError::ConnectionError);
}
}
else {
assert(!connection_);
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));
session_ = ComponentSession::create(jid_, secret_, sessionStream_);
stanzaChannel_->setSession(session_);
session_->onFinished.connect(boost::bind(&CoreComponent::handleSessionFinished, this, _1));
session_->start();
}
}
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
@@ -5,18 +5,19 @@
*/
#include <iostream>
#include <fstream>
#include <typeinfo>
#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;
class MyXMPPParserClient : public XMPPParserClient {
public:
virtual void handleStreamStart(const ProtocolHeader&) {
std::cout << "-> Stream start" << std::endl;
}
@@ -29,19 +30,20 @@ class MyXMPPParserClient : public XMPPParserClient {
};
int main(int argc, char* argv[]) {
if (argc != 2) {
std::cerr << "Usage: " << argv[0] << " file" << std::endl;
return 0;
}
FullPayloadParserFactoryCollection factories;
MyXMPPParserClient parserClient;
- XMPPParser parser(&parserClient, &factories);
+ PlatformXMLParserFactory xmlParserFactory;
+ XMPPParser parser(&parserClient, &factories, &xmlParserFactory);
ParserTester<XMLParserClient> tester(&parser);
std::string line;
std::ifstream myfile (argv[1]);
if (myfile.is_open()) {
while (!myfile.eof()) {
getline (myfile,line);
std::cout << "Parsing: " << line << std::endl;
if (!tester.parse(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
@@ -16,20 +16,21 @@
#include <Swiften/Elements/StreamFeatures.h>
#include <Swiften/Elements/IQ.h>
namespace Swift {
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);
}
void IncomingLinkLocalSession::handleStreamStart(const ProtocolHeader& incomingHeader) {
setRemoteJID(JID(incomingHeader.getFrom()));
if (!getRemoteJID().isValid()) {
finishSession();
return;
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
@@ -9,30 +9,31 @@
#include <boost/shared_ptr.hpp>
#include <Swiften/Base/boost_bsignals.h>
#include <Swiften/Session/Session.h>
#include <Swiften/JID/JID.h>
#include <Swiften/Network/Connection.h>
namespace Swift {
class ProtocolHeader;
-
+ class XMLParserFactory;
class Element;
class PayloadParserFactoryCollection;
class PayloadSerializerCollection;
class IncomingLinkLocalSession : public Session {
public:
IncomingLinkLocalSession(
const JID& localJID,
boost::shared_ptr<Connection> connection,
PayloadParserFactoryCollection* payloadParserFactories,
- PayloadSerializerCollection* payloadSerializers);
+ PayloadSerializerCollection* payloadSerializers,
+ XMLParserFactory* xmlParserFactory);
boost::signal<void ()> onSessionStarted;
private:
void handleElement(boost::shared_ptr<Element>);
void handleStreamStart(const ProtocolHeader&);
void setInitialized();
bool isInitialized() const {
return initialized;
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
@@ -15,20 +15,21 @@
#include <Swiften/Elements/IQ.h>
namespace Swift {
OutgoingLinkLocalSession::OutgoingLinkLocalSession(
const JID& localJID,
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);
}
void OutgoingLinkLocalSession::handleSessionStarted() {
ProtocolHeader header;
header.setFrom(getLocalJID());
getXMPPLayer()->writeHeader(header);
}
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
@@ -10,31 +10,32 @@
#include <Swiften/Base/boost_bsignals.h>
#include <boost/enable_shared_from_this.hpp>
#include <vector>
#include <Swiften/Session/Session.h>
#include <Swiften/JID/JID.h>
namespace Swift {
class ConnectionFactory;
-
+ class XMLParserFactory;
class Element;
class PayloadParserFactoryCollection;
class PayloadSerializerCollection;
class OutgoingLinkLocalSession : public Session {
public:
OutgoingLinkLocalSession(
const JID& localJID,
const JID& remoteJID,
boost::shared_ptr<Connection> connection,
PayloadParserFactoryCollection* payloadParserFactories,
- PayloadSerializerCollection* payloadSerializers);
+ PayloadSerializerCollection* payloadSerializers,
+ XMLParserFactory* xmlParserFactory);
void queueElement(boost::shared_ptr<Element> element);
private:
void handleSessionStarted();
void handleElement(boost::shared_ptr<Element>);
void handleStreamStart(const ProtocolHeader&);
private:
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
@@ -4,34 +4,37 @@
* See Documentation/Licenses/GPLv3.txt for more information.
*/
#include <Swiften/Network/BoostNetworkFactories.h>
#include <Swiften/Network/BoostTimerFactory.h>
#include <Swiften/Network/BoostConnectionFactory.h>
#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 {
BoostNetworkFactories::BoostNetworkFactories(EventLoop* eventLoop) {
timerFactory = new BoostTimerFactory(ioServiceThread.getIOService(), eventLoop);
connectionFactory = new BoostConnectionFactory(ioServiceThread.getIOService(), eventLoop);
domainNameResolver = new PlatformDomainNameResolver(eventLoop);
connectionServerFactory = new BoostConnectionServerFactory(ioServiceThread.getIOService(), eventLoop);
#ifdef SWIFT_EXPERIMENTAL_FT
natTraverser = new PlatformNATTraversalWorker(eventLoop);
#else
natTraverser = new NullNATTraverser(eventLoop);
#endif
+ xmlParserFactory = new PlatformXMLParserFactory();
}
BoostNetworkFactories::~BoostNetworkFactories() {
+ delete xmlParserFactory;
delete natTraverser;
delete connectionServerFactory;
delete domainNameResolver;
delete connectionFactory;
delete timerFactory;
}
}
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
@@ -36,18 +36,23 @@ namespace Swift {
ConnectionServerFactory* getConnectionServerFactory() const {
return connectionServerFactory;
}
NATTraverser* getNATTraverser() const {
return natTraverser;
}
+ virtual XMLParserFactory* getXMLParserFactory() const {
+ return xmlParserFactory;
+ }
+
private:
BoostIOServiceThread ioServiceThread;
TimerFactory* timerFactory;
ConnectionFactory* connectionFactory;
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
@@ -6,24 +6,26 @@
#pragma once
namespace Swift {
class TimerFactory;
class ConnectionFactory;
class DomainNameResolver;
class ConnectionServerFactory;
class NATTraverser;
+ class XMLParserFactory;
/**
* An interface collecting network factories.
*/
class NetworkFactories {
public:
virtual ~NetworkFactories();
virtual TimerFactory* getTimerFactory() const = 0;
virtual ConnectionFactory* getConnectionFactory() const = 0;
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
@@ -8,18 +8,19 @@
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <vector>
#include <Swiften/Elements/ProtocolHeader.h>
#include <string>
#include <Swiften/Parser/XMPPParser.h>
#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>
#include <Swiften/Elements/StreamFeatures.h>
#include <Swiften/Elements/UnknownElement.h>
using namespace Swift;
class XMPPParserTest : public CppUnit::TestFixture {
@@ -32,132 +33,132 @@ class XMPPParserTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testParse_StreamFeatures);
CPPUNIT_TEST(testParse_UnknownElement);
CPPUNIT_TEST(testParse_StrayCharacterData);
CPPUNIT_TEST(testParse_InvalidStreamStart);
CPPUNIT_TEST(testParse_ElementEndAfterInvalidStreamStart);
CPPUNIT_TEST_SUITE_END();
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' >"));
CPPUNIT_ASSERT(testling.parse("<presence/>"));
CPPUNIT_ASSERT(testling.parse("<presence/>"));
CPPUNIT_ASSERT(testling.parse("<iq/>"));
CPPUNIT_ASSERT(testling.parse("</stream:stream>"));
CPPUNIT_ASSERT_EQUAL(5, static_cast<int>(client_.events.size()));
CPPUNIT_ASSERT_EQUAL(Client::StreamStart, client_.events[0].type);
CPPUNIT_ASSERT_EQUAL(std::string("example.com"), client_.events[0].header->getTo());
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[1].type);
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[2].type);
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[3].type);
CPPUNIT_ASSERT_EQUAL(Client::StreamEnd, client_.events[4].type);
}
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'>"));
CPPUNIT_ASSERT_EQUAL(1, static_cast<int>(client_.events.size()));
CPPUNIT_ASSERT_EQUAL(Client::StreamStart, client_.events[0].type);
CPPUNIT_ASSERT_EQUAL(std::string("example.com"), client_.events[0].header->getFrom());
CPPUNIT_ASSERT_EQUAL(std::string("aeab"), client_.events[0].header->getID());
}
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/>"));
CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(client_.events.size()));
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[1].type);
CPPUNIT_ASSERT(dynamic_cast<Presence*>(client_.events[1].element.get()));
}
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/>"));
CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(client_.events.size()));
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[1].type);
CPPUNIT_ASSERT(dynamic_cast<IQ*>(client_.events[1].element.get()));
}
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/>"));
CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(client_.events.size()));
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[1].type);
CPPUNIT_ASSERT(dynamic_cast<Message*>(client_.events[1].element.get()));
}
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/>"));
CPPUNIT_ASSERT_EQUAL(2, static_cast<int>(client_.events.size()));
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[1].type);
CPPUNIT_ASSERT(dynamic_cast<StreamFeatures*>(client_.events[1].element.get()));
}
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/>"));
CPPUNIT_ASSERT(testling.parse("<foo/>"));
CPPUNIT_ASSERT(testling.parse("<bar/>"));
CPPUNIT_ASSERT(testling.parse("<presence/>"));
CPPUNIT_ASSERT_EQUAL(5, static_cast<int>(client_.events.size()));
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[2].type);
CPPUNIT_ASSERT(dynamic_cast<UnknownElement*>(client_.events[2].element.get()));
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[3].type);
CPPUNIT_ASSERT(dynamic_cast<UnknownElement*>(client_.events[3].element.get()));
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[4].type);
CPPUNIT_ASSERT(dynamic_cast<Presence*>(client_.events[4].element.get()));
}
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/>"));
CPPUNIT_ASSERT(testling.parse("bla"));
CPPUNIT_ASSERT(testling.parse("<iq/>"));
CPPUNIT_ASSERT_EQUAL(3, static_cast<int>(client_.events.size()));
CPPUNIT_ASSERT_EQUAL(Client::ElementEvent, client_.events[2].type);
CPPUNIT_ASSERT(dynamic_cast<IQ*>(client_.events[2].element.get()));
}
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/>"));
}
private:
class Client : public XMPPParserClient {
public:
enum Type { StreamStart, ElementEvent, StreamEnd };
struct Event {
@@ -183,12 +184,13 @@ class XMPPParserTest : public CppUnit::TestFixture {
}
void handleStreamEnd() {
events.push_back(Event(StreamEnd));
}
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
@@ -6,19 +6,18 @@
#include <Swiften/Parser/XMPPParser.h>
#include <iostream>
#include <cassert>
#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>
#include <Swiften/Parser/PresenceParser.h>
#include <Swiften/Parser/IQParser.h>
#include <Swiften/Parser/MessageParser.h>
#include <Swiften/Parser/StreamFeaturesParser.h>
#include <Swiften/Parser/StreamErrorParser.h>
#include <Swiften/Parser/AuthRequestParser.h>
@@ -35,34 +34,36 @@
#include <Swiften/Parser/StanzaAckRequestParser.h>
#include <Swiften/Parser/StartTLSParser.h>
#include <Swiften/Parser/StartTLSFailureParser.h>
#include <Swiften/Parser/CompressParser.h>
#include <Swiften/Parser/CompressFailureParser.h>
#include <Swiften/Parser/CompressedParser.h>
#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
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() {
delete currentElementParser_;
delete xmlParser_;
}
bool XMPPParser::parse(const std::string& data) {
bool xmlParseResult = xmlParser_->parse(data);
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
@@ -9,27 +9,28 @@
#include <boost/shared_ptr.hpp>
#include <boost/noncopyable.hpp>
#include <Swiften/Parser/XMLParserClient.h>
#include <Swiften/Parser/AttributeMap.h>
namespace Swift {
class XMLParser;
class XMPPParserClient;
-
+ class XMLParserFactory;
class ElementParser;
class PayloadParserFactoryCollection;
class XMPPParser : public XMLParserClient, boost::noncopyable {
public:
XMPPParser(
XMPPParserClient* parserClient,
- PayloadParserFactoryCollection* payloadParserFactories);
+ PayloadParserFactoryCollection* payloadParserFactories,
+ XMLParserFactory* xmlParserFactory);
~XMPPParser();
bool parse(const std::string&);
private:
virtual void handleStartElement(
const std::string& element,
const std::string& ns,
const AttributeMap& attributes);
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
@@ -19,30 +19,31 @@
namespace Swift {
BasicSessionStream::BasicSessionStream(
StreamType streamType,
boost::shared_ptr<Connection> connection,
PayloadParserFactoryCollection* payloadParserFactories,
PayloadSerializerCollection* payloadSerializers,
TLSContextFactory* tlsContextFactory,
- TimerFactory* timerFactory) :
+ TimerFactory* timerFactory,
+ XMLParserFactory* xmlParserFactory) :
available(false),
connection(connection),
payloadParserFactories(payloadParserFactories),
payloadSerializers(payloadSerializers),
tlsContextFactory(tlsContextFactory),
timerFactory(timerFactory),
streamType(streamType),
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));
xmppLayer->onDataRead.connect(boost::bind(&BasicSessionStream::handleDataRead, this, _1));
xmppLayer->onWriteData.connect(boost::bind(&BasicSessionStream::handleDataWritten, this, _1));
connection->onDisconnected.connect(boost::bind(&BasicSessionStream::handleConnectionFinished, this, _1));
connectionLayer = new ConnectionLayer(connection);
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
@@ -18,28 +18,30 @@ namespace Swift {
class TLSLayer;
class TimerFactory;
class WhitespacePingLayer;
class PayloadParserFactoryCollection;
class PayloadSerializerCollection;
class StreamStack;
class XMPPLayer;
class ConnectionLayer;
class CompressionLayer;
+ class XMLParserFactory;
class BasicSessionStream : public SessionStream {
public:
BasicSessionStream(
StreamType streamType,
boost::shared_ptr<Connection> connection,
PayloadParserFactoryCollection* payloadParserFactories,
PayloadSerializerCollection* payloadSerializers,
TLSContextFactory* tlsContextFactory,
- TimerFactory* whitespacePingLayerFactory
+ TimerFactory* whitespacePingLayerFactory,
+ XMLParserFactory* xmlParserFactory
);
~BasicSessionStream();
virtual void close();
virtual bool isOpen();
virtual void writeHeader(const ProtocolHeader& header);
virtual void writeElement(boost::shared_ptr<Element>);
virtual void writeFooter();
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
@@ -10,22 +10,24 @@
#include <Swiften/StreamStack/XMPPLayer.h>
#include <Swiften/StreamStack/StreamStack.h>
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),
finishing(false) {
}
Session::~Session() {
delete streamStack;
delete connectionLayer;
@@ -58,19 +60,19 @@ void Session::finishSession(const SessionError& error) {
if (xmppLayer) {
xmppLayer->writeFooter();
}
connection->disconnect();
handleSessionFinished(boost::optional<SessionError>(error));
onSessionFinished(boost::optional<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));
xmppLayer->onError.connect(
boost::bind(&Session::finishSession, shared_from_this(), XMLError));
xmppLayer->onDataRead.connect(boost::bind(boost::ref(onDataRead), _1));
xmppLayer->onWriteData.connect(boost::bind(boost::ref(onDataWritten), _1));
connection->onDisconnected.connect(
boost::bind(&Session::handleDisconnected, 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
@@ -19,18 +19,19 @@
namespace Swift {
class ProtocolHeader;
class StreamStack;
class JID;
class Element;
class PayloadParserFactoryCollection;
class PayloadSerializerCollection;
class XMPPLayer;
+ class XMLParserFactory;
class Session : public boost::enable_shared_from_this<Session> {
public:
enum SessionError {
ConnectionReadError,
ConnectionWriteError,
XMLError,
AuthenticationFailedError,
NoSupportedAuthMechanismsError,
@@ -39,19 +40,20 @@ namespace Swift {
SessionStartError,
TLSError,
ClientCertificateLoadError,
ClientCertificateError
};
Session(
boost::shared_ptr<Connection> connection,
PayloadParserFactoryCollection* payloadParserFactories,
- PayloadSerializerCollection* payloadSerializers);
+ PayloadSerializerCollection* payloadSerializers,
+ XMLParserFactory* xmlParserFactory);
virtual ~Session();
void startSession();
void finishSession();
void sendElement(boost::shared_ptr<Element>);
const JID& getLocalJID() const {
return localJID;
@@ -97,15 +99,16 @@ namespace Swift {
private:
void handleDisconnected(const boost::optional<Connection::Error>& error);
private:
JID localJID;
JID remoteJID;
boost::shared_ptr<Connection> connection;
PayloadParserFactoryCollection* payloadParserFactories;
PayloadSerializerCollection* payloadSerializers;
+ XMLParserFactory* xmlParserFactory;
XMPPLayer* xmppLayer;
ConnectionLayer* connectionLayer;
StreamStack* streamStack;
bool finishing;
};
}
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
@@ -13,18 +13,19 @@
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <Swiften/Base/ByteArray.h>
#include <Swiften/Base/Concat.h>
#include <Swiften/StreamStack/StreamStack.h>
#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>
using namespace Swift;
class StreamStackTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(StreamStackTest);
CPPUNIT_TEST(testWriteData_NoIntermediateStreamStack);
CPPUNIT_TEST(testWriteData_OneIntermediateStream);
@@ -32,19 +33,19 @@ class StreamStackTest : public CppUnit::TestFixture {
CPPUNIT_TEST(testReadData_NoIntermediateStreamStack);
CPPUNIT_TEST(testReadData_OneIntermediateStream);
CPPUNIT_TEST(testReadData_TwoIntermediateStreamStack);
CPPUNIT_TEST(testAddLayer_ExistingOnWriteDataSlot);
CPPUNIT_TEST_SUITE_END();
public:
void setUp() {
physicalStream_ = new TestLowLayer();
- xmppStream_ = new XMPPLayer(&parserFactories_, &serializers_, ClientStreamType);
+ xmppStream_ = new XMPPLayer(&parserFactories_, &serializers_, &xmlParserFactory_, ClientStreamType);
elementsReceived_ = 0;
dataWriteReceived_ = 0;
}
void tearDown() {
delete physicalStream_;
delete xmppStream_;
}
@@ -166,15 +167,16 @@ class StreamStackTest : public CppUnit::TestFixture {
std::vector<SafeByteArray> data_;
};
private:
FullPayloadParserFactoryCollection parserFactories_;
FullPayloadSerializerCollection serializers_;
TestLowLayer* physicalStream_;
+ PlatformXMLParserFactory xmlParserFactory_;
XMPPLayer* xmppStream_;
int elementsReceived_;
int dataWriteReceived_;
};
CPPUNIT_TEST_SUITE_REGISTRATION(StreamStackTest);
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
@@ -8,37 +8,38 @@
#include <boost/bind.hpp>
#include <cppunit/extensions/HelperMacros.h>
#include <cppunit/extensions/TestFactoryRegistry.h>
#include <Swiften/Elements/ProtocolHeader.h>
#include <Swiften/Elements/Presence.h>
#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>
using namespace Swift;
class XMPPLayerTest : public CppUnit::TestFixture {
CPPUNIT_TEST_SUITE(XMPPLayerTest);
CPPUNIT_TEST(testParseData_Error);
CPPUNIT_TEST(testResetParser);
CPPUNIT_TEST(testResetParser_FromSlot);
CPPUNIT_TEST(testWriteHeader);
CPPUNIT_TEST(testWriteElement);
CPPUNIT_TEST(testWriteFooter);
CPPUNIT_TEST_SUITE_END();
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;
}
void tearDown() {
delete testling_;
delete lowLayer_;
}
@@ -106,33 +107,35 @@ class XMPPLayerTest : public CppUnit::TestFixture {
++errorReceived_;
}
private:
class XMPPLayerExposed : public XMPPLayer {
public:
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;
};
class DummyLowLayer : public LowLayer {
public:
virtual void writeData(const SafeByteArray& data) {
writtenData += byteArrayToString(ByteArray(data.begin(), data.end()));
}
std::string writtenData;
};
FullPayloadParserFactoryCollection parserFactories_;
FullPayloadSerializerCollection serializers_;
DummyLowLayer* lowLayer_;
XMPPLayerExposed* testling_;
+ PlatformXMLParserFactory xmlParserFactory_;
int elementsReceived_;
int errorReceived_;
};
CPPUNIT_TEST_SUITE_REGISTRATION(XMPPLayerTest);
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
@@ -8,24 +8,26 @@
#include <Swiften/Parser/XMPPParser.h>
#include <Swiften/Serializer/XMPPSerializer.h>
#include <Swiften/Elements/ProtocolHeader.h>
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);
}
XMPPLayer::~XMPPLayer() {
delete xmppSerializer_;
delete xmppParser_;
}
void XMPPLayer::writeHeader(const ProtocolHeader& header) {
@@ -62,19 +64,19 @@ void XMPPLayer::handleDataRead(const SafeByteArray& data) {
}
inParser_ = false;
if (resetParserAfterParse_) {
doResetParser();
}
}
void XMPPLayer::doResetParser() {
delete xmppParser_;
- xmppParser_ = new XMPPParser(this, payloadParserFactories_);
+ xmppParser_ = new XMPPParser(this, payloadParserFactories_, xmlParserFactory_);
resetParserAfterParse_ = false;
}
void XMPPLayer::handleStreamStart(const ProtocolHeader& header) {
onStreamStart(header);
}
void XMPPLayer::handleElement(boost::shared_ptr<Element> stanza) {
onElement(stanza);
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
@@ -16,24 +16,26 @@
#include <Swiften/Elements/StreamType.h>
#include <Swiften/Parser/XMPPParserClient.h>
namespace Swift {
class ProtocolHeader;
class XMPPParser;
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();
void writeHeader(const ProtocolHeader& header);
void writeFooter();
void writeElement(boost::shared_ptr<Element>);
void writeData(const std::string& data);
void resetParser();
@@ -54,14 +56,15 @@ namespace Swift {
void handleElement(boost::shared_ptr<Element>);
void handleStreamEnd();
void doResetParser();
private:
PayloadParserFactoryCollection* payloadParserFactories_;
XMPPParser* xmppParser_;
PayloadSerializerCollection* payloadSerializers_;
+ XMLParserFactory* xmlParserFactory_;
XMPPSerializer* xmppSerializer_;
bool resetParserAfterParse_;
bool inParser_;
};
}