use a new transport for every connection

This commit is contained in:
Michael Zanetti 2018-09-02 22:41:48 +02:00
parent 1b2b7cf42f
commit 303527b75b
12 changed files with 111 additions and 49 deletions

View File

@ -37,11 +37,6 @@ BluetoothTransport::BluetoothTransport(QObject *parent) :
QObject::connect(m_socket, &QBluetoothSocket::stateChanged, this, &BluetoothTransport::onDataReady);
}
QStringList BluetoothTransport::supportedSchemes() const
{
return {"rfcom"};
}
bool BluetoothTransport::connect(const QUrl &url)
{
if (url.scheme() != "rfcom") {
@ -116,3 +111,14 @@ void BluetoothTransport::onDataReady()
qDebug() << "BluetoothInterface: recived data:" << qUtf8Printable(data);
emit dataReady(data);
}
NymeaTransportInterface *BluetoothTransportFactoy::createTransport(QObject *parent) const
{
return new BluetoothTransport(parent);
}
QStringList BluetoothTransportFactoy::supportedSchemes() const
{
return {"rfcom"};
}

View File

@ -28,14 +28,19 @@
#include "nymeatransportinterface.h"
class BluetoothTransportFactoy: public NymeaTransportInterfaceFactory
{
public:
NymeaTransportInterface* createTransport(QObject *parent = nullptr) const override;
QStringList supportedSchemes() const override;
};
class BluetoothTransport: public NymeaTransportInterface
{
Q_OBJECT
public:
explicit BluetoothTransport(QObject *parent = nullptr);
QStringList supportedSchemes() const override;
bool connect(const QUrl &url) override;
void disconnect() override;
ConnectionState connectionState() const override;

View File

@ -41,11 +41,6 @@ CloudTransport::CloudTransport(AWSClient *awsClient, QObject *parent):
QObject::connect(m_remoteproxyConnection, &RemoteProxyConnection::sslErrors, this, &CloudTransport::sslErrors);
}
QStringList CloudTransport::supportedSchemes() const
{
return {"cloud"};
}
bool CloudTransport::connect(const QUrl &url)
{
if (!m_awsClient->isLoggedIn()) {
@ -109,3 +104,20 @@ void CloudTransport::ignoreSslErrors(const QList<QSslError> &errors)
qDebug() << "Ignoring SSL errors" << errors;
m_remoteproxyConnection->ignoreSslErrors(errors);
}
CloudTransportFactory::CloudTransportFactory(AWSClient *awsClient):
m_awsClient(awsClient)
{
}
NymeaTransportInterface *CloudTransportFactory::createTransport(QObject *parent) const
{
return new CloudTransport(m_awsClient, parent);
}
QStringList CloudTransportFactory::supportedSchemes() const
{
return {"cloud"};
}

View File

@ -10,14 +10,22 @@ namespace remoteproxyclient {
class RemoteProxyConnection;
}
class CloudTransportFactory: public NymeaTransportInterfaceFactory
{
public:
CloudTransportFactory(AWSClient *awsClient);
NymeaTransportInterface* createTransport(QObject *parent = nullptr) const override;
QStringList supportedSchemes() const override;
private:
AWSClient *m_awsClient = nullptr;
};
class CloudTransport : public NymeaTransportInterface
{
Q_OBJECT
public:
explicit CloudTransport(AWSClient *awsClient, QObject *parent = nullptr);
QStringList supportedSchemes() const override;
bool connect(const QUrl &url) override;
void disconnect() override;
ConnectionState connectionState() const override;

View File

@ -21,11 +21,19 @@ bool NymeaConnection::connect(const QString &url)
}
m_currentUrl = QUrl(url);
m_currentTransport = m_transports.value(m_currentUrl.scheme());
if (!m_currentTransport) {
if (!m_transports.contains(m_currentUrl.scheme())) {
qWarning() << "Cannot connect to urls of scheme" << m_currentUrl.scheme() << "Supported schemes are" << m_transports.keys();
return false;
}
m_currentTransport = m_transports.value(m_currentUrl.scheme())->createTransport();
QObject::connect(m_currentTransport, &NymeaTransportInterface::sslErrors, this, &NymeaConnection::onSslErrors);
QObject::connect(m_currentTransport, &NymeaTransportInterface::error, this, &NymeaConnection::onError);
QObject::connect(m_currentTransport, &NymeaTransportInterface::connected, this, &NymeaConnection::onConnected);
QObject::connect(m_currentTransport, &NymeaTransportInterface::disconnected, this, &NymeaConnection::onDisconnected);
// signal forwarding
QObject::connect(m_currentTransport, &NymeaTransportInterface::dataReady, this, &NymeaConnection::dataAvailable);
qDebug() << "Should connect to url" << m_currentUrl;
return m_currentTransport->connect(m_currentUrl);
@ -156,22 +164,15 @@ void NymeaConnection::onDisconnected()
qWarning() << "NymeaConnection: An inactive transport is emitting signals... ignoring.";
return;
}
m_currentTransport->deleteLater();
m_currentTransport = nullptr;
qDebug() << "NymeaConnection: disconnected.";
emit connectedChanged(false);
}
void NymeaConnection::registerTransport(NymeaTransportInterface *transport)
void NymeaConnection::registerTransport(NymeaTransportInterfaceFactory *transportFactory)
{
QObject::connect(transport, &NymeaTransportInterface::sslErrors, this, &NymeaConnection::onSslErrors);
QObject::connect(transport, &NymeaTransportInterface::error, this, &NymeaConnection::onError);
QObject::connect(transport, &NymeaTransportInterface::connected, this, &NymeaConnection::onConnected);
QObject::connect(transport, &NymeaTransportInterface::disconnected, this, &NymeaConnection::onDisconnected);
// signal forwarding
QObject::connect(transport, &NymeaTransportInterface::dataReady, this, &NymeaConnection::dataAvailable);
foreach (const QString &scheme, transport->supportedSchemes()) {
m_transports[scheme] = transport;
foreach (const QString &scheme, transportFactory->supportedSchemes()) {
m_transports[scheme] = transportFactory;
}
}

View File

@ -8,6 +8,7 @@
#include <QUrl>
class NymeaTransportInterface;
class NymeaTransportInterfaceFactory;
class NymeaConnection : public QObject
{
@ -20,7 +21,7 @@ class NymeaConnection : public QObject
public:
explicit NymeaConnection(QObject *parent = nullptr);
void registerTransport(NymeaTransportInterface *transport);
void registerTransport(NymeaTransportInterfaceFactory *transportFactory);
Q_INVOKABLE bool connect(const QString &url);
Q_INVOKABLE void disconnect();
@ -50,7 +51,7 @@ private slots:
private:
private:
QHash<QString, NymeaTransportInterface*> m_transports;
QHash<QString, NymeaTransportInterfaceFactory*> m_transports;
NymeaTransportInterface *m_currentTransport = nullptr;
QUrl m_currentUrl;
};

View File

@ -27,6 +27,17 @@
#include <QSslCertificate>
#include <QHostAddress>
class NymeaTransportInterface;
class NymeaTransportInterfaceFactory
{
public:
virtual ~NymeaTransportInterfaceFactory() = default;
virtual NymeaTransportInterface* createTransport(QObject* parent = nullptr) const = 0;
virtual QStringList supportedSchemes() const = 0;
};
class NymeaTransportInterface : public QObject
{
Q_OBJECT
@ -41,8 +52,6 @@ public:
explicit NymeaTransportInterface(QObject *parent = nullptr);
virtual ~NymeaTransportInterface() = default;
virtual QStringList supportedSchemes() const = 0;
virtual bool connect(const QUrl &url) = 0;
virtual void disconnect() = 0;
virtual ConnectionState connectionState() const = 0;

View File

@ -16,11 +16,6 @@ TcpSocketTransport::TcpSocketTransport(QObject *parent) : NymeaTransportInterfac
}
QStringList TcpSocketTransport::supportedSchemes() const
{
return {"nymea", "nymeas"};
}
void TcpSocketTransport::sendData(const QByteArray &data)
{
qint64 ret = m_socket.write(data);
@ -97,3 +92,13 @@ void TcpSocketTransport::onSocketStateChanged(const QAbstractSocket::SocketState
{
qDebug() << "Socket state changed -->" << state;
}
NymeaTransportInterface *TcpSocketTransportFactory::createTransport(QObject *parent) const
{
return new TcpSocketTransport(parent);
}
QStringList TcpSocketTransportFactory::supportedSchemes() const
{
return {"nymea", "nymeas"};
}

View File

@ -7,14 +7,19 @@
#include <QSslSocket>
#include <QUrl>
class TcpSocketTransportFactory: public NymeaTransportInterfaceFactory
{
public:
NymeaTransportInterface* createTransport(QObject *parent = nullptr) const override;
QStringList supportedSchemes() const override;
};
class TcpSocketTransport: public NymeaTransportInterface
{
Q_OBJECT
public:
explicit TcpSocketTransport(QObject *parent = nullptr);
QStringList supportedSchemes() const override;
bool connect(const QUrl &url) override;
ConnectionState connectionState() const override;
void disconnect() override;

View File

@ -40,11 +40,6 @@ WebsocketTransport::WebsocketTransport(QObject *parent) :
QObject::connect(m_socket, static_cast<sslErrorsSignal>(&QWebSocket::sslErrors),this, &WebsocketTransport::sslErrors);
}
QStringList WebsocketTransport::supportedSchemes() const
{
return {"ws", "wss"};
}
bool WebsocketTransport::connect(const QUrl &url)
{
m_socket->open(QUrl(url));
@ -85,3 +80,13 @@ void WebsocketTransport::onTextMessageReceived(const QString &data)
{
emit dataReady(data.toUtf8());
}
NymeaTransportInterface *WebsocketTransportFactory::createTransport(QObject *parent) const
{
return new WebsocketTransport(parent);
}
QStringList WebsocketTransportFactory::supportedSchemes() const
{
return {"ws", "wss"};
}

View File

@ -26,14 +26,19 @@
#include "nymeatransportinterface.h"
class WebsocketTransportFactory: public NymeaTransportInterfaceFactory
{
public:
NymeaTransportInterface* createTransport(QObject *parent = nullptr) const override;
QStringList supportedSchemes() const override;
};
class WebsocketTransport: public NymeaTransportInterface
{
Q_OBJECT
public:
explicit WebsocketTransport(QObject *parent = nullptr);
QStringList supportedSchemes() const override;
bool connect(const QUrl &url) override;
ConnectionState connectionState() const override;
void disconnect() override;

View File

@ -114,10 +114,10 @@ Engine::Engine(QObject *parent) :
m_bluetoothDiscovery(new BluetoothDiscovery(this)),
m_aws(new AWSClient(this))
{
m_connection->registerTransport(new TcpSocketTransport(this));
m_connection->registerTransport(new WebsocketTransport(this));
m_connection->registerTransport(new BluetoothTransport(this));
m_connection->registerTransport(new CloudTransport(m_aws, this));
m_connection->registerTransport(new TcpSocketTransportFactory());
m_connection->registerTransport(new WebsocketTransportFactory());
m_connection->registerTransport(new BluetoothTransportFactoy());
m_connection->registerTransport(new CloudTransportFactory(m_aws));
connect(m_jsonRpcClient, &JsonRpcClient::connectedChanged, this, &Engine::onConnectedChanged);
connect(m_jsonRpcClient, &JsonRpcClient::authenticationRequiredChanged, this, &Engine::onConnectedChanged);