summaryrefslogtreecommitdiff
path: root/src/BtSetup.cc
diff options
context:
space:
mode:
authorTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-20 14:23:25 +0000
committerTatsuhiro Tsujikawa <tatsuhiro.t@gmail.com>2010-02-20 14:23:25 +0000
commit9281f1126471fa90e2d6fe094c4c6eba00073ea6 (patch)
treedb2dc360e785cf78fd67f565d061cc24dc68f388 /src/BtSetup.cc
parentaee471e52c6f7ac06817600e2c21b400ef375ecb (diff)
2010-02-20 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added Local Peer Discovery. It is disabled by default. Use --bt-enable-lpd to enable the function. * src/BtConstants.h * src/BtSetup.cc * src/LpdDispatchMessageCommand.cc * src/LpdDispatchMessageCommand.h * src/LpdMessage.h * src/LpdMessageDispatcher.cc * src/LpdMessageDispatcher.h * src/LpdMessageReceiver.cc * src/LpdMessageReceiver.h * src/LpdReceiveMessageCommand.cc * src/LpdReceiveMessageCommand.h * src/Makefile.am * src/OptionHandlerFactory.cc * src/Peer.cc * src/Peer.h * src/PeerInteractionCommand.cc * src/SocketCore.cc * src/SocketCore.h * src/prefs.cc * src/prefs.h * src/usage_text.h * src/util.cc * src/util.h * test/LpdMessageDispatcherTest.cc * test/LpdMessageReceiverTest.cc * test/Makefile.am
Diffstat (limited to 'src/BtSetup.cc')
-rw-r--r--src/BtSetup.cc39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/BtSetup.cc b/src/BtSetup.cc
index df59fbcf..756f745c 100644
--- a/src/BtSetup.cc
+++ b/src/BtSetup.cc
@@ -60,6 +60,12 @@
#include "BtRuntime.h"
#include "bittorrent_helper.h"
#include "BtStopDownloadCommand.h"
+#include "LpdReceiveMessageCommand.h"
+#include "LpdDispatchMessageCommand.h"
+#include "LpdMessageReceiver.h"
+#include "LpdMessageDispatcher.h"
+#include "message.h"
+#include "SocketCore.h"
namespace aria2 {
@@ -164,6 +170,39 @@ void BtSetup::setup(std::deque<Command*>& commands,
PeerListenCommand* listenCommand = PeerListenCommand::getInstance(e);
btRuntime->setListenPort(listenCommand->getPort());
}
+ if(option->getAsBool(PREF_BT_ENABLE_LPD) &&
+ (metadataGetMode || torrentAttrs[bittorrent::PRIVATE].i() == 0)) {
+ if(LpdReceiveMessageCommand::getNumInstance() == 0) {
+ SharedHandle<LpdMessageReceiver> receiver
+ (new LpdMessageReceiver(LPD_MULTICAST_ADDR, LPD_MULTICAST_PORT));
+ try {
+ receiver->init();
+ receiver->getSocket()->setMulticastTtl(1);
+ } catch(RecoverableException& e) {
+ _logger->info(EX_EXCEPTION_CAUGHT, e);
+ receiver.reset();
+ }
+ if(!receiver.isNull()) {
+ LpdReceiveMessageCommand* cmd =
+ LpdReceiveMessageCommand::getInstance(e, receiver);
+ e->commands.push_back(cmd);
+ }
+ }
+ if(LpdReceiveMessageCommand::getNumInstance()) {
+ const unsigned char* infoHash =
+ bittorrent::getInfoHash(requestGroup->getDownloadContext());
+ SharedHandle<LpdMessageDispatcher> dispatcher
+ (new LpdMessageDispatcher
+ (std::string(&infoHash[0], &infoHash[INFO_HASH_LENGTH]),
+ btRuntime->getListenPort(),
+ LPD_MULTICAST_ADDR, LPD_MULTICAST_PORT,
+ LpdReceiveMessageCommand::getInstance()->getReceiverSocket()));
+ LpdDispatchMessageCommand* cmd =
+ new LpdDispatchMessageCommand(e->newCUID(), dispatcher, e);
+ cmd->setBtRuntime(btRuntime);
+ e->commands.push_back(cmd);
+ }
+ }
time_t btStopTimeout = option->getAsInt(PREF_BT_STOP_TIMEOUT);
if(btStopTimeout > 0) {
BtStopDownloadCommand* stopDownloadCommand =