• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdenetwork API Reference
  • KDE Home
  • Contact Us
 

kget

  • sources
  • kde-4.12
  • kdenetwork
  • kget
  • transfer-plugins
  • bittorrent
  • advanceddetails
peerviewmodel.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (C) 2008 by Joris Guisson and Ivan Vasic *
3  * joris.guisson@gmail.com *
4  * ivasic@gmail.com *
5  * *
6  * This program is free software; you can redistribute it and/or modify *
7  * it under the terms of the GNU General Public License as published by *
8  * the Free Software Foundation; either version 2 of the License, or *
9  * (at your option) any later version. *
10  * *
11  * This program is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14  * GNU General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU General Public License *
17  * along with this program; if not, write to the *
18  * Free Software Foundation, Inc., *
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
20  ***************************************************************************/
21 #include "peerviewmodel.h"
22 #include <klocale.h>
23 #include <kicon.h>
24 #include <kstandarddirs.h>
25 #include <interfaces/torrentinterface.h>
26 #include <util/functions.h>
27 #include <kdebug.h>
28 
29 using namespace bt;
30 
31 namespace kt
32 {
33  static KIcon yes,no;
34  static bool icons_loaded = false;
35 
36  PeerViewModel::Item::Item(bt::PeerInterface* peer) : peer(peer)
37  {
38  stats = peer->getStats();
39  if (!icons_loaded)
40  {
41  yes = KIcon("dialog-ok");
42  no = KIcon("dialog-cancel");
43  }
44  }
45  /*
46  bool PeerViewModel::Item::changed() const
47  {
48  const PeerInterface::Stats & s = peer->getStats();
49 
50 
51  if (s.download_rate != stats.download_rate ||
52  s.upload_rate != stats.upload_rate ||
53  s.choked != stats.choked ||
54  s.snubbed != stats.snubbed ||
55  s.perc_of_file != stats.perc_of_file ||
56  s.aca_score != stats.aca_score ||
57  s.has_upload_slot != stats.has_upload_slot ||
58  s.num_down_requests != stats.num_down_requests ||
59  s.num_up_requests != stats.num_up_requests ||
60  s.bytes_downloaded != stats.bytes_downloaded ||
61  s.bytes_uploaded != stats.bytes_uploaded ||
62  s.interested != stats.interested ||
63  s.am_interested != stats.am_interested)
64  {
65  stats = s;
66  return true;
67  }
68  return false;
69  }
70  */
71  bool PeerViewModel::Item::changed(int col,bool & modified) const
72  {
73  const PeerInterface::Stats & s = peer->getStats();
74  bool ret = false;
75 
76  switch (col)
77  {
78  case 3:
79  ret = s.download_rate != stats.download_rate;
80  break;
81  case 4:
82  ret = s.upload_rate != stats.upload_rate;
83  break;
84  case 5:
85  ret = s.choked != stats.choked;
86  break;
87  case 6:
88  ret = s.snubbed != stats.snubbed;
89  break;
90  case 7:
91  ret = s.perc_of_file != stats.perc_of_file;
92  break;
93  case 9:
94  ret = s.aca_score != stats.aca_score;
95  break;
96  case 10:
97  ret = s.has_upload_slot != stats.has_upload_slot;
98  break;
99  case 11:
100  ret = (s.num_down_requests != stats.num_down_requests || s.num_up_requests != stats.num_up_requests);
101  break;
102  case 12:
103  ret = s.bytes_downloaded != stats.bytes_downloaded;
104  break;
105  case 13:
106  ret = s.bytes_uploaded != stats.bytes_uploaded;
107  break;
108  case 14:
109  ret = s.interested != stats.interested;
110  break;
111  case 15:
112  ret = s.am_interested != stats.am_interested;
113  break;
114  default:
115  ret = false;
116  break;
117  }
118 
119  modified = s.download_rate != stats.download_rate ||
120  s.upload_rate != stats.upload_rate ||
121  s.choked != stats.choked ||
122  s.snubbed != stats.snubbed ||
123  s.perc_of_file != stats.perc_of_file ||
124  s.aca_score != stats.aca_score ||
125  s.has_upload_slot != stats.has_upload_slot ||
126  s.num_down_requests != stats.num_down_requests ||
127  s.num_up_requests != stats.num_up_requests ||
128  s.bytes_downloaded != stats.bytes_downloaded ||
129  s.bytes_uploaded != stats.bytes_uploaded ||
130  s.interested != stats.interested ||
131  s.am_interested != stats.am_interested;
132  stats = s;
133  return ret;
134  }
135 
136  QVariant PeerViewModel::Item::data(int col) const
137  {
138  switch (col)
139  {
140  case 0: return stats.ip_address;
141  case 1: return stats.client;
142  case 2:
143  if (stats.download_rate >= 103)
144  return BytesPerSecToString(stats.download_rate);
145  else
146  return QVariant();
147  case 3:
148  if (stats.upload_rate >= 103)
149  return BytesPerSecToString(stats.upload_rate);
150  else
151  return QVariant();
152  case 4: return stats.choked ? i18nc("Choked", "Yes") : i18nc("Not choked", "No");
153  case 5: return stats.snubbed ? i18nc("Snubbed", "Yes") : i18nc("Not snubbed", "No");
154  case 6: return QString("%1 %").arg(KGlobal::locale()->formatNumber(stats.perc_of_file,2));
155  case 7: return QVariant();
156  case 8: return KGlobal::locale()->formatNumber(stats.aca_score,2);
157  case 9: return QVariant();
158  case 10: return QString("%1 / %2").arg(stats.num_down_requests).arg(stats.num_up_requests);
159  case 11: return BytesToString(stats.bytes_downloaded);
160  case 12: return BytesToString(stats.bytes_uploaded);
161  case 13: return stats.interested ? i18nc("Interested", "Yes") : i18nc("Not Interested", "No");
162  case 14: return stats.am_interested ? i18nc("Interesting", "Yes") : i18nc("Not Interesting", "No");
163  default: return QVariant();
164  }
165  return QVariant();
166  }
167 
168  bool PeerViewModel::Item::lessThan(int col,const Item* other) const
169  {
170  switch (col)
171  {
172  case 0: return stats.ip_address < other->stats.ip_address;
173  case 1: return QString::localeAwareCompare(stats.client,other->stats.client) < 0;
174  case 2: return stats.download_rate < other->stats.download_rate;
175  case 3: return stats.upload_rate < other->stats.upload_rate;
176  case 4: return stats.choked < other->stats.choked;
177  case 5: return stats.snubbed < other->stats.snubbed;
178  case 6: return stats.perc_of_file < other->stats.perc_of_file;
179  case 7: return stats.dht_support < other->stats.dht_support;
180  case 8: return stats.aca_score < other->stats.aca_score;
181  case 9: return stats.has_upload_slot < other->stats.has_upload_slot;
182  case 10: return stats.num_down_requests + stats.num_up_requests <
183  other->stats.num_down_requests + other->stats.num_up_requests;
184  case 11: return stats.bytes_downloaded < other->stats.bytes_downloaded;
185  case 12: return stats.bytes_uploaded < other->stats.bytes_uploaded;
186  case 13: return stats.interested < other->stats.interested;
187  case 14: return stats.am_interested < other->stats.am_interested;
188  default: return false;
189  }
190  return false;
191  }
192 
193  QVariant PeerViewModel::Item::decoration(int col) const
194  {
195  switch (col)
196  {
197  case 0:
198  if (stats.encrypted)
199  return KIcon("kt-encrypted");
200  break;
201  case 1: return flag;
202  case 8: return stats.dht_support ? yes : no;
203  case 10: return stats.has_upload_slot ? yes : KIcon();
204  }
205 
206  return QVariant();
207  }
208 
210 
211  PeerViewModel::PeerViewModel ( QObject* parent )
212  : QAbstractTableModel(parent)
213  {
214  sort_column = 0;
215  sort_order = Qt::AscendingOrder;
216  }
217 
218 
219  PeerViewModel::~PeerViewModel()
220  {
221  qDeleteAll(items);
222  }
223 
224  void PeerViewModel::peerAdded(bt::PeerInterface* peer)
225  {
226  items.append(new Item(peer));
227  insertRow(items.count() - 1);
228  sort(sort_column,sort_order);
229  }
230 
231  void PeerViewModel::peerRemoved(bt::PeerInterface* peer)
232  {
233  int idx = 0;
234  for (QList<Item*>::iterator i = items.begin();i != items.end();i++)
235  {
236  Item* item = *i;
237  if (item->peer == peer)
238  {
239  items.erase(i);
240  delete item;
241  removeRow(idx);
242  break;
243  }
244  idx++;
245  }
246  }
247 
248  void PeerViewModel::clear()
249  {
250  qDeleteAll(items);
251  items.clear();
252  reset();
253  }
254 
255  void PeerViewModel::update()
256  {
257  bool resort = false;
258  Uint32 idx=0;
259  foreach (Item* i,items)
260  {
261  bool modified = false;
262  if (i->changed(sort_column,modified))
263  resort = true;
264 
265  if (modified && !resort)
266  emit dataChanged(index(idx,3),index(idx,15));
267  idx++;
268  }
269 
270  if (resort)
271  sort(sort_column,sort_order);
272  }
273 
274  QModelIndex PeerViewModel::index(int row,int column,const QModelIndex & parent) const
275  {
276  if (!hasIndex(row,column,parent) || parent.isValid())
277  return QModelIndex();
278  else
279  return createIndex(row,column,items[row]);
280  }
281 
282  int PeerViewModel::rowCount( const QModelIndex & parent) const
283  {
284  if (parent.isValid())
285  return 0;
286  else
287  return items.count();
288  }
289 
290  int PeerViewModel::columnCount(const QModelIndex & parent) const
291  {
292  if (parent.isValid())
293  return 0;
294  else
295  return 16;
296  }
297 
298  QVariant PeerViewModel::headerData(int section, Qt::Orientation orientation,int role) const
299  {
300  if (orientation != Qt::Horizontal)
301  return QVariant();
302 
303  if (role == Qt::DisplayRole)
304  {
305  switch (section)
306  {
307  case 0: return i18n("IP Address");
308  case 1: return i18n("Client");
309  case 2: return i18n("Down Speed");
310  case 3: return i18n("Up Speed");
311  case 4: return i18n("Choked");
312  case 5: return i18n("Snubbed");
313  case 6: return i18n("Availability");
314  case 7: return i18n("DHT");
315  case 8: return i18n("Score");
316  case 9: return i18n("Upload Slot");
317  case 10: return i18n("Requests");
318  case 11: return i18n("Downloaded");
319  case 12: return i18n("Uploaded");
320  case 13: return i18n("Interested");
321  case 14: return i18n("Interesting");
322  default: return QVariant();
323  }
324  }
325  else if (role == Qt::ToolTipRole)
326  {
327  switch (section)
328  {
329  case 0: return i18n("IP address of the peer");
330  case 1: return i18n("Which client the peer is using");
331  case 2: return i18n("Download speed");
332  case 3: return i18n("Upload speed");
333  case 4: return i18n("Whether or not the peer has choked us. If we are choked, the peer will not send us any data.");
334  case 5: return i18n("Snubbed means the peer has not sent us any data in the last 2 minutes");
335  case 6: return i18n("How much of the torrent's data the peer has");
336  case 7: return i18n("Whether or not the peer has DHT enabled");
337  case 8: return i18n("The score of the peer. KTorrent uses this to determine who to upload to.");
338  case 9: return i18n("Only peers which have an upload slot will get data from us");
339  case 10: return i18n("The number of download and upload requests");
340  case 11: return i18n("How much data we have downloaded from this peer");
341  case 12: return i18n("How much data we have uploaded to this peer");
342  case 13: return i18n("Whether the peer is interested in downloading data from us");
343  case 14: return i18n("Whether we are interested in downloading from this peer");
344  default: return QVariant();
345  }
346  }
347 
348  return QVariant();
349  }
350 
351  QVariant PeerViewModel::data(const QModelIndex & index,int role) const
352  {
353  if (!index.isValid() || index.row() >= items.count() || index.row() < 0)
354  return QVariant();
355 
356  Item* item = (Item*)index.internalPointer();
357  if (role == Qt::DisplayRole)
358  return item->data(index.column());
359  else if (role == Qt::DecorationRole)
360  return item->decoration(index.column());
361 
362  return QVariant();
363  }
364 
365  bool PeerViewModel::removeRows ( int row,int count,const QModelIndex & /*parent*/ )
366  {
367  beginRemoveRows(QModelIndex(),row,row + count - 1);
368  endRemoveRows();
369  return true;
370  }
371 
372  bool PeerViewModel::insertRows ( int row,int count,const QModelIndex & /*parent*/ )
373  {
374  beginInsertRows(QModelIndex(),row,row + count - 1);
375  endInsertRows();
376  return true;
377  }
378 
379  bt::PeerInterface* PeerViewModel::indexToPeer(const QModelIndex & index)
380  {
381  if (!index.isValid() || index.row() >= items.count() || index.row() < 0)
382  return 0;
383  else
384  return ((Item*)index.internalPointer())->peer;
385  }
386 
387  class PeerViewModelItemCmp
388  {
389  public:
390  PeerViewModelItemCmp(int col,Qt::SortOrder order) : col(col),order(order)
391  {}
392 
393  bool operator()(PeerViewModel::Item* a,PeerViewModel::Item* b)
394  {
395  if (order == Qt::AscendingOrder)
396  return a->lessThan(col,b);
397  else
398  return !a->lessThan(col,b);
399  }
400 
401  int col;
402  Qt::SortOrder order;
403  };
404 
405  void PeerViewModel::sort(int col, Qt::SortOrder order)
406  {
407  sort_column = col;
408  sort_order = order;
409  emit layoutAboutToBeChanged();
410  qStableSort(items.begin(),items.end(),PeerViewModelItemCmp(col,order));
411  emit layoutChanged();
412  }
413 }
kt::no
static KIcon no
Definition: peerviewmodel.cpp:33
kt::PeerViewModel::sort
void sort(int col, Qt::SortOrder order)
Definition: peerviewmodel.cpp:405
kt::PeerViewModel::removeRows
virtual bool removeRows(int row, int count, const QModelIndex &parent)
Definition: peerviewmodel.cpp:365
kt::PeerViewModel::clear
void clear()
Definition: peerviewmodel.cpp:248
kt::PeerViewModel::Item::decoration
QVariant decoration(int col) const
Definition: peerviewmodel.cpp:193
kt::PeerViewModel::~PeerViewModel
virtual ~PeerViewModel()
Definition: peerviewmodel.cpp:219
kt::PeerViewModel::Item::peer
bt::PeerInterface * peer
Definition: peerviewmodel.h:73
kt::PeerViewModel::Item::changed
bool changed(int col, bool &modified) const
Definition: peerviewmodel.cpp:71
QObject
kt::PeerViewModel::peerRemoved
void peerRemoved(bt::PeerInterface *peer)
A peer has been removed.
Definition: peerviewmodel.cpp:231
kt::PeerViewModel::Item::data
QVariant data(int col) const
Definition: peerviewmodel.cpp:136
kt::PeerViewModel::index
virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const
Definition: peerviewmodel.cpp:274
kt::PeerViewModel::PeerViewModel
PeerViewModel(QObject *parent)
Definition: peerviewmodel.cpp:211
kt::PeerViewModel::data
virtual QVariant data(const QModelIndex &index, int role) const
Definition: peerviewmodel.cpp:351
kt::icons_loaded
static bool icons_loaded
Definition: peerviewmodel.cpp:34
kt::PeerViewModel::peerAdded
void peerAdded(bt::PeerInterface *peer)
A peer has been added.
Definition: peerviewmodel.cpp:224
peerviewmodel.h
kt::PeerViewModel::rowCount
virtual int rowCount(const QModelIndex &parent) const
Definition: peerviewmodel.cpp:282
kt::PeerViewModel::update
void update()
Update the model.
Definition: peerviewmodel.cpp:255
kt::PeerViewModel::Item
Definition: peerviewmodel.h:71
kt::PeerViewModel::insertRows
virtual bool insertRows(int row, int count, const QModelIndex &parent)
Definition: peerviewmodel.cpp:372
kt::PeerViewModel::columnCount
virtual int columnCount(const QModelIndex &parent) const
Definition: peerviewmodel.cpp:290
kt::yes
static KIcon yes
Definition: peerviewmodel.cpp:33
kt::PeerViewModel::headerData
virtual QVariant headerData(int section, Qt::Orientation orientation, int role) const
Definition: peerviewmodel.cpp:298
QAbstractTableModel
kt::PeerViewModel::indexToPeer
bt::PeerInterface * indexToPeer(const QModelIndex &idx)
Definition: peerviewmodel.cpp:379
kt::PeerViewModel::Item::lessThan
bool lessThan(int col, const Item *other) const
Definition: peerviewmodel.cpp:168
kt::PeerViewModel::Item::stats
bt::PeerInterface::Stats stats
Definition: peerviewmodel.h:74
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:53:17 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

kget

Skip menu "kget"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdenetwork API Reference

Skip menu "kdenetwork API Reference"
  • kget
  • kopete
  •   kopete
  •   libkopete
  • krdc
  • krfb

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal