/* */ #ifndef _D_DEFAULT_BT_CONTEXT_H_ #define _D_DEFAULT_BT_CONTEXT_H_ #include "BtContext.h" #include "Dictionary.h" #include "Data.h" #include "List.h" class Randomizer; extern typedef SharedHandle RandomizerHandle; #define INFO_HASH_LENGTH 20 #define PIECE_HASH_LENGTH 20 typedef Strings PieceHashes; class DefaultBtContext : public BtContext { private: unsigned char infoHash[INFO_HASH_LENGTH]; string infoHashString; PieceHashes pieceHashes; FileEntries fileEntries; FILE_MODE fileMode; int64_t totalLength; int32_t pieceLength; string name; int32_t numPieces; string peerId; string _peerIdPrefix; AnnounceTiers announceTiers; RandomizerHandle _randomizer; RequestGroup* _ownerRequestGroup; void clear(); void extractPieceHash(const unsigned char* hashData, int32_t hashDataLength, int32_t hashLength); void extractFileEntries(Dictionary* infoDic, const string& defaultName, const Strings& urlList); void extractAnnounce(Data* announceData); void extractAnnounceList(List* announceListData); Strings extractUrlList(const MetaEntry* obj); public: DefaultBtContext(); virtual ~DefaultBtContext(); virtual const unsigned char* getInfoHash() const; virtual int32_t getInfoHashLength() const; virtual string getInfoHashAsString() const; virtual string getPieceHash(int32_t index) const; virtual const Strings& getPieceHashes() const { return pieceHashes; } virtual int64_t getTotalLength() const; virtual FILE_MODE getFileMode() const; virtual FileEntries getFileEntries() const; virtual string getPieceHashAlgo() const { return "sha1"; } virtual AnnounceTiers getAnnounceTiers() const; virtual void load(const string& torrentFile); virtual string getName() const; virtual int32_t getPieceLength() const; virtual int32_t getNumPieces() const; virtual string getActualBasePath() const; virtual const unsigned char* getPeerId() { if(peerId == "") { peerId = generatePeerId(); } return (const unsigned char*)peerId.c_str(); } virtual Integers computeFastSet(const string& ipaddr, int32_t fastSetSize); virtual RequestGroup* getOwnerRequestGroup() { return _ownerRequestGroup; } string generatePeerId() const; void setPeerIdPrefix(const string& peerIdPrefix) { _peerIdPrefix = peerIdPrefix; } // for unit test void setInfoHash(const unsigned char* infoHash) { memcpy(this->infoHash, infoHash, sizeof(this->infoHash)); } void setNumPieces(int32_t numPieces) { this->numPieces = numPieces; } void setOwnerRequestGroup(RequestGroup* owner) { _ownerRequestGroup = owner; } void setRandomizer(const RandomizerHandle& randomizer); friend ostream& operator<<(ostream& o, const DefaultBtContext& ctx); }; typedef SharedHandle DefaultBtContextHandle; #endif // _D_DEFAULT_BT_CONTEXT_H_