/* */ #ifndef D_TRACKER_WATCHER_COMMAND_H #define D_TRACKER_WATCHER_COMMAND_H #include "Command.h" #include #include "SharedHandle.h" 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 SharedHandle& btAnnounce) = 0; }; class HTTPAnnRequest:public AnnRequest { public: HTTPAnnRequest(const SharedHandle& rg); virtual ~HTTPAnnRequest(); virtual bool stopped() const; virtual bool success() const; virtual bool issue(DownloadEngine* e); virtual void stop(DownloadEngine* e); virtual bool processResponse(const SharedHandle& btAnnounce); private: SharedHandle rg_; }; class UDPAnnRequest:public AnnRequest { public: UDPAnnRequest(const SharedHandle& req); virtual ~UDPAnnRequest(); virtual bool stopped() const; virtual bool success() const; virtual bool issue(DownloadEngine* e); virtual void stop(DownloadEngine* e); virtual bool processResponse(const SharedHandle& btAnnounce); private: SharedHandle req_; }; class TrackerWatcherCommand : public Command { private: RequestGroup* requestGroup_; DownloadEngine* e_; SharedHandle udpTrackerClient_; SharedHandle peerStorage_; SharedHandle pieceStorage_; SharedHandle btRuntime_; SharedHandle btAnnounce_; SharedHandle trackerRequest_; /** * Returns a command for announce request. Returns 0 if no announce request * is needed. */ SharedHandle createHTTPAnnRequest(const std::string& uri); SharedHandle createUDPAnnRequest(const std::string& host, uint16_t port, uint16_t localPort); void addConnection(); const SharedHandle