/*************************************************************************** * Copyright © 2007 by Krzysztof Kundzicz * * athantor@gmail.com * * * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ #include "statsplugin.h" K_EXPORT_COMPONENT_FACTORY(ktstatsplugin, KGenericFactory("ktstatsplugin")) namespace kt { StatsPlugin::StatsPlugin(TQObject* parent, const char* qt_name, const TQStringList& args): Plugin(parent, qt_name, args, "Statistics", i18n("Statistics"),"Krzysztof Kundzicz", "athantor@gmail.com", i18n("Shows transfers statistics"),"ktimemon"), pmUiSpd(0), pmUiCon(0), pmPrefsUi(0), pmUpdTmr(0) { mUpAvg = std::make_pair(0.0, 0.0); mDownAvg = std::make_pair(0.0, 0.0); mLeechAvg = std::make_pair(0, 0); mRunningLeechAvg = std::make_pair(0, 0); mSeedAvg = std::make_pair(0, 0); mRunningSeedAvg = std::make_pair(0, 0); } StatsPlugin::~StatsPlugin() { } void StatsPlugin::load() { mUpdCtr = 1; mPeerSpdUpdCtr = 1; pmUiSpd = new StatsSpd(dynamic_cast(parent())); pmUiCon = new StatsCon(dynamic_cast(parent())); pmPrefsUi = new StatsPluginPrefs(); pmUpdTmr = new TQTimer(this); connect(pmUpdTmr, TQT_SIGNAL(timeout () ), this, TQT_SLOT(UpdateData())); connect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(RestartTimer())); connect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(TogglePeersSpdCht())); connect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(ToggleLchInSwmDrawing())); connect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(ToggleSdrInSwmDrawing())); connect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(ChangeMsmtsCounts())); connect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(ChangeMaxMode())); TogglePeersSpdCht(); ChangeMaxMode(); pmUpdTmr -> start(StatsPluginSettings::gatherDataEveryMs()); getGUI() -> addToolWidget(pmUiSpd,"ktimemon" ,i18n("Speed statistics"), GUIInterface::DOCK_BOTTOM); getGUI() -> addToolWidget(pmUiCon,"ktimemon" ,i18n("Connection statistics"), GUIInterface::DOCK_BOTTOM); getGUI() -> addPrefPage (pmPrefsUi); } void StatsPlugin::unload() { getGUI() -> removeToolWidget(pmUiSpd); getGUI() -> removeToolWidget(pmUiCon); getGUI() -> removePrefPage(pmPrefsUi); disconnect(pmUpdTmr, TQT_SIGNAL(timeout()), this, TQT_SLOT(UpdateData())); disconnect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(RestartTimer())); disconnect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(TogglePeersSpdCht())); disconnect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(ToggleLchInSwmDrawing())); disconnect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(ToggleSdrInSwmDrawing())); disconnect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(ChangeMsmtsCounts())); disconnect(pmPrefsUi, TQT_SIGNAL(Applied()), this, TQT_SLOT(ChangeMaxMode())); delete pmUiSpd; delete pmUiCon; delete pmPrefsUi; delete pmUpdTmr; } bool StatsPlugin::versionCheck(const TQString& rVer) const { return rVer == KT_VERSION_MACRO; } void StatsPlugin::guiUpdate() { if(mUpdCtr >= StatsPluginSettings::updateChartsEveryGuiUpdates()) { pmUiSpd -> UpdateCharts(); pmUiCon -> UpdateCharts(); mUpdCtr = 1; } else { mUpdCtr++; } } void StatsPlugin::UpdateData() { uint32_t lcon = 0; uint32_t lswa = 0; uint32_t scon = 0; uint32_t sswa = 0; uint32_t rlcon = 0; uint32_t rlswa = 0; uint32_t rscon = 0; uint32_t rsswa = 0; uint32_t ld = 0; uint32_t lu = 0; uint32_t sd = 0; //--------------------------------------- mDownAvg.first += getCore() -> getStats() . download_speed; mDownAvg.second++; mUpAvg.first += getCore() -> getStats() . upload_speed; mUpAvg.second++; pmUiSpd -> AddDownSpdVal(0, getCore() -> getStats() . download_speed / 1024.0); pmUiSpd -> AddUpSpdVal(0, getCore() -> getStats() . upload_speed / 1024.0); pmUiSpd -> AddDownSpdVal(1, (mDownAvg.first / mDownAvg.second) / 1024.0 ); pmUiSpd -> AddUpSpdVal(1, (mUpAvg.first / mUpAvg.second) / 1024.0 ); pmUiSpd -> AddDownSpdVal(2, getCore() -> getMaxDownloadSpeed () ); pmUiSpd -> AddUpSpdVal(2, getCore() -> getMaxUploadSpeed ()); // if(getGUI()-> getCurrentTorrent()) // { // pmUi -> AddDownSpdVal(3, getGUI()-> getCurrentTorrent() -> getStats() . download_rate / 1024.0); // pmUi -> AddUpSpdVal(3, getGUI()-> getCurrentTorrent() -> getStats() . upload_rate / 1024.0); // } else { // pmUi -> AddDownSpdVal(3, 0.0); // pmUi -> AddUpSpdVal(3, 0.0); // } // ------ bt::QueueManager::iterator tor = getCore() -> getQueueManager () -> begin(); while(tor != getCore() -> getQueueManager () -> end()) { lcon += (*tor) -> getStats().leechers_connected_to; lswa += (*tor) -> getStats().leechers_total; scon += (*tor) -> getStats().seeders_connected_to; sswa += (*tor) -> getStats().seeders_total; mLeechAvg.first += lcon; mLeechAvg.second += lswa; mSeedAvg.first += scon; mSeedAvg.second += sswa; if(StatsPluginSettings::peersSpeed() && ( mPeerSpdUpdCtr >= StatsPluginSettings::peersSpeedDataIval() ) ) { bt::TorrentControl * tc = dynamic_cast( *tor ); const bt::PeerManager * pm = tc->getPeerMgr(); if(tc && pm) { for(bt::PeerManager::CItr it = pm -> beginPeerList(); it != pm -> endPeerList (); ++it) { if(it && (*it) ) { if(!(*it) -> isSeeder()) { ld += (*it) -> getDownloadRate(); lu += (*it) -> getUploadRate(); } else { sd += (*it) -> getDownloadRate(); } } } } } if( (*tor) -> getStats().started) { rlcon += (*tor) -> getStats().leechers_connected_to; rlswa += (*tor) -> getStats().leechers_total; rscon += (*tor) -> getStats().seeders_connected_to; rsswa += (*tor) -> getStats().seeders_total; mRunningLeechAvg.first += rlcon; mRunningLeechAvg.second += rlswa; mRunningSeedAvg.first += rscon; mRunningSeedAvg.second += rsswa; } tor++; } // ------ if(StatsPluginSettings::peersSpeed() ) { if( mPeerSpdUpdCtr >= StatsPluginSettings::peersSpeedDataIval() ) { pmUiSpd -> AddPeersSpdVal(0, (ld / (lcon * 1.0)) / 1024.0); pmUiSpd -> AddPeersSpdVal(1, (lu / (lcon * 1.0)) / 1024.0); pmUiSpd -> AddPeersSpdVal(2, (sd / (lswa * 1.0)) / 1024.0); pmUiSpd -> AddPeersSpdVal(3, ld / 1024.0); pmUiSpd -> AddPeersSpdVal(4, sd / 1024.0); mPeerSpdUpdCtr = 1; } else { mPeerSpdUpdCtr++; } } pmUiCon -> AddPeersConVal(0, lcon); if(StatsPluginSettings::drawLeechersInSwarms()) { pmUiCon -> AddPeersConVal(1, lswa); } pmUiCon -> AddPeersConVal(2, scon); if(StatsPluginSettings::drawSeedersInSwarms()) { pmUiCon -> AddPeersConVal(3, sswa); } double cnt = getCore() -> getQueueManager() -> count() * 1.0; double rcnt = getCore() -> getQueueManager() -> getNumRunning() * 1.0; pmUiCon -> AddPeersConVal(4, lcon / cnt ); pmUiCon -> AddPeersConVal(5, scon / cnt ); pmUiCon -> AddPeersConVal(6, lcon / rcnt); pmUiCon -> AddPeersConVal(7, scon / rcnt ); // ----- if( bt::Globals::instance().getDHT().isRunning() ) { pmUiCon -> AddDHTVal(0, bt::Globals::instance().getDHT(). getStats().num_peers); pmUiCon -> AddDHTVal(1, bt::Globals::instance().getDHT(). getStats().num_tasks); } } void StatsPlugin::RestartTimer() { if( (!pmUpdTmr) || (!pmUpdTmr -> isActive())) { return; } pmUpdTmr -> stop(); pmUpdTmr -> start(StatsPluginSettings::gatherDataEveryMs()); } void StatsPlugin::TogglePeersSpdCht() { if(StatsPluginSettings::peersSpeed()) { if(pmUiSpd -> PeersSpdGbw -> isHidden()) { pmUiSpd -> PeersSpdGbw -> setHidden(false); } } else { if(!pmUiSpd -> PeersSpdGbw -> isHidden()) { pmUiSpd -> PeersSpdGbw -> setHidden(true); } } } void StatsPlugin::ToggleLchInSwmDrawing() { if(!StatsPluginSettings::drawLeechersInSwarms()) { pmUiCon -> ZeroPeersConn(1); } } void StatsPlugin::ToggleSdrInSwmDrawing() { if(!StatsPluginSettings::drawSeedersInSwarms()) { pmUiCon -> ZeroPeersConn(3); } } void StatsPlugin::ChangeMsmtsCounts() { pmUiSpd -> ChangeDownMsmtCnt(StatsPluginSettings::downloadMeasurements()); pmUiSpd -> ChangePrsSpdMsmtCnt(StatsPluginSettings::peersSpeedMeasurements()); pmUiSpd -> ChangeUpMsmtCnt(StatsPluginSettings::uploadMeasurements()); pmUiCon -> ChangeConnMsmtCnt(StatsPluginSettings::connectionsMeasurements()); pmUiCon -> ChangeDHTMsmtCnt(StatsPluginSettings::dHTMeasurements()); } void StatsPlugin::ChangeMaxMode() { if(StatsPluginSettings::maxSpdMode() == 0) { pmUiSpd -> ChangeChartsMaxMode(ChartDrawer::MaxModeTop); pmUiCon -> ChangeChartsMaxMode(ChartDrawer::MaxModeTop); } else if (StatsPluginSettings::maxSpdMode() == 1) { pmUiSpd -> ChangeChartsMaxMode(ChartDrawer::MaxModeExact); pmUiCon -> ChangeChartsMaxMode(ChartDrawer::MaxModeExact); } } } // NS end #include "statsplugin.moc"