IRC disconnects are now handled properly
authorMarcus Eggenberger <egs@quassel-irc.org>
Mon, 29 Oct 2007 12:13:44 +0000 (12:13 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Mon, 29 Oct 2007 12:13:44 +0000 (12:13 +0000)
src/core/coresession.cpp
src/core/server.cpp
src/core/server.h

index 602ce78..726ddb8 100644 (file)
@@ -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) {
index 3af2119..67cc632 100644 (file)
@@ -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) {
index 1b92f16..2841323 100644 (file)
@@ -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: