X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Finternalpeer.cpp;h=30b466985f56d013181395eeb5213143912f08ab;hp=c2512a07cc2d70051e40ed528249a944043214ff;hb=c27d5bfbe80bfeb583a25404f4ccee4b70b010e0;hpb=9f91e0dd3c4eb5c2e2dedfc8d36a068d433d51b1 diff --git a/src/common/internalpeer.cpp b/src/common/internalpeer.cpp index c2512a07..30b46698 100644 --- a/src/common/internalpeer.cpp +++ b/src/common/internalpeer.cpp @@ -1,5 +1,5 @@ /*************************************************************************** - * Copyright (C) 2005-2016 by the Quassel Project * + * Copyright (C) 2005-2018 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,38 +18,32 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * ***************************************************************************/ -#include -#include - #include "internalpeer.h" using namespace Protocol; -template -class PeerMessageEvent : public QEvent -{ -public: - PeerMessageEvent(InternalPeer *sender, InternalPeer::EventType eventType, const T &message) - : QEvent(QEvent::Type(eventType)), sender(sender), message(message) {} - InternalPeer *sender; - T message; -}; - - InternalPeer::InternalPeer(QObject *parent) - : Peer(0, parent), - _proxy(0), - _peer(0), - _isOpen(true) -{ + : Peer(nullptr, parent) +{ + static bool registered = []() { + qRegisterMetaType>(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + qRegisterMetaType(); + return true; + }(); + Q_UNUSED(registered) + setFeatures(Quassel::Features{}); } InternalPeer::~InternalPeer() { - if (_isOpen) + if (_isOpen) { emit disconnected(); + } } @@ -58,16 +52,19 @@ 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 { return true; @@ -109,7 +106,7 @@ int InternalPeer::lag() const void InternalPeer::setSignalProxy(::SignalProxy *proxy) { if (!proxy && _proxy) { - _proxy = 0; + _proxy = nullptr; if (_isOpen) { _isOpen = false; emit disconnected(); @@ -128,19 +125,20 @@ void InternalPeer::setSignalProxy(::SignalProxy *proxy) void InternalPeer::setPeer(InternalPeer *peer) { - if (_peer) { - qWarning() << Q_FUNC_INFO << "Peer already set, ignoring!"; - return; - } - _peer = peer; + connect(peer, SIGNAL(dispatchMessage(Protocol::SyncMessage)), SLOT(handleMessage(Protocol::SyncMessage))); + connect(peer, SIGNAL(dispatchMessage(Protocol::RpcCall)) , SLOT(handleMessage(Protocol::RpcCall))); + connect(peer, SIGNAL(dispatchMessage(Protocol::InitRequest)), SLOT(handleMessage(Protocol::InitRequest))); + connect(peer, SIGNAL(dispatchMessage(Protocol::InitData)) , SLOT(handleMessage(Protocol::InitData))); + connect(peer, SIGNAL(disconnected()), SLOT(peerDisconnected())); + + _isOpen = true; } void InternalPeer::peerDisconnected() { - disconnect(_peer, 0, this, 0); - _peer = 0; + disconnect(sender(), nullptr, this, nullptr); if (_isOpen) { _isOpen = false; emit disconnected(); @@ -150,71 +148,63 @@ void InternalPeer::peerDisconnected() void InternalPeer::dispatch(const SyncMessage &msg) { - dispatch(SyncMessageEvent, msg); + emit dispatchMessage(msg); } void InternalPeer::dispatch(const RpcCall &msg) { - dispatch(RpcCallEvent, msg); + emit dispatchMessage(msg); } void InternalPeer::dispatch(const InitRequest &msg) { - dispatch(InitRequestEvent, msg); + emit dispatchMessage(msg); } void InternalPeer::dispatch(const InitData &msg) { - dispatch(InitDataEvent, msg); + emit dispatchMessage(msg); } -template -void InternalPeer::dispatch(EventType eventType, const T &msg) +void InternalPeer::handleMessage(const Protocol::SyncMessage &msg) { - if (!_peer) { - qWarning() << Q_FUNC_INFO << "Cannot dispatch a message without a peer!"; - return; - } + handle(msg); +} + - if(QThread::currentThread() == _peer->thread()) - _peer->handle(msg); - else - QCoreApplication::postEvent(_peer, new PeerMessageEvent(this, eventType, msg)); +void InternalPeer::handleMessage(const Protocol::RpcCall &msg) +{ + handle(msg); } -void InternalPeer::customEvent(QEvent *event) +void InternalPeer::handleMessage(const Protocol::InitRequest &msg) { - switch ((int)event->type()) { - case SyncMessageEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); - break; - } - case RpcCallEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); - break; - } - case InitRequestEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); - break; - } - case InitDataEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); - break; - } + handle(msg); +} - default: - qWarning() << Q_FUNC_INFO << "Received unknown custom event:" << event->type(); - return; - } - event->accept(); +void InternalPeer::handleMessage(const Protocol::InitData &msg) +{ + handle(msg); +} + + +template +void InternalPeer::handle(const T &msg) +{ + static auto setSourcePeer = [](Peer *peer) { + auto p = SignalProxy::current(); + if (p) { + p->setSourcePeer(peer); + } + }; + + setSourcePeer(this); + Peer::handle(msg); + setSourcePeer(nullptr); }