cmake: avoid de-duplication of user's CXXFLAGS
[quassel.git] / src / common / internalpeer.cpp
index 1400839..de2743b 100644 (file)
@@ -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  *
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
  ***************************************************************************/
 
-#include <QCoreApplication>
-#include <QThread>
-
 #include "internalpeer.h"
 
-using namespace Protocol;
-
-template<class T>
-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<QPointer<InternalPeer>>();
+        qRegisterMetaType<Protocol::SyncMessage>();
+        qRegisterMetaType<Protocol::RpcCall>();
+        qRegisterMetaType<Protocol::InitRequest>();
+        qRegisterMetaType<Protocol::InitData>();
+        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<const Protocol::SyncMessage&>(&InternalPeer::dispatchMessage),
+            this,
+            selectOverload<const Protocol::SyncMessage&>(&InternalPeer::handleMessage));
+    connect(peer,
+            selectOverload<const Protocol::RpcCall&>(&InternalPeer::dispatchMessage),
+            this,
+            selectOverload<const Protocol::RpcCall&>(&InternalPeer::handleMessage));
+    connect(peer,
+            selectOverload<const Protocol::InitRequest&>(&InternalPeer::dispatchMessage),
+            this,
+            selectOverload<const Protocol::InitRequest&>(&InternalPeer::handleMessage));
+    connect(peer,
+            selectOverload<const Protocol::InitData&>(&InternalPeer::dispatchMessage),
+            this,
+            selectOverload<const Protocol::InitData&>(&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<class T>
-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<T>(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<class T>
+void InternalPeer::handle(const T& msg)
 {
-    switch ((int)event->type()) {
-        case SyncMessageEvent: {
-            PeerMessageEvent<SyncMessage> *e = static_cast<PeerMessageEvent<SyncMessage> *>(event);
-            handle(e->message);
-            break;
-        }
-        case RpcCallEvent: {
-            PeerMessageEvent<RpcCall> *e = static_cast<PeerMessageEvent<RpcCall> *>(event);
-            handle(e->message);
-            break;
-        }
-        case InitRequestEvent: {
-            PeerMessageEvent<InitRequest> *e = static_cast<PeerMessageEvent<InitRequest> *>(event);
-            handle(e->message);
-            break;
+    static auto setSourcePeer = [](Peer* peer) {
+        auto p = SignalProxy::current();
+        if (p) {
+            p->setSourcePeer(peer);
         }
-        case InitDataEvent: {
-            PeerMessageEvent<InitData> *e = static_cast<PeerMessageEvent<InitData> *>(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);
 }