Don't crash upon core/client timeout disconnect
[quassel.git] / src / common / signalproxy.cpp
index a738715..17a44c4 100644 (file)
@@ -231,16 +231,17 @@ SignalProxy::SignalProxy(ProxyMode mode, QIODevice* device, QObject* parent)
 }
 
 SignalProxy::~SignalProxy() {
-  QList<SyncableObject *> syncObjects;
   QHash<QByteArray, ObjectId>::iterator classIter = _syncSlave.begin();
   while(classIter != _syncSlave.end()) {
-    syncObjects << classIter->values();
+    ObjectId::iterator objIter = classIter->begin();
+    while(objIter != classIter->end()) {
+      SyncableObject *obj = objIter.value();
+      objIter = classIter->erase(objIter);
+      obj->stopSynchronize(this);
+    }
     classIter++;
   }
   _syncSlave.clear();
-  foreach(SyncableObject *obj, syncObjects) {
-    obj->stopSynchronize(this);
-  }
 
   removeAllPeers();
 }
@@ -414,10 +415,6 @@ void SignalProxy::renameObject(const SyncableObject *obj, const QString &newname
 }
 
 void SignalProxy::objectRenamed(const QByteArray &classname, const QString &newname, const QString &oldname) {
-  qDebug() << "SignalProxy::objectRenamed" << classname << newname << oldname;
-  if(proxyMode() == Server)
-    return;
-
   if(_syncSlave.contains(classname) && _syncSlave[classname].contains(oldname) && oldname != newname) {
     SyncableObject *obj = _syncSlave[classname][newname] = _syncSlave[classname].take(oldname);
     requestInit(obj);
@@ -935,6 +932,8 @@ void SignalProxy::setInitData(SyncableObject *obj, const QVariantMap &properties
 void SignalProxy::sendHeartBeat() {
   QVariantList heartBeatParams;
   heartBeatParams << QTime::currentTime();
+  QList<IODevicePeer *> toClose;
+
   PeerHash::iterator peer = _peers.begin();
   while(peer != _peers.end()) {
     if((*peer)->type() == AbstractPeer::IODevicePeer) {
@@ -943,15 +942,18 @@ void SignalProxy::sendHeartBeat() {
       if(ioPeer->sentHeartBeats > 0) {
        updateLag(ioPeer, ioPeer->sentHeartBeats * _heartBeatTimer.interval());
       }
-      if(ioPeer->sentHeartBeats > 1) {
-       qWarning() << "SignalProxy: Disconnecting peer:" << ioPeer->address()
-                  << "(didn't receive a heartbeat for over" << ioPeer->sentHeartBeats * _heartBeatTimer.interval() / 1000 << "seconds)";
-       ioPeer->close();
-      } else {
+      if(ioPeer->sentHeartBeats > 1)
+        toClose.append(ioPeer);
+      else
        ioPeer->sentHeartBeats++;
-      }
     }
-    peer++;
+    ++peer;
+  }
+
+  foreach(IODevicePeer *ioPeer, toClose) {
+    qWarning() << "SignalProxy: Disconnecting peer:" << ioPeer->address()
+               << "(didn't receive a heartbeat for over" << ioPeer->sentHeartBeats * _heartBeatTimer.interval() / 1000 << "seconds)";
+    ioPeer->close();
   }
 }
 
@@ -1172,7 +1174,6 @@ const QHash<int, int> &SignalProxy::ExtendedMetaObject::receiveMap() {
 
       if(receiverId != -1) {
        receiveMap[i] = receiverId;
-        qDebug() << requestSlot.signature() << _meta->method(receiverId).signature() << "---" << i << receiverId;
       }
     }
     _receiveMap = receiveMap;