abort connection attempts opn disconnect too

This commit is contained in:
Michael Zanetti 2018-06-18 12:32:28 +02:00
parent 8152fdf944
commit 23800e9f97
6 changed files with 40 additions and 9 deletions

View File

@ -36,7 +36,7 @@ void NymeaConnection::connect(const QString &url)
void NymeaConnection::disconnect() void NymeaConnection::disconnect()
{ {
if (!m_currentInterface || !m_currentInterface->isConnected()) { if (!m_currentInterface || m_currentInterface->connectionState() == NymeaInterface::ConnectionStateDisconnected) {
qWarning() << "not connected, cannot disconnect"; qWarning() << "not connected, cannot disconnect";
return; return;
} }
@ -60,7 +60,7 @@ bool NymeaConnection::isTrusted(const QString &url)
bool NymeaConnection::connected() bool NymeaConnection::connected()
{ {
return m_currentInterface && m_currentInterface->isConnected(); return m_currentInterface && m_currentInterface->connectionState() == NymeaInterface::ConnectionStateConnected;
} }
QString NymeaConnection::url() const QString NymeaConnection::url() const

View File

@ -29,13 +29,20 @@ class NymeaInterface : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
enum ConnectionState {
ConnectionStateDisconnected,
ConnectionStateConnecting,
ConnectionStateConnected
};
Q_ENUM(ConnectionState)
explicit NymeaInterface(QObject *parent = 0); explicit NymeaInterface(QObject *parent = 0);
virtual QStringList supportedSchemes() const = 0; virtual QStringList supportedSchemes() const = 0;
virtual void connect(const QUrl &url) = 0; virtual void connect(const QUrl &url) = 0;
virtual void disconnect() = 0; virtual void disconnect() = 0;
virtual bool isConnected() const = 0; virtual ConnectionState connectionState() const = 0;
virtual void sendData(const QByteArray &data) = 0; virtual void sendData(const QByteArray &data) = 0;
virtual void ignoreSslErrors(const QList<QSslError> &errors) = 0; virtual void ignoreSslErrors(const QList<QSslError> &errors) = 0;

View File

@ -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() void TcpSocketInterface::disconnect()
{ {
qDebug() << "closing socket";
m_socket.disconnectFromHost(); 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() void TcpSocketInterface::socketReadyRead()

View File

@ -16,7 +16,7 @@ public:
QStringList supportedSchemes() const override; QStringList supportedSchemes() const override;
void connect(const QUrl &url) override; void connect(const QUrl &url) override;
bool isConnected() const override; ConnectionState connectionState() const override;
void disconnect() override; void disconnect() override;
void sendData(const QByteArray &data) override; void sendData(const QByteArray &data) override;
void ignoreSslErrors(const QList<QSslError> &errors) override; void ignoreSslErrors(const QList<QSslError> &errors) override;

View File

@ -51,14 +51,24 @@ void WebsocketInterface::connect(const QUrl &url)
m_socket->open(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() void WebsocketInterface::disconnect()
{ {
m_socket->close(); m_socket->close();
m_socket->abort();
} }
void WebsocketInterface::sendData(const QByteArray &data) void WebsocketInterface::sendData(const QByteArray &data)

View File

@ -35,7 +35,7 @@ public:
QStringList supportedSchemes() const override; QStringList supportedSchemes() const override;
void connect(const QUrl &url) override; void connect(const QUrl &url) override;
bool isConnected() const override; ConnectionState connectionState() const override;
void disconnect() override; void disconnect() override;
void sendData(const QByteArray &data) override; void sendData(const QByteArray &data) override;
void ignoreSslErrors(const QList<QSslError> &errors) override; void ignoreSslErrors(const QList<QSslError> &errors) override;