summaryrefslogtreecommitdiffstats
path: root/libktorrent/torrent/peerid.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libktorrent/torrent/peerid.cpp')
-rw-r--r--libktorrent/torrent/peerid.cpp253
1 files changed, 253 insertions, 0 deletions
diff --git a/libktorrent/torrent/peerid.cpp b/libktorrent/torrent/peerid.cpp
new file mode 100644
index 0000000..5f314b3
--- /dev/null
+++ b/libktorrent/torrent/peerid.cpp
@@ -0,0 +1,253 @@
+/***************************************************************************
+ * 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. *
+ ***************************************************************************/
+#include <time.h>
+#include <stdlib.h>
+#include <qmap.h>
+#include <klocale.h>
+#include "peerid.h"
+#include "ktversion.h"
+
+namespace bt
+{
+ char RandomLetterOrNumber()
+ {
+ int i = rand() % 62;
+ if (i < 26)
+ return 'a' + i;
+ else if (i < 52)
+ return 'A' + (i - 26);
+ else
+ return '0' + (i - 52);
+ }
+
+
+ PeerID::PeerID()
+ {
+ srand(time(0));
+ memcpy(id,kt::PEER_ID,8);
+ for (int i = 8;i < 20;i++)
+ id[i] = RandomLetterOrNumber();
+ client_name = identifyClient();
+ }
+
+ PeerID::PeerID(const char* pid)
+ {
+ if (pid)
+ memcpy(id,pid,20);
+ else
+ memset(id,0,20);
+ client_name = identifyClient();
+ }
+
+ PeerID::PeerID(const PeerID & pid)
+ {
+ memcpy(id,pid.id,20);
+ client_name = pid.client_name;
+ }
+
+ PeerID::~PeerID()
+ {}
+
+
+
+ PeerID & PeerID::operator = (const PeerID & pid)
+ {
+ memcpy(id,pid.id,20);
+ client_name = pid.client_name;
+ return *this;
+ }
+
+ bool operator == (const PeerID & a,const PeerID & b)
+ {
+ for (int i = 0;i < 20;i++)
+ if (a.id[i] != b.id[i])
+ return false;
+
+ return true;
+ }
+
+ bool operator != (const PeerID & a,const PeerID & b)
+ {
+ return ! operator == (a,b);
+ }
+
+ bool operator < (const PeerID & a,const PeerID & b)
+ {
+ for (int i = 0;i < 20;i++)
+ if (a.id[i] < b.id[i])
+ return true;
+
+ return false;
+ }
+
+ QString PeerID::toString() const
+ {
+ QString r;
+ for (int i = 0;i < 20;i++)
+ r += id[i] == 0 ? ' ' : id[i];
+ return r;
+ }
+
+ QString PeerID::identifyClient() const
+ {
+ if (!client_name.isNull())
+ return client_name;
+
+ QString peer_id = toString();
+ // we only need to create this map once
+ // so make it static
+ static QMap<QString, QString> Map;
+ static bool first = true;
+
+ if (first)
+ {
+ // Keep things a bit alphabetic to make it easier add new ones
+ //AZUREUS STYLE
+ Map["AG"] = "Ares";
+ Map["A~"] = "Ares";
+ Map["AV"] = "Avicora";
+ Map["AX"] = "BitPump";
+ Map["AR"] = "Arctic";
+ Map["AZ"] = "Azureus";
+ Map["BB"] = "BitBuddy";
+ Map["BC"] = "BitComet";
+ Map["BF"] = "Bitflu";
+ Map["BG"] = "BTGetit";
+ Map["BM"] = "BitMagnet";
+ Map["BO"] = "BitsOnWheels";
+ Map["BR"] = "BitRocket";
+ Map["BS"] = "BTSlave";
+ Map["BX"] = "BitTorrent X";
+ Map["CD"] = "Enhanced CTorrent";
+ Map["CT"] = "CTorrent";
+ Map["DE"] = "DelugeTorrent";
+ Map["DP"] = "Propagate Data Client";
+ Map["EB"] = "EBit";
+ Map["ES"] = "electric sheep";
+ Map["FT"] = "FoxTorrent";
+ Map["GS"] = "GSTorrent";
+ Map["G3"] = "G3 Torrent";
+ Map["HL"] = "Halite";
+ Map["HN"] = "Hydranode";
+ Map["KG"] = "KGet";
+ Map["KT"] = "KTorrent"; // lets not forget our own client
+ Map["LH"] = "LH-ABC";
+ Map["lt"] = "libTorrent";
+ Map["LT"] = "libtorrent";
+ Map["LP"] = "Lphant";
+ Map["LW"] = "LimeWire";
+ Map["ML"] = "MLDonkey";
+ Map["MO"] = "MonoTorrent";
+ Map["MP"] = "MooPolice";
+ Map["MT"] = "MoonLight";
+ Map["PD"] = "Pando";
+ Map["qB"] = "qBittorrent";
+ Map["QD"] = "QQDownload";
+ Map["QT"] = "Qt 4 Torrent example";
+ Map["RS"] = "Rufus";
+ Map["RT"] = "Retriever";
+ Map["S~"] = "Shareaza alpha/beta";
+ Map["SB"] = "Swiftbit";
+ Map["SS"] = "SwarmScope";
+ Map["ST"] = "SymTorrent";
+ Map["st"] = "sharktorrent";
+ Map["SZ"] = "Shareaza";
+ Map["TN"] = "Torrent .NET";
+ Map["TR"] = "Transmission";
+ Map["TS"] = "Torrent Storm";
+ Map["TT"] = "TuoTu";
+ Map["UL"] = "uLeecher!";
+ Map["UT"] = QString("%1Torrent").arg(QChar(0x00B5)); // µTorrent, 0x00B5 is unicode for µ
+ Map["WT"] = "BitLet";
+ Map["WY"] = "FireTorrent";
+ Map["XL"] = "Xunlei";
+ Map["XT"] = "Xan Torrent";
+ Map["XX"] = "Xtorrent";
+ Map["ZT"] = "Zip Torrent";
+
+ //SHADOWS STYLE
+ Map["A"] = "ABC";
+ Map["O"] = "Osprey Permaseed";
+ Map["Q"] = "BTQueue";
+ Map["R"] = "Tribler";
+ Map["S"] = "Shadow's";
+ Map["T"] = "BitTornado";
+ Map["U"] = "UPnP NAT BitTorrent";
+ //OTHER
+ Map["Plus"] = "Plus! II";
+ Map["OP"] = "Opera";
+ Map["BOW"] = "Bits on Wheels";
+ Map["M"] = "BitTorrent";
+ Map["exbc"] = "BitComet";
+ Map["Mbrst"] = "Burst!";
+ first = false;
+ }
+
+ QString name = i18n("Unknown client");
+ if (peer_id.at(0) == '-' &&
+ peer_id.at(1).isLetter() &&
+ peer_id.at(2).isLetter() ) //AZ style
+ {
+ QString ID(peer_id.mid(1,2));
+ if (Map.contains(ID))
+ name = Map[ID] + " " + peer_id.at(3) + "." + peer_id.at(4) + "."
+ + peer_id.at(5) + "." + peer_id.at(6);
+ }
+ else if (peer_id.at(0).isLetter() &&
+ peer_id.at(1).isDigit() &&
+ peer_id.at(2).isDigit() ) //Shadow's style
+ {
+ QString ID = QString(peer_id.at(0));
+ if (Map.contains(ID))
+ name = Map[ID] + " " + peer_id.at(1) + "." +
+ peer_id.at(2) + "." + peer_id.at(3);
+ }
+ else if (peer_id.at(0) == 'M' && peer_id.at(2) == '-' && (peer_id.at(4) == '-' || peer_id.at(5) == '-'))
+ {
+ name = Map["M"] + " " + peer_id.at(1) + "." + peer_id.at(3);
+ if(peer_id.at(4) == '-')
+ name += "." + peer_id.at(5);
+ else
+ name += peer_id.at(4) + "." + peer_id.at(6);
+ }
+ else if (peer_id.startsWith("OP"))
+ {
+ name = Map["OP"];
+ }
+ else if ( peer_id.startsWith("exbc") )
+ {
+ name = Map["exbc"];
+ }
+ else if ( peer_id.mid(1,3) == "BOW")
+ {
+ name = Map["BOW"];
+ }
+ else if ( peer_id.startsWith("Plus"))
+ {
+ name = Map["Plus"];
+ }
+ else if ( peer_id.startsWith("Mbrst"))
+ {
+ name = Map["Mbrst"] + " " + peer_id.at(5) + "." + peer_id.at(7);
+ }
+
+ return name;
+ }
+}