1 /*
2     SPDX-FileCopyrightText: 2007 Krzysztof Kundzicz <athantor@gmail.com>
3     SPDX-License-Identifier: GPL-2.0-or-later
4 */
5 
6 #include <ConnsTabPage.h>
7 
8 namespace kt
9 {
10 
ConnsTabPage(QWidget * p)11 ConnsTabPage::ConnsTabPage(QWidget* p) : PluginPage(p), pmConnsUi(new Ui::ConnsWgt), pmLhrSwnUuid(QUuid::createUuid()),
12     pmSesSwnUuid(QUuid::createUuid())
13 {
14 
15     if (StatsPluginSettings::widgetType() == 0) {
16         pmConnsChtWgt = new PlainChartDrawer(this);
17         pmDhtChtWgt = new PlainChartDrawer(this);
18     } else if (StatsPluginSettings::widgetType() == 1) {
19         pmConnsChtWgt = new KPlotWgtDrawer(this);
20         pmDhtChtWgt = new KPlotWgtDrawer(this);
21     }
22 
23     setupUi();
24 }
25 
~ConnsTabPage()26 ConnsTabPage::~ConnsTabPage()
27 {
28 }
29 
30 
setupUi()31 void ConnsTabPage::setupUi()
32 {
33     pmConnsUi->setupUi(this);
34 
35     pmConnsChtWgt->setUnitName(i18n("Connections"));
36     pmDhtChtWgt->setUnitName(i18n("Nodes"));
37 
38     pmConnsUi->ConnsGbw->layout()->addWidget(dynamic_cast<QWidget*>(pmConnsChtWgt));
39     pmConnsUi->DhtGbw->layout()->addWidget(dynamic_cast<QWidget*>(pmDhtChtWgt));
40 
41     //------------------
42     pmConnsChtWgt->addDataSet(ChartDrawerData(i18nc("Name of a line on chart", "Leechers connected"), QPen(StatsPluginSettings::cnLConnColor()), true));
43     //
44 
45     if (StatsPluginSettings::showLeechersInSwarms()) {
46         pmConnsChtWgt->addDataSet(ChartDrawerData(i18nc("Name of a line on chart", "Leechers in swarms"), QPen(StatsPluginSettings::cnLSwarmsColor()), true, pmLhrSwnUuid));
47     }
48 
49     //
50     pmConnsChtWgt->addDataSet(ChartDrawerData(i18nc("Name of a line on chart", "Seeds connected"), QPen(StatsPluginSettings::cnSConnColor()), true));
51 
52     //
53     if (StatsPluginSettings::showSeedsInSwarms()) {
54         pmConnsChtWgt->addDataSet(ChartDrawerData(i18nc("Name of a line on chart", "Seeds in swarms"), QPen(StatsPluginSettings::cnSSwarmsColor()), true, pmSesSwnUuid));
55     }
56 
57     //
58     pmConnsChtWgt->addDataSet(ChartDrawerData(i18nc("Name of a line on chart", "Average leechers connected per torrent"), QPen(StatsPluginSettings::cnAvgLConnPerTorrColor()), true));
59 
60     //
61     pmConnsChtWgt->addDataSet(ChartDrawerData(i18nc("Name of a line on chart", "Average seeds connected per torrent"), QPen(StatsPluginSettings::cnAvgSConnPerTorrColor()), true));
62 
63     //
64     pmConnsChtWgt->addDataSet(ChartDrawerData(i18nc("Name of a line on chart", "Average leechers connected per running torrent"), QPen(StatsPluginSettings::cnAvgLConnPerRunTorrColor()), true));
65 
66     //
67     pmConnsChtWgt->addDataSet(ChartDrawerData(i18nc("Name of a line on chart", "Average seeds connected per running torrent"), QPen(StatsPluginSettings::cnAvgSConnPerRunTorrColor()), true));
68 
69     //--------------------------
70 
71     if (bt::Globals::instance().getDHT().isRunning()) {
72         pmDhtChtWgt->addDataSet(ChartDrawerData(i18nc("Name of a line on chart", "Nodes"), QPen(StatsPluginSettings::dhtNodesColor()), true));
73         pmDhtChtWgt->addDataSet(ChartDrawerData(i18nc("Name of a line on chart", "Tasks"), QPen(StatsPluginSettings::dhtTasksColor()), true));
74     } else {
75         pmConnsUi->DhtGbw->setEnabled(false);
76     }
77 
78     applySettings();
79 }
80 
applySettings()81 void ConnsTabPage::applySettings()
82 {
83 
84     pmConnsChtWgt->enableAntiAlias(StatsPluginSettings::antiAliasing());
85     pmDhtChtWgt->enableAntiAlias(StatsPluginSettings::antiAliasing());
86 
87     pmConnsChtWgt->enableBackgroundGrid(StatsPluginSettings::drawBgdGrid());
88     pmDhtChtWgt->enableBackgroundGrid(StatsPluginSettings::drawBgdGrid());
89 
90 
91     //-------
92 
93     if (StatsPluginSettings::showLeechersInSwarms() && (pmConnsChtWgt->findUuidInSet(pmLhrSwnUuid) == -1)) {
94         pmConnsChtWgt->insertDataSet(1, ChartDrawerData(i18nc("Name of a line on chart", "Leechers in swarms"), QPen(StatsPluginSettings::cnLSwarmsColor()), true, pmLhrSwnUuid));
95     }
96 
97     if ((!StatsPluginSettings::showLeechersInSwarms()) && (pmConnsChtWgt->findUuidInSet(pmLhrSwnUuid) != -1)) {
98         pmConnsChtWgt->removeDataSet(1);
99     }
100 
101     //~
102 
103     if (StatsPluginSettings::showSeedsInSwarms() && (pmConnsChtWgt->findUuidInSet(pmSesSwnUuid) == -1)) {
104         if ((pmConnsChtWgt->findUuidInSet(pmLhrSwnUuid) == -1)) {
105             pmConnsChtWgt->insertDataSet(2, ChartDrawerData(i18nc("Name of a line on chart", "Seeds in swarms"), QPen(StatsPluginSettings::cnSSwarmsColor()), true, pmSesSwnUuid));
106         } else {
107             pmConnsChtWgt->insertDataSet(3, ChartDrawerData(i18nc("Name of a line on chart", "Seeds in swarms"), QPen(StatsPluginSettings::cnSSwarmsColor()), true, pmSesSwnUuid));
108         }
109     }
110 
111     if ((!StatsPluginSettings::showSeedsInSwarms()) && (pmConnsChtWgt->findUuidInSet(pmSesSwnUuid) != -1)) {
112         if ((pmConnsChtWgt->findUuidInSet(pmLhrSwnUuid) == -1)) {
113             pmConnsChtWgt->removeDataSet(2);
114         } else {
115             pmConnsChtWgt->removeDataSet(3);
116         }
117     }
118 
119     //-------------
120 
121     uint8_t s1, s2;
122 
123     s1 = s2 = 1;
124 
125     pmConnsChtWgt->setPen(0, QPen(StatsPluginSettings::cnLConnColor()));
126 
127     if (StatsPluginSettings::showLeechersInSwarms()) {
128         pmConnsChtWgt->setPen(1, QPen(StatsPluginSettings::cnLSwarmsColor()));
129         s1 = 0;
130     }
131 
132     pmConnsChtWgt->setPen(2 - s1, QPen(StatsPluginSettings::cnSConnColor()));
133 
134     if (StatsPluginSettings::showSeedsInSwarms()) {
135         pmConnsChtWgt->setPen(3 - s1, QPen(StatsPluginSettings::cnSSwarmsColor()));
136         s2 = 0;
137     }
138 
139     pmConnsChtWgt->setPen(4 - (s1 + s2), QPen(StatsPluginSettings::cnAvgLConnPerTorrColor()));
140 
141     pmConnsChtWgt->setPen(5 - (s1 + s2), QPen(StatsPluginSettings::cnAvgSConnPerTorrColor()));
142     pmConnsChtWgt->setPen(6 - (s1 + s2), QPen(StatsPluginSettings::cnAvgLConnPerRunTorrColor()));
143     pmConnsChtWgt->setPen(7 - (s1 + s2), QPen(StatsPluginSettings::cnAvgSConnPerRunTorrColor()));
144 
145     pmDhtChtWgt->setPen(0, QPen(StatsPluginSettings::dhtNodesColor()));
146     pmDhtChtWgt->setPen(1, QPen(StatsPluginSettings::dhtTasksColor()));
147 
148 //--------------------------------------------------------------------------------------------------------------------
149 
150     pmConnsChtWgt->setXMax(StatsPluginSettings::connsSamples());
151 
152     if (bt::Globals::instance().getDHT().isRunning()) {
153         if (! dynamic_cast<QWidget*>(pmDhtChtWgt)->isEnabled()) {
154             pmConnsUi->DhtGbw->setEnabled(true);
155         }
156 
157         pmDhtChtWgt->setXMax(StatsPluginSettings::dhtSpdSamples());
158 
159     } else {
160         pmConnsUi->DhtGbw->setEnabled(false);
161     }
162 
163     pmConnsChtWgt->setXMax(StatsPluginSettings::connsSamples());
164 
165     pmDhtChtWgt->setXMax(StatsPluginSettings::dhtSpdSamples());
166 
167     pmConnsChtWgt->setMaxMode(static_cast<PlainChartDrawer::MaxMode>(StatsPluginSettings::maxMode()));
168     pmDhtChtWgt->setMaxMode(static_cast<PlainChartDrawer::MaxMode>(StatsPluginSettings::maxMode()));
169 }
170 
updateAllCharts()171 void ConnsTabPage::updateAllCharts()
172 {
173     pmConnsChtWgt->update();
174 
175     if (dynamic_cast<QWidget*>(pmDhtChtWgt)->isEnabled()) {
176         pmDhtChtWgt->update();
177     }
178 }
179 
gatherData(Plugin * pPlug)180 void ConnsTabPage::gatherData(Plugin* pPlug)
181 {
182 
183     GatherConnStats(pPlug);
184 
185     if (pmConnsUi->DhtGbw->isEnabled()) {
186         GatherDhtStats();
187     }
188 }
189 
resetAvg(ChartDrawer *)190 void ConnsTabPage::resetAvg(ChartDrawer*)
191 {
192 }
193 
GatherDhtStats()194 void ConnsTabPage::GatherDhtStats()
195 {
196     const dht::Stats st = bt::Globals::instance().getDHT().getStats();
197 
198     pmDhtChtWgt->addValue(0, st.num_peers);
199     pmDhtChtWgt->addValue(1, st.num_tasks);
200 }
201 
GatherConnStats(Plugin * pPlug)202 void ConnsTabPage::GatherConnStats(Plugin* pPlug)
203 {
204     QueueManager* qm_iface = pPlug->getCore()->getQueueManager();
205 
206     if (qm_iface == nullptr) {
207         return;
208     }
209 
210     uint_least32_t lc, ls, sc, ss, tc, rtc;
211 
212     lc = ls = sc = ss = tc = rtc = 0;
213 
214     for (QList< bt::TorrentInterface*>::iterator it = qm_iface->begin(); it != qm_iface->end(); it++) {
215         const bt::TorrentStats& tstat = (*it)->getStats();
216 
217         lc += tstat.leechers_connected_to;
218         ls += tstat.leechers_total;
219         sc += tstat.seeders_connected_to;
220         ss += tstat.seeders_total;
221 
222         tc++;
223 
224         if (tstat.running) {
225             rtc++;
226         }
227     }
228 
229     uint8_t s1, s2;
230 
231     s1 = s2 = 1;
232 
233     pmConnsChtWgt->addValue(0, lc);
234 
235     if (StatsPluginSettings::showLeechersInSwarms()) {
236         pmConnsChtWgt->addValue(1, ls);
237         s1 = 0;
238     }
239 
240     pmConnsChtWgt->addValue(2 - s1, sc);
241 
242     if (StatsPluginSettings::showSeedsInSwarms()) {
243         pmConnsChtWgt->addValue(3 - s1, ss);
244         s2 = 0;
245     }
246 
247     if (tc == 0) {
248         pmConnsChtWgt->addValue(4 - (s1 + s2), 0);
249         pmConnsChtWgt->addValue(5 - (s1 + s2), 0);
250     } else {
251         pmConnsChtWgt->addValue(4 - (s1 + s2), static_cast<double>(lc) / static_cast<double>(tc));
252         pmConnsChtWgt->addValue(5 - (s1 + s2), static_cast<double>(sc) / static_cast<double>(tc));
253     }
254 
255     if (rtc == 0) {
256         pmConnsChtWgt->addValue(6 - (s1 + s2), 0);
257         pmConnsChtWgt->addValue(7 - (s1 + s2), 0);
258     } else {
259         pmConnsChtWgt->addValue(6 - (s1 + s2), static_cast<double>(lc) / static_cast<double>(rtc));
260         pmConnsChtWgt->addValue(7 - (s1 + s2), static_cast<double>(sc) / static_cast<double>(rtc));
261     }
262 }
263 
264 } //ns end
265