/* */ #ifndef D_DOWNLOAD_CONTEXT_H #define D_DOWNLOAD_CONTEXT_H #include "common.h" #include #include #include #include "SharedHandle.h" #include "TimerA2.h" #include "A2STR.h" #include "ValueBase.h" #include "SegList.h" #include "ContextAttribute.h" namespace aria2 { class RequestGroup; class Signature; class FileEntry; class DownloadContext { private: std::vector > fileEntries_; std::vector pieceHashes_; int32_t pieceLength_; std::string pieceHashType_; std::string digest_; std::string hashType_; bool checksumVerified_; std::string basePath_; bool knowsTotalLength_; RequestGroup* ownerRequestGroup_; std::vector > attrs_; Timer downloadStartTime_; Timer downloadStopTime_; SharedHandle signature_; // This member variable is required to avoid to use parse Metalink // (including both Metalink XML and Metalink/HTTP) twice. bool acceptMetalink_; public: DownloadContext(); // Convenient constructor that creates single file download. path // should be escaped with util::escapePath(...). DownloadContext(int32_t pieceLength, int64_t totalLength, const std::string& path = A2STR::NIL); ~DownloadContext(); const std::string& getPieceHash(size_t index) const; const std::vector& getPieceHashes() const { return pieceHashes_; } template void setPieceHashes (const std::string& hashType, InputIterator first, InputIterator last) { pieceHashType_ = hashType; pieceHashes_.assign(first, last); } int64_t getTotalLength() const; bool knowsTotalLength() const { return knowsTotalLength_; } void markTotalLengthIsUnknown() { knowsTotalLength_ = false; } void markTotalLengthIsKnown() { knowsTotalLength_ = true; } const std::vector >& getFileEntries() const { return fileEntries_; } const SharedHandle& getFirstFileEntry() const { assert(!fileEntries_.empty()); return fileEntries_[0]; } // This function returns first FileEntry whose isRequested() returns // true. If there is no such FileEntry, returns // SharedHandle(). SharedHandle getFirstRequestedFileEntry() const; size_t countRequestedFileEntry() const; template void setFileEntries(InputIterator first, InputIterator last) { fileEntries_.assign(first, last); } int32_t getPieceLength() const { return pieceLength_; } void setPieceLength(int32_t length) { pieceLength_ = length; } size_t getNumPieces() const; const std::string& getPieceHashType() const { return pieceHashType_; } const std::string& getDigest() const { return digest_; } const std::string& getHashType() const { return hashType_; } void setDigest(const std::string& hashType, const std::string& digest); // The representative path name for this context. It is used as a // part of .aria2 control file. If basePath_ is set, returns // basePath_. Otherwise, the first FileEntry's getFilePath() is // returned. const std::string& getBasePath() const; void setBasePath(const std::string& basePath); const SharedHandle& getSignature() const { return signature_; } void setSignature(const SharedHandle& signature); RequestGroup* getOwnerRequestGroup() { return ownerRequestGroup_; } void setOwnerRequestGroup(RequestGroup* owner) { ownerRequestGroup_ = owner; } // sgl must be normalized before the call. void setFileFilter(SegList& sgl); // Sets file path for specified index. index starts from 1. The // index is the same used in setFileFilter(). path is not escaped by // util::escapePath() in this function. void setFilePathWithIndex(size_t index, const std::string& path); // Returns true if hash check(whole file hash, not piece hash) is // need to be done bool isChecksumVerificationNeeded() const; // Returns true if whole hash(not piece hash) is available. bool isChecksumVerificationAvailable() const; // Returns true if piece hash(not whole file hash) is available. bool isPieceHashVerificationAvailable() const; void setChecksumVerified(bool f) { checksumVerified_ = f; } void setAttribute (ContextAttributeType key, const SharedHandle& value); const SharedHandle& getAttribute(ContextAttributeType key); bool hasAttribute(ContextAttributeType key) const; void resetDownloadStartTime(); void resetDownloadStopTime(); const Timer& getDownloadStopTime() const { return downloadStopTime_; } int64_t calculateSessionTime() const; // Returns FileEntry at given offset. SharedHandle() is // returned if no such FileEntry is found. SharedHandle findFileEntryByOffset(int64_t offset) const; void releaseRuntimeResource(); void setAcceptMetalink(bool f) { acceptMetalink_ = f; } bool getAcceptMetalink() const { return acceptMetalink_; } }; } // namespace aria2 #endif // D_DOWNLOAD_CONTEXT_H