X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Finternalpeer.cpp;h=7d8d018692613222528537061f248f3114dd018a;hp=15e67ed36d0399beed384f5f07f2e0700f4e5319;hb=f65431d2916386b93bf3c991578997203dfbc64d;hpb=9fc57dc2c000e80fb8bd746a090e2e8210e1278e diff --git a/src/common/internalpeer.cpp b/src/common/internalpeer.cpp index 15e67ed3..7d8d0186 100644 --- a/src/common/internalpeer.cpp +++ b/src/common/internalpeer.cpp @@ -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 -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(this, eventType, msg)); +void setSourcePeer(Peer* peer) +{ + auto p = SignalProxy::current(); + if (p) + p->setSourcePeer(peer); } +} // anon + template -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(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(); }