diff options
-rw-r--r-- | Swiften/Session/BasicSessionStream.cpp | 15 | ||||
-rw-r--r-- | Swiften/Session/BasicSessionStream.h | 4 | ||||
-rw-r--r-- | Swiften/Session/Session.cpp | 28 | ||||
-rw-r--r-- | Swiften/Session/Session.h | 16 | ||||
-rw-r--r-- | Swiften/StreamStack/StreamStack.cpp | 12 | ||||
-rw-r--r-- | Swiften/StreamStack/StreamStack.h | 14 | ||||
-rw-r--r-- | Swiften/StreamStack/UnitTest/StreamStackTest.cpp | 29 |
7 files changed, 56 insertions, 62 deletions
diff --git a/Swiften/Session/BasicSessionStream.cpp b/Swiften/Session/BasicSessionStream.cpp index 3e65640..c44961d 100644 --- a/Swiften/Session/BasicSessionStream.cpp +++ b/Swiften/Session/BasicSessionStream.cpp @@ -37,3 +37,3 @@ BasicSessionStream::BasicSessionStream( tlsOptions_(tlsOptions) { - xmppLayer = new XMPPLayer(payloadParserFactories, payloadSerializers, xmlParserFactory, streamType); + auto xmppLayer = std::make_unique<XMPPLayer>(payloadParserFactories, payloadSerializers, xmlParserFactory, streamType); xmppLayer->onStreamStart.connect(boost::bind(&BasicSessionStream::handleStreamStartReceived, this, _1)); @@ -46,6 +46,4 @@ BasicSessionStream::BasicSessionStream( connection->onDisconnected.connect(boost::bind(&BasicSessionStream::handleConnectionFinished, this, _1)); - connectionLayer = new ConnectionLayer(connection); - - streamStack = new StreamStack(xmppLayer, connectionLayer); + streamStack = std::make_unique<StreamStack>(std::move(xmppLayer), std::unique_ptr<ConnectionLayer>(new ConnectionLayer(connection))); available = true; @@ -59,7 +57,6 @@ BasicSessionStream::~BasicSessionStream() { } - delete streamStack; connection->onDisconnected.disconnect(boost::bind(&BasicSessionStream::handleConnectionFinished, this, _1)); - delete connectionLayer; + auto xmppLayer = streamStack->getLayer<XMPPLayer>(); xmppLayer->onStreamStart.disconnect(boost::bind(&BasicSessionStream::handleStreamStartReceived, this, _1)); @@ -70,3 +67,2 @@ BasicSessionStream::~BasicSessionStream() { xmppLayer->onWriteData.disconnect(boost::bind(&BasicSessionStream::handleDataWritten, this, _1)); - delete xmppLayer; } @@ -75,2 +71,3 @@ void BasicSessionStream::writeHeader(const ProtocolHeader& header) { assert(available); + auto* xmppLayer = streamStack->getLayer<XMPPLayer>(); xmppLayer->writeHeader(header); @@ -80,2 +77,3 @@ void BasicSessionStream::writeElement(std::shared_ptr<ToplevelElement> element) assert(available); + auto* xmppLayer = streamStack->getLayer<XMPPLayer>(); xmppLayer->writeElement(element); @@ -85,2 +83,3 @@ void BasicSessionStream::writeFooter() { assert(available); + auto* xmppLayer = streamStack->getLayer<XMPPLayer>(); xmppLayer->writeFooter(); @@ -90,2 +89,3 @@ void BasicSessionStream::writeData(const std::string& data) { assert(available); + auto* xmppLayer = streamStack->getLayer<XMPPLayer>(); xmppLayer->writeData(data); @@ -164,2 +164,3 @@ void BasicSessionStream::setWhitespacePingEnabled(bool enabled) { void BasicSessionStream::resetXMPPParser() { + auto* xmppLayer = streamStack->getLayer<XMPPLayer>(); xmppLayer->resetParser(); diff --git a/Swiften/Session/BasicSessionStream.h b/Swiften/Session/BasicSessionStream.h index 472b5cc..30a7e3b 100644 --- a/Swiften/Session/BasicSessionStream.h +++ b/Swiften/Session/BasicSessionStream.h @@ -85,5 +85,3 @@ namespace Swift { TimerFactory* timerFactory; - XMPPLayer* xmppLayer; - ConnectionLayer* connectionLayer; - StreamStack* streamStack; + std::unique_ptr<StreamStack> streamStack; TLSOptions tlsOptions_; diff --git a/Swiften/Session/Session.cpp b/Swiften/Session/Session.cpp index ebdb5d1..b1525b8 100644 --- a/Swiften/Session/Session.cpp +++ b/Swiften/Session/Session.cpp @@ -1,3 +1,3 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2018 Isode Limited. * All rights reserved. @@ -24,5 +24,2 @@ Session::Session( xmlParserFactory(xmlParserFactory), - xmppLayer(nullptr), - connectionLayer(nullptr), - streamStack(nullptr), finishing(false) { @@ -31,5 +28,2 @@ Session::Session( Session::~Session() { - delete streamStack; - delete connectionLayer; - delete xmppLayer; } @@ -46,3 +40,3 @@ void Session::finishSession() { finishing = true; - if (xmppLayer) { + if (auto xmppLayer = getXMPPLayer()) { xmppLayer->writeFooter(); @@ -57,3 +51,3 @@ void Session::finishSession(const SessionError& /*error*/) { finishing = true; - if (xmppLayer) { + if (auto xmppLayer = getXMPPLayer()) { xmppLayer->writeFooter(); @@ -64,3 +58,3 @@ void Session::finishSession(const SessionError& /*error*/) { void Session::initializeStreamStack() { - xmppLayer = new XMPPLayer(payloadParserFactories, payloadSerializers, xmlParserFactory, ClientStreamType); + auto xmppLayer = std::unique_ptr<XMPPLayer>(new XMPPLayer(payloadParserFactories, payloadSerializers, xmlParserFactory, ClientStreamType)); xmppLayer->onStreamStart.connect( @@ -74,8 +68,16 @@ void Session::initializeStreamStack() { boost::bind(&Session::handleDisconnected, this, _1)); - connectionLayer = new ConnectionLayer(connection); - streamStack = new StreamStack(xmppLayer, connectionLayer); + streamStack = std::unique_ptr<StreamStack>(new StreamStack(std::move(xmppLayer), std::unique_ptr<ConnectionLayer>(new ConnectionLayer(connection)))); } +XMPPLayer* Session::getXMPPLayer() const { + return dynamic_cast<XMPPLayer*>(streamStack->getTopLayer()); +} + +StreamStack* Session::getStreamStack() const { + return streamStack.get(); +} + + void Session::sendElement(std::shared_ptr<ToplevelElement> stanza) { - xmppLayer->writeElement(stanza); + getXMPPLayer()->writeElement(stanza); } diff --git a/Swiften/Session/Session.h b/Swiften/Session/Session.h index 04153ec..e6a0d53 100644 --- a/Swiften/Session/Session.h +++ b/Swiften/Session/Session.h @@ -1,3 +1,3 @@ /* - * Copyright (c) 2010-2017 Isode Limited. + * Copyright (c) 2010-2018 Isode Limited. * All rights reserved. @@ -87,9 +87,4 @@ namespace Swift { - XMPPLayer* getXMPPLayer() const { - return xmppLayer; - } - - StreamStack* getStreamStack() const { - return streamStack; - } + XMPPLayer* getXMPPLayer() const; + StreamStack* getStreamStack() const; @@ -107,5 +102,4 @@ namespace Swift { XMLParserFactory* xmlParserFactory; - XMPPLayer* xmppLayer; - ConnectionLayer* connectionLayer; - StreamStack* streamStack; + + std::unique_ptr<StreamStack> streamStack; bool finishing; diff --git a/Swiften/StreamStack/StreamStack.cpp b/Swiften/StreamStack/StreamStack.cpp index 75fb1ce..cf80fb1 100644 --- a/Swiften/StreamStack/StreamStack.cpp +++ b/Swiften/StreamStack/StreamStack.cpp @@ -10,5 +10,5 @@ +#include <Swiften/StreamStack/HighLayer.h> #include <Swiften/StreamStack/LowLayer.h> #include <Swiften/StreamStack/StreamLayer.h> -#include <Swiften/StreamStack/HighLayer.h> @@ -16,5 +16,5 @@ namespace Swift { -StreamStack::StreamStack(HighLayer* topLayer, LowLayer* bottomLayer) : topLayer_(topLayer), bottomLayer_(bottomLayer) { - bottomLayer_->setParentLayer(topLayer_); - topLayer_->setChildLayer(bottomLayer_); +StreamStack::StreamStack(std::unique_ptr<HighLayer> topLayer, std::unique_ptr<LowLayer> bottomLayer) : topLayer_(std::move(topLayer)), bottomLayer_(std::move(bottomLayer)) { + bottomLayer_->setParentLayer(topLayer_.get()); + topLayer_->setChildLayer(bottomLayer_.get()); } @@ -25,6 +25,6 @@ StreamStack::~StreamStack() { void StreamStack::addLayer(std::unique_ptr<StreamLayer> streamLayer) { - LowLayer* lowLayer = layers_.empty() ? bottomLayer_ : layers_.rbegin()->get(); + auto* lowLayer = layers_.empty() ? bottomLayer_.get() : layers_.rbegin()->get(); topLayer_->setChildLayer(streamLayer.get()); - streamLayer->setParentLayer(topLayer_); + streamLayer->setParentLayer(topLayer_.get()); diff --git a/Swiften/StreamStack/StreamStack.h b/Swiften/StreamStack/StreamStack.h index bd95811..263b1f5 100644 --- a/Swiften/StreamStack/StreamStack.h +++ b/Swiften/StreamStack/StreamStack.h @@ -23,3 +23,3 @@ namespace Swift { public: - StreamStack(HighLayer* topLayer, LowLayer* bottomLayer); + StreamStack(std::unique_ptr<HighLayer> topLayer, std::unique_ptr<LowLayer> bottomLayer); ~StreamStack(); @@ -29,3 +29,3 @@ namespace Swift { HighLayer* getTopLayer() const { - return topLayer_; + return topLayer_.get(); } @@ -39,2 +39,8 @@ namespace Swift { } + if (T* layer = dynamic_cast<T*>(topLayer_.get())) { + return layer; + } + if (T* layer = dynamic_cast<T*>(bottomLayer_.get())) { + return layer; + } return nullptr; @@ -43,4 +49,4 @@ namespace Swift { private: - HighLayer* topLayer_; - LowLayer* bottomLayer_; + std::unique_ptr<HighLayer> topLayer_; + std::unique_ptr<LowLayer> bottomLayer_; std::vector<std::unique_ptr<StreamLayer>> layers_; diff --git a/Swiften/StreamStack/UnitTest/StreamStackTest.cpp b/Swiften/StreamStack/UnitTest/StreamStackTest.cpp index 0b520f1..b074736 100644 --- a/Swiften/StreamStack/UnitTest/StreamStackTest.cpp +++ b/Swiften/StreamStack/UnitTest/StreamStackTest.cpp @@ -41,4 +41,5 @@ class StreamStackTest : public CppUnit::TestFixture { void setUp() { - physicalStream_ = new TestLowLayer(); - xmppStream_ = new XMPPLayer(&parserFactories_, &serializers_, &xmlParserFactory_, ClientStreamType); + testling_ = std::make_unique<StreamStack>(std::make_unique<XMPPLayer>(&parserFactories_, &serializers_, &xmlParserFactory_, ClientStreamType), std::make_unique<TestLowLayer>()); + physicalStream_ = testling_->getLayer<TestLowLayer>(); + xmppStream_ = testling_->getLayer<XMPPLayer>(); elementsReceived_ = 0; @@ -48,4 +49,2 @@ class StreamStackTest : public CppUnit::TestFixture { void tearDown() { - delete physicalStream_; - delete xmppStream_; } @@ -53,3 +52,2 @@ class StreamStackTest : public CppUnit::TestFixture { void testWriteData_NoIntermediateStreamStack() { - StreamStack testling(xmppStream_, physicalStream_); @@ -62,5 +60,4 @@ class StreamStackTest : public CppUnit::TestFixture { void testWriteData_OneIntermediateStream() { - StreamStack testling(xmppStream_, physicalStream_); std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("X")); - testling.addLayer(std::move(xStream)); + testling_->addLayer(std::move(xStream)); @@ -73,7 +70,6 @@ class StreamStackTest : public CppUnit::TestFixture { void testWriteData_TwoIntermediateStreamStack() { - StreamStack testling(xmppStream_, physicalStream_); std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("X")); std::unique_ptr<MyStreamLayer> yStream(new MyStreamLayer("Y")); - testling.addLayer(std::move(xStream)); - testling.addLayer(std::move(yStream)); + testling_->addLayer(std::move(xStream)); + testling_->addLayer(std::move(yStream)); @@ -86,3 +82,2 @@ class StreamStackTest : public CppUnit::TestFixture { void testReadData_NoIntermediateStreamStack() { - StreamStack testling(xmppStream_, physicalStream_); xmppStream_->onElement.connect(boost::bind(&StreamStackTest::handleElement, this, _1)); @@ -95,6 +90,5 @@ class StreamStackTest : public CppUnit::TestFixture { void testReadData_OneIntermediateStream() { - StreamStack testling(xmppStream_, physicalStream_); xmppStream_->onElement.connect(boost::bind(&StreamStackTest::handleElement, this, _1)); std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("<")); - testling.addLayer(std::move(xStream)); + testling_->addLayer(std::move(xStream)); @@ -106,3 +100,2 @@ class StreamStackTest : public CppUnit::TestFixture { void testReadData_TwoIntermediateStreamStack() { - StreamStack testling(xmppStream_, physicalStream_); xmppStream_->onElement.connect(boost::bind(&StreamStackTest::handleElement, this, _1)); @@ -110,4 +103,4 @@ class StreamStackTest : public CppUnit::TestFixture { std::unique_ptr<MyStreamLayer> yStream(new MyStreamLayer("<")); - testling.addLayer(std::move(xStream)); - testling.addLayer(std::move(yStream)); + testling_->addLayer(std::move(xStream)); + testling_->addLayer(std::move(yStream)); @@ -119,6 +112,5 @@ class StreamStackTest : public CppUnit::TestFixture { void testAddLayer_ExistingOnWriteDataSlot() { - StreamStack testling(xmppStream_, physicalStream_); xmppStream_->onWriteData.connect(boost::bind(&StreamStackTest::handleWriteData, this, _1)); std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("X")); - testling.addLayer(std::move(xStream)); + testling_->addLayer(std::move(xStream)); @@ -178,2 +170,3 @@ class StreamStackTest : public CppUnit::TestFixture { XMPPLayer* xmppStream_; + std::unique_ptr<StreamStack> testling_; int elementsReceived_; |