QXmpp Version: 1.9.2
 
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
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
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.
qint64 sendDatagram(const QByteArray &datagram)
Definition QXmppStun.cpp:2504
bool isConnected() const
Definition QXmppStun.cpp:2094
void close()
Definition QXmppStun.cpp:2068
void localCandidatesChanged()
This signal is emitted when the list of local candidates changes.
void connectToHost()
Definition QXmppStun.cpp:2081
void datagramReceived(const QByteArray &datagram)
This signal is emitted when a data packet is received.
int component() const
Definition QXmppStun.cpp:2045
static QList< QUdpSocket * > reservePorts(const QList< QHostAddress > &addresses, int count, QObject *parent=nullptr)
Definition QXmppStun.cpp:2455
static QList< QHostAddress > discoverAddresses()
Definition QXmppStun.cpp:2408
void connected()
This signal is emitted once ICE negotiation succeeds.
QList< QXmppJingleCandidate > localCandidates() const
Definition QXmppStun.cpp:2102
The QXmppIceConnection class represents a set of UDP sockets capable of performing Interactive Connec...
Definition QXmppStun.h:224
void connectToHost()
Definition QXmppStun.cpp:2688
void localCandidatesChanged()
This signal is emitted when the list of local candidates changes.
QXmppIceConnection(QObject *parent=nullptr)
Definition QXmppStun.cpp:2579
QXmppIceConnection::GatheringState gatheringState
Definition QXmppStun.h:232
void gatheringStateChanged()
This signal is emitted when the gathering state of local candidates changes.
void close()
Definition QXmppStun.cpp:2677
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
QXmppLoggable(QObject *parent=nullptr)
Definition QXmppLogger.cpp:57