summaryrefslogtreecommitdiffstats
path: root/atlantik/client/monopigator.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'atlantik/client/monopigator.cpp')
-rw-r--r--atlantik/client/monopigator.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/atlantik/client/monopigator.cpp b/atlantik/client/monopigator.cpp
new file mode 100644
index 00000000..83ef0d42
--- /dev/null
+++ b/atlantik/client/monopigator.cpp
@@ -0,0 +1,164 @@
+// Copyright (c) 2002-2004 Rob Kaper <[email protected]>
+//
+// This program is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License
+// version 2 as published by the Free Software Foundation.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; see the file COPYING. If not, write to
+// the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+// Boston, MA 02110-1301, USA.
+
+#include <qdom.h>
+#include <qptrlist.h>
+#include <qregexp.h>
+
+#include <kextendedsocket.h>
+
+#include "monopigator.moc"
+#include "main.h"
+
+Monopigator::Monopigator()
+{
+ m_downloadData = 0;
+ m_job = 0;
+ m_timer = 0;
+}
+
+Monopigator::~Monopigator()
+{
+ if (m_job)
+ m_job -> kill();
+ delete m_downloadData;
+ m_downloadData=0L;
+}
+
+void Monopigator::loadData(const KURL &url)
+{
+ delete m_downloadData;
+ m_downloadData = new QBuffer();
+ m_downloadData->open(IO_WriteOnly);
+ m_downloadData->reset();
+
+ m_job = KIO::get(url, true, false);
+ m_job->addMetaData(QString::fromLatin1("UserAgent"), QString::fromLatin1("Atlantik/" ATLANTIK_VERSION_STRING));
+
+ if (!m_timer)
+ {
+ m_timer = new QTimer(this);
+ m_timer->start(10000, true);
+ }
+
+ connect(m_job, SIGNAL(data(KIO::Job *, const QByteArray &)), SLOT(slotData(KIO::Job *, const QByteArray &)));
+ connect(m_job, SIGNAL(result(KIO::Job *)), SLOT(slotResult(KIO::Job *)));
+ connect(m_timer, SIGNAL(timeout()), SLOT(slotTimeout()));
+}
+
+void Monopigator::slotData(KIO::Job *, const QByteArray &data)
+{
+ m_timer->stop();
+ m_downloadData->writeBlock(data.data(), data.size());
+}
+
+void Monopigator::slotResult(KIO::Job *job)
+{
+ processData(m_downloadData->buffer(), !job->error());
+ m_job = 0;
+}
+
+void Monopigator::slotTimeout()
+{
+ if (m_job)
+ m_job -> kill();
+ m_job = 0;
+
+ emit timeout();
+}
+
+void Monopigator::processData(const QByteArray &data, bool okSoFar)
+{
+ if (okSoFar)
+ {
+ QString xmlData(data);
+ QDomDocument domDoc;
+ if (domDoc.setContent(xmlData))
+ {
+ QDomElement eTop = domDoc.documentElement();
+ if (eTop.tagName() != "monopigator")
+ return;
+
+ QDomNode n = eTop.firstChild();
+ while(!n.isNull())
+ {
+ QDomElement e = n.toElement();
+ if(!e.isNull())
+ {
+ if (e.tagName() == "server")
+ emit monopigatorAdd(e.attributeNode(QString("ip")).value(), e.attributeNode(QString("host")).value(), e.attributeNode(QString("port")).value(), e.attributeNode(QString("version")).value(), e.attributeNode(QString("users")).value().toInt());
+ }
+ n = n.nextSibling();
+ }
+ emit finished();
+ }
+ }
+}
+
+MonopigatorEntry::MonopigatorEntry(QListView *parent, QString host, QString latency, QString version, QString users, QString port, QString ip) : QObject(), QListViewItem(parent, host, latency, version, users, port)
+{
+ m_isDev = ( version.find( QRegExp("(CVS|-dev)") ) != -1 ) ? true : false;
+
+ setEnabled(false);
+ parent->sort();
+
+ if ( !ip.isEmpty() )
+ host = ip;
+ m_latencySocket = new KExtendedSocket( host, port.toInt(), KExtendedSocket::inputBufferedSocket | KExtendedSocket::noResolve );
+ connect(m_latencySocket, SIGNAL(lookupFinished(int)), this, SLOT(resolved()));
+ connect(m_latencySocket, SIGNAL(connectionSuccess()), this, SLOT(connected()));
+ m_latencySocket->startAsyncConnect();
+}
+
+void MonopigatorEntry::resolved()
+{
+ time.start();
+}
+
+void MonopigatorEntry::connected()
+{
+ setText( 1, QString::number(time.elapsed()) );
+ setEnabled(true);
+ listView()->sort();
+ delete m_latencySocket;
+}
+
+int MonopigatorEntry::compare(QListViewItem *i, int col, bool ascending) const
+{
+ // Colums 1 and 3 are integers (latency and users)
+ if (col == 1 || col == 3)
+ {
+ int myVal = text(col).toInt(), iVal = i->text(col).toInt();
+ if (myVal == iVal)
+ return 0;
+ else if (myVal > iVal)
+ return 1;
+ else
+ return -1;
+ }
+ return key( col, ascending ).compare( i->key( col, ascending) );
+}
+
+bool MonopigatorEntry::isDev() const
+{
+ return m_isDev;
+}
+
+void MonopigatorEntry::showDevelopmentServers(bool show)
+{
+ if ( isVisible() != show )
+ setVisible(show);
+}