/* */ #include "PeerInitiateConnectionCommand.h" #include "InitiatorMSEHandshakeCommand.h" #include "PeerInteractionCommand.h" #include "DownloadEngine.h" #include "DlAbortEx.h" #include "message.h" #include "prefs.h" #include "Socket.h" #include "Logger.h" #include "Peer.h" #include "BtRuntime.h" #include "PeerStorage.h" #include "PieceStorage.h" #include "PeerConnection.h" #include "RequestGroup.h" #include "DownloadContext.h" namespace aria2 { PeerInitiateConnectionCommand::PeerInitiateConnectionCommand (int cuid, RequestGroup* requestGroup, const PeerHandle& peer, DownloadEngine* e, const SharedHandle& btRuntime, bool mseHandshakeEnabled) : PeerAbstractCommand(cuid, peer, e), _requestGroup(requestGroup), _btRuntime(btRuntime), _mseHandshakeEnabled(mseHandshakeEnabled) { _btRuntime->increaseConnections(); _requestGroup->increaseNumCommand(); } PeerInitiateConnectionCommand::~PeerInitiateConnectionCommand() { _requestGroup->decreaseNumCommand(); _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); if(_mseHandshakeEnabled) { InitiatorMSEHandshakeCommand* c = new InitiatorMSEHandshakeCommand(cuid, _requestGroup, peer, e, _btRuntime, socket); c->setPeerStorage(_peerStorage); c->setPieceStorage(_pieceStorage); e->commands.push_back(c); } else { PeerInteractionCommand* command = new PeerInteractionCommand (cuid, _requestGroup, peer, e, _btRuntime, _pieceStorage, socket, PeerInteractionCommand::INITIATOR_SEND_HANDSHAKE); command->setPeerStorage(_peerStorage); 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(e->newCUID()); PeerInitiateConnectionCommand* command = new PeerInitiateConnectionCommand(peer->usedBy(), _requestGroup, peer, e, _btRuntime); command->setPeerStorage(_peerStorage); command->setPieceStorage(_pieceStorage); e->commands.push_back(command); } return true; } void PeerInitiateConnectionCommand::onAbort() { _peerStorage->returnPeer(peer); } bool PeerInitiateConnectionCommand::exitBeforeExecute() { return _btRuntime->isHalt(); } void PeerInitiateConnectionCommand::setPeerStorage (const SharedHandle& peerStorage) { _peerStorage = peerStorage; } void PeerInitiateConnectionCommand::setPieceStorage (const SharedHandle& pieceStorage) { _pieceStorage = pieceStorage; } } // namespace aria2