modernize: Replace most remaining old-style connects by PMF ones
[quassel.git] / src / common / internalpeer.cpp
1 /***************************************************************************
2  *   Copyright (C) 2005-2018 by the Quassel Project                        *
3  *   devel@quassel-irc.org                                                 *
4  *                                                                         *
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.                                           *
9  *                                                                         *
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.                          *
14  *                                                                         *
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  ***************************************************************************/
20
21 #include "internalpeer.h"
22 #include "util.h"
23
24 using namespace Protocol;
25
26 InternalPeer::InternalPeer(QObject *parent)
27     : Peer(nullptr, parent)
28 {
29     static bool registered = []() {
30         qRegisterMetaType<QPointer<InternalPeer>>();
31         qRegisterMetaType<Protocol::SyncMessage>();
32         qRegisterMetaType<Protocol::RpcCall>();
33         qRegisterMetaType<Protocol::InitRequest>();
34         qRegisterMetaType<Protocol::InitData>();
35         return true;
36     }();
37     Q_UNUSED(registered)
38
39     setFeatures(Quassel::Features{});
40 }
41
42
43 InternalPeer::~InternalPeer()
44 {
45     if (_isOpen) {
46         emit disconnected();
47     }
48 }
49
50
51 QString InternalPeer::description() const
52 {
53     return tr("internal connection");
54 }
55
56
57 QString InternalPeer::address() const
58 {
59     return tr("internal connection");
60 }
61
62
63 quint16 InternalPeer::port() const
64 {
65     return 0;
66 }
67
68
69 bool InternalPeer::isOpen() const
70 {
71     return _isOpen;
72 }
73
74
75 bool InternalPeer::isSecure() const
76 {
77     return true;
78 }
79
80
81 bool InternalPeer::isLocal() const
82 {
83     return true;
84 }
85
86
87 void InternalPeer::close(const QString &reason)
88 {
89     Q_UNUSED(reason);
90     _isOpen = false;
91 }
92
93
94 int InternalPeer::lag() const
95 {
96     return 0;
97 }
98
99
100 ::SignalProxy *InternalPeer::signalProxy() const
101 {
102     return _proxy;
103 }
104
105
106 void InternalPeer::setSignalProxy(::SignalProxy *proxy)
107 {
108     if (!proxy && _proxy) {
109         _proxy = nullptr;
110         if (_isOpen) {
111             _isOpen = false;
112             emit disconnected();
113         }
114         return;
115     }
116
117     if (proxy && !_proxy) {
118         _proxy = proxy;
119         _isOpen = true;
120         return;
121     }
122
123     qWarning() << Q_FUNC_INFO << "Changing the SignalProxy is not supported!";
124 }
125
126
127 void InternalPeer::setPeer(InternalPeer *peer)
128 {
129     connect(peer, selectOverload<const Protocol::SyncMessage&>(&InternalPeer::dispatchMessage),
130             this, selectOverload<const Protocol::SyncMessage&>(&InternalPeer::handleMessage));
131     connect(peer, selectOverload<const Protocol::RpcCall&>(&InternalPeer::dispatchMessage),
132             this, selectOverload<const Protocol::RpcCall&>(&InternalPeer::handleMessage));
133     connect(peer, selectOverload<const Protocol::InitRequest&>(&InternalPeer::dispatchMessage),
134             this, selectOverload<const Protocol::InitRequest&>(&InternalPeer::handleMessage));
135     connect(peer, selectOverload<const Protocol::InitData&>(&InternalPeer::dispatchMessage),
136             this, selectOverload<const Protocol::InitData&>(&InternalPeer::handleMessage));
137
138     connect(peer, &Peer::disconnected, this, &InternalPeer::peerDisconnected);
139
140     _isOpen = true;
141 }
142
143
144 void InternalPeer::peerDisconnected()
145 {
146     disconnect(sender(), nullptr, this, nullptr);
147     if (_isOpen) {
148         _isOpen = false;
149         emit disconnected();
150     }
151 }
152
153
154 void InternalPeer::dispatch(const SyncMessage &msg)
155 {
156     emit dispatchMessage(msg);
157 }
158
159
160 void InternalPeer::dispatch(const RpcCall &msg)
161 {
162     emit dispatchMessage(msg);
163 }
164
165
166 void InternalPeer::dispatch(const InitRequest &msg)
167 {
168     emit dispatchMessage(msg);
169 }
170
171
172 void InternalPeer::dispatch(const InitData &msg)
173 {
174     emit dispatchMessage(msg);
175 }
176
177
178 void InternalPeer::handleMessage(const Protocol::SyncMessage &msg)
179 {
180     handle(msg);
181 }
182
183
184 void InternalPeer::handleMessage(const Protocol::RpcCall &msg)
185 {
186     handle(msg);
187 }
188
189
190 void InternalPeer::handleMessage(const Protocol::InitRequest &msg)
191 {
192     handle(msg);
193 }
194
195
196 void InternalPeer::handleMessage(const Protocol::InitData &msg)
197 {
198     handle(msg);
199 }
200
201
202 template<class T>
203 void InternalPeer::handle(const T &msg)
204 {
205     static auto setSourcePeer = [](Peer *peer) {
206         auto p = SignalProxy::current();
207         if (p) {
208             p->setSourcePeer(peer);
209         }
210     };
211
212     setSourcePeer(this);
213     Peer::handle(msg);
214     setSourcePeer(nullptr);
215 }