00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef QXMPPSTUN_H
00025 #define QXMPPSTUN_H
00026
00027 #include <QObject>
00028
00029 #include "QXmppLogger.h"
00030 #include "QXmppJingleIq.h"
00031
00032 class QUdpSocket;
00033 class QTimer;
00034
00037
00038 class QXmppStunMessage
00039 {
00040 public:
00041 QXmppStunMessage();
00042
00043 QByteArray id() const;
00044 void setId(const QByteArray &id);
00045
00046 quint16 type() const;
00047 void setType(quint16 type);
00048
00049 QByteArray encode(const QString &password = QString()) const;
00050 bool decode(const QByteArray &buffer, const QString &password = QString(), QStringList *errors = 0);
00051 QString toString() const;
00052 static quint16 peekType(const QByteArray &buffer);
00053
00054
00055 int errorCode;
00056 QString errorPhrase;
00057 quint32 priority;
00058 QByteArray iceControlling;
00059 QByteArray iceControlled;
00060 QHostAddress mappedHost;
00061 quint16 mappedPort;
00062 QHostAddress otherHost;
00063 quint16 otherPort;
00064 QHostAddress xorMappedHost;
00065 quint16 xorMappedPort;
00066 QString software;
00067 QString username;
00068 bool useCandidate;
00069
00070 private:
00071 void setBodyLength(QByteArray &buffer, qint16 length) const;
00072
00073 QByteArray m_id;
00074 quint16 m_type;
00075 };
00076
00077
00081
00082 class QXmppStunSocket : public QObject
00083 {
00084 Q_OBJECT
00085
00086 public:
00087 QXmppStunSocket(bool iceControlling, QObject *parent=0);
00088 ~QXmppStunSocket();
00089
00090 QList<QXmppJingleCandidate> localCandidates() const;
00091 QString localUser() const;
00092 void setLocalUser(const QString &user);
00093 QString localPassword() const;
00094 void setLocalPassword(const QString &password);
00095
00096 int component() const;
00097 void setComponent(int component);
00098
00099 bool addRemoteCandidate(const QXmppJingleCandidate &candidate);
00100 void setRemoteUser(const QString &user);
00101 void setRemotePassword(const QString &password);
00102
00103 void close();
00104 void connectToHost();
00105 bool isConnected() const;
00106 qint64 writeDatagram(const QByteArray &datagram);
00107
00108 private slots:
00109 void checkCandidates();
00110 void readyRead();
00111
00112 signals:
00113
00114 void connected();
00115
00116
00117 void datagramReceived(const QByteArray &datagram);
00118
00120 void logMessage(QXmppLogger::MessageType type, const QString &msg);
00121
00122 private:
00123 class Pair {
00124 public:
00125 Pair();
00126 QString toString() const;
00127
00128 QIODevice::OpenMode checked;
00129 quint32 priority;
00130 QXmppJingleCandidate remote;
00131 QXmppJingleCandidate reflexive;
00132 QByteArray transaction;
00133 };
00134
00135 Pair *addRemoteCandidate(const QHostAddress &host, quint16 port);
00136 void debug(const QString &message, QXmppLogger::MessageType = QXmppLogger::DebugMessage);
00137 qint64 writeStun(const QXmppStunMessage &message, QXmppStunSocket::Pair *pair);
00138
00139 int m_component;
00140
00141 QString m_localUser;
00142 QString m_localPassword;
00143
00144 Pair *m_activePair;
00145 bool m_iceControlling;
00146 QList<Pair*> m_pairs;
00147 QString m_remoteUser;
00148 QString m_remotePassword;
00149
00150 QUdpSocket *m_socket;
00151 QTimer *m_timer;
00152 };
00153
00154 #endif