Changeset 10906


Ignore:
Timestamp:
Jun 30, 2010, 5:52:24 AM (11 years ago)
Author:
Longinus00
Message:

(libT) #2581:RPC extended to manage tracker lists

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/doc/rpc-spec.txt

    r10872 r10906  
    103103   "seedRatioLimit"      | double     session seeding ratio
    104104   "seedRatioMode"       | number     which ratio to use.  See tr_ratiolimit
     105   "trackerAdd"          | object     (see below)
     106   "trackerEdit"         | object     (see below)
     107   "trackerRemove"       | object     (see below)
    105108   "uploadLimit"         | number     maximum upload speed (in K/s)
    106109   "uploadLimited"       | boolean    true if "uploadLimit" is honored
     110                         |
     111   ----------------------+---------------------------------+
     112   trackerAdd            | an object containing:           |
     113                         +-----------------------+---------+
     114                         | announce              | string  | announce URL of the tracker
     115                         | tier (optional)       | number  | tier to add the tracker to
     116   ----------------------+---------------------------------+
     117   trackerEdit           | an object containing:           |
     118                         +-----------------------+---------+
     119                         | announce (or id)      | string  | announce URL of the tracker to modify
     120                         | id (or announce)      | number  | trackerId of the tracker to modify (see trackerStats)
     121                         +-----------------------+---------+
     122                         | announce-new          | string  | new announce URL for the tracker
     123                         | tier                  | number  | tier to change the tracker to
     124   ----------------------+---------------------------------+
     125   trackerRemove         | an object containing:           |
     126                         +-----------------------+---------+
     127                         | announce (or id)      | string  | announce URL of the tracker to remove
     128                         | id (or announce)      | number  | trackerId of the tracker to remove (see trackerStats)
     129                         +-----------------------+---------+
    107130
    108131   Just as an empty "ids" value is shorthand for "all ids", using an empty array
     
    602625         | 2.00    | yes       | session-get    | new arg "cache-size-MiB"
    603626         | 2.00    | yes       | torrent-get    | new arg "isFinished"
     627   ------+---------+-----------+----------------+-------------------------------
     628   10    | 2.10    | yes       | torrent-set    | new arg "trackerAdd"
     629         | 2.10    | yes       | torrent-set    | new arg "trackerEdit"
     630         | 2.10    | yes       | torrent-set    | new arg "trackerRemove"
  • trunk/libtransmission/rpcimpl.c

    r10848 r10906  
    753753}
    754754
     755static tr_bool
     756findTrackerById( const tr_info * inf,
     757                 uint32_t id,
     758                 int * index )
     759{
     760    int i;
     761    tr_bool found = FALSE;
     762
     763    for( i = 0; i < inf->trackerCount; ++i )
     764    {
     765        const tr_tracker_info * t = &inf->trackers[i];
     766        if( t->id == id )
     767        {
     768            if( index ) *index = i;
     769            found = TRUE;
     770            break;
     771        }
     772    }
     773
     774    return found;
     775}
     776
     777static tr_bool
     778findTrackerByURL( const tr_info * inf,
     779                  const char * url,
     780                  int * index )
     781{
     782    int i;
     783    tr_bool found = FALSE;
     784
     785    for( i = 0; i < inf->trackerCount; ++i )
     786    {
     787        const tr_tracker_info * t = &inf->trackers[i];
     788        if( !strcmp( t->announce, url ) )
     789        {
     790            if( index ) *index = i;
     791            found = TRUE;
     792            break;
     793        }
     794    }
     795
     796    return found;
     797}
     798
     799static const char*
     800addTracker( tr_torrent * tor,
     801            tr_benc    * tracker )
     802{
     803    int i;
     804    int64_t tmp;
     805    tr_bool duplicate = FALSE;
     806    const char * errmsg = NULL;
     807    const char * announce;
     808    const tr_info * inf = tr_torrentInfo( tor );
     809
     810    if( !tr_bencDictFindStr( tracker, "announce", &announce ) )
     811        return "no announce url supplied";
     812
     813    duplicate = findTrackerByURL( inf, announce, NULL );
     814
     815    if( !duplicate )
     816    {
     817        int tier, trackerCount;
     818        tr_tracker_info * trackers = tr_new0( tr_tracker_info, inf->trackerCount + 1 );
     819
     820        if( tr_bencDictFindInt( tracker, "tier", &tmp ) )
     821            tier = (int)tmp;
     822        else
     823            tier = -1;
     824
     825        for( i = 0; i < inf->trackerCount; ++i )
     826        {
     827            const tr_tracker_info * t = &inf->trackers[i];
     828            trackers[i].tier = t->tier;
     829            trackers[i].announce = tr_strdup( t->announce );
     830        }
     831        trackers[i].tier = tier < 0 ? trackers[i-1].tier + 1 : tier;
     832        trackers[i].announce = tr_strdup( announce );
     833        trackerCount = inf->trackerCount + 1;
     834
     835        if( !tr_torrentSetAnnounceList( tor, trackers, trackerCount ) )
     836            errmsg = "tracker URL was invalid";
     837
     838        for( i = 0; i < trackerCount; ++i )
     839            tr_free( trackers[i].announce );
     840        tr_free( trackers );
     841    }
     842    else
     843        errmsg = "tracker already exists";
     844
     845    return errmsg;
     846}
     847
     848static const char*
     849editTracker( tr_torrent * tor,
     850             tr_benc    * tracker )
     851{
     852    int trackerIndex;
     853    int64_t tmp;
     854    tr_bool found = FALSE;
     855    const char * errmsg = NULL;
     856    const char * announce;
     857    const tr_info * inf = tr_torrentInfo( tor );
     858
     859    if( tr_bencDictFindInt( tracker, "id", &tmp ) )
     860        found = findTrackerById( inf, (uint32_t)tmp, &trackerIndex );
     861    else if( tr_bencDictFindStr( tracker, "announce", &announce ) )
     862        found = findTrackerByURL( inf, announce, &trackerIndex );
     863    else
     864        errmsg = "no tracker supplied";
     865
     866    if( found )
     867    {
     868        int tier;
     869        const char * new;
     870        tr_bool rename = FALSE;
     871        tr_bool move = FALSE;
     872
     873        if( tr_bencDictFindStr( tracker, "announce-new", &new ) )
     874        {
     875            rename = !findTrackerByURL( inf, new, NULL );
     876            if( !rename )
     877                errmsg = "tracker already exists";
     878        }
     879        if( tr_bencDictFindInt( tracker, "tier", &tmp ) )
     880        {
     881            tier = (int)tmp;
     882            move = TRUE;
     883        }
     884
     885        if( ( rename || move ) && !errmsg )
     886        {
     887            int i, trackerCount;
     888            tr_tracker_info * trackers = tr_new0( tr_tracker_info, inf->trackerCount );
     889
     890            for( i = 0; i < inf->trackerCount; ++i )
     891            {
     892                const tr_tracker_info * t = &inf->trackers[i];
     893                if( i != trackerIndex )
     894                {
     895                    trackers[i].tier = t->tier;
     896                    trackers[i].announce = tr_strdup( t->announce );
     897                }
     898                else
     899                {
     900                    trackers[i].tier = move ? tier : t->tier;
     901                    trackers[i].announce = tr_strdup( rename ? new : t->announce );
     902                }
     903            }
     904            trackerCount = i;
     905
     906            if( !tr_torrentSetAnnounceList( tor, trackers, trackerCount ) )
     907                errmsg = "error setting announce list";
     908
     909            for( i = 0; i < trackerCount; ++i )
     910                tr_free( trackers[i].announce );
     911            tr_free( trackers );
     912        }
     913        else if( !errmsg )
     914            errmsg = "no operation supplied";
     915    }
     916    else
     917        errmsg = "tracker doesn't exists";
     918
     919    return errmsg;
     920}
     921
     922static const char*
     923removeTracker( tr_torrent * tor,
     924               tr_benc * tracker  )
     925{
     926    int trackerIndex;
     927    int64_t tmp;
     928    tr_bool found = FALSE;
     929    const char * errmsg = NULL;
     930    const char * announce;
     931    const tr_info * inf = tr_torrentInfo( tor );
     932
     933    if( tr_bencDictFindInt( tracker, "id", &tmp ) )
     934        found = findTrackerById( inf, (uint32_t)tmp, &trackerIndex );
     935    else if( tr_bencDictFindStr( tracker, "announce", &announce ) )
     936        found = findTrackerByURL( inf, announce, &trackerIndex );
     937    else
     938        errmsg = "no tracker supplied";
     939
     940    if( found )
     941    {
     942        int i, j, trackerCount;
     943        tr_tracker_info * trackers = tr_new0( tr_tracker_info, inf->trackerCount - 1 );
     944
     945        for( i = 0, j = 0; i < inf->trackerCount; ++i )
     946        {
     947            if( i != trackerIndex )
     948            {
     949                const tr_tracker_info * t = &inf->trackers[i];
     950                trackers[j].tier = t->tier;
     951                trackers[j].announce = tr_strdup( t->announce );
     952                ++j;
     953            }
     954        }
     955        trackerCount = j;
     956
     957        if( !tr_torrentSetAnnounceList( tor, trackers, trackerCount ) )
     958            errmsg = "error setting announce list";
     959
     960        for( i = 0; i < trackerCount; ++i )
     961            tr_free( trackers[i].announce );
     962        tr_free( trackers );
     963    }
     964    else
     965        errmsg = "tracker doesn't exists";
     966
     967    return errmsg;
     968}
     969
    755970static const char*
    756971torrentSet( tr_session               * session,
     
    770985        double       d;
    771986        tr_benc *    files;
     987        tr_benc *    tracker;
    772988        tr_bool      boolVal;
    773989        tr_torrent * tor = torrents[i];
     
    8021018        if( tr_bencDictFindInt( args_in, "seedRatioMode", &tmp ) )
    8031019            tr_torrentSetRatioMode( tor, tmp );
     1020        if( !errmsg && tr_bencDictFindDict( args_in, "trackerAdd", &tracker ) )
     1021            errmsg = addTracker( tor, tracker );
     1022        if( !errmsg && tr_bencDictFindDict( args_in, "trackerEdit", &tracker ) )
     1023            errmsg = editTracker( tor, tracker );
     1024        if( !errmsg && tr_bencDictFindDict( args_in, "trackerRemove", &tracker ) )
     1025            errmsg = removeTracker( tor, tracker );
    8041026        notify( session, TR_RPC_TORRENT_CHANGED, tor );
    8051027    }
Note: See TracChangeset for help on using the changeset viewer.