/* */ #ifndef _D_PEER_INTERACTION_COMMAND_H_ #define _D_PEER_INTERACTION_COMMAND_H_ #include "PeerAbstractCommand.h" #include "PeerConnection.h" #include "PendingMessage.h" #include "RequestSlotMan.h" using namespace std; class PeerInteractionCommand : public PeerAbstractCommand { private: int sequence; PeerConnection* peerConnection; RequestSlotMan* requestSlotMan; PendingMessages pendingMessages; Piece piece; struct timeval keepAliveCheckPoint; void receiveMessage(); void syncPiece(); void detectTimeoutAndDuplicateBlock(); void decideChoking(); void sendInterest(); void sendMessages(); void createRequestPendingMessage(int blockIndex); void deletePendingMessage(PeerMessage* cancelMessage); const RequestSlot& getRequestSlot(int index, int begin, int length) const; bool deleteRequestSlot(const RequestSlot& slot); void deleteAllRequestSlot(); bool checkPieceHash(const Piece& piece); void erasePieceOnDisk(const Piece& piece); void keepAlive(); Piece getNewPieceAndSendInterest(); void onGotNewPiece(); void onGotWrongPiece(); protected: bool executeInternal(); bool prepareForRetry(int wait); bool prepareForNextPeer(int wait); void onAbort(Exception* ex); void beforeSocketCheck(); public: PeerInteractionCommand(int cuid, Peer* peer, TorrentDownloadEngine* e, Socket* s, int sequence); ~PeerInteractionCommand(); enum Seq { INITIATOR_SEND_HANDSHAKE, INITIATOR_WAIT_HANDSHAKE, RECEIVER_SEND_HANDSHAKE, RECEIVER_WAIT_HANDSHAKE, WIRED}; }; #endif // _D_PEER_INTERACTION_COMMAND_H_