X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Finternalpeer.cpp;h=7d8d018692613222528537061f248f3114dd018a;hp=14008398e08e408e8a4560fbac6745d7a33cbac4;hb=f65431d2916386b93bf3c991578997203dfbc64d;hpb=1cb02004ee5973b89368bd84f234d4652794690d diff --git a/src/common/internalpeer.cpp b/src/common/internalpeer.cpp index 14008398..7d8d0186 100644 --- a/src/common/internalpeer.cpp +++ b/src/common/internalpeer.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2015 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,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{}); } @@ -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 { @@ -163,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) { @@ -171,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(); }