summaryrefslogtreecommitdiffstats
path: root/libktorrent/torrent/announcelist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libktorrent/torrent/announcelist.cpp')
-rw-r--r--libktorrent/torrent/announcelist.cpp195
1 files changed, 195 insertions, 0 deletions
diff --git a/libktorrent/torrent/announcelist.cpp b/libktorrent/torrent/announcelist.cpp
new file mode 100644
index 0000000..74b3397
--- /dev/null
+++ b/libktorrent/torrent/announcelist.cpp
@@ -0,0 +1,195 @@
+/***************************************************************************
+ * Copyright (C) 2005 by Joris Guisson *
+ * joris.guisson@gmail.com *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * 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; if not, write to the *
+ * Free Software Foundation, Inc., *
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
+ ***************************************************************************/
+#if 0
+#include "announcelist.h"
+#include "bnode.h"
+#include <util/error.h>
+#include "globals.h"
+#include <util/log.h>
+
+#include <klocale.h>
+#include <qstringlist.h>
+#include <qfile.h>
+#include <qtextstream.h>
+
+namespace bt
+{
+
+ AnnounceList::AnnounceList()
+ :m_datadir(QString::null)
+ {
+ curr = 0;
+ }
+
+
+ AnnounceList::~AnnounceList()
+ {
+ saveTrackers();
+ }
+
+ void AnnounceList::load(BNode* node)
+ {
+ BListNode* ml = dynamic_cast<BListNode*>(node);
+ if (!ml)
+ return;
+
+ //ml->printDebugInfo();
+ for (Uint32 i = 0;i < ml->getNumChildren();i++)
+ {
+ BListNode* url = dynamic_cast<BListNode*>(ml->getChild(i));
+ if (!url)
+ throw Error(i18n("Parse Error"));
+
+ for (Uint32 j = 0;j < url->getNumChildren();j++)
+ {
+ BValueNode* vn = dynamic_cast<BValueNode*>(url->getChild(j));
+ if (!vn)
+ throw Error(i18n("Parse Error"));
+
+ KURL url(vn->data().toString().stripWhiteSpace());
+ trackers.append(url);
+ //Out() << "Added tracker " << url << endl;
+ }
+ }
+ }
+
+ const KURL::List AnnounceList::getTrackerURLs()
+ {
+ KURL::List complete(trackers);
+ complete += custom_trackers;
+ return complete;
+ }
+
+ void AnnounceList::addTracker(KURL url, bool custom)
+ {
+ if(custom)
+ custom_trackers.append(url);
+ else
+ trackers.append(url);
+ }
+
+ bool AnnounceList::removeTracker(KURL url)
+ {
+ KURL::List::iterator i = custom_trackers.find(url);
+ if(i != custom_trackers.end())
+ {
+ custom_trackers.remove(i);
+ return true;
+ }
+ else
+ return false;
+ }
+
+ KURL AnnounceList::getTrackerURL(bool last_was_succesfull) const
+ {
+ int defaults = trackers.count();
+ int customs = custom_trackers.count();
+ int total = defaults + customs;
+
+ if (total == 0)
+ return KURL(); // return invalid url is there are no trackers
+
+ if (last_was_succesfull)
+ return curr < defaults ? *trackers.at(curr) : *custom_trackers.at(curr % customs);
+
+ curr = (curr + 1) % total;
+ return curr < defaults ? *trackers.at(curr) : *custom_trackers.at(curr % customs);
+ }
+
+ void AnnounceList::debugPrintURLList()
+ {
+ Out() << "Announce List : " << endl;
+ for (KURL::List::iterator i = trackers.begin();i != trackers.end();i++)
+ Out() << "URL : " << *i << endl;
+ }
+
+ void AnnounceList::saveTrackers()
+ {
+ QFile file(m_datadir + "trackers");
+ if(!file.open(IO_WriteOnly))
+ return;
+
+ QTextStream stream(&file);
+ for (KURL::List::iterator i = custom_trackers.begin();i != custom_trackers.end();i++)
+ stream << (*i).prettyURL() << ::endl;
+ file.close();
+ }
+
+ void AnnounceList::loadTrackers()
+ {
+ QFile file(m_datadir + "trackers");
+ if(!file.open(IO_ReadOnly))
+ return;
+
+ QTextStream stream(&file);
+ while (!stream.atEnd())
+ {
+ KURL url(stream.readLine().stripWhiteSpace());
+ custom_trackers.append(url);
+ }
+
+ file.close();
+ }
+
+ void AnnounceList::setDatadir(const QString& theValue)
+ {
+ m_datadir = theValue;
+ loadTrackers();
+ }
+
+ void AnnounceList::setTracker(KURL url)
+ {
+ int defaults = trackers.count();
+ int customs = custom_trackers.count();
+ int total = defaults + customs;
+
+ int backup = curr;
+
+ for(curr=0; curr<defaults; ++curr)
+ {
+ if( *trackers.at(curr) == url )
+ return;
+ }
+
+ for( ; curr<total; ++curr)
+ {
+ if( *custom_trackers.at(curr % customs) == url )
+ return;
+ }
+
+ curr = backup;
+ }
+
+ void AnnounceList::restoreDefault()
+ {
+ curr = 0;
+ }
+
+ void AnnounceList::merge(const AnnounceList* al)
+ {
+ for (Uint32 i = 0;i < al->getNumTrackerURLs();i++)
+ {
+ KURL url = *al->trackers.at(i);
+ if (!trackers.contains(url) && !custom_trackers.contains(url))
+ custom_trackers.append(url);
+ }
+ }
+}
+#endif