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

Last change on this file since 8323 was 8323, checked in by charles, 13 years ago

(trunk qt) Remember between runs whether we were running a local or remote session. Add a gui dialog for switching sessions during runtime.

File size: 5.4 KB
Line 
1/*
2 * This file Copyright (C) 2009 Charles Kerr <charles@transmissionbt.com>
3 *
4 * This file is licensed by the GPL version 2.  Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
9 *
10 * $Id:$
11 */
12
13#include <cassert>
14#include <iostream>
15
16#include <libtransmission/transmission.h>
17#include <libtransmission/bencode.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    const int row = index.row( );
45    if( row<0 || row>=myTorrents.size() )
46        return QVariant( );
47
48    const Torrent* t = myTorrents.at( row );
49
50    switch( role )
51    {
52        case Qt::DisplayRole:
53            var = QString( t->name() );
54            break;
55
56        case Qt::DecorationRole:
57            var = t->getMimeTypeIcon( );
58            break;
59
60        case TorrentRole:
61            var = qVariantFromValue( t );
62            break;
63
64        default:
65            //std::cerr << "Unhandled role: " << role << std::endl;
66            break;
67    }
68
69    return var;
70}
71
72/***
73****
74***/
75
76void
77TorrentModel :: addTorrent( Torrent * t )
78{
79    myIdToTorrent.insert( t->id( ), t );
80    myIdToRow.insert( t->id( ), myTorrents.size( ) );
81    myTorrents.append( t );
82}
83
84TorrentModel :: TorrentModel( Prefs& prefs ):
85    myPrefs( prefs )
86{
87}
88
89TorrentModel :: ~TorrentModel( )
90{
91    clear( );
92}
93
94/***
95****
96***/
97
98Torrent*
99TorrentModel :: getTorrentFromId( int id )
100{
101    id_to_torrent_t::iterator it( myIdToTorrent.find( id ) );
102    return it == myIdToTorrent.end() ? 0 : it.value( );
103}
104
105const Torrent*
106TorrentModel :: getTorrentFromId( int id ) const
107{
108    id_to_torrent_t::const_iterator it( myIdToTorrent.find( id ) );
109    return it == myIdToTorrent.end() ? 0 : it.value( );
110}
111
112/***
113****
114***/
115
116void
117TorrentModel :: onTorrentChanged( int torrentId )
118{
119    const int row( myIdToRow.value( torrentId, -1 ) );
120    if( row >= 0 ) {
121        QModelIndex qmi( index( row, 0 ) );
122        dataChanged( qmi, qmi );
123    }
124}
125
126void
127TorrentModel :: removeTorrents( tr_benc * torrents )
128{
129    int i = 0;
130    tr_benc * child;
131    while(( child = tr_bencListChild( torrents, i++ ))) {
132        int64_t intVal;
133        if( tr_bencGetInt( child, &intVal ) )
134            removeTorrent( intVal );
135    }
136}
137
138void
139TorrentModel :: updateTorrents( tr_benc * torrents, bool isCompleteList )
140{
141    QList<Torrent*> newTorrents;
142    QSet<int> oldIds( getIds( ) );
143    QSet<int> newIds;
144    int updatedCount = 0;
145
146    if( tr_bencIsList( torrents ) )
147    {
148        size_t i( 0 );
149        tr_benc * child;
150        while(( child = tr_bencListChild( torrents, i++ )))
151        {
152            int64_t id;
153            if( tr_bencDictFindInt( child, "id", &id ) )
154            {
155                newIds.insert( id );
156
157                Torrent * tor = getTorrentFromId( id );
158                if( tor == 0 )
159                {
160                    tor = new Torrent( myPrefs, id );
161                    tor->update( child );
162                    newTorrents.append( tor );
163                    connect( tor, SIGNAL(torrentChanged(int)), this, SLOT(onTorrentChanged(int)));
164                }
165                else
166                {
167                    tor->update( child );
168                    ++updatedCount;
169                }
170            }
171        }
172    }
173
174    if( !newTorrents.isEmpty( ) )
175    {
176        const int oldCount( rowCount( ) );
177        const int newCount( oldCount + newTorrents.size( ) );
178        QSet<int> ids;
179
180        beginInsertRows( QModelIndex(), oldCount, newCount - 1 );
181
182        foreach( Torrent * tor, newTorrents ) {
183            addTorrent( tor );
184            ids.insert( tor->id( ) );
185        }
186        endInsertRows( );
187
188        emit torrentsAdded( ids );
189    }
190
191    if( isCompleteList )
192    {
193        QSet<int> removedIds( oldIds );
194        removedIds -= newIds;
195        foreach( int id, removedIds )
196            removeTorrent( id );
197    }
198}
199
200void
201TorrentModel :: removeTorrent( int id )
202{
203    const int row = myIdToRow.value( id, -1 );
204    if( row >= 0 )
205    {
206        Torrent * tor = myIdToTorrent.value( id, 0 );
207        std::cerr << "removing torrent " << id << std::endl;
208
209        beginRemoveRows( QModelIndex(), row, row );
210        myIdToRow.remove( id );
211        myIdToTorrent.remove( id );
212        myTorrents.remove( myTorrents.indexOf( tor ) );
213        endRemoveRows( );
214
215        delete tor;
216    }
217}
218
219Speed
220TorrentModel :: getUploadSpeed( ) const
221{
222    Speed up;
223    foreach( const Torrent * tor, myTorrents )
224        up += tor->uploadSpeed( );
225    return up;
226}
227
228Speed
229TorrentModel :: getDownloadSpeed( ) const
230{
231    Speed down;
232    foreach( const Torrent * tor, myTorrents )
233        down += tor->downloadSpeed( );
234    return down;
235}
236
237QSet<int>
238TorrentModel :: getIds( ) const
239{
240    QSet<int> ids;
241    foreach( const Torrent * tor, myTorrents )
242        ids.insert( tor->id( ) );
243    return ids;
244}
245
246bool
247TorrentModel :: hasTorrent( const QString& hashString ) const
248{
249    foreach( const Torrent * tor, myTorrents )
250        if( tor->hashString( ) == hashString )
251            return true;
252    return false;
253}
Note: See TracBrowser for help on using the repository browser.