/* */ #ifndef _D_DEFAULT_BT_CONTEXT_H_ #define _D_DEFAULT_BT_CONTEXT_H_ #include "BtContext.h" #include "A2STR.h" #include namespace aria2 { class Randomizer; class Logger; class MetaEntry; class Dictionary; class List; class Data; #define INFO_HASH_LENGTH 20 #define PIECE_HASH_LENGTH 20 class DefaultBtContext : public BtContext { private: unsigned char infoHash[INFO_HASH_LENGTH]; std::string infoHashString; std::deque pieceHashes; std::deque > fileEntries; FILE_MODE fileMode; uint64_t totalLength; size_t pieceLength; std::string name; size_t numPieces; std::string peerId; std::string _peerIdPrefix; std::deque > announceTiers; std::deque > _nodes; SharedHandle _randomizer; RequestGroup* _ownerRequestGroup; Logger* _logger; void clear(); void extractPieceHash(const unsigned char* hashData, size_t hashDataLength, size_t hashLength); void extractFileEntries(const Dictionary* infoDic, const std::string& defaultName, const std::deque& urlList); void extractAnnounce(const Data* announceData); void extractAnnounceList(const List* announceListData); void extractUrlList(std::deque& uris, const MetaEntry* obj); void extractNodes(const List* nodes); void processRootDictionary(const Dictionary* rootDic, const std::string& defaultName); public: DefaultBtContext(); virtual ~DefaultBtContext(); virtual const unsigned char* getInfoHash() const; virtual size_t getInfoHashLength() const; virtual const std::string& getInfoHashAsString() const; virtual const std::string& getPieceHash(size_t index) const; virtual const std::deque& getPieceHashes() const { return pieceHashes; } virtual uint64_t getTotalLength() const; virtual FILE_MODE getFileMode() const; virtual std::deque > getFileEntries() const; virtual const std::string& getPieceHashAlgo() const; virtual std::deque > getAnnounceTiers() const; virtual void load(const std::string& torrentFile); void loadFromMemory(const unsigned char* content, size_t length, const std::string& defaultName); void loadFromMemory(const std::string& context, const std::string& defaultName) { loadFromMemory(reinterpret_cast(context.c_str()), context.size(), defaultName); } virtual const std::string& getName() const; virtual size_t getPieceLength() const; virtual size_t getNumPieces() const; virtual std::string getActualBasePath() const; virtual const unsigned char* getPeerId() { if(peerId.empty()) { peerId = generatePeerId(); } return reinterpret_cast(peerId.c_str()); } virtual void computeFastSet (std::deque& fastSet, const std::string& ipaddr, size_t fastSetSize); virtual RequestGroup* getOwnerRequestGroup() { return _ownerRequestGroup; } virtual std::deque >& getNodes(); std::string generatePeerId() const; void setPeerIdPrefix(const std::string& peerIdPrefix) { _peerIdPrefix = peerIdPrefix; } // for unit test void setInfoHash(const unsigned char* infoHash); void setNumPieces(size_t numPieces) { this->numPieces = numPieces; } void setOwnerRequestGroup(RequestGroup* owner) { _ownerRequestGroup = owner; } void setRandomizer(const SharedHandle& randomizer); friend std::ostream& operator<<(std::ostream& o, const DefaultBtContext& ctx); static const std::string DEFAULT_PEER_ID_PREFIX; }; typedef SharedHandle DefaultBtContextHandle; } // namespace aria2 #endif // _D_DEFAULT_BT_CONTEXT_H_