Changeset 10442


Ignore:
Timestamp:
Apr 3, 2010, 2:23:29 PM (11 years ago)
Author:
charles
Message:

(trunk qt) #3098 "tracker display broken in qt client" -- fixed in trunk for 2.00 by Longinus00's patch

Location:
trunk/qt
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • trunk/qt/details.cc

    r10077 r10442  
    4545#include "file-tree.h"
    4646#include "hig.h"
     47#include "prefs.h"
    4748#include "session.h"
    4849#include "squeezelabel.h"
     
    118119***/
    119120
    120 Details :: Details( Session& session, TorrentModel& model, QWidget * parent ):
     121Details :: Details( Session& session, Prefs& prefs, TorrentModel& model, QWidget * parent ):
    121122    QDialog( parent, Qt::Dialog ),
    122123    mySession( session ),
     124    myPrefs( prefs ),
    123125    myModel( model ),
    124126    myHavePendingRefresh( false )
     
    190192****
    191193***/
     194
     195QString
     196Details :: timeToStringRounded( int seconds )
     197{
     198    if( seconds > 60 ) seconds -= ( seconds % 60 );
     199    return Utils::timeToString ( seconds );
     200}
    192201
    193202void
     
    588597    // tracker tab
    589598    //
     599    QMap<QString,QTreeWidgetItem*> trackers2;
     600    QList<QTreeWidgetItem*> newItems2;
    590601    const time_t now( time( 0 ) );
    591 
    592     // myScrapeTimePrevLabel
    593     if( torrents.empty( ) )
    594         string = none;
    595     else {
    596         QDateTime latest = torrents[0]->lastScrapeTime();
    597         foreach( const Torrent * t, torrents ) {
    598             const QDateTime e = t->lastScrapeTime();
    599             if( latest < e )
    600                 latest = e;
    601         }
    602         string = latest.toString();
    603     }
    604     myScrapeTimePrevLabel->setText( string );
    605 
    606     // myScrapeResponseLabel
    607     if( torrents.empty( ) )
    608         string = none;
    609     else {
    610         string = torrents[0]->scrapeResponse( );
    611         foreach( const Torrent * t, torrents ) {
    612            if( string != t->scrapeResponse( ) ) {
    613                string = mixed;
    614                break;
    615            }
    616         }
    617     }
    618     myScrapeResponseLabel->setText( string );
    619 
    620     // myScrapeTimeNextLabel
    621     if( torrents.empty( ) )
    622         string = none;
    623     else {
    624         QDateTime soonest = torrents[0]->nextScrapeTime( );
    625         foreach( const Torrent * t, torrents ) {
    626             const QDateTime e = t->nextScrapeTime( );
    627             if( soonest > e )
    628                 soonest = e;
    629         }
    630         string = Utils::timeToString( soonest.toTime_t() - now );
    631     }
    632     myScrapeTimeNextLabel->setText( string );
    633 
    634     // myAnnounceTimePrevLabel
    635     if( torrents.empty( ) )
    636         string = none;
    637     else {
    638         QDateTime latest = torrents[0]->lastAnnounceTime();
    639         foreach( const Torrent * t, torrents ) {
    640             const QDateTime e = t->lastAnnounceTime();
    641             if( latest < e )
    642                 latest = e;
    643         }
    644         string = latest.toString();
    645     }
    646     myAnnounceTimePrevLabel->setText( string );
    647 
    648     // myAnnounceTimeNextLabel
    649     if( torrents.empty( ) )
    650         string = none;
    651     else {
    652         QDateTime soonest = torrents[0]->nextAnnounceTime( );
    653         foreach( const Torrent * t, torrents ) {
    654             const QDateTime e = t->nextAnnounceTime( );
    655             if( soonest > e )
    656                 soonest = e;
    657         }
    658         string = Utils::timeToString( soonest.toTime_t() - now );
    659     }
    660     myAnnounceTimeNextLabel->setText( string );
    661 
    662     // myAnnounceManualLabel
    663     if( torrents.empty( ) )
    664         string = none;
    665     else {
    666         QDateTime soonest = torrents[0]->nextAnnounceTime( );
    667         foreach( const Torrent * t, torrents ) {
    668             const QDateTime e = t->nextAnnounceTime( );
    669             if( soonest > e )
    670                 soonest = e;
    671         }
    672         if( soonest <= QDateTime::currentDateTime( ) )
    673             string = tr( "Now" );
    674         else
    675             string = Utils::timeToString( soonest.toTime_t() - now );
    676     }
    677     myAnnounceManualLabel->setText( string );
    678 
    679     // myAnnounceResponseLabel
    680     if( torrents.empty( ) )
    681         string = none;
    682     else {
    683         string = torrents[0]->announceResponse( );
    684         foreach( const Torrent * t, torrents ) {
    685            if( string != t->announceResponse( ) ) {
    686                string = mixed;
    687                break;
    688            }
    689         }
    690     }
    691     myAnnounceResponseLabel->setText( string );
    692 
    693     // myTrackerLabel
    694     if( torrents.empty( ) )
    695         string = none;
    696     else {
    697         string = QUrl(torrents[0]->announceUrl()).host();
    698         foreach( const Torrent * t, torrents ) {
    699             if( string != QUrl(t->announceUrl()).host() ) {
    700                 string = mixed;
    701                 break;
    702             }
    703         }
    704     }
    705     myTrackerLabel->setText( string );
     602    const bool showBackup = myPrefs.getBool( Prefs::SHOW_BACKUP_TRACKERS );
     603    const bool showScrape = myPrefs.getBool( Prefs::SHOW_TRACKER_SCRAPES );
     604    foreach( const Torrent * t, torrents )
     605    {
     606        const QString idStr( QString::number( t->id( ) ) );
     607        TrackerStatsList trackerStats = t->trackerStats( );
     608
     609        foreach( const TrackerStat& trackerStat, trackerStats )
     610        {
     611            const QString key( idStr + ":" + QString::number(trackerStat.id) );
     612            QTreeWidgetItem * item = (QTreeWidgetItem*) myTrackerStats.value( key, 0 );
     613            QString str;
     614
     615            if( item == 0 ) // new tracker
     616            {
     617                item = new QTreeWidgetItem( myTrackerTree );
     618                newItems2 << item;
     619            }
     620            str = trackerStat.host;
     621            if( showBackup || !trackerStat.isBackup)
     622            {
     623                if( trackerStat.hasAnnounced )
     624                {
     625                    const QString tstr( timeToStringRounded( now - trackerStat.lastAnnounceTime ) );
     626                    str += "\n";
     627                    if( trackerStat.lastAnnounceSucceeded )
     628                    {
     629                        str += tr( "Got a list of %1 peers %2 ago" )
     630                            .arg( trackerStat.lastAnnouncePeerCount )
     631                            .arg( tstr );
     632                    }
     633                    else if( trackerStat.lastAnnounceTimedOut )
     634                    {
     635                        str += tr( "Peer list request timed out %1 ago; will retry" )
     636                            .arg( tstr );
     637                    }
     638                    else
     639                    {
     640                        str += tr( "Got an error %1 ago" )
     641                            .arg( tstr );
     642                    }
     643                }
     644                switch( trackerStat.announceState )
     645                {
     646                    case TR_TRACKER_INACTIVE:
     647                        if( trackerStat.hasAnnounced )
     648                        {
     649                            str += "\n";
     650                            str += tr( "No updates scheduled" );
     651                        }
     652                        break;
     653                    case TR_TRACKER_WAITING:
     654                        {
     655                            const QString tstr( timeToStringRounded( trackerStat.nextAnnounceTime - now ) );
     656                            str += "\n";
     657                            str += tr( "Asking for more peers in %1" )
     658                                .arg( tstr );
     659                        }
     660                        break;
     661                    case TR_TRACKER_QUEUED:
     662                        str += "\n";
     663                        str += tr( "Queued to ask for more peers" );
     664                        break;
     665                    case TR_TRACKER_ACTIVE:
     666                        {
     667                            const QString tstr( timeToStringRounded( now - trackerStat.lastAnnounceStartTime ) );
     668                            str += "\n";
     669                            str += tr( "Asking for more peers now... %1" )
     670                                .arg( tstr );
     671                        }
     672                        break;
     673                }
     674                if( showScrape )
     675                {
     676                    if( trackerStat.hasScraped )
     677                    {
     678                        const QString tstr( timeToStringRounded( now - trackerStat.lastScrapeTime ) );
     679                        str += "\n";
     680                        if( trackerStat.lastScrapeSucceeded )
     681                        {
     682                            str += tr( "Tracker had %1 seeders and %2 leechers %3 ago" )
     683                                .arg( trackerStat.seederCount )
     684                                .arg( trackerStat.leecherCount )
     685                                .arg( tstr );
     686                        }
     687                        else
     688                        {
     689                            str += tr( "Got a scrape error %1 ago" )
     690                                .arg( tstr );
     691                        }
     692                    }
     693                    switch( trackerStat.scrapeState )
     694                    {
     695                        case TR_TRACKER_INACTIVE:
     696                            break;
     697                        case TR_TRACKER_WAITING:
     698                            {
     699                                const QString tstr( timeToStringRounded( trackerStat.nextScrapeTime - now ) );
     700                                str += "\n";
     701                                str += tr( "Asking for peer counts in %1" )
     702                                    .arg( tstr );
     703                            }
     704                            break;
     705                        case TR_TRACKER_QUEUED:
     706                            str += "\n";
     707                            str += tr( "Queued to ask for peer counts" );
     708                            break;
     709                        case TR_TRACKER_ACTIVE:
     710                            {
     711                                const QString tstr( timeToStringRounded( now - trackerStat.lastScrapeStartTime ) );
     712                                str += "\n";
     713                                str += tr( "Asking for peer counts now... %1" )
     714                                    .arg( tstr );
     715                            }
     716                            break;
     717                    }
     718                }
     719            }
     720
     721            item->setText( 0, str );
     722
     723            trackers2.insert( key, item );
     724        }
     725    }
     726    myTrackerTree->addTopLevelItems( newItems2 );
     727    foreach( QString key, myTrackerStats.keys() ) {
     728        if( !trackers2.contains( key ) ) { // tracker has disappeared
     729            QTreeWidgetItem * item = myTrackerStats.value( key, 0 );
     730            myTrackerTree->takeTopLevelItem( myTrackerTree->indexOfTopLevelItem( item ) );
     731            delete item;
     732        }
     733    }
     734    myTrackerStats = trackers2;
    706735
    707736    ///
     
    851880
    852881void
     882Details :: onShowBackupTrackersToggled( bool val )
     883{
     884    myPrefs.set( Prefs::SHOW_BACKUP_TRACKERS, val );
     885}
     886
     887void
     888Details :: onShowTrackerScrapesToggled( bool val )
     889{
     890    myPrefs.set( Prefs::SHOW_TRACKER_SCRAPES, val );
     891}
     892
     893void
    853894Details :: onHonorsSessionLimitsToggled( bool val )
    854895{
     
    10131054Details :: createTrackerTab( )
    10141055{
    1015     HIG * hig = new HIG( );
    1016 
    1017     hig->addSectionTitle( tr( "Scrape" ) );
    1018     hig->addRow( tr( "Last scrape at:" ), myScrapeTimePrevLabel = new SqueezeLabel );
    1019     hig->addRow( tr( "Tracker responded:" ), myScrapeResponseLabel = new SqueezeLabel );
    1020     hig->addRow( tr( "Next scrape in:" ), myScrapeTimeNextLabel = new SqueezeLabel );
    1021     hig->addSectionDivider( );
    1022     hig->addSectionTitle( tr( "Announce" ) );
    1023     hig->addRow( tr( "Tracker:" ), myTrackerLabel = new SqueezeLabel );
    1024     hig->addRow( tr( "Last announce at:" ), myAnnounceTimePrevLabel = new SqueezeLabel );
    1025     hig->addRow( tr( "Tracker responded:" ), myAnnounceResponseLabel = new SqueezeLabel );
    1026     hig->addRow( tr( "Next announce in:" ), myAnnounceTimeNextLabel = new SqueezeLabel );
    1027     hig->addRow( tr( "Manual announce allowed in:" ), myAnnounceManualLabel = new SqueezeLabel );
    1028     hig->finish( );
    1029 
    1030     myTrackerLabel->setScaledContents( true );
    1031 
    1032     return hig;
     1056    QCheckBox * c;
     1057    QWidget * top = new QWidget;
     1058    QVBoxLayout * v = new QVBoxLayout( top );
     1059
     1060    v->setSpacing( HIG :: PAD_BIG );
     1061    v->setContentsMargins( HIG::PAD_BIG, HIG::PAD_BIG, HIG::PAD_BIG, HIG::PAD_BIG );
     1062
     1063    QStringList headers;
     1064    headers << tr("Trackers");
     1065    myTrackerTree = new QTreeWidget;
     1066    myTrackerTree->setHeaderLabels( headers );
     1067    myTrackerTree->setSelectionMode( QTreeWidget::NoSelection );
     1068    myTrackerTree->setRootIsDecorated( false );
     1069    myTrackerTree->setTextElideMode( Qt::ElideRight );
     1070    myTrackerTree->setAlternatingRowColors( true );
     1071    v->addWidget( myTrackerTree, 1 );
     1072
     1073    c = new QCheckBox( tr( "Show &more details" ) );
     1074    c->setChecked( myPrefs.getBool( Prefs::SHOW_TRACKER_SCRAPES ) );
     1075    myShowTrackerScrapesCheck = c;
     1076    v->addWidget( c, 1 );
     1077    connect( c, SIGNAL(clicked(bool)), this, SLOT(onShowTrackerScrapesToggled(bool)) );
     1078
     1079    c = new QCheckBox( tr( "Show &backup trackers" ) );
     1080    c->setChecked( myPrefs.getBool( Prefs::SHOW_BACKUP_TRACKERS ) );
     1081    myShowBackupTrackersCheck = c;
     1082    v->addWidget( c, 1 );
     1083    connect( c, SIGNAL(clicked(bool)), this, SLOT(onShowBackupTrackersToggled(bool)) );
     1084
     1085    return top;
    10331086}
    10341087
  • trunk/qt/details.h

    r10077 r10442  
    4747
    4848    public:
    49         Details( Session&, TorrentModel&, QWidget * parent = 0 );
     49        Details( Session&, Prefs&, TorrentModel&, QWidget * parent = 0 );
    5050        ~Details( );
    5151        void setIds( const QSet<int>& ids );
     
    5959
    6060    private:
     61        QString timeToStringRounded( int seconds );
    6162        QString trimToDesiredWidth( const QString& str );
    6263        void enableWhenChecked( QCheckBox *, QWidget * );
     
    6566
    6667        Session& mySession;
     68        Prefs& myPrefs;
    6769        TorrentModel& myModel;
    6870        QSet<int> myIds;
     
    8486        QCheckBox * mySingleDownCheck;
    8587        QCheckBox * mySingleUpCheck;
     88        QCheckBox * myShowTrackerScrapesCheck;
     89        QCheckBox * myShowBackupTrackersCheck;
    8690        QSpinBox * mySingleDownSpin;
    8791        QSpinBox * mySingleUpSpin;
     
    109113        QLabel * myAnnounceManualLabel;
    110114
     115        QTreeWidget * myTrackerTree;
    111116        QTreeWidget * myPeerTree;
     117        QMap<QString,QTreeWidgetItem*> myTrackerStats;
    112118        QMap<QString,QTreeWidgetItem*> myPeers;
    113119        QWidgetList myWidgets;
     
    126132        void onSeedUntilChanged( bool );
    127133        void onSeedRatioLimitChanged( double );
     134        void onShowBackupTrackersToggled( bool );
     135        void onShowTrackerScrapesToggled( bool );
    128136        void onMaxPeersChanged( int );
    129137        void refresh( );
  • trunk/qt/mainwin.cc

    r10384 r10442  
    639639{
    640640    if( myDetailsDialog == 0 ) {
    641         myDetailsDialog = new Details( mySession, myModel, this );
     641        myDetailsDialog = new Details( mySession, myPrefs, myModel, this );
    642642        connect( myDetailsDialog, SIGNAL(destroyed(QObject*)), this, SLOT(onDetailsDestroyed()));
    643643    }
  • trunk/qt/prefs.cc

    r10391 r10442  
    4343    { SORT_REVERSED, "sort-reversed", QVariant::Bool },
    4444    { COMPACT_VIEW, "compact-view", QVariant::Bool },
     45    { SHOW_BACKUP_TRACKERS, "show-backup-trackers", QVariant::Bool },
    4546    { FILTERBAR, "show-filterbar", QVariant::Bool },
    4647    { STATUSBAR, "show-statusbar", QVariant::Bool },
    4748    { STATUSBAR_STATS, "statusbar-stats", QVariant::String },
     49    { SHOW_TRACKER_SCRAPES, "show-tracker-scrapes", QVariant::Bool },
    4850    { TOOLBAR, "show-toolbar" , QVariant::Bool },
    4951    { BLOCKLIST_DATE, "blocklist-date", QVariant::DateTime },
     
    240242    tr_bencDictAddInt( d, keyStr(BLOCKLIST_UPDATES_ENABLED), true );
    241243    tr_bencDictAddStr( d, keyStr(OPEN_DIALOG_FOLDER), QDir::home().absolutePath().toLatin1() );
     244    tr_bencDictAddInt( d, keyStr(SHOW_BACKUP_TRACKERS), false );
     245    tr_bencDictAddInt( d, keyStr(SHOW_TRACKER_SCRAPES), false );
    242246    tr_bencDictAddInt( d, keyStr(TOOLBAR), true );
    243247    tr_bencDictAddInt( d, keyStr(FILTERBAR), true );
  • trunk/qt/prefs.h

    r10391 r10442  
    4646            SORT_REVERSED,
    4747            COMPACT_VIEW,
     48            SHOW_BACKUP_TRACKERS,
    4849            FILTERBAR,
    4950            STATUSBAR,
    5051            STATUSBAR_STATS,
     52            SHOW_TRACKER_SCRAPES,
    5153            TOOLBAR,
    5254            BLOCKLIST_DATE,
  • trunk/qt/torrent.cc

    r10077 r10442  
    8686    { FAILED_EVER, "corruptEver", QVariant::ULongLong, STAT_EXTRA },
    8787    { TRACKERS, "trackers", QVariant::StringList, INFO },
     88    { TRACKERSTATS, "trackerStats", TrTypes::TrackerStatsList, STAT_EXTRA },
    8889    { MIME_ICON, "ccc", QVariant::Icon, DERIVED },
    8990    { SEED_RATIO_LIMIT, "seedRatioLimit", QVariant::Double, STAT_EXTRA },
     
    99100    { COMMENT, "comment", QVariant::String, INFO },
    100101    { CREATOR, "creator", QVariant::String, INFO },
    101     { LAST_ANNOUNCE_TIME, "lastAnnounceTime", QVariant::DateTime, STAT_EXTRA },
    102     { LAST_SCRAPE_TIME, "lastScrapeTime", QVariant::DateTime, STAT_EXTRA },
    103102    { MANUAL_ANNOUNCE_TIME, "manualAnnounceTime", QVariant::DateTime, STAT_EXTRA },
    104     { NEXT_ANNOUNCE_TIME, "nextAnnounceTime", QVariant::DateTime, STAT_EXTRA },
    105     { NEXT_SCRAPE_TIME, "nextScrapeTime", QVariant::DateTime, STAT_EXTRA },
    106     { SCRAPE_RESPONSE, "scrapeResponse", QVariant::String, STAT_EXTRA },
    107     { ANNOUNCE_RESPONSE, "announceResponse", QVariant::String, STAT_EXTRA },
    108     { ANNOUNCE_URL, "announceURL", QVariant::String, STAT_EXTRA },
    109103    { PEERS, "peers", TrTypes::PeerList, STAT_EXTRA },
    110104    { TORRENT_FILE, "torrentFile", QVariant::String, STAT_EXTRA },
     
    554548            changed = true;
    555549        }
     550    }
     551
     552    tr_benc * trackerStats;
     553    if( tr_bencDictFindList( d, "trackerStats", &trackerStats ) ) {
     554        tr_benc * child;
     555        TrackerStatsList  trackerStatsList;
     556        int childNum = 0;
     557        while(( child = tr_bencListChild( trackerStats, childNum++ ))) {
     558            tr_bool b;
     559            int64_t i;
     560            const char * str;
     561            TrackerStat trackerStat;
     562            if( tr_bencDictFindStr( child, "announce", &str ) )
     563                trackerStat.announce = QString::fromUtf8( str );
     564            if( tr_bencDictFindInt( child, "announceState", &i ) )
     565                trackerStat.announceState = i;
     566            if( tr_bencDictFindInt( child, "downloadCount", &i ) )
     567                trackerStat.downloadCount = i;
     568            if( tr_bencDictFindBool( child, "hasAnnounced", &b ) )
     569                trackerStat.hasAnnounced = b;
     570            if( tr_bencDictFindBool( child, "hasScraped", &b ) )
     571                trackerStat.hasScraped = b;
     572            if( tr_bencDictFindStr( child, "host", &str ) )
     573                trackerStat.host = QString::fromUtf8( str );
     574            if( tr_bencDictFindInt( child, "id", &i ) )
     575                trackerStat.id = i;
     576            if( tr_bencDictFindBool( child, "isBackup", &b ) )
     577                trackerStat.isBackup = b;
     578            if( tr_bencDictFindInt( child, "lastAnnouncePeerCount", &i ) )
     579                trackerStat.lastAnnouncePeerCount = i;
     580            if( tr_bencDictFindInt( child, "lastAnnounceResult", &i ) )
     581                trackerStat.lastAnnounceResult = i;
     582            if( tr_bencDictFindInt( child, "lastAnnounceStartTime", &i ) )
     583                trackerStat.lastAnnounceStartTime = i;
     584            if( tr_bencDictFindBool( child, "lastAnnounceSucceeded", &b ) )
     585                trackerStat.lastAnnounceSucceeded = b;
     586            if( tr_bencDictFindInt( child, "lastAnnounceTime", &i ) )
     587                trackerStat.lastAnnounceTime = i;
     588            if( tr_bencDictFindBool( child, "lastAnnounceTimedOut", &b ) )
     589                trackerStat.lastAnnounceTimedOut = b;
     590            if( tr_bencDictFindStr( child, "lastScrapeResult", &str ) )
     591                trackerStat.lastScrapeResult = QString::fromUtf8( str );
     592            if( tr_bencDictFindInt( child, "lastScrapeStartTime", &i ) )
     593                trackerStat.lastScrapeStartTime = i;
     594            if( tr_bencDictFindBool( child, "lastScrapeSucceeded", &b ) )
     595                trackerStat.lastScrapeSucceeded = b;
     596            if( tr_bencDictFindInt( child, "lastScrapeTime", &i ) )
     597                trackerStat.lastScrapeTime = i;
     598            if( tr_bencDictFindBool( child, "lastScrapeTimedOut", &b ) )
     599                trackerStat.lastScrapeTimedOut = b;
     600            if( tr_bencDictFindInt( child, "leecherCount", &i ) )
     601                trackerStat.leecherCount = i;
     602            if( tr_bencDictFindInt( child, "nextAnnounceTime", &i ) )
     603                trackerStat.nextAnnounceTime = i;
     604            if( tr_bencDictFindInt( child, "nextScrapeTime", &i ) )
     605                trackerStat.nextScrapeTime = i;
     606            if( tr_bencDictFindInt( child, "scrapeState", &i ) )
     607                trackerStat.scrapeState = i;
     608            if( tr_bencDictFindInt( child, "seederCount", &i ) )
     609                trackerStat.seederCount = i;
     610            if( tr_bencDictFindInt( child, "tier", &i ) )
     611                trackerStat.tier = i;
     612            trackerStatsList << trackerStat;
     613        }
     614        myValues[TRACKERSTATS].setValue( trackerStatsList );
     615        changed = true;
    556616    }
    557617
  • trunk/qt/torrent.h

    r10430 r10442  
    5858Q_DECLARE_METATYPE(Peer)
    5959Q_DECLARE_METATYPE(PeerList)
     60
     61struct TrackerStat
     62{
     63    QString announce;
     64    int announceState;
     65    int downloadCount;
     66    bool hasAnnounced;
     67    bool hasScraped;
     68    QString host;
     69    int id;
     70    bool isBackup;
     71    int lastAnnouncePeerCount;
     72    int lastAnnounceResult;
     73    int lastAnnounceStartTime;
     74    bool lastAnnounceSucceeded;
     75    int lastAnnounceTime;
     76    bool lastAnnounceTimedOut;
     77    QString lastScrapeResult;
     78    int lastScrapeStartTime;
     79    bool lastScrapeSucceeded;
     80    int lastScrapeTime;
     81    bool lastScrapeTimedOut;
     82    int leecherCount;
     83    int nextAnnounceTime;
     84    int nextScrapeTime;
     85    int scrapeState;
     86    int seederCount;
     87    int tier;
     88};
     89
     90typedef QList<TrackerStat> TrackerStatsList;
     91Q_DECLARE_METATYPE(TrackerStat)
     92Q_DECLARE_METATYPE(TrackerStatsList)
    6093
    6194struct TrFile
     
    116149            FAILED_EVER,
    117150            TRACKERS,
     151            TRACKERSTATS,
    118152            MIME_ICON,
    119153            SEED_RATIO_LIMIT,
     
    129163            COMMENT,
    130164            CREATOR,
    131             LAST_ANNOUNCE_TIME,
    132             LAST_SCRAPE_TIME,
    133165            MANUAL_ANNOUNCE_TIME,
    134             NEXT_ANNOUNCE_TIME,
    135             NEXT_SCRAPE_TIME,
    136             SCRAPE_RESPONSE,
    137             ANNOUNCE_RESPONSE,
    138             ANNOUNCE_URL,
    139166            PEERS,
    140167            TORRENT_FILE,
     
    209236        QString getError( ) const;
    210237        QString hashString( ) const { return getString( HASH_STRING ); }
    211         QString scrapeResponse( ) const { return getString( SCRAPE_RESPONSE ); }
    212         QString announceResponse( ) const { return getString( ANNOUNCE_RESPONSE ); }
    213         QString announceUrl( ) const { return getString( ANNOUNCE_URL ); }
    214238        QString torrentFile( ) const { return getString( TORRENT_FILE ); }
    215239        bool hasError( ) const { return !getError( ).isEmpty( ); }
     
    243267        QDateTime dateAdded( ) const { return getDateTime( DATE_ADDED ); }
    244268        QDateTime dateCreated( ) const { return getDateTime( DATE_CREATED ); }
    245         QDateTime lastAnnounceTime( ) const { return getDateTime( LAST_ANNOUNCE_TIME ); }
    246         QDateTime lastScrapeTime( ) const { return getDateTime( LAST_SCRAPE_TIME ); }
    247269        QDateTime manualAnnounceTime( ) const { return getDateTime( MANUAL_ANNOUNCE_TIME ); }
    248         QDateTime nextAnnounceTime( ) const { return getDateTime( NEXT_ANNOUNCE_TIME ); }
    249         QDateTime nextScrapeTime( ) const { return getDateTime( NEXT_SCRAPE_TIME ); }
    250270        bool canManualAnnounce( ) const { return isReadyToTransfer() && (manualAnnounceTime()<=QDateTime::currentDateTime()); }
    251271        int peersWeAreDownloadingFrom( ) const { return getInt( PEERS_SENDING_TO_US ) + getInt( WEBSEEDS_SENDING_TO_US ); }
     
    267287        double seedRatioLimit( ) const { return getDouble( SEED_RATIO_LIMIT ); }
    268288        tr_ratiolimit seedRatioMode( ) const { return (tr_ratiolimit) getInt( SEED_RATIO_MODE ); }
     289        TrackerStatsList trackerStats( ) const{ return myValues[TRACKERSTATS].value<TrackerStatsList>(); }
    269290        PeerList peers( ) const{ return myValues[PEERS].value<PeerList>(); }
    270291        const FileList& files( ) const { return myFiles; }
  • trunk/qt/types.h

    r9868 r10442  
    2222        enum
    2323        {
     24            TrackerStatsList = QVariant::UserType,
    2425            PeerList = QVariant::UserType,
    2526            FileList,
Note: See TracChangeset for help on using the changeset viewer.