1 /***************************************************************************
2 * Copyright (C) 2005-2016 by the Quassel Project *
3 * devel@quassel-irc.org *
5 * This program is free software; you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation; either version 2 of the License, or *
8 * (at your option) version 3. *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with this program; if not, write to the *
17 * Free Software Foundation, Inc., *
18 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
19 ***************************************************************************/
21 #include <QCoreApplication>
24 #include "internalpeer.h"
26 using namespace Protocol;
29 class PeerMessageEvent : public QEvent
32 PeerMessageEvent(InternalPeer *sender, InternalPeer::EventType eventType, const T &message)
33 : QEvent(QEvent::Type(eventType)), sender(sender), message(message)
41 InternalPeer::InternalPeer(QObject *parent)
47 setFeatures(Quassel::Features{});
51 InternalPeer::~InternalPeer()
58 QString InternalPeer::description() const
60 return tr("internal connection");
63 QString InternalPeer::address() const
65 return tr("internal connection");
68 quint16 InternalPeer::port() const
73 bool InternalPeer::isOpen() const
79 bool InternalPeer::isSecure() const
85 bool InternalPeer::isLocal() const
91 void InternalPeer::close(const QString &reason)
95 qWarning() << "closing not implemented!";
99 int InternalPeer::lag() const
105 ::SignalProxy *InternalPeer::signalProxy() const
111 void InternalPeer::setSignalProxy(::SignalProxy *proxy)
113 if (!proxy && _proxy) {
122 if (proxy && !_proxy) {
127 qWarning() << Q_FUNC_INFO << "Changing the SignalProxy is not supported!";
131 void InternalPeer::setPeer(InternalPeer *peer)
134 qWarning() << Q_FUNC_INFO << "Peer already set, ignoring!";
138 connect(peer, SIGNAL(disconnected()), SLOT(peerDisconnected()));
142 void InternalPeer::peerDisconnected()
144 disconnect(_peer, 0, this, 0);
153 void InternalPeer::dispatch(const SyncMessage &msg)
155 dispatch(SyncMessageEvent, msg);
159 void InternalPeer::dispatch(const RpcCall &msg)
161 dispatch(RpcCallEvent, msg);
165 void InternalPeer::dispatch(const InitRequest &msg)
167 dispatch(InitRequestEvent, msg);
171 void InternalPeer::dispatch(const InitData &msg)
173 dispatch(InitDataEvent, msg);
179 void setSourcePeer(Peer* peer)
181 auto p = SignalProxy::current();
183 p->setSourcePeer(peer);
190 void InternalPeer::dispatch(EventType eventType, const T &msg)
193 qWarning() << Q_FUNC_INFO << "Cannot dispatch a message without a peer!";
197 // The peers always live in different threads, so use an event for thread-safety
198 QCoreApplication::postEvent(_peer, new PeerMessageEvent<T>(this, eventType, msg));
202 void InternalPeer::customEvent(QEvent *event)
206 switch ((int)event->type()) {
207 case SyncMessageEvent: {
208 handle(static_cast<PeerMessageEvent<SyncMessage> *>(event)->message);
212 handle(static_cast<PeerMessageEvent<RpcCall> *>(event)->message);
215 case InitRequestEvent: {
216 handle(static_cast<PeerMessageEvent<InitRequest> *>(event)->message);
219 case InitDataEvent: {
220 handle(static_cast<PeerMessageEvent<InitData> *>(event)->message);
225 qWarning() << Q_FUNC_INFO << "Received unknown custom event:" << event->type();
226 setSourcePeer(nullptr);
230 setSourcePeer(nullptr);