Make SignalProxy detach QObjects automatically upon their destruction.
authorManuel Nickschas <sputnick@quassel-irc.org>
Tue, 18 Sep 2007 14:35:01 +0000 (14:35 +0000)
committerManuel Nickschas <sputnick@quassel-irc.org>
Tue, 18 Sep 2007 14:35:01 +0000 (14:35 +0000)
src/common/signalproxy.cpp
src/common/signalproxy.h

index c35ccb5..763daf6 100644 (file)
@@ -31,6 +31,7 @@ SignalProxy::SignalProxy(ProxyType _type, QIODevice *dev, QObject *parent) : QOb
 }
 
 SignalProxy::~SignalProxy() {
+  //qDebug() << "peers:" << peers.count();
   foreach(Connection conn, peers) {
     conn.peer->deleteLater(); conn.device->deleteLater();
   }
@@ -71,14 +72,19 @@ void SignalProxy::socketDisconnected() {
 }
 
 void SignalProxy::attachSignal(QObject* sender, const char* signal, const QByteArray& rpcFunction) {
+  disconnect(sender, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *)));
+  connect(sender, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *)));
+
   foreach(Connection conn, peers) {
     conn.peer->attachSignal(sender, signal, rpcFunction);
   }
   attachedSignals.append(SignalDesc(sender, signal, rpcFunction));
-
 }
 
 void SignalProxy::attachSlot(const QByteArray& rpcFunction, QObject* recv, const char* slot) {
+  disconnect(recv, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *)));
+  connect(recv, SIGNAL(destroyed(QObject *)), this, SLOT(detachObject(QObject *)));
+
   foreach(Connection conn, peers) {
     conn.peer->attachSlot(rpcFunction, recv, slot);
   }
index ed8b46b..cb1fcbf 100644 (file)
@@ -37,14 +37,14 @@ class SignalProxy : public QObject {
     void attachSignal(QObject* sender, const char* signal, const QByteArray& rpcFunction = QByteArray());
     void attachSlot(const QByteArray& rpcFunction, QObject* recv, const char* slot);
 
-    void detachObject(QObject* obj);
-
   public slots:
     void addPeer(QIODevice *device);
 
     void sendSignal(const char *signal, QVariant p1 = QVariant(), QVariant p2 = QVariant(), QVariant p3 = QVariant(), QVariant p4 = QVariant(),
               QVariant p5 = QVariant(), QVariant p6 = QVariant(), QVariant p7 = QVariant(), QVariant p8 = QVariant(), QVariant p9 = QVariant());
 
+    void detachObject(QObject* obj);
+
     //void detachSender();
 
   signals: