source: trunk/qt/torrent-model.cc @ 14377

Last change on this file since 14377 was 14377, checked in by mikedld, 8 years ago

Strip spaces around :: in C++ code (Qt client)

  • Property svn:keywords set to Date Rev Author Id
File size: 5.9 KB
Line 
1/*
2 * This file Copyright (C) 2009-2014 Mnemosyne LLC
3 *
4 * It may be used under the GNU Public License v2 or v3 licenses,
5 * or any future license endorsed by Mnemosyne LLC.
6 *
7 * $Id: torrent-model.cc 14377 2014-12-12 23:05:10Z mikedld $
8 */
9
10#include <cassert>
11#include <iostream>
12
13#include <libtransmission/transmission.h>
14#include <libtransmission/variant.h>
15
16#include "torrent-delegate.h"
17#include "torrent-model.h"
18
19void
20TorrentModel::clear ()
21{
22  beginResetModel ();
23
24  myIdToRow.clear ();
25  myIdToTorrent.clear ();
26  foreach (Torrent * tor, myTorrents) delete tor;
27  myTorrents.clear ();
28
29  endResetModel ();
30}
31
32int
33TorrentModel::rowCount (const QModelIndex& parent) const
34{
35  Q_UNUSED (parent);
36
37  return myTorrents.size ();
38}
39
40QVariant
41TorrentModel::data (const QModelIndex& index, int role) const
42{
43  QVariant var;
44
45  const Torrent * t = myTorrents.value (index.row(), 0);
46  if (t != 0)
47    {
48      switch (role)
49        {
50          case Qt::DisplayRole:
51            var.setValue (t->name());
52            break;
53
54          case Qt::DecorationRole:
55            var.setValue (t->getMimeTypeIcon());
56            break;
57
58          case TorrentRole:
59            var = qVariantFromValue(t);
60            break;
61
62          default:
63            //std::cerr << "Unhandled role: " << role << std::endl;
64            break;
65        }
66    }
67
68  return var;
69}
70
71/***
72****
73***/
74
75void
76TorrentModel::addTorrent (Torrent * t)
77{
78  myIdToTorrent.insert (t->id (), t);
79  myIdToRow.insert (t->id (), myTorrents.size ());
80  myTorrents.append (t);
81}
82
83TorrentModel::TorrentModel (Prefs& prefs):
84  myPrefs (prefs)
85{
86}
87
88TorrentModel::~TorrentModel ()
89{
90  clear ();
91}
92
93/***
94****
95***/
96
97Torrent*
98TorrentModel::getTorrentFromId (int id)
99{
100  id_to_torrent_t::iterator it (myIdToTorrent.find (id));
101  return it == myIdToTorrent.end() ? 0 : it.value ();
102}
103
104const Torrent*
105TorrentModel::getTorrentFromId (int id) const
106{
107  id_to_torrent_t::const_iterator it (myIdToTorrent.find (id));
108  return it == myIdToTorrent.end() ? 0 : it.value ();
109}
110
111/***
112****
113***/
114
115void
116TorrentModel::onTorrentChanged (int torrentId)
117{
118  const int row (myIdToRow.value (torrentId, -1));
119  if (row >= 0)
120    {
121      QModelIndex qmi (index (row, 0));
122      emit dataChanged (qmi, qmi);
123    }
124}
125
126void
127TorrentModel::removeTorrents (tr_variant * torrents)
128{
129  int i = 0;
130  tr_variant * child;
131  while( (child = tr_variantListChild (torrents, i++)))
132    {
133      int64_t intVal;
134      if (tr_variantGetInt (child, &intVal))
135        removeTorrent (intVal);
136    }
137}
138
139void
140TorrentModel::updateTorrents (tr_variant * torrents, bool isCompleteList)
141{
142  QList<Torrent*> newTorrents;
143  QSet<int> oldIds;
144  QSet<int> addIds;
145  QSet<int> newIds;
146  int updatedCount = 0;
147
148  if  (isCompleteList)
149    oldIds = getIds ();
150
151  if (tr_variantIsList (torrents))
152    {
153      size_t i (0);
154      tr_variant * child;
155      while( (child = tr_variantListChild (torrents, i++)))
156        {
157          int64_t id;
158          if (tr_variantDictFindInt (child, TR_KEY_id, &id))
159            {
160              newIds.insert (id);
161
162              Torrent * tor = getTorrentFromId (id);
163              if (tor == 0)
164                {
165                  tor = new Torrent (myPrefs, id);
166                  tor->update (child);
167                  if (!tor->hasMetadata())
168                    tor->setMagnet (true);
169                  newTorrents.append (tor);
170                  connect (tor, SIGNAL(torrentChanged(int)), this, SLOT(onTorrentChanged(int)));
171                }
172              else
173                {
174                  tor->update (child);
175                  ++updatedCount;
176                  if (tor->isMagnet() && tor->hasMetadata())
177                    {
178                      addIds.insert (tor->id());
179                      tor->setMagnet (false);
180                    }
181                }
182            }
183        }
184    }
185
186  if (!newTorrents.isEmpty ())
187    {
188      const int oldCount (rowCount ());
189      const int newCount (oldCount + newTorrents.size ());
190      QSet<int> ids;
191
192      beginInsertRows (QModelIndex(), oldCount, newCount - 1);
193
194      foreach (Torrent * tor, newTorrents)
195        {
196          addTorrent (tor);
197          addIds.insert (tor->id ());
198        }
199
200      endInsertRows ();
201    }
202
203  if (!addIds.isEmpty())
204    emit torrentsAdded (addIds);
205
206  if (isCompleteList)
207    {
208      QSet<int> removedIds (oldIds);
209      removedIds -= newIds;
210      foreach (int id, removedIds)
211        removeTorrent (id);
212    }
213}
214
215void
216TorrentModel::removeTorrent (int id)
217{
218  const int row = myIdToRow.value (id, -1);
219  if (row >= 0)
220    {
221      Torrent * tor = myIdToTorrent.value (id, 0);
222
223      beginRemoveRows (QModelIndex(), row, row);
224      // make the myIdToRow map consistent with list view/model
225      for (QMap<int,int>::iterator i = myIdToRow.begin(); i != myIdToRow.end(); ++i)
226        if (i.value() > row)
227          --i.value();
228      myIdToRow.remove (id);
229      myIdToTorrent.remove (id);
230      myTorrents.remove (myTorrents.indexOf (tor));
231      endRemoveRows ();
232
233      delete tor;
234    }
235}
236
237void
238TorrentModel::getTransferSpeed (Speed   & uploadSpeed,
239                                size_t  & uploadPeerCount,
240                                Speed   & downloadSpeed,
241                                size_t  & downloadPeerCount)
242{
243  Speed upSpeed, downSpeed;
244  size_t upCount=0, downCount=0;
245
246  foreach (const Torrent * const tor, myTorrents)
247    {
248      upSpeed += tor->uploadSpeed ();
249      upCount += tor->peersWeAreUploadingTo ();
250      downSpeed += tor->downloadSpeed ();
251      downCount += tor->webseedsWeAreDownloadingFrom();
252      downCount += tor->peersWeAreDownloadingFrom();
253    }
254
255  uploadSpeed = upSpeed;
256  uploadPeerCount = upCount;
257  downloadSpeed = downSpeed;
258  downloadPeerCount = downCount;
259}
260
261QSet<int>
262TorrentModel::getIds () const
263{
264  QSet<int> ids;
265
266  ids.reserve (myTorrents.size());
267  foreach (const Torrent * tor, myTorrents)
268    ids.insert (tor->id());
269
270  return ids;
271}
272
273bool
274TorrentModel::hasTorrent (const QString& hashString) const
275{
276  foreach (const Torrent * tor, myTorrents)
277    if (tor->hashString () == hashString)
278      return true;
279
280  return false;
281}
Note: See TracBrowser for help on using the repository browser.