QXmpp Version: 0.9.3
QXmppStun.h
1/*
2 * Copyright (C) 2008-2014 The QXmpp developers
3 *
4 * Author:
5 * Jeremy Lainé
6 *
7 * Source:
8 * https://github.com/qxmpp-project/qxmpp
9 *
10 * This file is a part of QXmpp library.
11 *
12 * This library is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public
14 * License as published by the Free Software Foundation; either
15 * version 2.1 of the License, or (at your option) any later version.
16 *
17 * This library is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * Lesser General Public License for more details.
21 *
22 */
23
24#ifndef QXMPPSTUN_H
25#define QXMPPSTUN_H
26
27#include <QObject>
28
29#include "QXmppLogger.h"
30#include "QXmppJingleIq.h"
31
32class CandidatePair;
33class QDataStream;
34class QUdpSocket;
35class QTimer;
36class QXmppIceComponentPrivate;
37class QXmppIceConnectionPrivate;
38class QXmppIcePrivate;
39
44
45class QXMPP_EXPORT QXmppStunMessage
46{
47public:
48 enum MethodType {
49 Binding = 0x1,
50 SharedSecret = 0x2,
51 Allocate = 0x3,
52 Refresh = 0x4,
53 Send = 0x6,
54 Data = 0x7,
55 CreatePermission = 0x8,
56 ChannelBind = 0x9
57 };
58
59 enum ClassType {
60 Request = 0x000,
61 Indication = 0x010,
62 Response = 0x100,
63 Error = 0x110
64 };
65
66 QXmppStunMessage();
67
68 quint32 cookie() const;
69 void setCookie(quint32 cookie);
70
71 QByteArray id() const;
72 void setId(const QByteArray &id);
73
74 quint16 messageClass() const;
75 quint16 messageMethod() const;
76
77 quint16 type() const;
78 void setType(quint16 type);
79
80 // attributes
81
82 quint32 changeRequest() const;
83 void setChangeRequest(quint32 changeRequest);
84
85 quint16 channelNumber() const;
86 void setChannelNumber(quint16 channelNumber);
87
88 QByteArray data() const;
89 void setData(const QByteArray &data);
90
91 quint32 lifetime() const;
92 void setLifetime(quint32 changeRequest);
93
94 QByteArray nonce() const;
95 void setNonce(const QByteArray &nonce);
96
97 quint32 priority() const;
98 void setPriority(quint32 priority);
99
100 QString realm() const;
101 void setRealm(const QString &realm);
102
103 QByteArray reservationToken() const;
104 void setReservationToken(const QByteArray &reservationToken);
105
106 quint8 requestedTransport() const;
107 void setRequestedTransport(quint8 requestedTransport);
108
109 QString software() const;
110 void setSoftware(const QString &software);
111
112 QString username() const;
113 void setUsername(const QString &username);
114
115 QByteArray encode(const QByteArray &key = QByteArray(), bool addFingerprint = true) const;
116 bool decode(const QByteArray &buffer, const QByteArray &key = QByteArray(), QStringList *errors = 0);
117 QString toString() const;
118 static quint16 peekType(const QByteArray &buffer, quint32 &cookie, QByteArray &id);
119
120 // attributes
121 int errorCode;
122 QString errorPhrase;
123 QByteArray iceControlling;
124 QByteArray iceControlled;
125 QHostAddress changedHost;
126 quint16 changedPort;
127 QHostAddress mappedHost;
128 quint16 mappedPort;
129 QHostAddress otherHost;
130 quint16 otherPort;
131 QHostAddress sourceHost;
132 quint16 sourcePort;
133 QHostAddress xorMappedHost;
134 quint16 xorMappedPort;
135 QHostAddress xorPeerHost;
136 quint16 xorPeerPort;
137 QHostAddress xorRelayedHost;
138 quint16 xorRelayedPort;
139 bool useCandidate;
140
141private:
142 quint32 m_cookie;
143 QByteArray m_id;
144 quint16 m_type;
145
146 // attributes
147 QSet<quint16> m_attributes;
148 quint32 m_changeRequest;
149 quint16 m_channelNumber;
150 QByteArray m_data;
151 quint32 m_lifetime;
152 QByteArray m_nonce;
153 quint32 m_priority;
154 QString m_realm;
155 quint8 m_requestedTransport;
156 QByteArray m_reservationToken;
157 QString m_software;
158 QString m_username;
159};
160
164
165class QXMPP_EXPORT QXmppIceComponent : public QXmppLoggable
166{
167 Q_OBJECT
168
169public:
171
172 int component() const;
173 bool isConnected() const;
174 QList<QXmppJingleCandidate> localCandidates() const;
175
176 static QList<QHostAddress> discoverAddresses();
177 static QList<QUdpSocket*> reservePorts(const QList<QHostAddress> &addresses, int count, QObject *parent = 0);
178
179public slots:
180 void close();
181 void connectToHost();
182 qint64 sendDatagram(const QByteArray &datagram);
183
184private slots:
185 void checkCandidates();
186 void handleDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port);
187 void turnConnected();
188 void transactionFinished();
189 void updateGatheringState();
190 void writeStun(const QXmppStunMessage &request);
191
192signals:
194 void connected();
195
197 void datagramReceived(const QByteArray &datagram);
198
200 void gatheringStateChanged();
201
204
205private:
206 QXmppIceComponent(int component, QXmppIcePrivate *config, QObject *parent=0);
207
208 QXmppIceComponentPrivate *d;
209 friend class QXmppIceComponentPrivate;
210 friend class QXmppIceConnection;
211};
212
240
241class QXMPP_EXPORT QXmppIceConnection : public QXmppLoggable
242{
243 Q_OBJECT
244 Q_ENUMS(GatheringState)
245 Q_PROPERTY(QXmppIceConnection::GatheringState gatheringState READ gatheringState NOTIFY gatheringStateChanged)
246
247public:
248 enum GatheringState
249 {
250 NewGatheringState,
251 BusyGatheringState,
252 CompleteGatheringState
253 };
254
255 QXmppIceConnection(QObject *parent = 0);
257
258 QXmppIceComponent *component(int component);
259 void addComponent(int component);
260 void setIceControlling(bool controlling);
261
262 QList<QXmppJingleCandidate> localCandidates() const;
263 QString localUser() const;
264 QString localPassword() const;
265
266 void addRemoteCandidate(const QXmppJingleCandidate &candidate);
267 void setRemoteUser(const QString &user);
268 void setRemotePassword(const QString &password);
269
270 void setStunServer(const QHostAddress &host, quint16 port = 3478);
271 void setTurnServer(const QHostAddress &host, quint16 port = 3478);
272 void setTurnUser(const QString &user);
273 void setTurnPassword(const QString &password);
274
275 bool bind(const QList<QHostAddress> &addresses);
276 bool isConnected() const;
277
278 GatheringState gatheringState() const;
279
280signals:
282 void connected();
283
286
289
292
293public slots:
294 void close();
295 void connectToHost();
296
297private slots:
298 void slotConnected();
299 void slotGatheringStateChanged();
300 void slotTimeout();
301
302private:
303 QXmppIceConnectionPrivate *d;
304};
305
306#endif
The QXmppIceComponent class represents a piece of a media stream requiring a single transport address...
Definition: QXmppStun.h:166
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:242
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.
The QXmppJingleCandidate class represents a transport candidate as specified by XEP-0176: Jingle ICE-...
Definition: QXmppJingleIq.h:85
The QXmppLoggable class represents a source of logging messages.
Definition: QXmppLogger.h:112