/* */ #ifndef _D_SEGMENT_MAN_H_ #define _D_SEGMENT_MAN_H_ #include "common.h" #include "SharedHandle.h" #include namespace aria2 { class Segment; class Logger; class Option; class PeerStat; class DownloadContext; class PieceStorage; class Piece; class SegmentEntry { public: int32_t cuid; SharedHandle segment; public: SegmentEntry(int32_t cuid, const SharedHandle& segment); ~SegmentEntry(); }; typedef SharedHandle SegmentEntryHandle; typedef std::deque SegmentEntries; /** * This class holds the download progress of the one download entry. */ class SegmentMan { private: const Option* _option; const Logger* logger; SharedHandle _downloadContext; SharedHandle _pieceStorage; SegmentEntries usedSegmentEntries; std::deque > peerStats; SharedHandle checkoutSegment(int32_t cuid, const SharedHandle& piece); SegmentEntryHandle findSlowerSegmentEntry(const SharedHandle& peerStat) const; public: SegmentMan(const Option* option, const SharedHandle& downloadContext = 0, const SharedHandle& pieceStorage = 0); ~SegmentMan(); // Initializes totalSize, isSplittable, downloadStarted, errors. // Clears command queue. Also, closes diskWriter. void init(); /** * The total number of bytes to download. * If Transfer-Encoding is Chunked or Content-Length header is not provided, * then this value is set to be 0. */ int64_t getTotalLength() const; /** * Returs true when the download has finished. * If downloadStarted is false or the number of the segments of this object * holds is 0, then returns false. */ bool downloadFinished() const; /** * Returns a vacant segment. * If there is no vacant segment, then returns a segment instance whose * isNull call is true. */ std::deque > getInFlightSegment(int32_t cuid); SharedHandle getSegment(int32_t cuid); /** * Returns a segment whose index is index. * If it has already assigned * to another cuid or has been downloaded, then returns a segment instance * whose isNull call is true. */ SharedHandle getSegment(int32_t cuid, int32_t index); /** * Updates download status. */ //bool updateSegment(int cuid, const Segment& segment); /** * Cancels all the segment which the command having given cuid * uses. */ void cancelSegment(int32_t cuid); /** * Tells SegmentMan that the segment has been downloaded successfully. */ bool completeSegment(int32_t cuid, const SharedHandle& segment); /** * Injects PieceStorage. */ void setPieceStorage(const SharedHandle& pieceStorage); /** * Injects DownloadContext. */ void setDownloadContext(const SharedHandle& downloadContext); /** * Returns true if the segment whose index is index has been downloaded. */ bool hasSegment(int32_t index) const; /** * Returns the length of bytes downloaded. */ int64_t getDownloadLength() const; /** * Registers given peerStat if it has not been registerd. * Otherwise does nothing. */ void registerPeerStat(const SharedHandle& peerStat); /** * Returns peerStat whose cuid is given cuid. If it is not found, returns * 0. */ SharedHandle getPeerStat(int32_t cuid) const; /** * Returns current download speed in bytes per sec. */ int32_t calculateDownloadSpeed() const; int32_t countFreePieceFrom(int32_t index) const; }; typedef SharedHandle SegmentManHandle; } // namespace aria2 #endif // _D_SEGMENT_MAN_H_