/* */ #ifndef D_TRACKER_WATCHER_COMMAND_H #define D_TRACKER_WATCHER_COMMAND_H #include "Command.h" #include #include namespace aria2 { class DownloadEngine; class RequestGroup; class PeerStorage; class PieceStorage; class BtRuntime; class BtAnnounce; class Option; struct UDPTrackerRequest; class UDPTrackerClient; class AnnRequest { public: virtual ~AnnRequest() {} // Returns true if tracker request is finished, regardless of the // outcome. virtual bool stopped() const = 0; // Returns true if tracker request is successful. virtual bool success() const = 0; // Returns true if issuing request is successful. virtual bool issue(DownloadEngine* e) = 0; // Stop this request. virtual void stop(DownloadEngine* e) = 0; // Returns true if processing tracker response is successful. virtual bool processResponse(const std::shared_ptr& btAnnounce) = 0; }; class HTTPAnnRequest:public AnnRequest { public: HTTPAnnRequest(std::unique_ptr rg); virtual ~HTTPAnnRequest(); virtual bool stopped() const CXX11_OVERRIDE; virtual bool success() const CXX11_OVERRIDE; virtual bool issue(DownloadEngine* e) CXX11_OVERRIDE; virtual void stop(DownloadEngine* e) CXX11_OVERRIDE; virtual bool processResponse(const std::shared_ptr& btAnnounce) CXX11_OVERRIDE; private: std::unique_ptr rg_; }; class UDPAnnRequest:public AnnRequest { public: UDPAnnRequest(const std::shared_ptr& req); virtual ~UDPAnnRequest(); virtual bool stopped() const CXX11_OVERRIDE; virtual bool success() const CXX11_OVERRIDE; virtual bool issue(DownloadEngine* e) CXX11_OVERRIDE; virtual void stop(DownloadEngine* e) CXX11_OVERRIDE; virtual bool processResponse(const std::shared_ptr& btAnnounce) CXX11_OVERRIDE; private: std::shared_ptr req_; }; class TrackerWatcherCommand : public Command { private: RequestGroup* requestGroup_; DownloadEngine* e_; std::shared_ptr udpTrackerClient_; std::shared_ptr peerStorage_; std::shared_ptr pieceStorage_; std::shared_ptr btRuntime_; std::shared_ptr btAnnounce_; std::unique_ptr trackerRequest_; /** * Returns a command for announce request. Returns 0 if no announce request * is needed. */ std::unique_ptr createHTTPAnnRequest(const std::string& uri); std::unique_ptr createUDPAnnRequest(const std::string& host, uint16_t port, uint16_t localPort); void addConnection(); const std::shared_ptr