QXmpp Version: 1.10.0
QXmppStun.h
1// SPDX-FileCopyrightText: 2010 Jeremy Lainé <jeremy.laine@m4x.org>
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4
5#ifndef QXMPPSTUN_H
6#define QXMPPSTUN_H
7
8#include "QXmppJingleIq.h"
9#include "QXmppLogger.h"
10
11#include <QObject>
12
13class CandidatePair;
14class QDataStream;
15class QUdpSocket;
16class QTimer;
17class QXmppIceComponentPrivate;
18class QXmppIceConnectionPrivate;
19class QXmppIcePrivate;
20
26class QXMPP_EXPORT QXmppStunMessage
27{
28public:
29 enum MethodType {
30 Binding = 0x1,
31 SharedSecret = 0x2,
32 Allocate = 0x3,
33 Refresh = 0x4,
34 Send = 0x6,
35 Data = 0x7,
36 CreatePermission = 0x8,
37 ChannelBind = 0x9
38 };
39
40 enum ClassType {
41 Request = 0x000,
42 Indication = 0x010,
43 Response = 0x100,
44 Error = 0x110
45 };
46
47 QXmppStunMessage();
48
49 quint32 cookie() const;
50 void setCookie(quint32 cookie);
51
52 QByteArray id() const;
53 void setId(const QByteArray &id);
54
55 quint16 messageClass() const;
56 quint16 messageMethod() const;
57
58 quint16 type() const;
59 void setType(quint16 type);
60
61 // attributes
62
63 quint32 changeRequest() const;
64 void setChangeRequest(quint32 changeRequest);
65
66 quint16 channelNumber() const;
67 void setChannelNumber(quint16 channelNumber);
68
69 QByteArray data() const;
70 void setData(const QByteArray &data);
71
72 quint32 lifetime() const;
73 void setLifetime(quint32 changeRequest);
74
75 QByteArray nonce() const;
76 void setNonce(const QByteArray &nonce);
77
78 quint32 priority() const;
79 void setPriority(quint32 priority);
80
81 QString realm() const;
82 void setRealm(const QString &realm);
83
84 QByteArray reservationToken() const;
85 void setReservationToken(const QByteArray &reservationToken);
86
87 quint8 requestedTransport() const;
88 void setRequestedTransport(quint8 requestedTransport);
89
90 QString software() const;
91 void setSoftware(const QString &software);
92
93 QString username() const;
94 void setUsername(const QString &username);
95
96 QByteArray encode(const QByteArray &key = QByteArray(), bool addFingerprint = true) const;
97 bool decode(const QByteArray &buffer, const QByteArray &key = QByteArray(), QStringList *errors = nullptr);
98 QString toString() const;
99 static quint16 peekType(const QByteArray &buffer, quint32 &cookie, QByteArray &id);
100
101 // attributes
102 int errorCode;
103 QString errorPhrase;
104 QByteArray iceControlling;
105 QByteArray iceControlled;
106 QHostAddress changedHost;
107 quint16 changedPort;
108 QHostAddress mappedHost;
109 quint16 mappedPort;
110 QHostAddress otherHost;
111 quint16 otherPort;
112 QHostAddress sourceHost;
113 quint16 sourcePort;
114 QHostAddress xorMappedHost;
115 quint16 xorMappedPort;
116 QHostAddress xorPeerHost;
117 quint16 xorPeerPort;
118 QHostAddress xorRelayedHost;
119 quint16 xorRelayedPort;
120 bool useCandidate;
121
122private:
123 quint32 m_cookie;
124 QByteArray m_id;
125 quint16 m_type;
126
127 // attributes
128 QSet<quint16> m_attributes;
129 quint32 m_changeRequest;
130 quint16 m_channelNumber;
131 QByteArray m_data;
132 quint32 m_lifetime;
133 QByteArray m_nonce;
134 quint32 m_priority;
135 QString m_realm;
136 quint8 m_requestedTransport;
137 QByteArray m_reservationToken;
138 QString m_software;
139 QString m_username;
140};
141
147class QXMPP_EXPORT QXmppIceComponent : public QXmppLoggable
148{
149 Q_OBJECT
150
151public:
152 ~QXmppIceComponent() override;
153
154 int component() const;
155 bool isConnected() const;
156 QList<QXmppJingleCandidate> localCandidates() const;
157
158 static QList<QHostAddress> discoverAddresses();
159 static QList<QUdpSocket *> reservePorts(const QList<QHostAddress> &addresses, int count, QObject *parent = nullptr);
160
161public Q_SLOTS:
162 void close();
163 void connectToHost();
164 qint64 sendDatagram(const QByteArray &datagram);
165
166private Q_SLOTS:
167 void checkCandidates();
168 void handleDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port);
169 void turnConnected();
170 void transactionFinished();
171 void updateGatheringState();
172 void writeStun(const QXmppStunMessage &request);
173
174Q_SIGNALS:
176 void connected();
177
179 void datagramReceived(const QByteArray &datagram);
180
183
186
187private:
188 QXmppIceComponent(int component, QXmppIcePrivate *config, QObject *parent = nullptr);
189
190 const std::unique_ptr<QXmppIceComponentPrivate> d;
191 friend class QXmppIceComponentPrivate;
192 friend class QXmppIceConnection;
193};
194
223class QXMPP_EXPORT QXmppIceConnection : public QXmppLoggable
224{
225 Q_OBJECT
226
232 Q_PROPERTY(QXmppIceConnection::GatheringState gatheringState READ gatheringState NOTIFY gatheringStateChanged)
233
234public:
241 NewGatheringState,
242 BusyGatheringState,
243 CompleteGatheringState
244 };
245 Q_ENUM(GatheringState)
246
247 QXmppIceConnection(QObject *parent = nullptr);
248 ~QXmppIceConnection() override;
249
250 QXmppIceComponent *component(int component);
251 void addComponent(int component);
252 void setIceControlling(bool controlling);
253
254 QList<QXmppJingleCandidate> localCandidates() const;
255 QString localUser() const;
256 QString localPassword() const;
257
258 void addRemoteCandidate(const QXmppJingleCandidate &candidate);
259 void setRemoteUser(const QString &user);
260 void setRemotePassword(const QString &password);
261
262 void setStunServers(const QList<QPair<QHostAddress, quint16>> &servers);
263 void setStunServer(const QHostAddress &host, quint16 port = 3478);
264 void setTurnServer(const QHostAddress &host, quint16 port = 3478);
265 void setTurnUser(const QString &user);
266 void setTurnPassword(const QString &password);
267
268 bool bind(const QList<QHostAddress> &addresses);
269 bool isConnected() const;
270
271 // documentation needs to be here, see https://stackoverflow.com/questions/49192523/
278 GatheringState gatheringState() const;
279
280Q_SIGNALS:
282 void connected();
283
286
293
296
297public Q_SLOTS:
298 void close();
299 void connectToHost();
300
301private Q_SLOTS:
302 void slotConnected();
303 void slotGatheringStateChanged();
304 void slotTimeout();
305
306private:
307 const std::unique_ptr<QXmppIceConnectionPrivate> d;
308};
309
310#endif
The QXmppIceComponent class represents a piece of a media stream requiring a single transport address...
Definition: QXmppStun.h:148
void gatheringStateChanged()
This signal is emitted when the gathering state of local candidates changes.
void localCandidatesChanged()
This signal is emitted when the list of local candidates changes.
void datagramReceived(const QByteArray &datagram)
This signal is emitted when a data packet is received.
void connected()
This signal is emitted once ICE negotiation succeeds.
The QXmppIceConnection class represents a set of UDP sockets capable of performing Interactive Connec...
Definition: QXmppStun.h:224
void localCandidatesChanged()
This signal is emitted when the list of local candidates changes.
void gatheringStateChanged()
This signal is emitted when the gathering state of local candidates changes.
void disconnected()
This signal is emitted when ICE negotiation fails.
void connected()
This signal is emitted once ICE negotiation succeeds.
GatheringState
Definition: QXmppStun.h:240
The QXmppJingleCandidate class represents a transport candidate as specified by XEP-0176: Jingle ICE-...
Definition: QXmppJingleData.h:278
The QXmppLoggable class represents a source of logging messages.
Definition: QXmppLogger.h:110