/* */ #include "DHTGetPeersCommand.h" #include "DHTTaskQueue.h" #include "DHTTaskFactory.h" #include "DHTTask.h" #include "DownloadEngine.h" #include "RequestGroup.h" #include "DHTNode.h" #include "DHTNodeLookupEntry.h" #include "BtRuntime.h" #include "PeerStorage.h" #include "Peer.h" #include "Logger.h" #include "bittorrent_helper.h" #include "DownloadContext.h" #include "wallclock.h" namespace aria2 { DHTGetPeersCommand::DHTGetPeersCommand(int32_t cuid, RequestGroup* requestGroup, DownloadEngine* e): Command(cuid), _requestGroup(requestGroup), _e(e), _numRetry(0), _lastGetPeerTime(0) { _requestGroup->increaseNumCommand(); } DHTGetPeersCommand::~DHTGetPeersCommand() { _requestGroup->decreaseNumCommand(); } bool DHTGetPeersCommand::execute() { if(_btRuntime->isHalt()) { return true; } if(_task.isNull() && ((_numRetry > 0 && _lastGetPeerTime.difference(global::wallclock) >= (time_t)_numRetry*5) || _lastGetPeerTime.difference(global::wallclock) >= GET_PEER_INTERVAL)) { if(logger->debug()) { logger->debug("Issuing PeerLookup for infoHash=%s", bittorrent::getInfoHashString (_requestGroup->getDownloadContext()).c_str()); } _task = _taskFactory->createPeerLookupTask (_requestGroup->getDownloadContext(), _btRuntime, _peerStorage); _taskQueue->addPeriodicTask2(_task); } else if(!_task.isNull() && _task->finished()) { _lastGetPeerTime = global::wallclock; if(_numRetry < MAX_RETRIES && _btRuntime->lessThanMinPeers()) { ++_numRetry; } else { _numRetry = 0; } _task.reset(); } _e->commands.push_back(this); return false; } void DHTGetPeersCommand::setTaskQueue(const SharedHandle& taskQueue) { _taskQueue = taskQueue; } void DHTGetPeersCommand::setTaskFactory(const SharedHandle& taskFactory) { _taskFactory = taskFactory; } void DHTGetPeersCommand::setBtRuntime(const SharedHandle& btRuntime) { _btRuntime = btRuntime; } void DHTGetPeersCommand::setPeerStorage(const SharedHandle& ps) { _peerStorage = ps; } } // namespace aria2