common: Set sourcePeer() also for internal (mono) connections
[quassel.git] / src / common / internalpeer.cpp
index 15e67ed..7d8d018 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2013 by the Quassel Project                        *
+ *   Copyright (C) 2005-2016 by the Quassel Project                        *
  *   devel@quassel-irc.org                                                 *
  *                                                                         *
  *   This program is free software; you can redistribute it and/or modify  *
@@ -30,19 +30,21 @@ class PeerMessageEvent : public QEvent
 {
 public:
     PeerMessageEvent(InternalPeer *sender, InternalPeer::EventType eventType, const T &message)
-    : QEvent(QEvent::Type(eventType)), sender(sender), message(message) {}
+        : QEvent(QEvent::Type(eventType)), sender(sender), message(message)
+    {}
+
     InternalPeer *sender;
     T message;
 };
 
 
 InternalPeer::InternalPeer(QObject *parent)
-    : SignalProxy::AbstractPeer(parent),
+    : Peer(0, parent),
     _proxy(0),
     _peer(0),
     _isOpen(true)
 {
-
+    setFeatures(Quassel::Features{});
 }
 
 
@@ -58,6 +60,15 @@ QString InternalPeer::description() const
     return tr("internal connection");
 }
 
+QString InternalPeer::address() const
+{
+    return tr("internal connection");
+}
+
+quint16 InternalPeer::port() const
+{
+    return 0;
+}
 
 bool InternalPeer::isOpen() const
 {
@@ -91,6 +102,12 @@ int InternalPeer::lag() const
 }
 
 
+::SignalProxy *InternalPeer::signalProxy() const
+{
+    return _proxy;
+}
+
+
 void InternalPeer::setSignalProxy(::SignalProxy *proxy)
 {
     if (!proxy && _proxy) {
@@ -157,61 +174,59 @@ void InternalPeer::dispatch(const InitData &msg)
 }
 
 
-template<class T>
-void InternalPeer::dispatch(EventType eventType, const T &msg)
-{
-    if (!_peer) {
-        qWarning() << Q_FUNC_INFO << "Cannot dispatch a message without a peer!";
-        return;
-    }
+namespace {
 
-    if(QThread::currentThread() == _peer->thread())
-        _peer->handle(msg);
-    else
-        QCoreApplication::postEvent(_peer, new PeerMessageEvent<T>(this, eventType, msg));
+void setSourcePeer(Peer* peer)
+{
+    auto p = SignalProxy::current();
+    if (p)
+        p->setSourcePeer(peer);
 }
 
+}  // anon
+
 
 template<class T>
-void InternalPeer::handle(const T &msg)
+void InternalPeer::dispatch(EventType eventType, const T &msg)
 {
-    if (!_proxy) {
-        qWarning() << Q_FUNC_INFO << "Cannot handle a message without having a signal proxy set!";
+    if (!_peer) {
+        qWarning() << Q_FUNC_INFO << "Cannot dispatch a message without a peer!";
         return;
     }
 
-    _proxy->handle(this, msg);
+    // The peers always live in different threads, so use an event for thread-safety
+    QCoreApplication::postEvent(_peer, new PeerMessageEvent<T>(this, eventType, msg));
 }
 
 
 void InternalPeer::customEvent(QEvent *event)
 {
+    setSourcePeer(this);
+
     switch ((int)event->type()) {
         case SyncMessageEvent: {
-            PeerMessageEvent<SyncMessage> *e = static_cast<PeerMessageEvent<SyncMessage> *>(event);
-            handle(e->message);
+            handle(static_cast<PeerMessageEvent<SyncMessage> *>(event)->message);
             break;
         }
         case RpcCallEvent: {
-            PeerMessageEvent<RpcCall> *e = static_cast<PeerMessageEvent<RpcCall> *>(event);
-            handle(e->message);
+            handle(static_cast<PeerMessageEvent<RpcCall> *>(event)->message);
             break;
         }
         case InitRequestEvent: {
-            PeerMessageEvent<InitRequest> *e = static_cast<PeerMessageEvent<InitRequest> *>(event);
-            handle(e->message);
+            handle(static_cast<PeerMessageEvent<InitRequest> *>(event)->message);
             break;
         }
         case InitDataEvent: {
-            PeerMessageEvent<InitData> *e = static_cast<PeerMessageEvent<InitData> *>(event);
-            handle(e->message);
+            handle(static_cast<PeerMessageEvent<InitData> *>(event)->message);
             break;
         }
 
         default:
             qWarning() << Q_FUNC_INFO << "Received unknown custom event:" << event->type();
+            setSourcePeer(nullptr);
             return;
     }
 
+    setSourcePeer(nullptr);
     event->accept();
 }