X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Fsignalproxy.cpp;h=85f053b25fae92ed30af9e81bd1a53b41d9a0c21;hp=1b05ab43fb786bcf4465feaa505de4c7e6e3a846;hb=5c35ac3ee6f951d39cc052925aa224debfa148a8;hpb=f24b79010368ac773923d29187c15c33aea69bc9 diff --git a/src/common/signalproxy.cpp b/src/common/signalproxy.cpp index 1b05ab43..85f053b2 100644 --- a/src/common/signalproxy.cpp +++ b/src/common/signalproxy.cpp @@ -223,6 +223,7 @@ SignalProxy::~SignalProxy() { QList senders = _relayHash.keys(); foreach(QObject* sender, senders) detachObject(sender); + removeAllPeers(); } void SignalProxy::setProxyMode(ProxyMode mode) { @@ -284,9 +285,6 @@ bool SignalProxy::addPeer(QIODevice* iodev) { connect(sock, SIGNAL(disconnected()), this, SLOT(removePeerBySender())); } - // we take ownership of that device - iodev->setParent(this); - _peers[iodev] = new IODevicePeer(iodev, iodev->property("UseCompression").toBool()); if(_peers.count() == 1) @@ -300,60 +298,37 @@ void SignalProxy::removeAllPeers() { // wee need to copy that list since we modify it in the loop QList peers = _peers.keys(); foreach(QObject *peer, peers) { - switch(_peers[peer]->type()) { - case AbstractPeer::IODevicePeer: - removePeer(static_cast(peer)); - break; - case AbstractPeer::SignalProxyPeer: - removePeer(static_cast(peer)); - break; - default: - Q_ASSERT(false); // there shouldn't be any peers with wrong / unknown type - } + removePeer(peer); } } -void SignalProxy::removePeer(QIODevice* iodev) { +void SignalProxy::removePeer(QObject* dev) { if(_peers.isEmpty()) { qWarning() << "SignalProxy::removePeer(): No peers in use!"; return; } - Q_ASSERT(iodev); - if(!_peers.contains(iodev)) { - qWarning() << "SignalProxy: unknown QIODevice" << iodev; + Q_ASSERT(dev); + if(!_peers.contains(dev)) { + qWarning() << "SignalProxy: unknown Peer" << dev; return; } - AbstractPeer *peer = _peers[iodev]; - _peers.remove(iodev); - delete peer; - - disconnect(iodev, 0, this, 0); - emit peerRemoved(iodev); + AbstractPeer *peer = _peers[dev]; + _peers.remove(dev); - if(_peers.isEmpty()) - emit disconnected(); -} + disconnect(dev, 0, this, 0); + if(peer->type() == AbstractPeer::IODevicePeer) + emit peerRemoved(static_cast(dev)); -void SignalProxy::removePeer(SignalProxy *proxy) { - if(!_peers.contains(proxy)) { - qWarning() << "SignalProxy: unknown QIODevice" << proxy; - return; - } - - _peers.remove(proxy); + delete peer; if(_peers.isEmpty()) emit disconnected(); } - void SignalProxy::removePeerBySender() { - // OK we're brutal here... but since it's a private slot we know what we've got connected to it... - // this Slot is not triggered by destroyed, so the object is still alive and can be used! - QIODevice *ioDev = (QIODevice *)(sender()); - removePeer(ioDev); + removePeer(sender()); } void SignalProxy::objectRenamed(const QString &newname, const QString &oldname) {