From 419189f88aa62da0b3dc4564554b2b85f9aa6524 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Mon, 29 Oct 2007 12:13:44 +0000 Subject: [PATCH] IRC disconnects are now handled properly --- src/core/coresession.cpp | 5 +++-- src/core/server.cpp | 11 +++++++---- src/core/server.h | 5 +++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 602ce78e..726ddb89 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -146,8 +146,9 @@ void CoreSession::serverConnected(uint networkid) { } void CoreSession::serverDisconnected(uint networkid) { - servers.remove(networkid); - delete servers[networkid]; + Q_ASSERT(servers.contains(networkid)); + servers.take(networkid)->deleteLater(); + Q_ASSERT(!servers.contains(networkid)); } void CoreSession::msgFromGui(BufferInfo bufid, QString msg) { diff --git a/src/core/server.cpp b/src/core/server.cpp index 3af2119d..67cc6325 100644 --- a/src/core/server.cpp +++ b/src/core/server.cpp @@ -53,10 +53,11 @@ Server::~Server() { void Server::run() { connect(&socket, SIGNAL(connected()), this, SLOT(socketConnected())); - connect(&socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected())); + connect(&socket, SIGNAL(disconnected()), this, SLOT(quit())); connect(&socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError))); connect(&socket, SIGNAL(stateChanged(QAbstractSocket::SocketState)), this, SLOT(socketStateChanged(QAbstractSocket::SocketState))); connect(&socket, SIGNAL(readyRead()), this, SLOT(socketHasData())); + connect(this, SIGNAL(finished()), this, SLOT(threadFinished())); exec(); } @@ -94,15 +95,17 @@ void Server::socketError( QAbstractSocket::SocketError err ) { //qDebug() << "Socket Error!"; } -void Server::socketConnected( ) { +void Server::socketConnected() { emit connected(networkId()); putRawLine(QString("NICK :%1").arg(identity["NickList"].toStringList()[0])); // FIXME: try more nicks if error occurs putRawLine(QString("USER %1 8 * :%2").arg(identity["Ident"].toString()).arg(identity["RealName"].toString())); } -void Server::socketDisconnected( ) { +void Server::threadFinished() { + // the Socket::disconnected() is connect to this::quit() + // so after the event loop is finished we're beeing called + // and propagate the disconnect emit disconnected(networkId()); - // propagate to networkInfo, so we can clear up } void Server::socketStateChanged(QAbstractSocket::SocketState state) { diff --git a/src/core/server.h b/src/core/server.h index 1b92f16d..28413233 100644 --- a/src/core/server.h +++ b/src/core/server.h @@ -73,7 +73,9 @@ public slots: void putRawLine(QString input); void putCmd(QString cmd, QStringList params, QString prefix = 0); - //void exitThread(); + +private slots: + void threadFinished(); signals: void serverState(QString net, QVariantMap data); @@ -94,7 +96,6 @@ private slots: void socketHasData(); void socketError(QAbstractSocket::SocketError); void socketConnected(); - void socketDisconnected(); void socketStateChanged(QAbstractSocket::SocketState); private: -- 2.20.1