/* */ #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" #include "util.h" #include "FileAllocationEntry.h" #include "CheckIntegrityEntry.h" #include "RequestGroupMan.h" #include "ServerStatMan.h" namespace aria2 { PeerInitiateConnectionCommand::PeerInitiateConnectionCommand (cuid_t cuid, RequestGroup* requestGroup, const SharedHandle& 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() { if(getLogger()->info()) { getLogger()->info(MSG_CONNECTING_TO_SERVER, util::itos(getCuid()).c_str(), getPeer()->ipaddr.c_str(), getPeer()->port); } createSocket(); getSocket()->establishConnection(getPeer()->ipaddr, getPeer()->port); if(_mseHandshakeEnabled) { InitiatorMSEHandshakeCommand* c = new InitiatorMSEHandshakeCommand(getCuid(), _requestGroup, getPeer(), getDownloadEngine(), _btRuntime, getSocket()); c->setPeerStorage(_peerStorage); c->setPieceStorage(_pieceStorage); getDownloadEngine()->addCommand(c); } else { PeerInteractionCommand* command = new PeerInteractionCommand (getCuid(), _requestGroup, getPeer(), getDownloadEngine(), _btRuntime, _pieceStorage, _peerStorage, getSocket(), PeerInteractionCommand::INITIATOR_SEND_HANDSHAKE); getDownloadEngine()->addCommand(command); } return true; } // TODO this method removed when PeerBalancerCommand is implemented bool PeerInitiateConnectionCommand::prepareForNextPeer(time_t wait) { if(_peerStorage->isPeerAvailable() && _btRuntime->lessThanEqMinPeers()) { SharedHandle peer = _peerStorage->getUnusedPeer(); peer->usedBy(getDownloadEngine()->newCUID()); PeerInitiateConnectionCommand* command = new PeerInitiateConnectionCommand(peer->usedBy(), _requestGroup, peer, getDownloadEngine(), _btRuntime); command->setPeerStorage(_peerStorage); command->setPieceStorage(_pieceStorage); getDownloadEngine()->addCommand(command); } return true; } void PeerInitiateConnectionCommand::onAbort() { _peerStorage->returnPeer(getPeer()); } bool PeerInitiateConnectionCommand::exitBeforeExecute() { return _btRuntime->isHalt(); } void PeerInitiateConnectionCommand::setPeerStorage (const SharedHandle& peerStorage) { _peerStorage = peerStorage; } void PeerInitiateConnectionCommand::setPieceStorage (const SharedHandle& pieceStorage) { _pieceStorage = pieceStorage; } } // namespace aria2