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