29 #include "QXmppLogger.h"
30 #include "QXmppJingleIq.h"
41 class QXMPP_EXPORT QXmppStunMessage
51 CreatePermission = 0x8,
64 quint32 cookie()
const;
65 void setCookie(quint32 cookie);
67 QByteArray id()
const;
68 void setId(
const QByteArray &
id);
70 quint16 messageClass()
const;
71 quint16 messageMethod()
const;
74 void setType(quint16 type);
78 quint32 changeRequest()
const;
79 void setChangeRequest(quint32 changeRequest);
81 quint16 channelNumber()
const;
82 void setChannelNumber(quint16 channelNumber);
84 QByteArray data()
const;
85 void setData(
const QByteArray &data);
87 quint32 lifetime()
const;
88 void setLifetime(quint32 changeRequest);
90 QByteArray nonce()
const;
91 void setNonce(
const QByteArray &nonce);
93 quint32 priority()
const;
94 void setPriority(quint32 priority);
96 QString realm()
const;
97 void setRealm(
const QString &realm);
99 QByteArray reservationToken()
const;
100 void setReservationToken(
const QByteArray &reservationToken);
102 quint8 requestedTransport()
const;
103 void setRequestedTransport(quint8 requestedTransport);
105 QString software()
const;
106 void setSoftware(
const QString &software);
108 QString username()
const;
109 void setUsername(
const QString &username);
111 QByteArray encode(
const QByteArray &key = QByteArray(),
bool addFingerprint =
true)
const;
112 bool decode(
const QByteArray &buffer,
const QByteArray &key = QByteArray(), QStringList *errors = 0);
113 QString toString()
const;
114 static quint16 peekType(
const QByteArray &buffer, quint32 &cookie, QByteArray &
id);
119 QByteArray iceControlling;
120 QByteArray iceControlled;
121 QHostAddress changedHost;
123 QHostAddress mappedHost;
125 QHostAddress otherHost;
127 QHostAddress sourceHost;
129 QHostAddress xorMappedHost;
130 quint16 xorMappedPort;
131 QHostAddress xorPeerHost;
133 QHostAddress xorRelayedHost;
134 quint16 xorRelayedPort;
143 QSet<quint16> m_attributes;
144 quint32 m_changeRequest;
145 quint16 m_channelNumber;
151 quint8 m_requestedTransport;
152 QByteArray m_reservationToken;
162 class QXMPP_EXPORT QXmppStunTransaction :
public QXmppLoggable
167 QXmppStunTransaction(
const QXmppStunMessage &request, QObject *parent);
168 QXmppStunMessage request()
const;
169 QXmppStunMessage response()
const;
173 void writeStun(
const QXmppStunMessage &request);
176 void readStun(
const QXmppStunMessage &response);
182 QXmppStunMessage m_request;
183 QXmppStunMessage m_response;
184 QTimer *m_retryTimer;
194 class QXMPP_EXPORT QXmppTurnAllocation :
public QXmppLoggable
207 QXmppTurnAllocation(QObject *parent = 0);
208 ~QXmppTurnAllocation();
210 QHostAddress relayedHost()
const;
211 quint16 relayedPort()
const;
212 AllocationState state()
const;
214 void setServer(
const QHostAddress &host, quint16 port = 3478);
215 void setUser(
const QString &user);
216 void setPassword(
const QString &password);
218 qint64 writeDatagram(
const QByteArray &data,
const QHostAddress &host, quint16 port);
225 void datagramReceived(
const QByteArray &data,
const QHostAddress &host, quint16 port);
231 void connectToHost();
232 void disconnectFromHost();
237 void refreshChannels();
238 void transactionFinished();
239 void writeStun(
const QXmppStunMessage &message);
242 void handleDatagram(
const QByteArray &datagram,
const QHostAddress &host, quint16 port);
243 void setState(AllocationState state);
247 QTimer *m_channelTimer;
250 QHostAddress m_relayedHost;
251 quint16 m_relayedPort;
252 QHostAddress m_turnHost;
256 typedef QPair<QHostAddress, quint16> Address;
257 quint16 m_channelNumber;
258 QMap<quint16, Address> m_channels;
265 AllocationState m_state;
266 QList<QXmppStunTransaction*> m_transactions;
280 void setIceControlling(
bool controlling);
281 void setStunServer(
const QHostAddress &host, quint16 port);
282 void setTurnServer(
const QHostAddress &host, quint16 port);
283 void setTurnUser(
const QString &user);
284 void setTurnPassword(
const QString &password);
286 QList<QXmppJingleCandidate> localCandidates()
const;
287 void setLocalUser(
const QString &user);
288 void setLocalPassword(
const QString &password);
290 int component()
const;
291 void setComponent(
int component);
294 void setRemoteUser(
const QString &user);
295 void setRemotePassword(
const QString &password);
297 bool isConnected()
const;
298 void setSockets(QList<QUdpSocket*> sockets);
300 static QList<QHostAddress> discoverAddresses();
301 static QList<QUdpSocket*> reservePorts(
const QList<QHostAddress> &addresses,
int count, QObject *parent = 0);
305 void connectToHost();
306 qint64 sendDatagram(
const QByteArray &datagram);
309 void checkCandidates();
311 void handleDatagram(
const QByteArray &datagram,
const QHostAddress &host, quint16 port, QUdpSocket *socket = 0);
313 void turnConnected();
320 void datagramReceived(
const QByteArray &datagram);
323 void localCandidatesChanged();
328 Pair(
int component,
bool controlling);
329 quint64 priority()
const;
330 QString toString()
const;
332 QIODevice::OpenMode checked;
335 QByteArray transaction;
343 Pair *addRemoteCandidate(QUdpSocket *socket,
const QHostAddress &host, quint16 port, quint32 priority);
344 qint64 writeStun(
const QXmppStunMessage &message, QXmppIceComponent::Pair *pair);
348 QList<QXmppJingleCandidate> m_localCandidates;
350 QString m_localPassword;
353 Pair *m_fallbackPair;
354 bool m_iceControlling;
355 QList<Pair*> m_pairs;
356 quint32 m_peerReflexivePriority;
357 QString m_remoteUser;
358 QString m_remotePassword;
360 QList<QUdpSocket*> m_sockets;
365 QHostAddress m_stunHost;
371 QXmppTurnAllocation *m_turnAllocation;
372 bool m_turnConfigured;
387 void addComponent(
int component);
388 void setIceControlling(
bool controlling);
390 QList<QXmppJingleCandidate> localCandidates()
const;
391 QString localUser()
const;
392 void setLocalUser(
const QString &user);
393 QString localPassword()
const;
394 void setLocalPassword(
const QString &password);
397 void setRemoteUser(
const QString &user);
398 void setRemotePassword(
const QString &password);
400 void setStunServer(
const QHostAddress &host, quint16 port = 3478);
401 void setTurnServer(
const QHostAddress &host, quint16 port = 3478);
402 void setTurnUser(
const QString &user);
403 void setTurnPassword(
const QString &password);
405 bool bind(
const QList<QHostAddress> &addresses);
406 bool isConnected()
const;
416 void localCandidatesChanged();
420 void connectToHost();
423 void slotConnected();
427 QTimer *m_connectTimer;
428 bool m_iceControlling;
429 QMap<int, QXmppIceComponent*> m_components;
431 QString m_localPassword;
432 QHostAddress m_stunHost;
434 QHostAddress m_turnHost;
437 QString m_turnPassword;