X-Git-Url: https://git.quassel-irc.org/?a=blobdiff_plain;f=src%2Fcommon%2Finternalpeer.cpp;h=7d8d018692613222528537061f248f3114dd018a;hb=9ba2ca5186c8598e33910a7df95bbdbf812a1a3d;hp=b724dc01ff5b6f22344d9392576c2696a2c2bba6;hpb=9ef86f499753853c3751aee7da54d186837a5161;p=quassel.git diff --git a/src/common/internalpeer.cpp b/src/common/internalpeer.cpp index b724dc01..7d8d0186 100644 --- a/src/common/internalpeer.cpp +++ b/src/common/internalpeer.cpp @@ -30,7 +30,9 @@ 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; }; @@ -42,7 +44,7 @@ InternalPeer::InternalPeer(QObject *parent) _peer(0), _isOpen(true) { - + setFeatures(Quassel::Features{}); } @@ -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 void InternalPeer::dispatch(EventType eventType, const T &msg) { @@ -180,41 +194,39 @@ void InternalPeer::dispatch(EventType eventType, const T &msg) return; } - if(QThread::currentThread() == _peer->thread()) - _peer->handle(msg); - else - QCoreApplication::postEvent(_peer, new PeerMessageEvent(this, eventType, msg)); + // The peers always live in different threads, so use an event for thread-safety + QCoreApplication::postEvent(_peer, new PeerMessageEvent(this, eventType, msg)); } void InternalPeer::customEvent(QEvent *event) { + setSourcePeer(this); + switch ((int)event->type()) { case SyncMessageEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); + handle(static_cast *>(event)->message); break; } case RpcCallEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); + handle(static_cast *>(event)->message); break; } case InitRequestEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); + handle(static_cast *>(event)->message); break; } case InitDataEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); + handle(static_cast *>(event)->message); break; } default: qWarning() << Q_FUNC_INFO << "Received unknown custom event:" << event->type(); + setSourcePeer(nullptr); return; } + setSourcePeer(nullptr); event->accept(); }