diff --git a/libmea-core/nymeaconnection.cpp b/libmea-core/nymeaconnection.cpp index 44353d9d..0f2fdd86 100644 --- a/libmea-core/nymeaconnection.cpp +++ b/libmea-core/nymeaconnection.cpp @@ -36,7 +36,7 @@ void NymeaConnection::connect(const QString &url) void NymeaConnection::disconnect() { - if (!m_currentInterface || !m_currentInterface->isConnected()) { + if (!m_currentInterface || m_currentInterface->connectionState() == NymeaInterface::ConnectionStateDisconnected) { qWarning() << "not connected, cannot disconnect"; return; } @@ -60,7 +60,7 @@ bool NymeaConnection::isTrusted(const QString &url) bool NymeaConnection::connected() { - return m_currentInterface && m_currentInterface->isConnected(); + return m_currentInterface && m_currentInterface->connectionState() == NymeaInterface::ConnectionStateConnected; } QString NymeaConnection::url() const diff --git a/libmea-core/nymeainterface.h b/libmea-core/nymeainterface.h index 358b4e00..1c4f3e94 100644 --- a/libmea-core/nymeainterface.h +++ b/libmea-core/nymeainterface.h @@ -29,13 +29,20 @@ class NymeaInterface : public QObject { Q_OBJECT public: + enum ConnectionState { + ConnectionStateDisconnected, + ConnectionStateConnecting, + ConnectionStateConnected + }; + Q_ENUM(ConnectionState) + explicit NymeaInterface(QObject *parent = 0); virtual QStringList supportedSchemes() const = 0; virtual void connect(const QUrl &url) = 0; virtual void disconnect() = 0; - virtual bool isConnected() const = 0; + virtual ConnectionState connectionState() const = 0; virtual void sendData(const QByteArray &data) = 0; virtual void ignoreSslErrors(const QList &errors) = 0; diff --git a/libmea-core/tcpsocketinterface.cpp b/libmea-core/tcpsocketinterface.cpp index b4ba38fc..c2727490 100644 --- a/libmea-core/tcpsocketinterface.cpp +++ b/libmea-core/tcpsocketinterface.cpp @@ -61,14 +61,28 @@ void TcpSocketInterface::connect(const QUrl &url) } } -bool TcpSocketInterface::isConnected() const +NymeaInterface::ConnectionState TcpSocketInterface::connectionState() const { - return m_socket.state() == QAbstractSocket::ConnectedState; + switch (m_socket.state()) { + case QAbstractSocket::ConnectedState: + return NymeaInterface::ConnectionStateConnected; + case QAbstractSocket::ConnectingState: + case QAbstractSocket::HostLookupState: + return NymeaInterface::ConnectionStateConnecting; + default: + return NymeaInterface::ConnectionStateDisconnected; + } } void TcpSocketInterface::disconnect() { + qDebug() << "closing socket"; m_socket.disconnectFromHost(); + m_socket.close(); + // QTcpSocket might endlessly wait for a timeout if we call connectToHost() for an IP which isn't + // reable at all (e.g. has disappeared from the network). Closing the socket is not enough, we need + // abort the exiting connection attempts too. + m_socket.abort(); } void TcpSocketInterface::socketReadyRead() diff --git a/libmea-core/tcpsocketinterface.h b/libmea-core/tcpsocketinterface.h index 5fefa4fb..4e894cc0 100644 --- a/libmea-core/tcpsocketinterface.h +++ b/libmea-core/tcpsocketinterface.h @@ -16,7 +16,7 @@ public: QStringList supportedSchemes() const override; void connect(const QUrl &url) override; - bool isConnected() const override; + ConnectionState connectionState() const override; void disconnect() override; void sendData(const QByteArray &data) override; void ignoreSslErrors(const QList &errors) override; diff --git a/libmea-core/websocketinterface.cpp b/libmea-core/websocketinterface.cpp index 063eef38..9d91041d 100644 --- a/libmea-core/websocketinterface.cpp +++ b/libmea-core/websocketinterface.cpp @@ -51,14 +51,24 @@ void WebsocketInterface::connect(const QUrl &url) m_socket->open(QUrl(url)); } -bool WebsocketInterface::isConnected() const +NymeaInterface::ConnectionState WebsocketInterface::connectionState() const { - return m_socket->state() == QAbstractSocket::ConnectedState; + switch (m_socket->state()) { + case QAbstractSocket::ConnectedState: + return NymeaInterface::ConnectionStateConnected; + case QAbstractSocket::ConnectingState: + case QAbstractSocket::HostLookupState: + return NymeaInterface::ConnectionStateConnecting; + default: + return NymeaInterface::ConnectionStateDisconnected; + } + } void WebsocketInterface::disconnect() { m_socket->close(); + m_socket->abort(); } void WebsocketInterface::sendData(const QByteArray &data) diff --git a/libmea-core/websocketinterface.h b/libmea-core/websocketinterface.h index 4b8f762d..8349a736 100644 --- a/libmea-core/websocketinterface.h +++ b/libmea-core/websocketinterface.h @@ -35,7 +35,7 @@ public: QStringList supportedSchemes() const override; void connect(const QUrl &url) override; - bool isConnected() const override; + ConnectionState connectionState() const override; void disconnect() override; void sendData(const QByteArray &data) override; void ignoreSslErrors(const QList &errors) override;