diff --git a/libnymea-app-core/connection/bluetoothtransport.cpp b/libnymea-app-core/connection/bluetoothtransport.cpp index bbb3abf6..af12a988 100644 --- a/libnymea-app-core/connection/bluetoothtransport.cpp +++ b/libnymea-app-core/connection/bluetoothtransport.cpp @@ -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"}; +} diff --git a/libnymea-app-core/connection/bluetoothtransport.h b/libnymea-app-core/connection/bluetoothtransport.h index 734b360d..6eb3ddc3 100644 --- a/libnymea-app-core/connection/bluetoothtransport.h +++ b/libnymea-app-core/connection/bluetoothtransport.h @@ -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; diff --git a/libnymea-app-core/connection/cloudtransport.cpp b/libnymea-app-core/connection/cloudtransport.cpp index 9cdd971d..e8dc0071 100644 --- a/libnymea-app-core/connection/cloudtransport.cpp +++ b/libnymea-app-core/connection/cloudtransport.cpp @@ -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 &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"}; +} + diff --git a/libnymea-app-core/connection/cloudtransport.h b/libnymea-app-core/connection/cloudtransport.h index 9fb9b0d5..2d247501 100644 --- a/libnymea-app-core/connection/cloudtransport.h +++ b/libnymea-app-core/connection/cloudtransport.h @@ -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; diff --git a/libnymea-app-core/connection/nymeaconnection.cpp b/libnymea-app-core/connection/nymeaconnection.cpp index 3421c526..3679d03e 100644 --- a/libnymea-app-core/connection/nymeaconnection.cpp +++ b/libnymea-app-core/connection/nymeaconnection.cpp @@ -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; } } diff --git a/libnymea-app-core/connection/nymeaconnection.h b/libnymea-app-core/connection/nymeaconnection.h index 13d9c253..0d3afe1a 100644 --- a/libnymea-app-core/connection/nymeaconnection.h +++ b/libnymea-app-core/connection/nymeaconnection.h @@ -8,6 +8,7 @@ #include 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 m_transports; + QHash m_transports; NymeaTransportInterface *m_currentTransport = nullptr; QUrl m_currentUrl; }; diff --git a/libnymea-app-core/connection/nymeatransportinterface.h b/libnymea-app-core/connection/nymeatransportinterface.h index 439ad68f..5ccb6aec 100644 --- a/libnymea-app-core/connection/nymeatransportinterface.h +++ b/libnymea-app-core/connection/nymeatransportinterface.h @@ -27,6 +27,17 @@ #include #include +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; diff --git a/libnymea-app-core/connection/tcpsockettransport.cpp b/libnymea-app-core/connection/tcpsockettransport.cpp index 3c20b03f..87d94151 100644 --- a/libnymea-app-core/connection/tcpsockettransport.cpp +++ b/libnymea-app-core/connection/tcpsockettransport.cpp @@ -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"}; +} diff --git a/libnymea-app-core/connection/tcpsockettransport.h b/libnymea-app-core/connection/tcpsockettransport.h index 6b1c8c02..2d2cb822 100644 --- a/libnymea-app-core/connection/tcpsockettransport.h +++ b/libnymea-app-core/connection/tcpsockettransport.h @@ -7,14 +7,19 @@ #include #include +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; diff --git a/libnymea-app-core/connection/websockettransport.cpp b/libnymea-app-core/connection/websockettransport.cpp index a640a3f2..e7ea200c 100644 --- a/libnymea-app-core/connection/websockettransport.cpp +++ b/libnymea-app-core/connection/websockettransport.cpp @@ -40,11 +40,6 @@ WebsocketTransport::WebsocketTransport(QObject *parent) : QObject::connect(m_socket, static_cast(&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"}; +} diff --git a/libnymea-app-core/connection/websockettransport.h b/libnymea-app-core/connection/websockettransport.h index 430cd23e..be2d4223 100644 --- a/libnymea-app-core/connection/websockettransport.h +++ b/libnymea-app-core/connection/websockettransport.h @@ -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; diff --git a/libnymea-app-core/engine.cpp b/libnymea-app-core/engine.cpp index d3b0f950..8c41b279 100644 --- a/libnymea-app-core/engine.cpp +++ b/libnymea-app-core/engine.cpp @@ -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);