this should hopefully fix the dreaded BR #140 (sync to core hangs)
authorMarcus Eggenberger <egs@quassel-irc.org>
Fri, 11 Jul 2008 18:56:29 +0000 (20:56 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Fri, 11 Jul 2008 18:56:38 +0000 (20:56 +0200)
src/common/network.cpp
src/common/network.h

index cfcda7d..2e10c04 100644 (file)
@@ -208,6 +208,7 @@ void Network::ircUserDestroyed() {
   QHash<QString, IrcUser *>::iterator ircUserIter = _ircUsers.begin();
   while(ircUserIter != _ircUsers.end()) {
     if(ircUser == *ircUserIter) {
   QHash<QString, IrcUser *>::iterator ircUserIter = _ircUsers.begin();
   while(ircUserIter != _ircUsers.end()) {
     if(ircUser == *ircUserIter) {
+      emit deletedIrcUserRemoved(ircUserIter.key());
       ircUserIter = _ircUsers.erase(ircUserIter);
       break;
     }
       ircUserIter = _ircUsers.erase(ircUserIter);
       break;
     }
@@ -215,6 +216,30 @@ void Network::ircUserDestroyed() {
   }
 }
 
   }
 }
 
+void Network::removeDeletedIrcUser(const QString &username) {
+  // DO NOT CALL THIS SLOT EVER!!!
+  
+  // this slots purpose is only to remove deleted users that haven't been synced yet.
+  // Reason:
+  // as a user parting a channel results in it's deletion if it is no longer in any known channel
+  // this action can only be communicated if the slaves are allready in sync.
+  // so if such a deleted user isn't synced in slave mode, we kill and remove it.
+
+  Q_ASSERT(proxy());
+
+  if(!_ircUsers.contains(username))
+    return;
+
+  IrcUser *ircUser = _ircUsers[username];
+
+  if(ircUser->isInitialized())
+    return;
+
+  _ircUsers.remove(username);
+  emit ircUserRemoved(username);
+  emit ircUserRemoved(ircUser);
+}
+
 void Network::removeIrcUser(IrcUser *ircuser) {
   QString nick = _ircUsers.key(ircuser);
   if(nick.isNull())
 void Network::removeIrcUser(IrcUser *ircuser) {
   QString nick = _ircUsers.key(ircuser);
   if(nick.isNull())
index 3759e56..9704646 100644 (file)
@@ -204,6 +204,7 @@ public slots:
 
   inline void addIrcUser(const QString &hostmask) { newIrcUser(hostmask); }
   inline void addIrcChannel(const QString &channel) { newIrcChannel(channel); }
 
   inline void addIrcUser(const QString &hostmask) { newIrcUser(hostmask); }
   inline void addIrcChannel(const QString &channel) { newIrcChannel(channel); }
+  void removeDeletedIrcUser(const QString &username);
   void removeIrcUser(const QString &nick);
   void removeIrcChannel(const QString &channel);
 
   void removeIrcUser(const QString &nick);
   void removeIrcChannel(const QString &channel);
 
@@ -274,6 +275,7 @@ signals:
   void ircChannelAdded(const QString &channelname);
   void ircChannelAdded(IrcChannel *);
 
   void ircChannelAdded(const QString &channelname);
   void ircChannelAdded(IrcChannel *);
 
+  void deletedIrcUserRemoved(const QString &username);
   void ircUserRemoved(const QString &nick);
   void ircChannelRemoved(const QString &channel);
 
   void ircUserRemoved(const QString &nick);
   void ircChannelRemoved(const QString &channel);