X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Finternalpeer.cpp;h=dc645fbf2d04af9b44921b29f97c456a738b5041;hp=14008398e08e408e8a4560fbac6745d7a33cbac4;hb=HEAD;hpb=b65b9f7615165e8700a44d59b7275a55558dd45b diff --git a/src/common/internalpeer.cpp b/src/common/internalpeer.cpp index 14008398..de2743ba 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-2022 by the Quassel Project * * devel@quassel-irc.org * * * * This program is free software; you can redistribute it and/or modify * @@ -18,89 +18,85 @@ * 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; -}; +#include "util.h" +using namespace Protocol; -InternalPeer::InternalPeer(QObject *parent) - : Peer(0, parent), - _proxy(0), - _peer(0), - _isOpen(true) +InternalPeer::InternalPeer(QObject* parent) + : 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(); + } } - QString InternalPeer::description() const { return tr("internal connection"); } +QString InternalPeer::address() const +{ + return tr("internal connection"); +} -bool InternalPeer::isOpen() const +quint16 InternalPeer::port() const { - return true; + return 0; } +bool InternalPeer::isOpen() const +{ + return _isOpen; +} bool InternalPeer::isSecure() const { return true; } - bool InternalPeer::isLocal() const { return true; } - -void InternalPeer::close(const QString &reason) +void InternalPeer::close(const QString& reason) { - // FIXME - Q_UNUSED(reason) - qWarning() << "closing not implemented!"; + Q_UNUSED(reason); + _isOpen = false; } - int InternalPeer::lag() const { return 0; } - -::SignalProxy *InternalPeer::signalProxy() const +::SignalProxy* InternalPeer::signalProxy() const { return _proxy; } - -void InternalPeer::setSignalProxy(::SignalProxy *proxy) +void InternalPeer::setSignalProxy(::SignalProxy* proxy) { if (!proxy && _proxy) { - _proxy = 0; + _proxy = nullptr; if (_isOpen) { _isOpen = false; emit disconnected(); @@ -110,102 +106,97 @@ void InternalPeer::setSignalProxy(::SignalProxy *proxy) if (proxy && !_proxy) { _proxy = proxy; + _isOpen = true; return; } qWarning() << Q_FUNC_INFO << "Changing the SignalProxy is not supported!"; } - -void InternalPeer::setPeer(InternalPeer *peer) +void InternalPeer::setPeer(InternalPeer* peer) { - if (_peer) { - qWarning() << Q_FUNC_INFO << "Peer already set, ignoring!"; - return; - } - _peer = peer; - connect(peer, SIGNAL(disconnected()), SLOT(peerDisconnected())); -} + connect(peer, + selectOverload(&InternalPeer::dispatchMessage), + this, + selectOverload(&InternalPeer::handleMessage)); + connect(peer, + selectOverload(&InternalPeer::dispatchMessage), + this, + selectOverload(&InternalPeer::handleMessage)); + connect(peer, + selectOverload(&InternalPeer::dispatchMessage), + this, + selectOverload(&InternalPeer::handleMessage)); + connect(peer, + selectOverload(&InternalPeer::dispatchMessage), + this, + selectOverload(&InternalPeer::handleMessage)); + connect(peer, &Peer::disconnected, this, &InternalPeer::peerDisconnected); + + _isOpen = true; +} void InternalPeer::peerDisconnected() { - disconnect(_peer, 0, this, 0); - _peer = 0; + disconnect(sender(), nullptr, this, nullptr); if (_isOpen) { _isOpen = false; emit disconnected(); } } - -void InternalPeer::dispatch(const SyncMessage &msg) +void InternalPeer::dispatch(const SyncMessage& msg) { - dispatch(SyncMessageEvent, msg); + emit dispatchMessage(msg); } - -void InternalPeer::dispatch(const RpcCall &msg) +void InternalPeer::dispatch(const RpcCall& msg) { - dispatch(RpcCallEvent, msg); + emit dispatchMessage(msg); } - -void InternalPeer::dispatch(const InitRequest &msg) +void InternalPeer::dispatch(const InitRequest& msg) { - dispatch(InitRequestEvent, msg); + emit dispatchMessage(msg); } - -void InternalPeer::dispatch(const InitData &msg) +void InternalPeer::dispatch(const InitData& msg) { - dispatch(InitDataEvent, msg); + emit dispatchMessage(msg); } +void InternalPeer::handleMessage(const Protocol::SyncMessage& msg) +{ + handle(msg); +} -template -void InternalPeer::dispatch(EventType eventType, const T &msg) +void InternalPeer::handleMessage(const Protocol::RpcCall& 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::InitRequest& msg) +{ + handle(msg); } +void InternalPeer::handleMessage(const Protocol::InitData& msg) +{ + handle(msg); +} -void InternalPeer::customEvent(QEvent *event) +template +void InternalPeer::handle(const T& 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; + static auto setSourcePeer = [](Peer* peer) { + auto p = SignalProxy::current(); + if (p) { + p->setSourcePeer(peer); } - case InitDataEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); - break; - } - - default: - qWarning() << Q_FUNC_INFO << "Received unknown custom event:" << event->type(); - return; - } + }; - event->accept(); + setSourcePeer(this); + Peer::handle(msg); + setSourcePeer(nullptr); }