diff options
| author | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-03-04 20:36:51 +0000 |
|---|---|---|
| committer | Jeremy Lainé <jeremy.laine@m4x.org> | 2010-03-04 20:36:51 +0000 |
| commit | 789fda8616d00ff1b880f4760cdeb3ff7f35eda0 (patch) | |
| tree | 3cc76cb9915349e84d3e512fb59915dd9ec69d07 /source | |
| parent | 20dccb6eb88e81363030120fbc4ede901ac55582 (diff) | |
| download | qxmpp-789fda8616d00ff1b880f4760cdeb3ff7f35eda0.tar.gz | |
use a single SOCKS5 server instead of one per job
Diffstat (limited to 'source')
| -rw-r--r-- | source/QXmppSocks.cpp | 5 | ||||
| -rw-r--r-- | source/QXmppSocks.h | 1 | ||||
| -rw-r--r-- | source/QXmppTransferManager.cpp | 38 | ||||
| -rw-r--r-- | source/QXmppTransferManager.h | 2 |
4 files changed, 25 insertions, 21 deletions
diff --git a/source/QXmppSocks.cpp b/source/QXmppSocks.cpp index c2e3ecec..691563a7 100644 --- a/source/QXmppSocks.cpp +++ b/source/QXmppSocks.cpp @@ -265,6 +265,11 @@ bool QXmppSocksServer::listen(const QHostAddress &address, quint16 port) return m_server->listen(address, port); } +bool QXmppSocksServer::isListening() const +{ + return m_server->isListening(); +} + QHostAddress QXmppSocksServer::serverAddress() const { return m_server->serverAddress(); diff --git a/source/QXmppSocks.h b/source/QXmppSocks.h index e99c7618..21d3be2d 100644 --- a/source/QXmppSocks.h +++ b/source/QXmppSocks.h @@ -70,6 +70,7 @@ class QXmppSocksServer : public QObject public: QXmppSocksServer(QObject *parent=0); void close(); + bool isListening() const; bool listen(const QHostAddress &address = QHostAddress::Any, quint16 port = 0); QHostAddress serverAddress() const; diff --git a/source/QXmppTransferManager.cpp b/source/QXmppTransferManager.cpp index 7816f289..dc498607 100644 --- a/source/QXmppTransferManager.cpp +++ b/source/QXmppTransferManager.cpp @@ -58,7 +58,6 @@ QXmppTransferJob::QXmppTransferJob(const QString &jid, QXmppTransferJob::Directi m_fileSize(0), m_ibbSequence(0), m_socksClient(0), - m_socksServer(0), m_socksSocket(0) { } @@ -173,8 +172,6 @@ void QXmppTransferJob::terminate(QXmppTransferJob::Error cause) // close sockets if (m_socksClient) m_socksClient->close(); - if (m_socksServer) - m_socksServer->close(); if (m_socksSocket) m_socksSocket->close(); @@ -197,8 +194,18 @@ bool QXmppTransferJob::writeData(const QByteArray &data) QXmppTransferManager::QXmppTransferManager(QXmppClient *client) : m_client(client), m_ibbBlockSize(4096), + m_socksServer(0), m_supportedMethods(QXmppTransferJob::AnyMethod) { + // start SOCKS server + m_socksServer = new QXmppSocksServer(this); + if (m_socksServer->listen()) + { + connect(m_socksServer, SIGNAL(newConnection(QTcpSocket*, const QString&, quint16)), + this, SLOT(socksServerConnected(QTcpSocket*, const QString&, quint16))); + } else { + qWarning() << "QXmppSocksServer could not start listening"; + } } void QXmppTransferManager::byteStreamIqReceived(const QXmppByteStreamIq &iq) @@ -730,21 +737,16 @@ void QXmppTransferManager::socksClientDisconnected() void QXmppTransferManager::socksServerConnected(QTcpSocket *socket, const QString &hostName, quint16 port) { - QXmppSocksServer *socksServer = qobject_cast<QXmppSocksServer*>(sender()); + const QString ownJid = m_client->getConfiguration().jid(); foreach (QXmppTransferJob *job, m_jobs) { - if (job->m_socksServer == socksServer) + if (hostName == streamHash(job->m_sid, ownJid, job->jid()) && port == 0) { - const QString ownJid = m_client->getConfiguration().jid(); - if (hostName == streamHash(job->m_sid, ownJid, job->jid()) || port == 0) - { - job->m_socksSocket = socket; - return; - } - // don't accept any further connections - job->m_socksServer->close(); + job->m_socksSocket = socket; + return; } } + qWarning("QXmppSocksServer got a connection for a unknown stream"); socket->close(); } @@ -805,7 +807,7 @@ void QXmppTransferManager::socksServerSendOffer(QXmppTransferJob *job) QXmppByteStreamIq::StreamHost streamHost; streamHost.setHost(entry.ip()); - streamHost.setPort(job->m_socksServer->serverPort()); + streamHost.setPort(m_socksServer->serverPort()); streamHost.setJid(ownJid); streamHosts.append(streamHost); } @@ -879,16 +881,12 @@ void QXmppTransferManager::streamInitiationResultReceived(const QXmppStreamIniti job->m_requestId = openIq.id(); m_client->sendPacket(openIq); } else if (job->method() == QXmppTransferJob::SocksMethod) { - // start listening - job->m_socksServer = new QXmppSocksServer(this); - if (!job->m_socksServer->listen()) + if (!m_socksServer->isListening()) { - qWarning() << "QXmppSocksServer could not start listening"; + qWarning() << "QXmppSocksServer is not listening"; job->terminate(QXmppTransferJob::ProtocolError); return; } - qDebug() << "QXmppSocksServer listening on port" << job->m_socksServer->serverPort(); - if (!m_proxy.isEmpty()) { job->m_socksProxy.setJid(m_proxy); diff --git a/source/QXmppTransferManager.h b/source/QXmppTransferManager.h index 45d87172..cc8fc926 100644 --- a/source/QXmppTransferManager.h +++ b/source/QXmppTransferManager.h @@ -136,7 +136,6 @@ private: // for socks5 bytestreams QXmppSocksClient *m_socksClient; - QXmppSocksServer *m_socksServer; QTcpSocket *m_socksSocket; QXmppByteStreamIq::StreamHost m_socksProxy; @@ -189,6 +188,7 @@ private: QXmppClient* m_client; QList<QXmppTransferJob*> m_jobs; int m_ibbBlockSize; + QXmppSocksServer *m_socksServer; int m_supportedMethods; QString m_proxy; }; |
