- Fixed a minor bug in IrcUser
authorMarcus Eggenberger <egs@quassel-irc.org>
Fri, 4 Jan 2008 00:51:53 +0000 (00:51 +0000)
committerMarcus Eggenberger <egs@quassel-irc.org>
Fri, 4 Jan 2008 00:51:53 +0000 (00:51 +0000)
- Made the SignalProxy::objectRenamed slot behave more like the objectDestroyed slot

src/common/ircuser.cpp
src/common/signalproxy.cpp

index 91b3a2b..affd64b 100644 (file)
@@ -136,7 +136,6 @@ void IrcUser::setHost(const QString &host) {
 
 void IrcUser::setNick(const QString &nick) {
   if(!nick.isEmpty() && nick != _nick) {
-    QString oldnick(_nick);
     _nick = nick;
     updateObjectName();
     emit nickSet(nick);
@@ -144,14 +143,14 @@ void IrcUser::setNick(const QString &nick) {
 }
 
 void IrcUser::updateObjectName() {
-  QString oldName(objectName());
-  setObjectName(QString::number(networkInfo->networkId()) + "/" + _nick);
-  if(!oldName.isEmpty()) {
-    emit renameObject(oldName, objectName());
+  QString newName = QString::number(networkInfo->networkId()) + "/" + _nick;
+  QString oldName = objectName();
+  if(oldName != newName) {
+    setObjectName(newName);
+    emit renameObject(oldName, newName);
   }
 }
 
-
 void IrcUser::updateHostmask(const QString &mask) {
   if(mask == hostmask())
     return;
@@ -165,9 +164,9 @@ void IrcUser::updateHostmask(const QString &mask) {
 void IrcUser::joinChannel(IrcChannel *channel) {
   Q_ASSERT(channel);
   if(!_channels.contains(channel)) {
+    _channels.insert(channel);
     channel->join(this);
     connect(channel, SIGNAL(destroyed()), this, SLOT(channelDestroyed()));
-    _channels.insert(channel);
     emit channelJoined(channel->name());
   }
 }
index a6e16fa..7aab025 100644 (file)
@@ -247,7 +247,8 @@ void SignalProxy::objectRenamed(QString oldname, QString newname) {
 }
 
 void SignalProxy::objectRenamed(QByteArray classname, QString oldname, QString newname) {
-  if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname))
+  QMutexLocker locker(&slaveMutex);
+  if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname) && oldname != newname)
     _syncSlave[classname][newname] = _syncSlave[classname].take(oldname);
 }
 
@@ -433,7 +434,7 @@ void SignalProxy::synchronizeAsMaster(QObject *sender) {
   relay->setSynchronize(true);
 
   if(sender->metaObject()->indexOfSignal(QMetaObject::normalizedSignature("renameObject(QString, QString)")) != -1)
-    connect(sender, SIGNAL(renameObject(QString, QString)), this, SLOT(objectRenamed(QString, QString)));
+    connect(sender, SIGNAL(renameObject(QString, QString)), this, SLOT(objectRenamed(QString, QString)), Qt::DirectConnection);
 
   QByteArray className(sender->metaObject()->className());
   _syncSlave[className][sender->objectName()] = sender;
@@ -556,14 +557,14 @@ void SignalProxy::dispatchSignal(const QVariant &identifier, const QVariantList
 void SignalProxy::receivePeerSignal(QIODevice *sender, const QVariant &packedFunc) {
   QVariantList params(packedFunc.toList());
 
+  QVariant call = params.takeFirst();
+  if(call.type() != QVariant::Int)
+    return handleSignal(call.toByteArray(), params);
+
   // well yes we are locking code here and not only data.
   // otherwise each handler would have to lock the data anyway. this leaves us on the safe side
   // unable to forget a lock
   QMutexLocker locker(&slaveMutex);
-  
-  QVariant call = params.takeFirst();
-  if(call.type() != QVariant::Int)
-    return handleSignal(call.toByteArray(), params);
 
   switch(call.toInt()) {
   case Sync:
@@ -605,7 +606,8 @@ void SignalProxy::handleSync(QVariantList params) {
     qWarning() << "received Sync Call for Object" << receiver
               << "- no matching Slot for Signal:" << signalName;
     return;
-   }
+  }
+
   int slotId = syncMap(receiver)[signalId];
   if(!invokeSlot(receiver, slotId, params))
     qWarning("SignalProxy::handleSync(): invokeMethod for \"%s\" failed ", methodName(receiver, slotId).constData());