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

Last change on this file since 13718 was 13718, checked in by jordan, 9 years ago

In TorrentModel?.updateTorrents(), don't call getIds() if we don't need them

  • Property svn:keywords set to Date Rev Author Id
File size: 5.9 KB
Line 
1/*
2 * This file Copyright (C) Mnemosyne LLC
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2
6 * as published by the Free Software Foundation.
7 *
8 * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
9 *
10 * $Id: torrent-model.cc 13718 2012-12-29 21:05:05Z jordan $
11 */
12
13#include <cassert>
14#include <iostream>
15
16#include <libtransmission/transmission.h>
17#include <libtransmission/variant.h>
18
19#include "torrent-delegate.h"
20#include "torrent-model.h"
21
22void
23TorrentModel :: clear( )
24{
25    myIdToRow.clear( );
26    myIdToTorrent.clear( );
27    foreach( Torrent * tor, myTorrents ) delete tor;
28    myTorrents.clear( );
29    reset( );
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        QModelIndex qmi( index( row, 0 ) );
121        emit dataChanged( qmi, qmi );
122    }
123}
124
125void
126TorrentModel :: removeTorrents( tr_variant * torrents )
127{
128    int i = 0;
129    tr_variant * child;
130    while(( child = tr_variantListChild( torrents, i++ ))) {
131        int64_t intVal;
132        if( tr_variantGetInt( child, &intVal ) )
133            removeTorrent( intVal );
134    }
135}
136
137void
138TorrentModel :: updateTorrents( tr_variant * torrents, bool isCompleteList )
139{
140    QList<Torrent*> newTorrents;
141    QSet<int> oldIds;
142    QSet<int> addIds;
143    QSet<int> newIds;
144    int updatedCount = 0;
145
146    if ( isCompleteList )
147      oldIds = getIds( );
148
149    if( tr_variantIsList( torrents ) )
150    {
151        size_t i( 0 );
152        tr_variant * child;
153        while(( child = tr_variantListChild( torrents, i++ )))
154        {
155            int64_t id;
156            if( tr_variantDictFindInt( child, TR_KEY_id, &id ) )
157            {
158                newIds.insert( id );
159
160                Torrent * tor = getTorrentFromId( id );
161                if( tor == 0 )
162                {
163                    tor = new Torrent( myPrefs, id );
164                    tor->update( child );
165                    if( !tor->hasMetadata() )
166                        tor->setMagnet( true );
167                    newTorrents.append( tor );
168                    connect( tor, SIGNAL(torrentChanged(int)), this, SLOT(onTorrentChanged(int)));
169                }
170                else
171                {
172                    tor->update( child );
173                    ++updatedCount;
174                    if( tor->isMagnet() && tor->hasMetadata() )
175                    {
176                        addIds.insert( tor->id() );
177                        tor->setMagnet( false );
178                    }
179                }
180            }
181        }
182    }
183
184    if( !newTorrents.isEmpty( ) )
185    {
186        const int oldCount( rowCount( ) );
187        const int newCount( oldCount + newTorrents.size( ) );
188        QSet<int> ids;
189
190        beginInsertRows( QModelIndex(), oldCount, newCount - 1 );
191
192        foreach( Torrent * tor, newTorrents ) {
193            addTorrent( tor );
194            addIds.insert( tor->id( ) );
195        }
196        endInsertRows( );
197    }
198
199    if( !addIds.isEmpty() )
200        emit torrentsAdded( addIds );
201
202    if( isCompleteList )
203    {
204        QSet<int> removedIds( oldIds );
205        removedIds -= newIds;
206        foreach( int id, removedIds )
207            removeTorrent( id );
208    }
209}
210
211void
212TorrentModel :: removeTorrent( int id )
213{
214    const int row = myIdToRow.value( id, -1 );
215    if( row >= 0 )
216    {
217        Torrent * tor = myIdToTorrent.value( id, 0 );
218
219        beginRemoveRows( QModelIndex(), row, row );
220        // make the myIdToRow map consistent with list view/model
221        for( QMap<int,int>::iterator i = myIdToRow.begin(); i != myIdToRow.end(); ++i )
222            if( i.value() > row )
223                --i.value();
224        myIdToRow.remove( id );
225        myIdToTorrent.remove( id );
226        myTorrents.remove( myTorrents.indexOf( tor ) );
227        endRemoveRows( );
228
229        delete tor;
230    }
231}
232
233Speed
234TorrentModel :: getUploadSpeed( ) const
235{
236    Speed up;
237    foreach( const Torrent * tor, myTorrents )
238        up += tor->uploadSpeed( );
239    return up;
240}
241
242Speed
243TorrentModel :: getDownloadSpeed( ) const
244{
245    Speed down;
246    foreach( const Torrent * tor, myTorrents )
247        down += tor->downloadSpeed( );
248    return down;
249}
250
251QSet<int>
252TorrentModel :: getIds () const
253{
254  QSet<int> ids;
255
256  ids.reserve (myTorrents.size());
257  foreach (const Torrent * tor, myTorrents)
258    ids.insert (tor->id());
259
260  return ids;
261}
262
263bool
264TorrentModel :: hasTorrent( const QString& hashString ) const
265{
266    foreach( const Torrent * tor, myTorrents )
267        if( tor->hashString( ) == hashString )
268            return true;
269    return false;
270}
Note: See TracBrowser for help on using the repository browser.