/* */ #ifndef _D_UNKNOWN_LENGTH_PIECE_STORAGE_H_ #define _D_UNKNOWN_LENGTH_PIECE_STORAGE_H_ #include "PieceStorage.h" namespace aria2 { class Option; class DownloadContext; class DiskWriterFactory; class DirectDiskAdaptor; class UnknownLengthPieceStorage:public PieceStorage { private: SharedHandle _downloadContext; const Option* _option; SharedHandle _diskAdaptor; SharedHandle _diskWriterFactory; uint64_t _totalLength; bool _downloadFinished; SharedHandle _piece; public: UnknownLengthPieceStorage(const SharedHandle& downloadContext, const Option* option); virtual ~UnknownLengthPieceStorage(); /** * Returns true if the peer has a piece that localhost doesn't have. * Otherwise returns false. */ virtual bool hasMissingPiece(const SharedHandle& peer); /** * Returns a piece that the peer has but localhost doesn't. * The piece will be marked "used" status in order to prevent other command * from get the same piece. But in end game mode, same piece may be returned * to several commands. */ virtual SharedHandle getMissingPiece(const SharedHandle& peer); /** * Returns a piece that the peer has but localhost doesn't. * Only pieces that declared as "fast" are returned. * The piece will be marked "used" status in order to prevent other command * from get the same piece. But in end game mode, same piece may be returned * to several commands. */ virtual SharedHandle getMissingFastPiece(const SharedHandle& peer); /** * Returns a missing piece if available. Otherwise returns 0; */ virtual SharedHandle getMissingPiece(); /** * Returns a missing piece whose index is index. * If a piece whose index is index is already acquired or currently used, * then returns 0. * Also returns 0 if any of missing piece is not available. */ virtual SharedHandle getMissingPiece(size_t index); /** * Returns the piece denoted by index. * No status of the piece is changed in this method. */ virtual SharedHandle getPiece(size_t index); /** * Tells that the download of the specfied piece completes. */ virtual void completePiece(const SharedHandle& piece); /** * Tells that the download of the specified piece is canceled. */ virtual void cancelPiece(const SharedHandle& piece); /** * Returns true if the specified piece is already downloaded. * Otherwise returns false. */ virtual bool hasPiece(size_t index); virtual bool isPieceUsed(size_t index); virtual uint64_t getTotalLength() { return _totalLength; } virtual uint64_t getFilteredTotalLength() { return _totalLength; } virtual uint64_t getCompletedLength() { // TODO we have to return actual completed length here? return _totalLength; } virtual uint64_t getFilteredCompletedLength() { return getCompletedLength(); } virtual void setFileFilter(const std::deque& filePaths) {} virtual void setFileFilter(IntSequence seq) {} virtual void clearFileFilter() {} /** * Returns true if download has completed. * If file filter is enabled, then returns true if those files have * downloaded. */ virtual bool downloadFinished() { return _downloadFinished; } /** * Returns true if all files have downloaded. * The file filter is ignored. */ virtual bool allDownloadFinished() { return downloadFinished(); } /** * Initializes DiskAdaptor. * TODO add better documentation here. */ virtual void initStorage(); virtual const unsigned char* getBitfield() { return 0; } virtual void setBitfield(const unsigned char* bitfield, size_t bitfieldLength) {} virtual size_t getBitfieldLength() { return 0; } virtual bool isSelectiveDownloadingMode() { return false; } virtual void finishSelectiveDownloadingMode() {} virtual bool isEndGame() { return false; } virtual SharedHandle getDiskAdaptor(); virtual size_t getPieceLength(size_t index); /** * Adds piece index to advertise to other commands. They send have message * based on this information. */ virtual void advertisePiece(int32_t cuid, size_t index) {} /** * Returns piece index which is not advertised by the caller command and * newer than lastCheckTime. */ virtual std::deque getAdvertisedPieceIndexes(int32_t myCuid, const Time& lastCheckTime) { return std::deque(); } /** * Removes have entry if specified seconds have elapsed since its * registration. */ virtual void removeAdvertisedPiece(time_t elapsed) {} /** * Sets all bits in bitfield to 1. */ virtual void markAllPiecesDone(); virtual void markPiecesDone(uint64_t length); virtual void markPieceMissing(size_t index); /** * Do nothing because loading in-flight piece is not supported for this * class. */ virtual void addInFlightPiece(const std::deque >& pieces) {} virtual size_t countInFlightPiece() { return 0; } virtual std::deque > getInFlightPieces(); void setDiskWriterFactory(const SharedHandle& diskWriterFactory); }; typedef SharedHandle UnknownLengthPieceStorageHandle; } // namespace aria2 #endif // _D_UNKNOWN_LENGTH_PIECE_STORAGE_H_