summaryrefslogtreecommitdiff
path: root/src/CompactPeerListProcessor.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2006-10-01 11:29:14 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2006-10-01 11:29:14 +0000
commit07e91896e1558f6beb10bcdc3e5c3ff38904317f (patch)
tree238e441e6eeb51018e8173b08b612f1369923cdc /src/CompactPeerListProcessor.cc
parentf7f1770633ac92bd6ba82a320a12ec8076532122 (diff)
2006-10-01 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
To add timeout to async name resolution: * src/AbstractCommand.h (nameResolveFinished): New function. This is not elegant way. It needs to be more refined. (nameResolverCheck): New variable. * src/AbstractCommand.cc (AbstractCommand): Added nameResolverCheck. (execute): Added the check whether the name resolution has finished. (setNameResolverCheck): Set nameResolverCheck to true. (disableNameResolverCheck): Set nameResolverCheck to false. (nameResolverFinished): New function. * src/FtpInitiateConnectionCommand.h (nameResolverFinished): New function. * src/HttpInitiateConnectionCommand.h (nameResolverFinished): New function. To add the support for a non-compact response from a tracker: * src/PeerListProcessor.h: New class. * src/DefaultPeerListProcessor.h: New class. * src/DefaultPeerListProcessor.cc: New class. * src/CompactPeerListProcessor.h: New class. * src/CompactPeerListProcessor.cc: New class. * src/DelegatingPeerListProcessor.h: New class. * src/DelegatingPeerListProcessor.cc: New class. * src/TorrentMan.cc (addPeer): New function(overload). (addPeer): Delete unused peers only when new peer is added. * src/TorrentMan.h (PeerListProcessor.h): Included. (Peers): Removed. (addPeer): New function(overload). * src/TrackerUpdateCommand.cc (netinet/in.h): Removed. (DelegatingPeerListProcessor.h): Included. (execute): Updated to use DelegatingPeerListProcessor. To fix the memory leak in TorrentMan::peers: * src/PeerAbstractCommand.cc (onAbort): Added peer->resetStatus(). * src/Peer.h (resetStatus): Made public. To improve the precision of the speed calculation: * src/SpeedCalc.h (nextInterval): New variable. * src/SpeedCalc.cc (reset): Added nextInterval. (isIntervalOver): Use nextInterval instead of CHANGE_INTERVAL_SEC. (changeSw): Set nextInterval to 15 seconds relative to the current instant time. * src/main.cc (showVersion): Updated.
Diffstat (limited to 'src/CompactPeerListProcessor.cc')
-rw-r--r--src/CompactPeerListProcessor.cc64
1 files changed, 64 insertions, 0 deletions
diff --git a/src/CompactPeerListProcessor.cc b/src/CompactPeerListProcessor.cc
new file mode 100644
index 00000000..bae88c2b
--- /dev/null
+++ b/src/CompactPeerListProcessor.cc
@@ -0,0 +1,64 @@
+/*
+ * aria2 - The high speed download utility
+ *
+ * Copyright (C) 2006 Tatsuhiro Tsujikawa
+ *
+ * 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
+ *
+ * In addition, as a special exception, the copyright holders give
+ * permission to link the code of portions of this program with the
+ * OpenSSL library under certain conditions as described in each
+ * individual source file, and distribute linked combinations
+ * including the two.
+ * You must obey the GNU General Public License in all respects
+ * for all of the code used other than OpenSSL. If you modify
+ * file(s) with this exception, you may extend this exception to your
+ * version of the file(s), but you are not obligated to do so. If you
+ * do not wish to do so, delete this exception statement from your
+ * version. If you delete this exception statement from all source
+ * files in the program, then also delete it here.
+ */
+/* copyright --> */
+#include "CompactPeerListProcessor.h"
+#include "Data.h"
+#include <netinet/in.h>
+
+bool CompactPeerListProcessor::canHandle(const MetaEntry* peersEntry) const {
+ return dynamic_cast<const Data*>(peersEntry) != 0;
+}
+
+Peers CompactPeerListProcessor::extractPeer(const MetaEntry* peersEntry) {
+ Peers peers;
+
+ const Data* peersData = (const Data*)peersEntry;
+ if(peersData->getLen() > 0) {
+ for(int i = 0; i < peersData->getLen(); i += 6) {
+ unsigned int ipaddr1 = (unsigned char)*(peersData->getData()+i);
+ unsigned int ipaddr2 = (unsigned char)*(peersData->getData()+i+1);
+ unsigned int ipaddr3 = (unsigned char)*(peersData->getData()+i+2);
+ unsigned int ipaddr4 = (unsigned char)*(peersData->getData()+i+3);
+ unsigned int port = ntohs(*(unsigned short int*)(peersData->getData()+i+4));
+ char ipaddr[16];
+
+ snprintf(ipaddr, sizeof(ipaddr), "%d.%d.%d.%d",
+ ipaddr1, ipaddr2, ipaddr3, ipaddr4);
+ PeerHandle peer =
+ PeerHandle(new Peer(ipaddr, port, pieceLength, totalLength));
+
+ peers.push_back(peer);
+ }
+ }
+ return peers;
+}