/* */ #include "PeerInitiateConnectionCommand.h" #include "InitiatorMSEHandshakeCommand.h" #include "PeerInteractionCommand.h" #include "DownloadEngine.h" #include "DlAbortEx.h" #include "message.h" #include "prefs.h" #include "CUIDCounter.h" #include "Socket.h" #include "Logger.h" #include "Peer.h" #include "PeerConnection.h" #include "BtContext.h" #include "BtRuntime.h" #include "PieceStorage.h" #include "PeerStorage.h" #include "BtAnnounce.h" #include "BtProgressInfoFile.h" namespace aria2 { PeerInitiateConnectionCommand::PeerInitiateConnectionCommand(int cuid, RequestGroup* requestGroup, const PeerHandle& peer, DownloadEngine* e, const BtContextHandle& btContext, bool mseHandshakeEnabled) :PeerAbstractCommand(cuid, peer, e), BtContextAwareCommand(btContext), RequestGroupAware(requestGroup), _mseHandshakeEnabled(mseHandshakeEnabled) { btRuntime->increaseConnections(); } PeerInitiateConnectionCommand::~PeerInitiateConnectionCommand() { btRuntime->decreaseConnections(); } bool PeerInitiateConnectionCommand::executeInternal() { logger->info(MSG_CONNECTING_TO_SERVER, cuid, peer->ipaddr.c_str(), peer->port); socket.reset(new SocketCore()); socket->establishConnection(peer->ipaddr, peer->port); Command* command; if(_mseHandshakeEnabled) { command = new InitiatorMSEHandshakeCommand(cuid, _requestGroup, peer, e, btContext, socket); } else { command = new PeerInteractionCommand(cuid, _requestGroup, peer, e, btContext, socket, PeerInteractionCommand::INITIATOR_SEND_HANDSHAKE); } e->commands.push_back(command); return true; } // TODO this method removed when PeerBalancerCommand is implemented bool PeerInitiateConnectionCommand::prepareForNextPeer(time_t wait) { if(peerStorage->isPeerAvailable() && btRuntime->lessThanEqMinPeers()) { PeerHandle peer = peerStorage->getUnusedPeer(); peer->usedBy(CUIDCounterSingletonHolder::instance()->newID()); Command* command = new PeerInitiateConnectionCommand(peer->usedBy(), _requestGroup, peer, e, btContext); e->commands.push_back(command); } return true; } void PeerInitiateConnectionCommand::onAbort() { peerStorage->returnPeer(peer); } bool PeerInitiateConnectionCommand::exitBeforeExecute() { return btRuntime->isHalt(); } } // namespace aria2