diff --git a/libnymea-remoteproxy/server/jsonrpcserver.cpp b/libnymea-remoteproxy/server/jsonrpcserver.cpp index 9157d0a..074f3cb 100644 --- a/libnymea-remoteproxy/server/jsonrpcserver.cpp +++ b/libnymea-remoteproxy/server/jsonrpcserver.cpp @@ -301,7 +301,13 @@ void JsonRpcServer::asyncReplyFinished() if (!reply->success()) { // Disconnect this client since the request was not successfully - transportClient->interface()->killClientConnection(transportClient->clientId(), "API call was not successfully."); + transportClient->killConnectionAfterResponse("API call was not successfully."); + } + + + // If the server decided to kill the connection after the response, do it now + if (transportClient->killConnectionRequested()) { + transportClient->killConnection(transportClient->killConnectionReason()); } } else { diff --git a/libnymea-remoteproxy/tunnelproxy/tunnelproxyclientconnection.cpp b/libnymea-remoteproxy/tunnelproxy/tunnelproxyclientconnection.cpp index 21c529c..c39a5f5 100644 --- a/libnymea-remoteproxy/tunnelproxy/tunnelproxyclientconnection.cpp +++ b/libnymea-remoteproxy/tunnelproxy/tunnelproxyclientconnection.cpp @@ -27,16 +27,15 @@ #include "tunnelproxyclientconnection.h" #include "server/transportclient.h" +#include "tunnelproxy/tunnelproxyserverconnection.h" namespace remoteproxy { -TunnelProxyClientConnection::TunnelProxyClientConnection(TransportClient *transportClient, TunnelProxyServerConnection *serverConnection, const QUuid &clientUuid, const QString &clientName, const QUuid &serverUuid, QObject *parent) : +TunnelProxyClientConnection::TunnelProxyClientConnection(TransportClient *transportClient, const QUuid &clientUuid, const QString &clientName, QObject *parent) : QObject(parent), m_transportClient(transportClient), - m_serverConnection(serverConnection), m_clientUuid(clientUuid), - m_clientName(clientName), - m_serverUuid(serverUuid) + m_clientName(clientName) { } @@ -51,6 +50,17 @@ TunnelProxyServerConnection *TunnelProxyClientConnection::serverConnection() con return m_serverConnection; } +void TunnelProxyClientConnection::setServerConnection(TunnelProxyServerConnection *serverConnection) +{ + m_serverConnection = serverConnection; + if (m_serverConnection) { + m_serverUuid = m_serverConnection->serverUuid(); + } else { + m_serverUuid = QUuid(); + } + +} + QUuid TunnelProxyClientConnection::clientUuid() const { return m_clientUuid; diff --git a/libnymea-remoteproxy/tunnelproxy/tunnelproxyclientconnection.h b/libnymea-remoteproxy/tunnelproxy/tunnelproxyclientconnection.h index b1414a0..f124c0e 100644 --- a/libnymea-remoteproxy/tunnelproxy/tunnelproxyclientconnection.h +++ b/libnymea-remoteproxy/tunnelproxy/tunnelproxyclientconnection.h @@ -41,11 +41,12 @@ class TunnelProxyClientConnection : public QObject { Q_OBJECT public: - explicit TunnelProxyClientConnection(TransportClient *transportClient, TunnelProxyServerConnection *serverConnection, const QUuid &clientUuid, const QString &clientName, const QUuid &serverUuid, QObject *parent = nullptr); + explicit TunnelProxyClientConnection(TransportClient *transportClient, const QUuid &clientUuid, const QString &clientName, QObject *parent = nullptr); TransportClient *transportClient() const; TunnelProxyServerConnection *serverConnection() const; + void setServerConnection(TunnelProxyServerConnection *serverConnection); QUuid clientUuid() const; QString clientName() const; diff --git a/libnymea-remoteproxy/tunnelproxy/tunnelproxyserver.cpp b/libnymea-remoteproxy/tunnelproxy/tunnelproxyserver.cpp index dedef2f..6b81061 100644 --- a/libnymea-remoteproxy/tunnelproxy/tunnelproxyserver.cpp +++ b/libnymea-remoteproxy/tunnelproxy/tunnelproxyserver.cpp @@ -153,7 +153,8 @@ TunnelProxyServer::TunnelProxyError TunnelProxyServer::registerClient(const QUui tunnelProxyClient->setUuid(clientUuid); tunnelProxyClient->setName(clientName); - TunnelProxyClientConnection *clientConnection = new TunnelProxyClientConnection(tunnelProxyClient, serverConnection, clientUuid, clientName, serverUuid); + TunnelProxyClientConnection *clientConnection = new TunnelProxyClientConnection(tunnelProxyClient, clientUuid, clientName, this); + clientConnection->setServerConnection(serverConnection); m_tunnelProxyClientConnections.insert(clientUuid, clientConnection); qCDebug(dcTunnelProxyServer()) << "Register client" << clientConnection << "-->" << serverConnection; @@ -303,7 +304,6 @@ void TunnelProxyServer::onClientDisconnected(const QUuid &clientId) if (!serverConnection) { qCWarning(dcTunnelProxyServer()) << "Could not find server connection for disconnected tunnel proxy client claiming to be a server."; } else { - foreach (TunnelProxyClientConnection *clientConnection, serverConnection->clientConnections()) { serverConnection->unregisterClientConnection(clientConnection); clientConnection->setSocketAddress(0xFFFF); @@ -319,11 +319,12 @@ void TunnelProxyServer::onClientDisconnected(const QUuid &clientId) if (!clientConnection) { qCWarning(dcTunnelProxyServer()) << "Could not find client connection for disconnected tunnel proxy client claiming to be a client."; } else { - if (clientConnection->serverConnection()) { + TunnelProxyServerConnection *serverConnection = clientConnection->serverConnection(); + if (serverConnection) { QVariantMap params; params.insert("socketAddress", clientConnection->socketAddress()); - clientConnection->serverConnection()->unregisterClientConnection(clientConnection); - m_jsonRpcServer->sendNotification("TunnelProxy", "ClientDisconnected", params, clientConnection->serverConnection()->transportClient()); + serverConnection->unregisterClientConnection(clientConnection); + m_jsonRpcServer->sendNotification("TunnelProxy", "ClientDisconnected", params, serverConnection->transportClient()); } clientConnection->deleteLater(); diff --git a/libnymea-remoteproxy/tunnelproxy/tunnelproxyserverconnection.cpp b/libnymea-remoteproxy/tunnelproxy/tunnelproxyserverconnection.cpp index f9addae..7d91ec4 100644 --- a/libnymea-remoteproxy/tunnelproxy/tunnelproxyserverconnection.cpp +++ b/libnymea-remoteproxy/tunnelproxy/tunnelproxyserverconnection.cpp @@ -62,16 +62,18 @@ QList TunnelProxyServerConnection::clientConnecti void TunnelProxyServerConnection::registerClientConnection(TunnelProxyClientConnection *clientConnection) { - m_clientConnections.insert(clientConnection->clientUuid(), clientConnection); quint16 socketAddress = getFreeAddress(); clientConnection->setSocketAddress(socketAddress); m_clientConnectionsAddresses.insert(socketAddress, clientConnection); + m_clientConnections.insert(clientConnection->clientUuid(), clientConnection); + clientConnection->setServerConnection(this); } void TunnelProxyServerConnection::unregisterClientConnection(TunnelProxyClientConnection *clientConnection) { m_clientConnections.remove(clientConnection->clientUuid()); m_clientConnectionsAddresses.remove(clientConnection->socketAddress()); + clientConnection->setServerConnection(nullptr); } TunnelProxyClientConnection *TunnelProxyServerConnection::getClientConnection(quint16 socketAddress)