diff options
author | Tobias Markmann <tm@ayena.de> | 2018-07-31 15:42:11 (GMT) |
---|---|---|
committer | Tobias Markmann <tm@ayena.de> | 2018-07-31 15:42:11 (GMT) |
commit | 0007bbfa11e74f2a76aebc83995843ee8f6840ab (patch) | |
tree | 809fdb606a6bf37acfd800742dd0aeee72d2dbbf | |
parent | 9d88d2c7130ebccdec12abf6420843d0f5e08e8e (diff) | |
download | swift-0007bbfa11e74f2a76aebc83995843ee8f6840ab.zip swift-0007bbfa11e74f2a76aebc83995843ee8f6840ab.tar.bz2 |
Have StreamStack own intermediate layers via std::unique_ptr
Test-Information:
`./scons test=all` passes with no errors on macOS with clang
7 master.
Change-Id: I31765ac15750dc5af7b70d1a85171dc8e3590181
-rw-r--r-- | Swiften/Session/BasicSessionStream.cpp | 32 | ||||
-rw-r--r-- | Swiften/Session/BasicSessionStream.h | 5 | ||||
-rw-r--r-- | Swiften/StreamStack/StreamStack.cpp | 16 | ||||
-rw-r--r-- | Swiften/StreamStack/StreamStack.h | 12 | ||||
-rw-r--r-- | Swiften/StreamStack/UnitTest/StreamStackTest.cpp | 30 |
5 files changed, 44 insertions, 51 deletions
diff --git a/Swiften/Session/BasicSessionStream.cpp b/Swiften/Session/BasicSessionStream.cpp index 54cd225..183b986 100644 --- a/Swiften/Session/BasicSessionStream.cpp +++ b/Swiften/Session/BasicSessionStream.cpp @@ -36,5 +36,2 @@ BasicSessionStream::BasicSessionStream( timerFactory(timerFactory), - compressionLayer(nullptr), - tlsLayer(nullptr), - whitespacePingLayer(nullptr), tlsOptions_(tlsOptions) { @@ -57,10 +54,7 @@ BasicSessionStream::BasicSessionStream( BasicSessionStream::~BasicSessionStream() { - delete compressionLayer; - if (tlsLayer) { + if (auto tlsLayer = streamStack->getLayer<TLSLayer>()) { tlsLayer->onError.disconnect(boost::bind(&BasicSessionStream::handleTLSError, this, _1)); tlsLayer->onConnected.disconnect(boost::bind(&BasicSessionStream::handleTLSConnected, this)); - delete tlsLayer; } - delete whitespacePingLayer; delete streamStack; @@ -114,3 +108,3 @@ void BasicSessionStream::addTLSEncryption() { auto tlsContext = tlsContextFactory->createTLSContext(tlsOptions_); - tlsLayer = new TLSLayer(std::move(tlsContext)); + auto tlsLayer = std::make_unique<TLSLayer>(std::move(tlsContext)); if (hasTLSCertificate() && !tlsLayer->setClientCertificate(getTLSCertificate())) { @@ -119,3 +113,4 @@ void BasicSessionStream::addTLSEncryption() { else { - streamStack->addLayer(tlsLayer); + streamStack->addLayer(std::move(tlsLayer)); + auto tlsLayer = streamStack->getLayer<TLSLayer>(); tlsLayer->onError.connect(boost::bind(&BasicSessionStream::handleTLSError, this, _1)); @@ -127,3 +122,3 @@ void BasicSessionStream::addTLSEncryption() { bool BasicSessionStream::isTLSEncrypted() { - return tlsLayer; + return streamStack->getLayer<TLSLayer>() != nullptr; } @@ -131,3 +126,3 @@ bool BasicSessionStream::isTLSEncrypted() { Certificate::ref BasicSessionStream::getPeerCertificate() const { - return tlsLayer->getPeerCertificate(); + return streamStack->getLayer<TLSLayer>()->getPeerCertificate(); } @@ -135,3 +130,3 @@ Certificate::ref BasicSessionStream::getPeerCertificate() const { std::vector<Certificate::ref> BasicSessionStream::getPeerCertificateChain() const { - return tlsLayer->getPeerCertificateChain(); + return streamStack->getLayer<TLSLayer>()->getPeerCertificateChain(); } @@ -139,3 +134,3 @@ std::vector<Certificate::ref> BasicSessionStream::getPeerCertificateChain() cons std::shared_ptr<CertificateVerificationError> BasicSessionStream::getPeerCertificateVerificationError() const { - return tlsLayer->getPeerCertificateVerificationError(); + return streamStack->getLayer<TLSLayer>()->getPeerCertificateVerificationError(); } @@ -143,3 +138,3 @@ std::shared_ptr<CertificateVerificationError> BasicSessionStream::getPeerCertifi ByteArray BasicSessionStream::getTLSFinishMessage() const { - return tlsLayer->getContext()->getFinishMessage(); + return streamStack->getLayer<TLSLayer>()->getContext()->getFinishMessage(); } @@ -151,4 +146,4 @@ bool BasicSessionStream::supportsZLibCompression() { void BasicSessionStream::addZLibCompression() { - compressionLayer = new CompressionLayer(); - streamStack->addLayer(compressionLayer); + auto compressionLayer = std::make_unique<CompressionLayer>(); + streamStack->addLayer(std::move(compressionLayer)); } @@ -156,6 +151,7 @@ void BasicSessionStream::addZLibCompression() { void BasicSessionStream::setWhitespacePingEnabled(bool enabled) { + auto whitespacePingLayer = streamStack->getLayer<WhitespacePingLayer>(); if (enabled) { if (!whitespacePingLayer) { - whitespacePingLayer = new WhitespacePingLayer(timerFactory); - streamStack->addLayer(whitespacePingLayer); + streamStack->addLayer(std::make_unique<WhitespacePingLayer>(timerFactory)); + whitespacePingLayer = streamStack->getLayer<WhitespacePingLayer>(); } diff --git a/Swiften/Session/BasicSessionStream.h b/Swiften/Session/BasicSessionStream.h index 48b3d63..472b5cc 100644 --- a/Swiften/Session/BasicSessionStream.h +++ b/Swiften/Session/BasicSessionStream.h @@ -1,3 +1,3 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2018 Isode Limited. * All rights reserved. @@ -87,5 +87,2 @@ namespace Swift { ConnectionLayer* connectionLayer; - CompressionLayer* compressionLayer; - TLSLayer* tlsLayer; - WhitespacePingLayer* whitespacePingLayer; StreamStack* streamStack; diff --git a/Swiften/StreamStack/StreamStack.cpp b/Swiften/StreamStack/StreamStack.cpp index 44a018d..f14f95c 100644 --- a/Swiften/StreamStack/StreamStack.cpp +++ b/Swiften/StreamStack/StreamStack.cpp @@ -1,3 +1,3 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2018 Isode Limited. * All rights reserved. @@ -24,12 +24,12 @@ StreamStack::~StreamStack() { -void StreamStack::addLayer(StreamLayer* newLayer) { - LowLayer* lowLayer = layers_.empty() ? physicalLayer_ : *layers_.rbegin(); +void StreamStack::addLayer(std::unique_ptr<StreamLayer> streamLayer) { + LowLayer* lowLayer = layers_.empty() ? physicalLayer_ : layers_.rbegin()->get(); - xmppLayer_->setChildLayer(newLayer); - newLayer->setParentLayer(xmppLayer_); + xmppLayer_->setChildLayer(streamLayer.get()); + streamLayer->setParentLayer(xmppLayer_); - lowLayer->setParentLayer(newLayer); - newLayer->setChildLayer(lowLayer); + lowLayer->setParentLayer(streamLayer.get()); + streamLayer->setChildLayer(lowLayer); - layers_.push_back(newLayer); + layers_.emplace_back(std::move(streamLayer)); } diff --git a/Swiften/StreamStack/StreamStack.h b/Swiften/StreamStack/StreamStack.h index b12a69f..5b77085 100644 --- a/Swiften/StreamStack/StreamStack.h +++ b/Swiften/StreamStack/StreamStack.h @@ -1,3 +1,3 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2018 Isode Limited. * All rights reserved. @@ -26,3 +26,3 @@ namespace Swift { - void addLayer(StreamLayer*); + void addLayer(std::unique_ptr<StreamLayer> /* streamLayer */); @@ -32,5 +32,5 @@ namespace Swift { - template<typename T> T* getLayer() { - for (auto& i : layers_) { - T* layer = dynamic_cast<T*>(i); + template<typename T> T* getLayer() const { + for (const auto& i : layers_) { + T* layer = dynamic_cast<T*>(i.get()); if (layer) { @@ -45,3 +45,3 @@ namespace Swift { LowLayer* physicalLayer_; - std::vector<StreamLayer*> layers_; + std::vector<std::unique_ptr<StreamLayer>> layers_; }; diff --git a/Swiften/StreamStack/UnitTest/StreamStackTest.cpp b/Swiften/StreamStack/UnitTest/StreamStackTest.cpp index f0f82c9..0b520f1 100644 --- a/Swiften/StreamStack/UnitTest/StreamStackTest.cpp +++ b/Swiften/StreamStack/UnitTest/StreamStackTest.cpp @@ -1,3 +1,3 @@ /* - * Copyright (c) 2010-2016 Isode Limited. + * Copyright (c) 2010-2018 Isode Limited. * All rights reserved. @@ -63,4 +63,4 @@ class StreamStackTest : public CppUnit::TestFixture { StreamStack testling(xmppStream_, physicalStream_); - std::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("X")); - testling.addLayer(xStream.get()); + std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("X")); + testling.addLayer(std::move(xStream)); @@ -74,6 +74,6 @@ class StreamStackTest : public CppUnit::TestFixture { StreamStack testling(xmppStream_, physicalStream_); - std::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("X")); - std::shared_ptr<MyStreamLayer> yStream(new MyStreamLayer("Y")); - testling.addLayer(xStream.get()); - testling.addLayer(yStream.get()); + 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)); @@ -97,4 +97,4 @@ class StreamStackTest : public CppUnit::TestFixture { xmppStream_->onElement.connect(boost::bind(&StreamStackTest::handleElement, this, _1)); - std::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("<")); - testling.addLayer(xStream.get()); + std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("<")); + testling.addLayer(std::move(xStream)); @@ -108,6 +108,6 @@ class StreamStackTest : public CppUnit::TestFixture { xmppStream_->onElement.connect(boost::bind(&StreamStackTest::handleElement, this, _1)); - std::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("s")); - std::shared_ptr<MyStreamLayer> yStream(new MyStreamLayer("<")); - testling.addLayer(xStream.get()); - testling.addLayer(yStream.get()); + std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("s")); + std::unique_ptr<MyStreamLayer> yStream(new MyStreamLayer("<")); + testling.addLayer(std::move(xStream)); + testling.addLayer(std::move(yStream)); @@ -121,4 +121,4 @@ class StreamStackTest : public CppUnit::TestFixture { xmppStream_->onWriteData.connect(boost::bind(&StreamStackTest::handleWriteData, this, _1)); - std::shared_ptr<MyStreamLayer> xStream(new MyStreamLayer("X")); - testling.addLayer(xStream.get()); + std::unique_ptr<MyStreamLayer> xStream(new MyStreamLayer("X")); + testling.addLayer(std::move(xStream)); |