From: Marcus Eggenberger Date: Sun, 19 Oct 2008 15:12:01 +0000 (+0200) Subject: adapting to the new peer types X-Git-Tag: 0.3.1~148 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=5c35ac3ee6f951d39cc052925aa224debfa148a8 adapting to the new peer types --- 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) { diff --git a/src/common/signalproxy.h b/src/common/signalproxy.h index 0dc33325..f2490ba5 100644 --- a/src/common/signalproxy.h +++ b/src/common/signalproxy.h @@ -64,9 +64,8 @@ public: inline ProxyMode proxyMode() const { return _proxyMode; } bool addPeer(QIODevice *iodev); - void removePeer(QIODevice *iodev); bool addPeer(SignalProxy *proxy); - void removePeer(SignalProxy *proxy); + void removePeer(QObject *peer); void removeAllPeers(); bool attachSignal(QObject *sender, const char *signal, const QByteArray& sigName = QByteArray()); diff --git a/src/core/coresession.cpp b/src/core/coresession.cpp index 5bdfefe5..ded76eff 100644 --- a/src/core/coresession.cpp +++ b/src/core/coresession.cpp @@ -243,14 +243,10 @@ void CoreSession::addClient(QObject *dev) { // this is QObject* so we can use it } void CoreSession::removeClient(QIODevice *iodev) { - // no checks for validity check - privateslot... QTcpSocket *socket = qobject_cast(iodev); if(socket) quInfo() << qPrintable(tr("Client")) << qPrintable(socket->peerAddress().toString()) << qPrintable(tr("disconnected (UserId: %1).").arg(user().toInt())); - else - quInfo() << "Local client disconnedted."; - disconnect(socket, 0, this, 0); - socket->deleteLater(); + iodev->deleteLater(); } SignalProxy *CoreSession::signalProxy() const {