diff options
author | Kevin Smith <git@kismith.co.uk> | 2011-11-12 16:56:21 (GMT) |
---|---|---|
committer | Kevin Smith <git@kismith.co.uk> | 2011-12-13 08:17:58 (GMT) |
commit | 81c09a0f6a3e87b078340d7f35d0dea4c03f3a6d (patch) | |
tree | 4371c5808ee26b2b5ed79ace9ccb439ff2988945 /Swiften/Network/TLSConnection.cpp | |
parent | fd17fe0d239f97cedebe4ceffa234155bd299b68 (diff) | |
download | swift-contrib-81c09a0f6a3e87b078340d7f35d0dea4c03f3a6d.zip swift-contrib-81c09a0f6a3e87b078340d7f35d0dea4c03f3a6d.tar.bz2 |
BOSH Support for Swiften
This adds support for BOSH to Swiften. It does not expose it to Swift.
Release-Notes: Swiften now allows connects over BOSH, if used appropriately.
Diffstat (limited to 'Swiften/Network/TLSConnection.cpp')
-rw-r--r-- | Swiften/Network/TLSConnection.cpp | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/Swiften/Network/TLSConnection.cpp b/Swiften/Network/TLSConnection.cpp new file mode 100644 index 0000000..543ee1e --- /dev/null +++ b/Swiften/Network/TLSConnection.cpp @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2011 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include <Swiften/Network/TLSConnection.h> + +#include <boost/bind.hpp> + +#include <Swiften/Network/HostAddressPort.h> +#include <Swiften/TLS/TLSContext.h> +#include <Swiften/TLS/TLSContextFactory.h> + +namespace Swift { + +TLSConnection::TLSConnection(Connection::ref connection, TLSContextFactory* tlsFactory) : connection(connection) { + context = tlsFactory->createTLSContext(); + context->onDataForNetwork.connect(boost::bind(&TLSConnection::handleTLSDataForNetwork, this, _1)); + context->onDataForApplication.connect(boost::bind(&TLSConnection::handleTLSDataForApplication, this, _1)); + context->onConnected.connect(boost::bind(&TLSConnection::handleTLSConnectFinished, this, false)); + context->onError.connect(boost::bind(&TLSConnection::handleTLSConnectFinished, this, true)); + + connection->onConnectFinished.connect(boost::bind(&TLSConnection::handleRawConnectFinished, this, _1)); + connection->onDataRead.connect(boost::bind(&TLSConnection::handleRawDataRead, this, _1)); + connection->onDataWritten.connect(boost::bind(&TLSConnection::handleRawDataWritten, this)); + connection->onDisconnected.connect(boost::bind(&TLSConnection::handleRawDisconnected, this, _1)); +} + +TLSConnection::~TLSConnection() { + connection->onConnectFinished.disconnect(boost::bind(&TLSConnection::handleRawConnectFinished, this, _1)); + connection->onDataRead.disconnect(boost::bind(&TLSConnection::handleRawDataRead, this, _1)); + connection->onDataWritten.disconnect(boost::bind(&TLSConnection::handleRawDataWritten, this)); + connection->onDisconnected.disconnect(boost::bind(&TLSConnection::handleRawDisconnected, this, _1)); + delete context; +} + +void TLSConnection::handleTLSConnectFinished(bool error) { + onConnectFinished(error); + if (error) { + disconnect(); + } +} + +void TLSConnection::handleTLSDataForNetwork(const SafeByteArray& data) { + connection->write(data); +} + +void TLSConnection::handleTLSDataForApplication(const SafeByteArray& data) { + onDataRead(boost::make_shared<SafeByteArray>(data)); +} + +void TLSConnection::connect(const HostAddressPort& address) { + connection->connect(address); +} + +void TLSConnection::disconnect() { + connection->disconnect(); +} + +void TLSConnection::write(const SafeByteArray& data) { + context->handleDataFromApplication(data); +} + +HostAddressPort TLSConnection::getLocalAddress() const { + return connection->getLocalAddress(); +} + +void TLSConnection::handleRawConnectFinished(bool error) { + connection->onConnectFinished.disconnect(boost::bind(&TLSConnection::handleRawConnectFinished, this, _1)); + if (error) { + onConnectFinished(true); + } + else { + context->connect(); + } +} + +void TLSConnection::handleRawDisconnected(const boost::optional<Error>& error) { + onDisconnected(error); +} + +void TLSConnection::handleRawDataRead(boost::shared_ptr<SafeByteArray> data) { + context->handleDataFromNetwork(*data); +} + +void TLSConnection::handleRawDataWritten() { + onDataWritten(); +} + +} |