/* */ #include "ActivePeerConnectionCommand.h" #include "PeerInitiateConnectionCommand.h" #include "CUIDCounter.h" #include "message.h" #include "DownloadEngine.h" #include "BtContext.h" #include "PeerStorage.h" #include "PieceStorage.h" #include "BtRuntime.h" #include "Peer.h" #include "Logger.h" namespace aria2 { ActivePeerConnectionCommand::ActivePeerConnectionCommand(int cuid, RequestGroup* requestGroup, DownloadEngine* e, const BtContextHandle& btContext, int32_t interval) :Command(cuid), BtContextAwareCommand(btContext), RequestGroupAware(requestGroup), interval(interval), e(e), _lowestSpeedLimit(50*1024), _numNewConnection(5) {} ActivePeerConnectionCommand::~ActivePeerConnectionCommand() {} bool ActivePeerConnectionCommand::execute() { if(btRuntime->isHalt()) { return true; } if(!pieceStorage->downloadFinished() && checkPoint.elapsed(interval)) { checkPoint.reset(); TransferStat tstat = peerStorage->calculateStat(); size_t numAdd = btRuntime->lessThanEqMinPeer() ? MIN_PEERS-btRuntime->getConnections():_numNewConnection; if(tstat.getDownloadSpeed() < _lowestSpeedLimit || btRuntime->lessThanEqMinPeer()) { for(; numAdd > 0 && peerStorage->isPeerAvailable(); --numAdd) { PeerHandle peer = peerStorage->getUnusedPeer(); connectToPeer(peer); } } } e->commands.push_back(this); return false; } void ActivePeerConnectionCommand::connectToPeer(const PeerHandle& peer) { if(peer.isNull()) { return; } peer->cuid = CUIDCounterSingletonHolder::instance()->newID(); PeerInitiateConnectionCommand* command = new PeerInitiateConnectionCommand(peer->cuid, _requestGroup, peer, e, btContext); e->commands.push_back(command); logger->info(MSG_CONNECTING_TO_PEER, cuid, peer->ipaddr.c_str()); } } // namespace aria2