X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fsignalproxy.cpp;h=763daf61b14f44b2b7065e01fc94b770a511759d;hp=d6c105b313049b880d54f5af2fd59b0f5ddc1d4e;hb=d7052a3218b115ab68d24ea33e670ed26afd19ce;hpb=06a03c2c69ee934aaeec83512bae2fffee83a340 diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index d6c105b3..763daf61 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -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); } @@ -86,12 +92,21 @@ void SignalProxy::attachSlot(const QByteArray& rpcFunction, QObject* recv, const } void SignalProxy::detachObject(QObject* obj) { - Q_ASSERT(false); // not done yet + //Q_ASSERT(false); // not done yet foreach(Connection conn, peers) { conn.peer->detachObject(obj); } - // FIXME: delete attached signal/slot info - + QList sigs; + foreach(SignalDesc desc, attachedSignals) { + if(desc.sender != obj) sigs << desc; + } + attachedSignals = sigs; + QList slot; + foreach(SlotDesc desc, attachedSlots) { + if(desc.recv != obj) slot << desc; + } + attachedSlots = slot; + // FIXME: test this! } void SignalProxy::sendSignal(const char *signal, QVariant p1, QVariant p2, QVariant p3, QVariant p4, QVariant p5, QVariant p6, QVariant p7, QVariant p8, QVariant p9) {