Added Q_ASSERT when catching destroyed signals. There seems to be a problem in some...
authorMarcus Eggenberger <egs@quassel-irc.org>
Sun, 21 Oct 2007 13:05:46 +0000 (13:05 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Sun, 21 Oct 2007 13:05:46 +0000 (13:05 +0000)
src/common/ircchannel.cpp
src/common/networkinfo.cpp

index 95d0ed1..2233861 100644 (file)
@@ -192,7 +192,11 @@ void IrcChannel::initSetUserModes(const QVariantMap &usermodes) {
 }
 
 void IrcChannel::ircUserDestroyed() {
-  part(qobject_cast<IrcUser *>(sender()));
+  IrcUser *ircUser = qobject_cast<IrcUser *>(sender());
+  // in case this assert triggers we probably need a static_cast
+  // dynamic_casts seem to screw things up when using the destroyed signal
+  Q_ASSERT(ircUser);
+  part(ircUser);
 }
 
 void IrcChannel::setInitialized() {
index 114287a..9db9f16 100644 (file)
@@ -299,6 +299,7 @@ IrcUser *NetworkInfo::updateNickFromMask(const QString &mask) {
 
 void NetworkInfo::ircUserNickChanged(QString newnick) {
   QString oldnick = _ircUsers.key(qobject_cast<IrcUser*>(sender()));
+
   if(oldnick.isNull())
     return;
   
@@ -310,26 +311,18 @@ void NetworkInfo::ircUserNickChanged(QString newnick) {
 
 void NetworkInfo::ircUserDestroyed() {
   IrcUser *ircuser = qobject_cast<IrcUser *>(sender());
-  QHash<QString, IrcUser*>::iterator i = _ircUsers.begin();
-  while(i != _ircUsers.end()) {
-    if(i.value() == ircuser) {
-      i = _ircUsers.erase(i);
-    } else {
-      i++;
-    }
-  }
+  // in case this assert triggers we probably need a static_cast
+  // dynamic_casts seem to screw things up when using the destroyed signal
+  Q_ASSERT(ircuser);
+  _ircUsers.remove(_ircUsers.key(ircuser);
 }
 
 void NetworkInfo::channelDestroyed() {
   IrcChannel *channel = qobject_cast<IrcChannel *>(sender());
-  QHash<QString, IrcChannel*>::iterator i = _ircChannels.begin();
-  while(i != _ircChannels.end()) {
-    if(i.value() == channel) {
-      i = _ircChannels.erase(i);
-    } else {
-      i++;
-    }
-  }
+  // in case this assert triggers we probably need a static_cast
+  // dynamic_casts seem to screw things up when using the destroyed signal
+  Q_ASSERT(channel);
+  _ircChannels.remove(_ircChannels.key(channel));
 }
 
 void NetworkInfo::setInitialized() {