aboutsummaryrefslogtreecommitdiff
path: root/src/server/mod_proxy65.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/mod_proxy65.cpp')
-rw-r--r--src/server/mod_proxy65.cpp183
1 files changed, 103 insertions, 80 deletions
diff --git a/src/server/mod_proxy65.cpp b/src/server/mod_proxy65.cpp
index a5ce0744..76c9fb67 100644
--- a/src/server/mod_proxy65.cpp
+++ b/src/server/mod_proxy65.cpp
@@ -149,22 +149,25 @@ public:
quint16 port;
QMap<QString, QTcpSocketPair*> pairs;
- QList<TransferStats> recent;
QXmppSocksServer *server;
- QSettings *statistics;
- QString statisticsFile;
+
+ // statistics
+ QList<TransferStats> recent;
QTimer *statisticsTimer;
+ quint64 totalBytes;
+ quint64 totalTransfers;
};
QXmppServerProxy65::QXmppServerProxy65()
: d(new QXmppServerProxy65Private)
{
- d->statistics = 0;
+ d->port = 7777;
+ d->server = new QXmppSocksServer(this);
+
d->statisticsTimer = new QTimer(this);
d->statisticsTimer->setInterval(300 * 1000);
- d->statisticsTimer->start();
-
- d->server = new QXmppSocksServer(this);
+ d->totalBytes = 0;
+ d->totalTransfers = 0;
bool check = connect(d->server, SIGNAL(newConnection(QTcpSocket*, const QString&, quint16)),
this, SLOT(slotSocketConnected(QTcpSocket*, const QString &, quint16)));
@@ -180,6 +183,40 @@ QXmppServerProxy65::~QXmppServerProxy65()
delete d;
}
+/// Returns the proxy server's JID.
+///
+
+QString QXmppServerProxy65::jid() const
+{
+ return d->jid;
+}
+
+/// Set the proxy server's JID.
+///
+/// \param jid
+
+void QXmppServerProxy65::setJid(const QString &jid)
+{
+ d->jid = jid;
+}
+
+/// Returns the port on which to listen for SOCKS5 connections.
+///
+
+quint16 QXmppServerProxy65::port() const
+{
+ return d->port;
+}
+
+/// Sets the port on which to listen for SOCKS5 connections.
+///
+/// \param port
+
+void QXmppServerProxy65::setPort(quint16 port)
+{
+ d->port = port;
+}
+
QStringList QXmppServerProxy65::discoveryItems() const
{
return QStringList() << d->jid;
@@ -219,7 +256,7 @@ bool QXmppServerProxy65::handleStanza(QXmppStream *stream, const QDomElement &el
responseIq.setIdentities(identities);
}
- stream->sendPacket(responseIq);
+ server()->sendPacket(responseIq);
return true;
}
}
@@ -245,7 +282,7 @@ bool QXmppServerProxy65::handleStanza(QXmppStream *stream, const QDomElement &el
streamHosts.append(streamHost);
responseIq.setStreamHosts(streamHosts);
- stream->sendPacket(responseIq);
+ server()->sendPacket(responseIq);
}
else if (bsIq.type() == QXmppIq::Set)
{
@@ -268,43 +305,13 @@ bool QXmppServerProxy65::handleStanza(QXmppStream *stream, const QDomElement &el
qWarning() << "Not activating connection" << hash << "by" << bsIq.from();
responseIq.setType(QXmppIq::Error);
}
- stream->sendPacket(responseIq);
+ server()->sendPacket(responseIq);
}
return true;
}
return false;
}
-QString QXmppServerProxy65::jid() const
-{
- return d->jid;
-}
-
-void QXmppServerProxy65::setJid(const QString &jid)
-{
- d->jid = jid;
-}
-
-QString QXmppServerProxy65::statisticsFile() const
-{
- return d->statisticsFile;
-}
-
-void QXmppServerProxy65::setStatisticsFile(const QString &statisticsFile)
-{
- if (d->statistics)
- {
- delete d->statistics;
- d->statistics = 0;
- }
- d->statisticsFile = statisticsFile;
- if (!statisticsFile.isEmpty())
- {
- d->statistics = new QSettings(statisticsFile, QSettings::IniFormat, this);
- slotUpdateStatistics();
- }
-}
-
bool QXmppServerProxy65::start()
{
// determine jid
@@ -324,22 +331,69 @@ bool QXmppServerProxy65::start()
}
hostAddress = hostInfo.addresses().first();
}
- quint16 port = 7777;
// start listening
- if (!d->server->listen(hostAddress, port))
+ if (!d->server->listen(hostAddress, d->port))
return false;
d->host = hostAddress;
- d->port = port;
+
+ // start statistics update
+ d->statisticsTimer->start();
return true;
}
void QXmppServerProxy65::stop()
{
+ // refuse incoming connections
d->server->close();
+
+ // close socket pairs
foreach (QTcpSocketPair *pair, d->pairs)
delete pair;
d->pairs.clear();
+
+ // stop statistics update
+ d->statisticsTimer->stop();
+}
+
+QVariantMap QXmppServerProxy65::statistics() const
+{
+ // calculate stats
+ qint64 minimumSpeed = -1;
+ qint64 maximumSpeed = 0;
+ qint64 totalSize = 0;
+ qint64 totalElapsed = 0;
+ for (int i = d->recent.size() - 1; i >= 0; --i)
+ {
+ if (d->recent[i].elapsed > 0)
+ {
+ qint64 speed = (1000 * d->recent[i].size) / d->recent[i].elapsed;
+ if (speed > maximumSpeed)
+ maximumSpeed = speed;
+ if (minimumSpeed < 0 || speed < minimumSpeed)
+ minimumSpeed = speed;
+ totalSize += d->recent[i].size;
+ totalElapsed += d->recent[i].elapsed;
+ }
+ }
+ if (minimumSpeed < 0)
+ minimumSpeed = 0;
+ qint64 averageSpeed = totalElapsed > 0 ? (1000 * totalSize) / totalElapsed : 0;
+
+ // store stats
+ QVariantMap stats;
+ stats["total-bytes"] = d->totalBytes;
+ stats["total-transfers"] = d->totalTransfers;
+ stats["average-speed"] = averageSpeed;
+ stats["minimum-speed"] = minimumSpeed;
+ stats["maximum-speed"] = maximumSpeed;
+ return stats;
+}
+
+void QXmppServerProxy65::setStatistics(const QVariantMap &statistics)
+{
+ d->totalBytes = statistics.value("total-bytes").toULongLong();
+ d->totalTransfers = statistics.value("total-transfers").toULongLong();
}
void QXmppServerProxy65::slotSocketConnected(QTcpSocket *socket, const QString &hostName, quint16 port)
@@ -372,59 +426,28 @@ void QXmppServerProxy65::slotPairFinished()
d->recent.prepend(stats);
slotUpdateStatistics();
- // store total statistics
- if (d->statistics)
- {
- d->statistics->beginGroup("socks-proxy");
- d->statistics->setValue("total-bytes",
- d->statistics->value("total-bytes").toULongLong() + pair->transfer);
- d->statistics->setValue("total-transfers",
- d->statistics->value("total-transfers").toULongLong() + 1);
- d->statistics->endGroup();
- }
+ // update totals
+ d->totalBytes += pair->transfer;
+ d->totalTransfers++;
// remove socket pair
d->pairs.remove(pair->key);
pair->deleteLater();
}
+/// Prune obsolete statistics.
+///
+
void QXmppServerProxy65::slotUpdateStatistics()
{
- qint64 minimumSpeed = -1;
- qint64 maximumSpeed = 0;
- qint64 totalSize = 0;
- qint64 totalElapsed = 0;
QDateTime cutoff = QDateTime::currentDateTime().addDays(-1);
for (int i = d->recent.size() - 1; i >= 0; --i)
{
- // only keep 100 points, less than one day old
if (i >= 100 || d->recent[i].date < cutoff)
{
d->recent.removeAt(i);
- } else if (d->recent[i].elapsed > 0) {
- qint64 speed = (1000 * d->recent[i].size) / d->recent[i].elapsed;
- if (speed > maximumSpeed)
- maximumSpeed = speed;
- if (minimumSpeed < 0 || speed < minimumSpeed)
- minimumSpeed = speed;
- totalSize += d->recent[i].size;
- totalElapsed += d->recent[i].elapsed;
}
}
- if (minimumSpeed < 0)
- minimumSpeed = 0;
- qint64 averageSpeed = totalElapsed > 0 ? (1000 * totalSize) / totalElapsed : 0;
-
- // store statistics
- if (d->statistics)
- {
- d->statistics->beginGroup("socks-proxy");
- d->statistics->setValue("version", qApp->applicationVersion());
- d->statistics->setValue("average-speed", averageSpeed);
- d->statistics->setValue("minimum-speed", minimumSpeed);
- d->statistics->setValue("maximum-speed", maximumSpeed);
- d->statistics->endGroup();
- }
}
// PLUGIN