/* */ #ifndef _D_PEER_STAT_H_ #define _D_PEER_STAT_H_ #include "common.h" #include "SpeedCalc.h" #include "SharedHandle.h" #include namespace aria2 { class PeerStat { public: enum STATUS { IDLE, ACTIVE, REQUEST_IDLE, }; private: int32_t cuid; std::string _hostname; std::string _protocol; SpeedCalc downloadSpeed; SpeedCalc uploadSpeed; Time downloadStartTime; PeerStat::STATUS status; unsigned int _avgDownloadSpeed; unsigned int _avgUploadSpeed; public: PeerStat(int32_t cuid, const std::string& hostname, const::std::string& protocol): cuid(cuid), _hostname(hostname), _protocol(protocol), status(PeerStat::IDLE), _avgDownloadSpeed(0), _avgUploadSpeed(0) {} PeerStat(int32_t cuid = 0):cuid(cuid), status(PeerStat::IDLE), _avgDownloadSpeed(0), _avgUploadSpeed(0) {} ~PeerStat() {} /** * Returns current download speed in byte per sec. */ unsigned int calculateDownloadSpeed() { return downloadSpeed.calculateSpeed(); } unsigned int calculateDownloadSpeed(const struct timeval& now) { return downloadSpeed.calculateSpeed(now); } unsigned int calculateAvgDownloadSpeed() { _avgDownloadSpeed = downloadSpeed.calculateAvgSpeed(); return _avgDownloadSpeed; } unsigned int calculateUploadSpeed() { return uploadSpeed.calculateSpeed(); } unsigned int calculateUploadSpeed(const struct timeval& now) { return uploadSpeed.calculateSpeed(now); } unsigned int calculateAvgUploadSpeed() { _avgUploadSpeed = uploadSpeed.calculateAvgSpeed(); return _avgUploadSpeed; } void updateDownloadLength(size_t bytes) { downloadSpeed.update(bytes); } void updateUploadLength(size_t bytes) { uploadSpeed.update(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.reset(); status = PeerStat::IDLE; } void downloadStart() { reset(); status = PeerStat::ACTIVE; } void downloadStop() { calculateAvgDownloadSpeed(); calculateAvgUploadSpeed(); status = PeerStat::IDLE; } void requestIdle() { status = PeerStat::REQUEST_IDLE; } const Time& getDownloadStartTime() const { return downloadStartTime; } PeerStat::STATUS getStatus() const { return status; } int32_t getCuid() const { return cuid; } const std::string& getHostname() const { return _hostname; } const std::string& getProtocol() const { return _protocol; } }; typedef SharedHandle PeerStatHandle; } // namespace aria2 #endif // _D_PEER_STAT_H_