summaryrefslogtreecommitdiffstats
path: root/src/client/net/serverconnection.cpp
diff options
context:
space:
mode:
authorsr2013-02-05 19:00:11 +0100
committersr2013-02-05 19:00:11 +0100
commit62fb9fd2b4d6e1d8e0c06f70bb7ba08b1f286be7 (patch)
tree5a19e024633de3ccdaf2f182b75374d74bac5dbf /src/client/net/serverconnection.cpp
parent[SHARED] Add missing error message if network message parsing fails (diff)
downloadpvs2-62fb9fd2b4d6e1d8e0c06f70bb7ba08b1f286be7.tar.gz
pvs2-62fb9fd2b4d6e1d8e0c06f70bb7ba08b1f286be7.tar.xz
pvs2-62fb9fd2b4d6e1d8e0c06f70bb7ba08b1f286be7.zip
[SERVER/CLIENT] Wait for connection to close properly before deleting socket object
Diffstat (limited to 'src/client/net/serverconnection.cpp')
-rw-r--r--src/client/net/serverconnection.cpp59
1 files changed, 42 insertions, 17 deletions
diff --git a/src/client/net/serverconnection.cpp b/src/client/net/serverconnection.cpp
index 849f43b..6858f54 100644
--- a/src/client/net/serverconnection.cpp
+++ b/src/client/net/serverconnection.cpp
@@ -15,7 +15,7 @@
#define CHALLENGE_LEN 20
ServerConnection::ServerConnection(const QString& host, const quint16 port, const QByteArray& sessionName, const QByteArray& certHash) :
- QObject(NULL), _jpegQuality(80), _authed(0), _sessionName(sessionName), _certHash(certHash)
+ QObject(NULL), _timerDelete(0), _jpegQuality(80), _authed(0), _sessionName(sessionName), _certHash(certHash)
{
_socket = new QSslSocket();
_blank = new BlankScreen();
@@ -37,7 +37,12 @@ ServerConnection::ServerConnection(const QString& host, const quint16 port, cons
ServerConnection::~ServerConnection()
{
- this->disconnectFromServer();
+ if (_socket != NULL)
+ {
+ qCritical("**** SOCKET DELETE IN DESTRUCTOR");
+ _socket->deleteLater();
+ }
+ qDebug("*** Server connection destroyed.");
_blank->deleteLater();
_blank = NULL;
}
@@ -56,16 +61,19 @@ void ServerConnection::sendMessage(NetworkMessage& message)
void ServerConnection::disconnectFromServer()
{
- if (_socket == NULL)
- return;
- qDebug("Closing connection to server");
- VncServer::instance()->stop();
- emit closeVnc();
- _socket->blockSignals(true);
- _socket->abort();
- _socket->deleteLater();
- _socket = NULL;
- this->deleteLater();
+ if (_timerDelete == 0)
+ {
+ VncServer::instance()->stop();
+ emit closeVnc();
+ emit disconnected();
+ _timerDelete = startTimer(500);
+ qDebug("Closing connection to server");
+ if (_socket != NULL)
+ {
+ _socket->blockSignals(true);
+ _socket->abort();
+ }
+ }
}
void ServerConnection::handleMsg()
@@ -236,11 +244,28 @@ void ServerConnection::handleMsg()
void ServerConnection::timerEvent(QTimerEvent *event)
{
- if (_timerId == 0)
- return;
- killTimer(_timerId);
- _timerId = 0;
- this->disconnectFromServer();
+ if (event->timerId() == _timerId)
+ {
+ killTimer(_timerId);
+ _timerId = 0;
+ this->disconnectFromServer();
+ }
+ else if (event->timerId() == _timerDelete)
+ {
+ if (_socket == NULL || _socket->state() == QAbstractSocket::UnconnectedState)
+ {
+ if (_socket != NULL)
+ _socket->deleteLater();
+ _socket = NULL;
+ killTimer(_timerDelete);
+ this->deleteLater();
+ return;
+ }
+ _socket->abort();
+ qDebug("A socket is still pending...");
+ }
+ else
+ killTimer(event->timerId());
}
/**