aboutsummaryrefslogtreecommitdiff
path: root/src/QXmppStun.cpp
diff options
context:
space:
mode:
authorJeremy Lainé <jeremy.laine@m4x.org>2010-12-09 15:51:49 +0000
committerJeremy Lainé <jeremy.laine@m4x.org>2010-12-09 15:51:49 +0000
commita0c132858ebe2962ccb7de1c008c2fc0e10d3614 (patch)
treeb799e0ecc423467279f5a7d1676e6fd437d933c3 /src/QXmppStun.cpp
parent4fcdb188810f9bd37953daad1b80b93f5b1cb463 (diff)
downloadqxmpp-a0c132858ebe2962ccb7de1c008c2fc0e10d3614.tar.gz
* improve QXmppIceComponent/QXmppIceConnection code documentation
* start STUN checks as soon as bind() is called
Diffstat (limited to 'src/QXmppStun.cpp')
-rw-r--r--src/QXmppStun.cpp47
1 files changed, 33 insertions, 14 deletions
diff --git a/src/QXmppStun.cpp b/src/QXmppStun.cpp
index 9565a233..28986cce 100644
--- a/src/QXmppStun.cpp
+++ b/src/QXmppStun.cpp
@@ -773,8 +773,8 @@ QXmppIceComponent::QXmppIceComponent(bool controlling, QObject *parent)
m_activePair(0),
m_fallbackPair(0),
m_iceControlling(controlling),
- m_stunDone(false),
- m_stunPort(0)
+ m_stunPort(0),
+ m_stunTries(0)
{
m_localUser = generateStanzaHash(4);
m_localPassword = generateStanzaHash(22);
@@ -782,6 +782,10 @@ QXmppIceComponent::QXmppIceComponent(bool controlling, QObject *parent)
m_timer = new QTimer(this);
m_timer->setInterval(500);
connect(m_timer, SIGNAL(timeout()), this, SLOT(checkCandidates()));
+
+ m_stunTimer = new QTimer(this);
+ m_stunTimer->setInterval(500);
+ connect(m_stunTimer, SIGNAL(timeout()), this, SLOT(checkStun()));
}
/// Destroys the QXmppIceComponent.
@@ -835,21 +839,28 @@ void QXmppIceComponent::checkCandidates()
writeStun(message, pair);
}
- /// Send a request to STUN server to determine server-reflexive candidate
- if (!m_stunHost.isNull() && m_stunPort != 0 && !m_stunDone)
+}
+
+void QXmppIceComponent::checkStun()
+{
+ if (m_stunHost.isNull() || !m_stunPort || m_stunTries > 10) {
+ m_stunTimer->stop();
+ return;
+ }
+
+ // Send a request to STUN server to determine server-reflexive candidate
+ foreach (QUdpSocket *socket, m_sockets)
{
- foreach (QUdpSocket *socket, m_sockets)
- {
- QXmppStunMessage msg;
- msg.setType(QXmppStunMessage::Binding | QXmppStunMessage::Request);
- msg.setId(m_stunId);
+ QXmppStunMessage msg;
+ msg.setType(QXmppStunMessage::Binding | QXmppStunMessage::Request);
+ msg.setId(m_stunId);
#ifdef QXMPP_DEBUG_STUN
- logSent(QString("STUN packet to %1 %2\n%3").arg(m_stunHost.toString(),
- QString::number(m_stunPort), msg.toString()));
+ logSent(QString("STUN packet to %1 %2\n%3").arg(m_stunHost.toString(),
+ QString::number(m_stunPort), msg.toString()));
#endif
- socket->writeDatagram(msg.encode(), m_stunHost, m_stunPort);
- }
+ socket->writeDatagram(msg.encode(), m_stunHost, m_stunPort);
}
+ m_stunTries++;
}
/// Stops ICE connectivity checks and closes the underlying sockets.
@@ -859,6 +870,7 @@ void QXmppIceComponent::close()
foreach (QUdpSocket *socket, m_sockets)
socket->close();
m_timer->stop();
+ m_stunTimer->stop();
}
/// Starts ICE connectivity checks.
@@ -1013,6 +1025,13 @@ void QXmppIceComponent::setSockets(QList<QUdpSocket*> sockets)
m_sockets << socket;
m_localCandidates << candidate;
}
+
+ // start STUN checks
+ if (!m_stunHost.isNull() && m_stunPort) {
+ m_stunTries = 0;
+ checkStun();
+ m_stunTimer->start();
+ }
}
void QXmppIceComponent::setStunServer(const QHostAddress &host, quint16 port)
@@ -1079,7 +1098,7 @@ void QXmppIceComponent::readyRead()
// check how to handle message
if (message.id() == m_stunId)
{
- m_stunDone = true;
+ m_stunTimer->stop();
// determine server-reflexive address
QHostAddress reflexiveHost;