QssParser: Interpret "oblique" as italic
[quassel.git] / src / common / internalpeer.cpp
index 90bde5b..30b4669 100644 (file)
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright (C) 2005-2013 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  *
  *   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;
-};
-
-
 InternalPeer::InternalPeer(QObject *parent)
-    : Peer(0, parent),
-    _proxy(0),
-    _peer(0),
-    _isOpen(true)
+    : 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();
+    }
 }
 
 
@@ -59,6 +53,18 @@ QString InternalPeer::description() const
 }
 
 
+QString InternalPeer::address() const
+{
+    return tr("internal connection");
+}
+
+
+quint16 InternalPeer::port() const
+{
+    return 0;
+}
+
+
 bool InternalPeer::isOpen() const
 {
     return true;
@@ -100,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();
@@ -119,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();
@@ -141,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<class T>
-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<T>(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<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;
-        }
-        case InitDataEvent: {
-            PeerMessageEvent<InitData> *e = static_cast<PeerMessageEvent<InitData> *>(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<class T>
+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);
 }