/* */ #ifndef _D_PEER_STAT_H_ #define _D_PEER_STAT_H_ #include "common.h" #include #include "SpeedCalc.h" #include "SharedHandle.h" #include "Command.h" #include "wallclock.h" namespace aria2 { class PeerStat { public: enum STATUS { IDLE, ACTIVE, }; private: cuid_t cuid_; std::string hostname_; std::string protocol_; SpeedCalc downloadSpeed_; SpeedCalc uploadSpeed_; Timer downloadStartTime_; PeerStat::STATUS status_; unsigned int avgDownloadSpeed_; unsigned int avgUploadSpeed_; uint64_t sessionDownloadLength_; uint64_t sessionUploadLength_; public: PeerStat(cuid_t cuid, const std::string& hostname, const::std::string& protocol): cuid_(cuid), hostname_(hostname), protocol_(protocol), downloadStartTime_(global::wallclock), status_(PeerStat::IDLE), avgDownloadSpeed_(0), avgUploadSpeed_(0), sessionDownloadLength_(0), sessionUploadLength_(0) {} PeerStat(cuid_t cuid = 0): cuid_(cuid), status_(PeerStat::IDLE), avgDownloadSpeed_(0), avgUploadSpeed_(0), sessionDownloadLength_(0), sessionUploadLength_(0) {} /** * Returns current download speed in byte per sec. */ unsigned int calculateDownloadSpeed() { return downloadSpeed_.calculateSpeed(); } unsigned int calculateAvgDownloadSpeed() { avgDownloadSpeed_ = downloadSpeed_.calculateAvgSpeed(); return avgDownloadSpeed_; } unsigned int calculateUploadSpeed() { return uploadSpeed_.calculateSpeed(); } unsigned int calculateAvgUploadSpeed() { avgUploadSpeed_ = uploadSpeed_.calculateAvgSpeed(); return avgUploadSpeed_; } void updateDownloadLength(size_t bytes) { downloadSpeed_.update(bytes); sessionDownloadLength_ += bytes; } void updateUploadLength(size_t bytes) { uploadSpeed_.update(bytes); sessionUploadLength_ += bytes; } unsigned int getMaxDownloadSpeed() const { return downloadSpeed_.getMaxSpeed(); } unsigned int getMaxUploadSpeed() const { return uploadSpeed_.getMaxSpeed(); } unsigned int getAvgDownloadSpeed() const { return avgDownloadSpeed_; } unsigned int getAvgUploadSpeed() const { return avgUploadSpeed_; } void reset() { downloadSpeed_.reset(); uploadSpeed_.reset(); downloadStartTime_ = global::wallclock; status_ = PeerStat::IDLE; } void downloadStart() { reset(); status_ = PeerStat::ACTIVE; } void downloadStop() { calculateAvgDownloadSpeed(); calculateAvgUploadSpeed(); status_ = PeerStat::IDLE; } const Timer& getDownloadStartTime() const { return downloadStartTime_; } PeerStat::STATUS getStatus() const { return status_; } cuid_t getCuid() const { return cuid_; } const std::string& getHostname() const { return hostname_; } const std::string& getProtocol() const { return protocol_; } uint64_t getSessionDownloadLength() const { return sessionDownloadLength_; } uint64_t getSessionUploadLength() const { return sessionUploadLength_; } void addSessionDownloadLength(uint64_t length) { sessionDownloadLength_ += length; } }; typedef SharedHandle PeerStatHandle; } // namespace aria2 #endif // _D_PEER_STAT_H_