Loading...
Searching...
No Matches
QXmppStun.h
// SPDX-FileCopyrightText: 2010 Jeremy Lainé <jeremy.laine@m4x.org>
//
// SPDX-License-Identifier: LGPL-2.1-or-later
#ifndef QXMPPSTUN_H
#define QXMPPSTUN_H
#include "QXmppJingleIq.h"
#include "QXmppLogger.h"
#include <QObject>
#include <QSet>
class CandidatePair;
class QDataStream;
class QUdpSocket;
class QTimer;
class QXmppIceComponentPrivate;
class QXmppIceConnectionPrivate;
class QXmppIcePrivate;
class QXmppIceTransport;
class QXmppStunTransaction;
namespace QXmpp {
struct StunServer;
struct TurnServer;
} // namespace QXmpp
class QXMPP_EXPORT QXmppStunMessage
{
public:
enum MethodType {
Binding = 0x1,
SharedSecret = 0x2,
Allocate = 0x3,
Refresh = 0x4,
Send = 0x6,
Data = 0x7,
CreatePermission = 0x8,
ChannelBind = 0x9
};
enum ClassType {
Request = 0x000,
Indication = 0x010,
Response = 0x100,
Error = 0x110
};
QXmppStunMessage();
quint32 cookie() const;
void setCookie(quint32 cookie);
QByteArray id() const;
void setId(const QByteArray &id);
quint16 messageClass() const;
quint16 messageMethod() const;
quint16 type() const;
void setType(quint16 type);
// attributes
quint32 changeRequest() const;
void setChangeRequest(quint32 changeRequest);
quint16 channelNumber() const;
void setChannelNumber(quint16 channelNumber);
QByteArray data() const;
void setData(const QByteArray &data);
quint32 lifetime() const;
void setLifetime(quint32 changeRequest);
QByteArray nonce() const;
void setNonce(const QByteArray &nonce);
quint32 priority() const;
void setPriority(quint32 priority);
QString realm() const;
void setRealm(const QString &realm);
QByteArray reservationToken() const;
void setReservationToken(const QByteArray &reservationToken);
quint8 requestedTransport() const;
void setRequestedTransport(quint8 requestedTransport);
QString software() const;
void setSoftware(const QString &software);
QString username() const;
void setUsername(const QString &username);
QByteArray encode(const QByteArray &key = QByteArray(), bool addFingerprint = true) const;
bool decode(const QByteArray &buffer, const QByteArray &key = QByteArray(), QStringList *errors = nullptr);
QString toString() const;
static quint16 peekType(const QByteArray &buffer, quint32 &cookie, QByteArray &id);
// attributes
int errorCode = 0;
QString errorPhrase;
QByteArray iceControlling;
QByteArray iceControlled;
QHostAddress changedHost;
quint16 changedPort = 0;
QHostAddress mappedHost;
quint16 mappedPort = 0;
QHostAddress otherHost;
quint16 otherPort = 0;
QHostAddress sourceHost;
quint16 sourcePort = 0;
QHostAddress xorMappedHost;
quint16 xorMappedPort = 0;
QHostAddress xorPeerHost;
quint16 xorPeerPort = 0;
QHostAddress xorRelayedHost;
quint16 xorRelayedPort = 0;
bool useCandidate = false;
private:
quint32 m_cookie;
QByteArray m_id;
quint16 m_type = 0;
// attributes
QSet<quint16> m_attributes;
quint32 m_changeRequest = 0;
quint16 m_channelNumber = 0;
QByteArray m_data;
quint32 m_lifetime = 0;
QByteArray m_nonce;
quint32 m_priority = 0;
QString m_realm;
quint8 m_requestedTransport = 0;
QByteArray m_reservationToken;
QString m_software;
QString m_username;
};
class QXMPP_EXPORT QXmppIceComponent : public QXmppLoggable
{
Q_OBJECT
public:
~QXmppIceComponent() override;
int component() const;
bool isConnected() const;
QList<QXmppJingleCandidate> localCandidates() const;
static QList<QHostAddress> discoverAddresses();
static QList<QUdpSocket *> reservePorts(const QList<QHostAddress> &addresses, int count, QObject *parent = nullptr);
Q_SLOT void close();
Q_SLOT void connectToHost();
Q_SLOT qint64 sendDatagram(const QByteArray &datagram);
Q_SIGNAL void connected();
Q_SIGNAL void datagramReceived(const QByteArray &datagram);
Q_SIGNAL void gatheringStateChanged();
Q_SIGNAL void localCandidatesChanged();
private:
QXmppIceComponent(int component, QXmppIcePrivate *config, QObject *parent = nullptr);
Q_SLOT void checkCandidates();
Q_SLOT void handleDatagram(const QByteArray &datagram, const QHostAddress &host, quint16 port);
Q_SLOT void turnConnected();
void handleStunResponse(QXmppIceTransport *transport, const QXmppStunMessage &response);
Q_SLOT void updateGatheringState();
const std::unique_ptr<QXmppIceComponentPrivate> d;
friend class QXmppIceComponentPrivate;
friend class QXmppIceConnection;
};
class QXMPP_EXPORT QXmppIceConnection : public QXmppLoggable
{
Q_OBJECT
Q_PROPERTY(QXmppIceConnection::GatheringState gatheringState READ gatheringState NOTIFY gatheringStateChanged)
public:
enum GatheringState {
NewGatheringState,
BusyGatheringState,
CompleteGatheringState
};
Q_ENUM(GatheringState)
QXmppIceConnection(QObject *parent = nullptr);
~QXmppIceConnection() override;
QXmppIceComponent *component(int component);
void addComponent(int component);
void setIceControlling(bool controlling);
QList<QXmppJingleCandidate> localCandidates() const;
QString localUser() const;
QString localPassword() const;
void addRemoteCandidate(const QXmppJingleCandidate &candidate);
void setRemoteUser(const QString &user);
void setRemotePassword(const QString &password);
void setStunServers(const QList<QXmpp::StunServer> &servers);
void setTurnServer(const QXmpp::TurnServer &);
#if QXMPP_DEPRECATED_SINCE(1, 11)
[[deprecated("Use setStunServers(QList<StunServer>)")]]
void setStunServers(const QList<QPair<QHostAddress, quint16>> &servers);
[[deprecated("Use setStunServers(QList<StunServer>)")]]
void setStunServer(const QHostAddress &host, quint16 port = 3478);
[[deprecated("Use setTurnServer(TurnServer)")]]
void setTurnServer(const QHostAddress &host, quint16 port = 3478);
[[deprecated("Use setTurnServer(TurnServer)")]]
void setTurnUser(const QString &user);
[[deprecated("Use setTurnServer(TurnServer)")]]
void setTurnPassword(const QString &password);
#endif
bool bind(const QList<QHostAddress> &addresses);
bool isConnected() const;
// documentation needs to be here, see https://stackoverflow.com/questions/49192523/
GatheringState gatheringState() const;
Q_SIGNAL void connected();
Q_SIGNAL void disconnected();
Q_SIGNAL void gatheringStateChanged();
Q_SIGNAL void localCandidatesChanged();
Q_SLOT void close();
Q_SLOT void connectToHost();
private:
Q_SLOT void slotConnected();
Q_SLOT void slotGatheringStateChanged();
Q_SLOT void slotTimeout();
const std::unique_ptr<QXmppIceConnectionPrivate> d;
};
#endif
QXmppIceComponent
The QXmppIceComponent class represents a piece of a media stream requiring a single transport address...
Definition QXmppStun.h:156
QXmppIceComponent::localCandidatesChanged
Q_SIGNAL void localCandidatesChanged()
This signal is emitted when the list of local candidates changes.
QXmppIceComponent::gatheringStateChanged
Q_SIGNAL void gatheringStateChanged()
This signal is emitted when the gathering state of local candidates changes.
QXmppIceComponent::sendDatagram
Q_SLOT qint64 sendDatagram(const QByteArray &datagram)
Definition QXmppStun.cpp:2483
QXmppIceComponent::isConnected
bool isConnected() const
Definition QXmppStun.cpp:2109
QXmppIceComponent::close
Q_SLOT void close()
Definition QXmppStun.cpp:2083
QXmppIceComponent::connectToHost
Q_SLOT void connectToHost()
Definition QXmppStun.cpp:2096
QXmppIceComponent::component
int component() const
Definition QXmppStun.cpp:2060
QXmppIceComponent::reservePorts
static QList< QUdpSocket * > reservePorts(const QList< QHostAddress > &addresses, int count, QObject *parent=nullptr)
Definition QXmppStun.cpp:2434
QXmppIceComponent::datagramReceived
Q_SIGNAL void datagramReceived(const QByteArray &datagram)
This signal is emitted when a data packet is received.
QXmppIceComponent::discoverAddresses
static QList< QHostAddress > discoverAddresses()
Definition QXmppStun.cpp:2387
QXmppIceComponent::connected
Q_SIGNAL void connected()
This signal is emitted once ICE negotiation succeeds.
QXmppIceComponent::localCandidates
QList< QXmppJingleCandidate > localCandidates() const
Definition QXmppStun.cpp:2117
QXmppIceConnection
The QXmppIceConnection class represents a set of UDP sockets capable of performing Interactive Connec...
Definition QXmppStun.h:228
QXmppIceConnection::connectToHost
Q_SLOT void connectToHost()
Definition QXmppStun.cpp:2643
QXmppIceConnection::gatheringStateChanged
Q_SIGNAL void gatheringStateChanged()
This signal is emitted when the gathering state of local candidates changes.
QXmppIceConnection::QXmppIceConnection
QXmppIceConnection(QObject *parent=nullptr)
Definition QXmppStun.cpp:2535
QXmppIceConnection::localCandidatesChanged
Q_SIGNAL void localCandidatesChanged()
This signal is emitted when the list of local candidates changes.
QXmppIceConnection::gatheringState
QXmppIceConnection::GatheringState gatheringState
Definition QXmppStun.h:236
QXmppIceConnection::connected
Q_SIGNAL void connected()
This signal is emitted once ICE negotiation succeeds.
QXmppIceConnection::close
Q_SLOT void close()
Definition QXmppStun.cpp:2632
QXmppIceConnection::disconnected
Q_SIGNAL void disconnected()
This signal is emitted when ICE negotiation fails.
QXmppIceConnection::GatheringState
GatheringState
Definition QXmppStun.h:244
QXmppJingleCandidate
The QXmppJingleCandidate class represents a transport candidate as specified by XEP-0176: Jingle ICE-...
Definition QXmppJingleData.h:288
QXmppLoggable::QXmppLoggable
QXmppLoggable(QObject *parent=nullptr)
Definition QXmppLogger.cpp:57
QXmpp
Definition Algorithms.h:14
QXmpp::StunServer
STUN server address.
Definition QXmppStunServer.h:19
QXmpp::TurnServer
TURN server address.
Definition QXmppTurnServer.h:19