summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRemko Tronçon <git@el-tramo.be>2009-07-15 18:07:44 (GMT)
committerRemko Tronçon <git@el-tramo.be>2009-07-15 18:07:44 (GMT)
commitf061668e3c1d5eac01b85303e2c81df2bc560e9a (patch)
treede56afe6d93cb36425f7c2e458575d27bd9105a4
parent0930cd940963be0edfe7c80b4925babca0e01443 (diff)
downloadswift-contrib-f061668e3c1d5eac01b85303e2c81df2bc560e9a.zip
swift-contrib-f061668e3c1d5eac01b85303e2c81df2bc560e9a.tar.bz2
Make stream stack layers reference counted.
-rw-r--r--Limber/main.cpp25
-rw-r--r--Swiften/Client/Session.cpp14
-rw-r--r--Swiften/Client/Session.h8
-rw-r--r--Swiften/Client/UnitTest/SessionTest.cpp10
-rw-r--r--Swiften/EventLoop/MainEventLoop.h2
-rw-r--r--Swiften/EventLoop/UnitTest/EventLoopTest.cpp18
-rw-r--r--Swiften/EventLoop/UnitTest/SimpleEventLoopTest.cpp4
-rw-r--r--Swiften/Network/BoostConnection.cpp2
-rw-r--r--Swiften/Network/Timer.cpp2
-rw-r--r--Swiften/QA/ClientTest/ClientTest.cpp4
-rw-r--r--Swiften/QA/NetworkTest/BoostConnectionTest.cpp4
-rw-r--r--Swiften/Server/ServerFromClientSession.cpp6
-rw-r--r--Swiften/Server/ServerFromClientSession.h4
-rw-r--r--Swiften/StreamStack/PlatformTLSLayerFactory.cpp6
-rw-r--r--Swiften/StreamStack/PlatformTLSLayerFactory.h7
-rw-r--r--Swiften/StreamStack/StreamStack.cpp19
-rw-r--r--Swiften/StreamStack/StreamStack.h27
-rw-r--r--Swiften/StreamStack/TLSLayerFactory.h9
-rw-r--r--Swiften/StreamStack/UnitTest/StreamStackTest.cpp38
19 files changed, 106 insertions, 103 deletions
diff --git a/Limber/main.cpp b/Limber/main.cpp
index 200f2e4..5d1bb6a 100644
--- a/Limber/main.cpp
+++ b/Limber/main.cpp
@@ -3,6 +3,7 @@
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
#include "Swiften/Elements/IQ.h"
#include "Swiften/Elements/RosterPayload.h"
@@ -12,6 +13,7 @@
#include "Swiften/Base/IDGenerator.h"
#include "Swiften/EventLoop/MainEventLoop.h"
#include "Swiften/EventLoop/SimpleEventLoop.h"
+#include "Swiften/EventLoop/EventOwner.h"
#include "Swiften/Elements/Stanza.h"
#include "Swiften/Network/ConnectionServer.h"
#include "Swiften/Network/BoostConnection.h"
@@ -22,9 +24,12 @@
using namespace Swift;
-class BoostConnectionServer : public ConnectionServer {
+class BoostConnectionServer : public ConnectionServer, public EventOwner, public boost::enable_shared_from_this<BoostConnectionServer> {
public:
BoostConnectionServer(int port, boost::asio::io_service& ioService) : acceptor_(ioService, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)) {
+ }
+
+ void start() {
acceptNextConnection();
}
@@ -32,12 +37,12 @@ class BoostConnectionServer : public ConnectionServer {
void acceptNextConnection() {
boost::shared_ptr<BoostConnection> newConnection(new BoostConnection(&acceptor_.io_service()));
acceptor_.async_accept(newConnection->getSocket(),
- boost::bind(&BoostConnectionServer::handleAccept, this, newConnection, boost::asio::placeholders::error));
+ boost::bind(&BoostConnectionServer::handleAccept, shared_from_this(), newConnection, boost::asio::placeholders::error));
}
void handleAccept(boost::shared_ptr<BoostConnection> newConnection, const boost::system::error_code& error) {
if (!error) {
- MainEventLoop::postEvent(boost::bind(boost::ref(onNewConnection), newConnection), this);
+ MainEventLoop::postEvent(boost::bind(boost::ref(onNewConnection), newConnection), shared_from_this());
newConnection->listen();
acceptNextConnection();
}
@@ -49,12 +54,9 @@ class BoostConnectionServer : public ConnectionServer {
class Server {
public:
Server(UserRegistry* userRegistry) : userRegistry_(userRegistry) {
- serverFromClientConnectionServer_ = new BoostConnectionServer(5222, boostIOServiceThread_.getIOService());
+ serverFromClientConnectionServer_ = boost::shared_ptr<BoostConnectionServer>(new BoostConnectionServer(5224, boostIOServiceThread_.getIOService()));
serverFromClientConnectionServer_->onNewConnection.connect(boost::bind(&Server::handleNewConnection, this, _1));
- }
-
- ~Server() {
- delete serverFromClientConnectionServer_;
+ serverFromClientConnectionServer_->start();
}
private:
@@ -101,7 +103,7 @@ class Server {
IDGenerator idGenerator_;
UserRegistry* userRegistry_;
BoostIOServiceThread boostIOServiceThread_;
- BoostConnectionServer* serverFromClientConnectionServer_;
+ boost::shared_ptr<BoostConnectionServer> serverFromClientConnectionServer_;
std::vector<ServerFromClientSession*> serverFromClientSessions_;
FullPayloadParserFactoryCollection payloadParserFactories_;
FullPayloadSerializerCollection payloadSerializers_;
@@ -110,7 +112,10 @@ class Server {
int main() {
SimpleEventLoop eventLoop;
SimpleUserRegistry userRegistry;
- userRegistry.addUser(JID("remko@limber"), "pass");
+ userRegistry.addUser(JID("remko@localhost"), "remko");
+ userRegistry.addUser(JID("kevin@localhost"), "kevin");
+ userRegistry.addUser(JID("remko@limber.swift.im"), "remko");
+ userRegistry.addUser(JID("kevin@limber.swift.im"), "kevin");
Server server(&userRegistry);
eventLoop.run();
return 0;
diff --git a/Swiften/Client/Session.cpp b/Swiften/Client/Session.cpp
index 087880f..dbeddb7 100644
--- a/Swiften/Client/Session.cpp
+++ b/Swiften/Client/Session.cpp
@@ -31,20 +31,12 @@ Session::Session(const JID& jid, ConnectionFactory* connectionFactory, TLSLayerF
payloadSerializers_(payloadSerializers),
state_(Initial),
error_(NoError),
- xmppLayer_(0),
- tlsLayer_(0),
- connectionLayer_(0),
- whitespacePingLayer_(0),
streamStack_(0),
needSessionStart_(false) {
}
Session::~Session() {
delete streamStack_;
- delete whitespacePingLayer_;
- delete connectionLayer_;
- delete tlsLayer_;
- delete xmppLayer_;
}
void Session::start() {
@@ -73,13 +65,13 @@ void Session::sendStreamHeader() {
}
void Session::initializeStreamStack() {
- xmppLayer_ = new XMPPLayer(payloadParserFactories_, payloadSerializers_);
+ xmppLayer_ = boost::shared_ptr<XMPPLayer>(new XMPPLayer(payloadParserFactories_, payloadSerializers_));
xmppLayer_->onStreamStart.connect(boost::bind(&Session::handleStreamStart, this));
xmppLayer_->onElement.connect(boost::bind(&Session::handleElement, this, _1));
xmppLayer_->onError.connect(boost::bind(&Session::setError, this, XMLError));
xmppLayer_->onDataRead.connect(boost::bind(boost::ref(onDataRead), _1));
xmppLayer_->onWriteData.connect(boost::bind(boost::ref(onDataWritten), _1));
- connectionLayer_ = new ConnectionLayer(connection_);
+ connectionLayer_ = boost::shared_ptr<ConnectionLayer>(new ConnectionLayer(connection_));
streamStack_ = new StreamStack(xmppLayer_, connectionLayer_);
}
@@ -144,7 +136,7 @@ void Session::handleElement(boost::shared_ptr<Element> element) {
// Start the session
// Add a whitespace ping layer
- whitespacePingLayer_ = new WhitespacePingLayer();
+ whitespacePingLayer_ = boost::shared_ptr<WhitespacePingLayer>(new WhitespacePingLayer());
streamStack_->addLayer(whitespacePingLayer_);
if (streamFeatures->hasSession()) {
diff --git a/Swiften/Client/Session.h b/Swiften/Client/Session.h
index 72b57bd..1b4d1fe 100644
--- a/Swiften/Client/Session.h
+++ b/Swiften/Client/Session.h
@@ -113,10 +113,10 @@ namespace Swift {
State state_;
SessionError error_;
boost::shared_ptr<Connection> connection_;
- XMPPLayer* xmppLayer_;
- TLSLayer* tlsLayer_;
- ConnectionLayer* connectionLayer_;
- WhitespacePingLayer* whitespacePingLayer_;
+ boost::shared_ptr<XMPPLayer> xmppLayer_;
+ boost::shared_ptr<TLSLayer> tlsLayer_;
+ boost::shared_ptr<ConnectionLayer> connectionLayer_;
+ boost::shared_ptr<WhitespacePingLayer> whitespacePingLayer_;
StreamStack* streamStack_;
bool needSessionStart_;
PKCS12Certificate certificate_;
diff --git a/Swiften/Client/UnitTest/SessionTest.cpp b/Swiften/Client/UnitTest/SessionTest.cpp
index f7f1db0..5d43736 100644
--- a/Swiften/Client/UnitTest/SessionTest.cpp
+++ b/Swiften/Client/UnitTest/SessionTest.cpp
@@ -718,23 +718,23 @@ class SessionTest : public CppUnit::TestFixture {
MockTLSLayerFactory() : haveTLS_(true) {}
void setTLSSupported(bool b) { haveTLS_ = b; }
virtual bool canCreate() const { return haveTLS_; }
- virtual TLSLayer* createTLSLayer() {
+ virtual boost::shared_ptr<TLSLayer> createTLSLayer() {
assert(haveTLS_);
- MockTLSLayer* result = new MockTLSLayer();
+ boost::shared_ptr<MockTLSLayer> result(new MockTLSLayer());
layers_.push_back(result);
return result;
}
- std::vector<MockTLSLayer*> layers_;
+ std::vector< boost::shared_ptr<MockTLSLayer> > layers_;
bool haveTLS_;
};
struct MockSession : public Session {
MockSession(const JID& jid, ConnectionFactory* connectionFactory, TLSLayerFactory* tlsLayerFactory, PayloadParserFactoryCollection* payloadParserFactories, PayloadSerializerCollection* payloadSerializers) : Session(jid, connectionFactory, tlsLayerFactory, payloadParserFactories, payloadSerializers) {}
- MockTLSLayer* getTLSLayer() const {
+ boost::shared_ptr<MockTLSLayer> getTLSLayer() const {
return getStreamStack()->getLayer<MockTLSLayer>();
}
- WhitespacePingLayer* getWhitespacePingLayer() const {
+ boost::shared_ptr<WhitespacePingLayer> getWhitespacePingLayer() const {
return getStreamStack()->getLayer<WhitespacePingLayer>();
}
};
diff --git a/Swiften/EventLoop/MainEventLoop.h b/Swiften/EventLoop/MainEventLoop.h
index 0046546..fbb7079 100644
--- a/Swiften/EventLoop/MainEventLoop.h
+++ b/Swiften/EventLoop/MainEventLoop.h
@@ -19,7 +19,7 @@ namespace Swift {
* If the owner is destroyed, all events should be removed from the
* loop using removeEventsFromOwner().
*/
- static void postEvent(boost::function<void ()> event, boost::shared_ptr<EventOwner> owner = 0);
+ static void postEvent(boost::function<void ()> event, boost::shared_ptr<EventOwner> owner = boost::shared_ptr<EventOwner>());
static void removeEventsFromOwner(boost::shared_ptr<EventOwner> owner);
diff --git a/Swiften/EventLoop/UnitTest/EventLoopTest.cpp b/Swiften/EventLoop/UnitTest/EventLoopTest.cpp
index c64d1ad..9475ac9 100644
--- a/Swiften/EventLoop/UnitTest/EventLoopTest.cpp
+++ b/Swiften/EventLoop/UnitTest/EventLoopTest.cpp
@@ -3,6 +3,7 @@
#include <boost/thread.hpp>
#include <boost/bind.hpp>
+#include "Swiften/EventLoop/EventOwner.h"
#include "Swiften/EventLoop/SimpleEventLoop.h"
#include "Swiften/Base/sleep.h"
@@ -25,8 +26,8 @@ class EventLoopTest : public CppUnit::TestFixture
void testPost() {
SimpleEventLoop testling;
- testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 1), 0);
- testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 2), 0);
+ testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 1));
+ testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 2));
testling.stop();
testling.run();
@@ -37,12 +38,14 @@ class EventLoopTest : public CppUnit::TestFixture
void testRemove() {
SimpleEventLoop testling;
+ boost::shared_ptr<MyEventOwner> eventOwner1(new MyEventOwner());
+ boost::shared_ptr<MyEventOwner> eventOwner2(new MyEventOwner());
- testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 1), &testling);
- testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 2), this);
- testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 3), &testling);
- testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 4), this);
- testling.removeEventsFromOwner(this);
+ testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 1), eventOwner1);
+ testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 2), eventOwner2);
+ testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 3), eventOwner1);
+ testling.postEvent(boost::bind(&EventLoopTest::logEvent, this, 4), eventOwner2);
+ testling.removeEventsFromOwner(eventOwner2);
testling.stop();
testling.run();
@@ -52,6 +55,7 @@ class EventLoopTest : public CppUnit::TestFixture
}
private:
+ struct MyEventOwner : public EventOwner {};
void logEvent(int i) {
events_.push_back(i);
}
diff --git a/Swiften/EventLoop/UnitTest/SimpleEventLoopTest.cpp b/Swiften/EventLoop/UnitTest/SimpleEventLoopTest.cpp
index a39aa9a..b6c2da8 100644
--- a/Swiften/EventLoop/UnitTest/SimpleEventLoopTest.cpp
+++ b/Swiften/EventLoop/UnitTest/SimpleEventLoopTest.cpp
@@ -32,7 +32,7 @@ class SimpleEventLoopTest : public CppUnit::TestFixture
void testPostFromMainThread() {
SimpleEventLoop testling;
- testling.postEvent(boost::bind(&SimpleEventLoopTest::incrementCounterAndStop, this, &testling), 0);
+ testling.postEvent(boost::bind(&SimpleEventLoopTest::incrementCounterAndStop, this, &testling));
testling.run();
CPPUNIT_ASSERT_EQUAL(1, counter_);
@@ -42,7 +42,7 @@ class SimpleEventLoopTest : public CppUnit::TestFixture
void runIncrementingThread(SimpleEventLoop* loop) {
for (unsigned int i = 0; i < 10; ++i) {
Swift::sleep(1);
- loop->postEvent(boost::bind(&SimpleEventLoopTest::incrementCounter, this), 0);
+ loop->postEvent(boost::bind(&SimpleEventLoopTest::incrementCounter, this));
}
loop->stop();
}
diff --git a/Swiften/Network/BoostConnection.cpp b/Swiften/Network/BoostConnection.cpp
index ff53289..f837b50 100644
--- a/Swiften/Network/BoostConnection.cpp
+++ b/Swiften/Network/BoostConnection.cpp
@@ -42,7 +42,6 @@ BoostConnection::BoostConnection(boost::asio::io_service* ioService) :
}
BoostConnection::~BoostConnection() {
- MainEventLoop::removeEventsFromOwner(shared_from_this());
}
void BoostConnection::listen() {
@@ -65,6 +64,7 @@ void BoostConnection::connect(const String& domain) {
}
void BoostConnection::disconnect() {
+ //MainEventLoop::removeEventsFromOwner(shared_from_this());
socket_.close();
}
diff --git a/Swiften/Network/Timer.cpp b/Swiften/Network/Timer.cpp
index bab41e4..8999113 100644
--- a/Swiften/Network/Timer.cpp
+++ b/Swiften/Network/Timer.cpp
@@ -12,7 +12,7 @@ Timer::Timer(int milliseconds) :
}
Timer::~Timer() {
- MainEventLoop::removeEventsFromOwner(shared_from_this());
+ //MainEventLoop::removeEventsFromOwner(shared_from_this());
ioService_->stop();
thread_->join();
delete timer_;
diff --git a/Swiften/QA/ClientTest/ClientTest.cpp b/Swiften/QA/ClientTest/ClientTest.cpp
index 01b9647..b628a8d 100644
--- a/Swiften/QA/ClientTest/ClientTest.cpp
+++ b/Swiften/QA/ClientTest/ClientTest.cpp
@@ -45,8 +45,8 @@ int main(int, char**) {
{
boost::shared_ptr<Timer> timer(new Timer(10000));
- timer.onTick.connect(boost::bind(&SimpleEventLoop::stop, &eventLoop));
- timer.start();
+ timer->onTick.connect(boost::bind(&SimpleEventLoop::stop, &eventLoop));
+ timer->start();
eventLoop.run();
}
diff --git a/Swiften/QA/NetworkTest/BoostConnectionTest.cpp b/Swiften/QA/NetworkTest/BoostConnectionTest.cpp
index d29739e..e38b895 100644
--- a/Swiften/QA/NetworkTest/BoostConnectionTest.cpp
+++ b/Swiften/QA/NetworkTest/BoostConnectionTest.cpp
@@ -20,13 +20,13 @@ class BoostConnectionTest : public CppUnit::TestFixture {
BoostConnectionTest() {}
void setUp() {
- eventLoop_ = new DummyEventLoop();
boostIOServiceThread_ = new BoostIOServiceThread();
+ eventLoop_ = new DummyEventLoop();
}
void tearDown() {
- delete boostIOServiceThread_;
delete eventLoop_;
+ delete boostIOServiceThread_;
}
void testDestructor() {
diff --git a/Swiften/Server/ServerFromClientSession.cpp b/Swiften/Server/ServerFromClientSession.cpp
index 6d4aba1..67067c5 100644
--- a/Swiften/Server/ServerFromClientSession.cpp
+++ b/Swiften/Server/ServerFromClientSession.cpp
@@ -31,7 +31,7 @@ ServerFromClientSession::ServerFromClientSession(
userRegistry_(userRegistry),
authenticated_(false),
initialized_(false) {
- xmppLayer_ = new XMPPLayer(payloadParserFactories_, payloadSerializers_);
+ xmppLayer_ = boost::shared_ptr<XMPPLayer>(new XMPPLayer(payloadParserFactories_, payloadSerializers_));
xmppLayer_->onStreamStart.connect(
boost::bind(&ServerFromClientSession::handleStreamStart, this, _2));
xmppLayer_->onElement.connect(
@@ -42,14 +42,12 @@ ServerFromClientSession::ServerFromClientSession(
boost::bind(boost::ref(onDataRead), _1));
xmppLayer_->onWriteData.connect(
boost::bind(boost::ref(onDataWritten), _1));
- connectionLayer_ = new ConnectionLayer(connection_);
+ connectionLayer_ = boost::shared_ptr<ConnectionLayer>(new ConnectionLayer(connection_));
streamStack_ = new StreamStack(xmppLayer_, connectionLayer_);
}
ServerFromClientSession::~ServerFromClientSession() {
delete streamStack_;
- delete connectionLayer_;
- delete xmppLayer_;
}
void ServerFromClientSession::handleElement(boost::shared_ptr<Element> element) {
diff --git a/Swiften/Server/ServerFromClientSession.h b/Swiften/Server/ServerFromClientSession.h
index 9c37b3d..62e89ef 100644
--- a/Swiften/Server/ServerFromClientSession.h
+++ b/Swiften/Server/ServerFromClientSession.h
@@ -55,9 +55,9 @@ namespace Swift {
UserRegistry* userRegistry_;
bool authenticated_;
bool initialized_;
- ConnectionLayer* connectionLayer_;
+ boost::shared_ptr<XMPPLayer> xmppLayer_;
+ boost::shared_ptr<ConnectionLayer> connectionLayer_;
StreamStack* streamStack_;
- XMPPLayer* xmppLayer_;
JID domain_;
String user_;
JID jid_;
diff --git a/Swiften/StreamStack/PlatformTLSLayerFactory.cpp b/Swiften/StreamStack/PlatformTLSLayerFactory.cpp
index bb1abf1..40021ee 100644
--- a/Swiften/StreamStack/PlatformTLSLayerFactory.cpp
+++ b/Swiften/StreamStack/PlatformTLSLayerFactory.cpp
@@ -22,12 +22,12 @@ bool PlatformTLSLayerFactory::canCreate() const {
#endif
}
-TLSLayer* PlatformTLSLayerFactory::createTLSLayer() {
+boost::shared_ptr<TLSLayer> PlatformTLSLayerFactory::createTLSLayer() {
#ifdef HAVE_OPENSSL
- return new OpenSSLLayer();
+ return boost::shared_ptr<TLSLayer>(new OpenSSLLayer());
#else
assert(false);
- return 0;
+ return boost::shared_ptr<TLSLayer>();
#endif
}
diff --git a/Swiften/StreamStack/PlatformTLSLayerFactory.h b/Swiften/StreamStack/PlatformTLSLayerFactory.h
index 6ebee32..6c343b0 100644
--- a/Swiften/StreamStack/PlatformTLSLayerFactory.h
+++ b/Swiften/StreamStack/PlatformTLSLayerFactory.h
@@ -1,5 +1,4 @@
-#ifndef SWIFTEN_OpenSSLLayerFactory_H
-#define SWIFTEN_OpenSSLLayerFactory_H
+#pragma once
#include "Swiften/StreamStack/TLSLayerFactory.h"
@@ -9,8 +8,6 @@ namespace Swift {
PlatformTLSLayerFactory();
bool canCreate() const;
- virtual TLSLayer* createTLSLayer();
+ virtual boost::shared_ptr<TLSLayer> createTLSLayer();
};
}
-
-#endif
diff --git a/Swiften/StreamStack/StreamStack.cpp b/Swiften/StreamStack/StreamStack.cpp
index 7dde858..9eb9b4e 100644
--- a/Swiften/StreamStack/StreamStack.cpp
+++ b/Swiften/StreamStack/StreamStack.cpp
@@ -2,25 +2,36 @@
#include <boost/bind.hpp>
+#include "Swiften/Base/foreach.h"
#include "Swiften/StreamStack/XMPPLayer.h"
#include "Swiften/StreamStack/LowLayer.h"
#include "Swiften/StreamStack/StreamLayer.h"
namespace Swift {
-StreamStack::StreamStack(XMPPLayer* xmppLayer, LowLayer* physicalLayer) : xmppLayer_(xmppLayer), physicalLayer_(physicalLayer) {
+StreamStack::StreamStack(boost::shared_ptr<XMPPLayer> xmppLayer, boost::shared_ptr<LowLayer> physicalLayer) : xmppLayer_(xmppLayer), physicalLayer_(physicalLayer) {
xmppReadSlotConnection_ = physicalLayer_->onDataRead.connect(boost::bind(&XMPPLayer::parseData, xmppLayer_, _1));
xmppWriteSignalConnection_ = xmppLayer_->onWriteData.connect(boost::bind(&LowLayer::writeData, physicalLayer_, _1));
}
-void StreamStack::addLayer(StreamLayer* newLayer) {
+StreamStack::~StreamStack() {
+ // Disconnect the write signal connections to break cyclic signal
+ // dependencies. The read signal connections have
+ // to remain, since these can be reached from the main event loop.
+ xmppWriteSignalConnection_.disconnect();
+ foreach(const boost::bsignals::connection& connection, writeSignalConnections_) {
+ connection.disconnect();
+ }
+}
+
+void StreamStack::addLayer(boost::shared_ptr<StreamLayer> newLayer) {
xmppReadSlotConnection_.disconnect();
xmppWriteSignalConnection_.disconnect();
- LowLayer* lowLayer = (layers_.empty() ? physicalLayer_ : *layers_.rbegin());
+ boost::shared_ptr<LowLayer> lowLayer = (layers_.empty() ? physicalLayer_ : *layers_.rbegin());
lowLayer->onDataRead.connect(boost::bind(&HighLayer::handleDataRead, newLayer, _1), boost::bsignals::at_front);
- newLayer->onWriteData.connect(boost::bind(&LowLayer::writeData, lowLayer, _1), boost::bsignals::at_front);
+ writeSignalConnections_.push_back(newLayer->onWriteData.connect(boost::bind(&LowLayer::writeData, lowLayer, _1), boost::bsignals::at_front));
xmppWriteSignalConnection_ = xmppLayer_->onWriteData.connect(boost::bind(&LowLayer::writeData, newLayer, _1), boost::bsignals::at_front);
xmppReadSlotConnection_ = newLayer->onDataRead.connect(boost::bind(&XMPPLayer::parseData, xmppLayer_, _1), boost::bsignals::at_front);
layers_.push_back(newLayer);
diff --git a/Swiften/StreamStack/StreamStack.h b/Swiften/StreamStack/StreamStack.h
index bc2e89b..87c522d 100644
--- a/Swiften/StreamStack/StreamStack.h
+++ b/Swiften/StreamStack/StreamStack.h
@@ -1,5 +1,4 @@
-#ifndef SWIFTEN_STREAMSTACK_H
-#define SWIFTEN_STREAMSTACK_H
+#pragma once
#include <boost/shared_ptr.hpp>
#include <boost/signal.hpp>
@@ -15,31 +14,31 @@ namespace Swift {
class StreamStack {
public:
- StreamStack(XMPPLayer* xmppLayer, LowLayer* physicalLayer);
+ StreamStack(boost::shared_ptr<XMPPLayer> xmppLayer, boost::shared_ptr<LowLayer> physicalLayer);
+ ~StreamStack();
- void addLayer(StreamLayer*);
+ void addLayer(boost::shared_ptr<StreamLayer>);
- XMPPLayer* getXMPPLayer() const {
+ boost::shared_ptr<XMPPLayer> getXMPPLayer() const {
return xmppLayer_;
}
- template<typename T> T* getLayer() {
- foreach(StreamLayer* streamLayer, layers_) {
- T* layer = dynamic_cast<T*>(streamLayer);
+ template<typename T> boost::shared_ptr<T> getLayer() {
+ foreach(const boost::shared_ptr<StreamLayer>& streamLayer, layers_) {
+ boost::shared_ptr<T> layer = boost::dynamic_pointer_cast<T>(streamLayer);
if (layer) {
return layer;
}
}
- return 0;
+ return boost::shared_ptr<T>();
}
private:
- XMPPLayer* xmppLayer_;
- LowLayer* physicalLayer_;
- std::vector<StreamLayer*> layers_;
+ boost::shared_ptr<XMPPLayer> xmppLayer_;
+ boost::shared_ptr<LowLayer> physicalLayer_;
+ std::vector< boost::shared_ptr<StreamLayer> > layers_;
boost::bsignals::connection xmppReadSlotConnection_;
boost::bsignals::connection xmppWriteSignalConnection_;
+ std::vector< boost::bsignals::connection > writeSignalConnections_;
};
}
-
-#endif
diff --git a/Swiften/StreamStack/TLSLayerFactory.h b/Swiften/StreamStack/TLSLayerFactory.h
index b4218a5..1b0bfc1 100644
--- a/Swiften/StreamStack/TLSLayerFactory.h
+++ b/Swiften/StreamStack/TLSLayerFactory.h
@@ -1,5 +1,6 @@
-#ifndef SWIFTEN_TLSLayerFactory_H
-#define SWIFTEN_TLSLayerFactory_H
+#pragma once
+
+#include <boost/shared_ptr.hpp>
namespace Swift {
class TLSLayer;
@@ -9,8 +10,6 @@ namespace Swift {
virtual ~TLSLayerFactory();
virtual bool canCreate() const = 0;
- virtual TLSLayer* createTLSLayer() = 0;
+ virtual boost::shared_ptr<TLSLayer> createTLSLayer() = 0;
};
}
-
-#endif
diff --git a/Swiften/StreamStack/UnitTest/StreamStackTest.cpp b/Swiften/StreamStack/UnitTest/StreamStackTest.cpp
index 1f6aad7..6b97c0d 100644
--- a/Swiften/StreamStack/UnitTest/StreamStackTest.cpp
+++ b/Swiften/StreamStack/UnitTest/StreamStackTest.cpp
@@ -29,15 +29,13 @@ class StreamStackTest : public CppUnit::TestFixture
StreamStackTest() {}
void setUp() {
- physicalStream_ = new TestLowLayer();
- xmppStream_ = new XMPPLayer(&parserFactories_, &serializers_);
+ physicalStream_ = boost::shared_ptr<TestLowLayer>(new TestLowLayer());
+ xmppStream_ = boost::shared_ptr<XMPPLayer>(new XMPPLayer(&parserFactories_, &serializers_));
elementsReceived_ = 0;
dataWriteReceived_ = 0;
}
void tearDown() {
- delete physicalStream_;
- delete xmppStream_;
}
void testWriteData_NoIntermediateStreamStack() {
@@ -51,8 +49,8 @@ class StreamStackTest : public CppUnit::TestFixture
void testWriteData_OneIntermediateStream() {
StreamStack testling(xmppStream_, physicalStream_);
- std::auto_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
- testling.addLayer(xStream.get());
+ boost::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
+ testling.addLayer(xStream);
xmppStream_->writeData("foo");
@@ -62,10 +60,10 @@ class StreamStackTest : public CppUnit::TestFixture
void testWriteData_TwoIntermediateStreamStack() {
StreamStack testling(xmppStream_, physicalStream_);
- std::auto_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
- std::auto_ptr<MyStreamLayer> yStream(new MyStreamLayer("Y"));
- testling.addLayer(xStream.get());
- testling.addLayer(yStream.get());
+ boost::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
+ boost::shared_ptr<MyStreamLayer> yStream(new MyStreamLayer("Y"));
+ testling.addLayer(xStream);
+ testling.addLayer(yStream);
xmppStream_->writeData("foo");
@@ -85,8 +83,8 @@ class StreamStackTest : public CppUnit::TestFixture
void testReadData_OneIntermediateStream() {
StreamStack testling(xmppStream_, physicalStream_);
xmppStream_->onElement.connect(boost::bind(&StreamStackTest::handleElement, this, _1));
- std::auto_ptr<MyStreamLayer> xStream(new MyStreamLayer("<"));
- testling.addLayer(xStream.get());
+ boost::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("<"));
+ testling.addLayer(xStream);
physicalStream_->onDataRead(ByteArray("stream:stream xmlns:stream='http://etherx.jabber.org/streams'><presence/>"));
@@ -96,10 +94,10 @@ class StreamStackTest : public CppUnit::TestFixture
void testReadData_TwoIntermediateStreamStack() {
StreamStack testling(xmppStream_, physicalStream_);
xmppStream_->onElement.connect(boost::bind(&StreamStackTest::handleElement, this, _1));
- std::auto_ptr<MyStreamLayer> xStream(new MyStreamLayer("s"));
- std::auto_ptr<MyStreamLayer> yStream(new MyStreamLayer("<"));
- testling.addLayer(xStream.get());
- testling.addLayer(yStream.get());
+ boost::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("s"));
+ boost::shared_ptr<MyStreamLayer> yStream(new MyStreamLayer("<"));
+ testling.addLayer(xStream);
+ testling.addLayer(yStream);
physicalStream_->onDataRead(ByteArray("tream:stream xmlns:stream='http://etherx.jabber.org/streams'><presence/>"));
@@ -109,8 +107,8 @@ class StreamStackTest : public CppUnit::TestFixture
void testAddLayer_ExistingOnWriteDataSlot() {
StreamStack testling(xmppStream_, physicalStream_);
xmppStream_->onWriteData.connect(boost::bind(&StreamStackTest::handleWriteData, this, _1));
- std::auto_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
- testling.addLayer(xStream.get());
+ boost::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("X"));
+ testling.addLayer(xStream);
xmppStream_->writeData("foo");
@@ -158,8 +156,8 @@ class StreamStackTest : public CppUnit::TestFixture
private:
FullPayloadParserFactoryCollection parserFactories_;
FullPayloadSerializerCollection serializers_;
- TestLowLayer* physicalStream_;
- XMPPLayer* xmppStream_;
+ boost::shared_ptr<TestLowLayer> physicalStream_;
+ boost::shared_ptr<XMPPLayer> xmppStream_;
int elementsReceived_;
int dataWriteReceived_;
};