diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2011-03-25 11:27:57 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2011-03-25 11:27:57 +0000 |
| commit | 8d254877fafb1bf930d1251916d99faa080453a9 (patch) | |
| tree | ca6ba73240151a4e66feb2ffcde3bab460ffd5d7 /src/QXmppStun.cpp | |
| parent | c604d85c48b0364517111ab09b4ffd412f84ec04 (diff) | |
| download | qxmpp-8d254877fafb1bf930d1251916d99faa080453a9.tar.gz | |
simplify TURN allocation connect/disconnect
Diffstat (limited to 'src/QXmppStun.cpp')
| -rw-r--r-- | src/QXmppStun.cpp | 66 |
1 files changed, 34 insertions, 32 deletions
diff --git a/src/QXmppStun.cpp b/src/QXmppStun.cpp index 6353b742..2fa37076 100644 --- a/src/QXmppStun.cpp +++ b/src/QXmppStun.cpp @@ -1167,23 +1167,12 @@ QXmppTurnAllocation::QXmppTurnAllocation(QObject *parent) Q_ASSERT(check); } -/// Binds the local socket. +/// Destroys the TURN allocation. -bool QXmppTurnAllocation::bind(const QHostAddress &address, quint16 port) +QXmppTurnAllocation::~QXmppTurnAllocation() { - return socket->bind(address, port); -} - -/// Disconnects from the server and closes the local socket. - -void QXmppTurnAllocation::close() -{ - disconnectFromHost(); - socket->close(); - foreach (QXmppStunTransaction *transaction, m_transactions) - delete transaction; - m_transactions.clear(); - setState(UnconnectedState); + if (m_state == ConnectedState) + disconnectFromHost(); } /// Allocates the TURN allocation. @@ -1193,6 +1182,14 @@ void QXmppTurnAllocation::connectToHost() if (m_state != UnconnectedState) return; + // start listening for UDP + if (socket->state() == QAbstractSocket::UnconnectedState) { + if (!socket->bind()) { + warning("Could not start listening for TURN"); + return; + } + } + // send allocate request QXmppStunMessage request; request.setType(QXmppStunMessage::Allocate | QXmppStunMessage::Request); @@ -1211,21 +1208,28 @@ void QXmppTurnAllocation::disconnectFromHost() { m_channelTimer->stop(); m_timer->stop(); - if (m_state != ConnectedState) - return; - // send refresh request with zero lifetime - QXmppStunMessage request; - request.setType(QXmppStunMessage::Refresh | QXmppStunMessage::Request); - request.setId(generateRandomBytes(12)); - request.setNonce(m_nonce); - request.setRealm(m_realm); - request.setUsername(m_username); - request.setLifetime(0); - m_transactions << new QXmppStunTransaction(request, this); + // clear channels and any outstanding transactions + m_channels.clear(); + foreach (QXmppStunTransaction *transaction, m_transactions) + delete transaction; + m_transactions.clear(); - // update state - setState(ClosingState); + // end allocation + if (m_state == ConnectedState) { + QXmppStunMessage request; + request.setType(QXmppStunMessage::Refresh | QXmppStunMessage::Request); + request.setId(generateRandomBytes(12)); + request.setNonce(m_nonce); + request.setRealm(m_realm); + request.setUsername(m_username); + request.setLifetime(0); + m_transactions << new QXmppStunTransaction(request, this); + + setState(ClosingState); + } else { + setState(UnconnectedState); + } } void QXmppTurnAllocation::readyRead() @@ -1681,7 +1685,7 @@ void QXmppIceComponent::close() { foreach (QUdpSocket *socket, m_sockets) socket->close(); - m_turnAllocation->close(); + m_turnAllocation->disconnectFromHost(); m_timer->stop(); m_stunTimer->stop(); } @@ -1866,10 +1870,8 @@ void QXmppIceComponent::setSockets(QList<QUdpSocket*> sockets) } // connect to TURN server - if (m_turnConfigured) { - m_turnAllocation->bind(); + if (m_turnConfigured) m_turnAllocation->connectToHost(); - } } /// Sets the STUN server to use to determine server-reflexive addresses |
