use a new transport for every connection
This commit is contained in:
parent
1b2b7cf42f
commit
303527b75b
@ -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"};
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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"};
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
};
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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"};
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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"};
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user