common: Set sourcePeer() also for internal (mono) connections
authorManuel Nickschas <sputnick@quassel-irc.org>
Mon, 26 Mar 2018 22:04:01 +0000 (00:04 +0200)
committerManuel Nickschas <sputnick@quassel-irc.org>
Wed, 28 Mar 2018 20:18:29 +0000 (22:18 +0200)
So far, SignalProxy::sourcePeer() was only set while processing
messages from remote peers. Set this also for internal connections.

Also remove InternalPeer's special-casing for in-thread communication,
as the two connected peers always live in different threads anyways.

Closes GH-345.

src/common/internalpeer.cpp

index c2512a0..7d8d018 100644 (file)
@@ -30,7 +30,9 @@ class PeerMessageEvent : public QEvent
 {
 public:
     PeerMessageEvent(InternalPeer *sender, InternalPeer::EventType eventType, const T &message)
 {
 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 *sender;
     T message;
 };
@@ -172,6 +174,18 @@ void InternalPeer::dispatch(const InitData &msg)
 }
 
 
 }
 
 
+namespace {
+
+void setSourcePeer(Peer* peer)
+{
+    auto p = SignalProxy::current();
+    if (p)
+        p->setSourcePeer(peer);
+}
+
+}  // anon
+
+
 template<class T>
 void InternalPeer::dispatch(EventType eventType, const T &msg)
 {
 template<class T>
 void InternalPeer::dispatch(EventType eventType, const T &msg)
 {
@@ -180,41 +194,39 @@ void InternalPeer::dispatch(EventType eventType, const T &msg)
         return;
     }
 
         return;
     }
 
-    if(QThread::currentThread() == _peer->thread())
-        _peer->handle(msg);
-    else
-        QCoreApplication::postEvent(_peer, new PeerMessageEvent<T>(this, eventType, 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)
 {
 }
 
 
 void InternalPeer::customEvent(QEvent *event)
 {
+    setSourcePeer(this);
+
     switch ((int)event->type()) {
         case SyncMessageEvent: {
     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: {
             break;
         }
         case RpcCallEvent: {
-            PeerMessageEvent<RpcCall> *e = static_cast<PeerMessageEvent<RpcCall> *>(event);
-            handle(e->message);
+            handle(static_cast<PeerMessageEvent<RpcCall> *>(event)->message);
             break;
         }
         case InitRequestEvent: {
             break;
         }
         case InitRequestEvent: {
-            PeerMessageEvent<InitRequest> *e = static_cast<PeerMessageEvent<InitRequest> *>(event);
-            handle(e->message);
+            handle(static_cast<PeerMessageEvent<InitRequest> *>(event)->message);
             break;
         }
         case InitDataEvent: {
             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();
             break;
         }
 
         default:
             qWarning() << Q_FUNC_INFO << "Received unknown custom event:" << event->type();
+            setSourcePeer(nullptr);
             return;
     }
 
             return;
     }
 
+    setSourcePeer(nullptr);
     event->accept();
 }
     event->accept();
 }