/* */ #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; Logger* logger; SharedHandle _downloadContext; SharedHandle _pieceStorage; SegmentEntries usedSegmentEntries; std::deque > peerStats; SharedHandle checkoutSegment(int32_t cuid, const SharedHandle& piece); SharedHandle findSlowerSegmentEntry (const SharedHandle& peerStat); public: SegmentMan(const Option* option, const SharedHandle& downloadContext, const SharedHandle& pieceStorage); ~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. */ uint64_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; /** * Fill segments which are assigned to the command whose CUID is cuid. * This function doesn't clear passed segments. */ void getInFlightSegment(std::deque >& segments, 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, size_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(size_t index) const; /** * Returns the length of bytes downloaded. */ uint64_t getDownloadLength() const; /** * Registers given peerStat if it has not been registerd and returns true. * Otherwise does nothing and returns false. */ bool registerPeerStat(const SharedHandle& peerStat); /** * Returns peerStat whose cuid is given cuid. If it is not found, returns * 0. */ SharedHandle getPeerStat(int32_t cuid) const; const std::deque >& getPeerStats() const; /** * Returns current download speed in bytes per sec. */ unsigned int calculateDownloadSpeed() const; /** * Returns the downloaded bytes in this session. */ uint64_t calculateSessionDownloadLength() const; size_t countFreePieceFrom(size_t index) const; }; typedef SharedHandle SegmentManHandle; } // namespace aria2 #endif // _D_SEGMENT_MAN_H_