adapting to the new peer types
authorMarcus Eggenberger <egs@quassel-irc.org>
Sun, 19 Oct 2008 15:12:01 +0000 (17:12 +0200)
committerMarcus Eggenberger <egs@quassel-irc.org>
Tue, 21 Oct 2008 16:52:51 +0000 (18:52 +0200)
src/common/signalproxy.cpp
src/common/signalproxy.h
src/core/coresession.cpp

index 1b05ab4..85f053b 100644 (file)
@@ -223,6 +223,7 @@ SignalProxy::~SignalProxy() {
   QList<QObject*> 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<QObject *> peers = _peers.keys();
   foreach(QObject *peer, peers) {
-    switch(_peers[peer]->type()) {
-    case AbstractPeer::IODevicePeer:
-      removePeer(static_cast<QIODevice *>(peer));
-      break;
-    case AbstractPeer::SignalProxyPeer:
-      removePeer(static_cast<SignalProxy *>(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<QIODevice *>(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) {
index 0dc3332..f2490ba 100644 (file)
@@ -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());
index 5bdfefe..ded76ef 100644 (file)
@@ -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<QTcpSocket *>(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 {