Changeset 6404


Ignore:
Timestamp:
Jul 26, 2008, 2:47:07 PM (15 years ago)
Author:
charles
Message:

(rpc) to lower the bandwidth/cpu used up by very large torrent lists, allow finer-grained control over which fields to return in the `torrent-get' request.

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/daemon/remote.c

    r6383 r6404  
    173173}
    174174
     175#define TR_N_ELEMENTS( ary ) ( sizeof( ary ) / sizeof( *ary ) )
     176
     177static const char * files_keys[] = {
     178    "files", "name", "priorities", "wanted"
     179};
     180
     181static const char * details_keys[] = {
     182    "activityDate", "addedDate", "announceResponse", "announceURL",
     183    "comment", "corruptEver", "creator", "dateCreated", "doneDate",
     184    "downloadedEver", "errorString", "eta", "hashString", "haveUnchecked",
     185    "haveValid", "id", "isPrivate", "lastAnnounceTime", "lastScrapeTime",
     186    "leechers", "leftUntilDone", "name", "nextAnnounceTime", "nextScrapeTime",
     187    "pieceCount", "pieceSize", "rateDownload", "rateUpload", "recheckProgress",
     188    "scrapeResponse", "seeders", "sizeWhenDone", "sizeWhenDone", "startDate",
     189    "status", "timesCompleted", "totalSize", "uploadedEver"
     190};
     191
     192static const char * list_keys[] = {
     193    "downloadedEver", "eta", "id", "leftUntilDone", "name", "rateDownload",
     194    "rateUpload", "sizeWhenDone", "status", "uploadedEver"
     195};
     196
    175197static void
    176198readargs( int argc, const char ** argv )
     
    185207    while(( c = tr_getopt( getUsage(), argc, argv, opts, &optarg )))
    186208    {
     209        int i, n;
    187210        char buf[MAX_PATH_LENGTH];
    188211        int addArg = TRUE;
    189         tr_benc top, *args;
     212        tr_benc top, *args, *fields;
    190213        tr_bencInitDict( &top, 3 );
    191         int64_t fields = 0;
    192214        args = tr_bencDictAddDict( &top, "arguments", 0 );
    193215
     
    221243                      tr_bencDictAddInt( &top, "tag", TAG_FILES );
    222244                      addIdArg( args, id );
    223                       fields = TR_RPC_TORRENT_ID
    224                              | TR_RPC_TORRENT_FILES
    225                              | TR_RPC_TORRENT_PRIORITIES;
    226                       tr_bencDictAddInt( args, "fields", fields );
     245                      n = TR_N_ELEMENTS( files_keys );
     246                      fields = tr_bencDictAddList( args, "fields", n );
     247                      for( i=0; i<n; ++i )
     248                          tr_bencListAddStr( fields, files_keys[i] );
    227249                      break;
    228250            case 'g': tr_bencDictAddStr( &top, "method", "torrent-set" );
     
    237259                      tr_bencDictAddInt( &top, "tag", TAG_DETAILS );
    238260                      addIdArg( args, id );
    239                       fields = TR_RPC_TORRENT_ACTIVITY
    240                           | TR_RPC_TORRENT_ANNOUNCE
    241                           | TR_RPC_TORRENT_ERROR
    242                           | TR_RPC_TORRENT_HISTORY
    243                           | TR_RPC_TORRENT_ID
    244                           | TR_RPC_TORRENT_INFO
    245                           | TR_RPC_TORRENT_SCRAPE
    246                           | TR_RPC_TORRENT_SIZE
    247                           | TR_RPC_TORRENT_TRACKER_STATS;
    248                       tr_bencDictAddInt( args, "fields", fields );
     261                      n = TR_N_ELEMENTS( details_keys );
     262                      fields = tr_bencDictAddList( args, "fields", n );
     263                      for( i=0; i<n; ++i )
     264                          tr_bencListAddStr( fields, details_keys[i] );
    249265                      break;
    250266            case 'l': tr_bencDictAddStr( &top, "method", "torrent-get" );
    251267                      tr_bencDictAddInt( &top, "tag", TAG_LIST );
    252                       fields = TR_RPC_TORRENT_ID
    253                              | TR_RPC_TORRENT_ACTIVITY
    254                              | TR_RPC_TORRENT_HISTORY
    255                              | TR_RPC_TORRENT_SIZE;
    256                       tr_bencDictAddInt( args, "fields", fields );
     268                      n = TR_N_ELEMENTS( list_keys );
     269                      fields = tr_bencDictAddList( args, "fields", n );
     270                      for( i=0; i<n; ++i )
     271                          tr_bencListAddStr( fields, list_keys[i] );
    257272                      break;
    258273            case 'm': tr_bencDictAddStr( &top, "method", "session-set" );
     
    726741        tr_bencDictFindInt( &top, "tag", &tag );
    727742
    728         if( tr_bencDictFindStr( &top, "result", &str ) )
    729             printf( "%s:%d responded: \"%s\"\n", host, port, str );
    730743        switch( tag ) {
    731744            case TAG_FILES: printFileList( &top ); break;
    732745            case TAG_DETAILS: printDetails( &top ); break;
    733746            case TAG_LIST: printTorrentList( &top ); break;
    734             default: break;
     747            default: if( tr_bencDictFindStr( &top, "result", &str ) )
     748                         printf( "%s:%d responded: \"%s\"\n", host, port, str );
    735749        }
    736750
  • trunk/doc/rpc-spec.txt

    r6377 r6404  
    101101   Request arguments:
    102102
    103    string       | required? | default | value type & description
    104    -------------+-----------+---------+---------------------------------------
    105    "ids"        | no        | all     | array     described in 3.1
    106    "fields"     | yes       | n/a     | number    bitwise-or'ed field
    107                 |           |         |           values from the table below
     103   (1) An opional "ids" array as described in 3.1.
     104   (2) A required "fields" array of keys. (see list below)
    108105
    109106   Response arguments:
    110107
    111    (1) A "fields" number identical to the request's
    112    (2) A "torrents" array of objects, each of which contains the
    113        key/value fields that match the "fields" argument.
    114        See the table below for a complete list.
    115 
    116    "fields" value     | response | response               | source
    117                       | value    | key                    |
    118    -------------------+----------+------------------------+-------------
    119    activity, 1        | number   | desiredAvailable       | tr_stat
    120                       | number   | eta                    | tr_stat
    121                       | number   | peersConnected         | tr_stat
    122                       | number   | peersGettingFromUs     | tr_stat
    123                       | number   | peersSendingToUs       | tr_stat
    124                       | number   | rateDownload           | tr_stat
    125                       | number   | rateUpload             | tr_stat
    126                       | number   | recheckProgress        | tr_stat
    127                       | number   | status                 | tr_stat
    128                       | number   | swarmSpeed (K/s)       | tr_stat
    129                       | 'double' | uploadRatio            | tr_stat
    130                       | number   | webseedsSendingToUs    | tr_stat
    131    -------------------+----------+------------------------+-------------
    132    announce, 2        | string   | announceResponse       | tr_stat
    133                       | string   | announceURL            | tr_stat
    134                       | number   | lastAnnounceTime       | tr_stat
    135                       | number   | manualAnnounceTime     | tr_stat
    136                       | number   | nextAnnounceTime       | tr_stat
    137    -------------------+----------+------------------------+-------------
    138    error, 4           | number   | error                  | tr_stat
    139                       | number   | errorString            | tr_stat
    140    -------------------+----------+------------------------+-------------
    141    files, 8           | array    | files
    142                       +----------+--------------------------------------
    143                       | files is an array of objects that contain:
    144                       +----------+------------------------+-------------
    145                       | number   | bytesCompleted         | tr_torrent
    146                       | number   | length                 | tr_info
    147                       | string   | name                   | tr_info
    148    -------------------+----------+------------------------+-------------
    149    history, 16        | number   | activityDate           | tr_stat
    150                       | number   | addedDate              | tr_stat
    151                       | number   | corruptEver            | tr_stat
    152                       | number   | doneDate               | tr_stat
    153                       | number   | downloadedEver         | tr_stat
    154                       | number   | startDate              | tr_stat
    155                       | number   | uploadedEver           | tr_stat
    156    -------------------+----------+------------------------+-------------
    157    id, 32             | number   | uniqueId               | tr_torrent
    158                       | string   | hashString             | tr_info
    159                       | string   | name                   | tr_info
    160    -------------------+----------+------------------------+-------------
    161    info, 64           | string   | comment                | tr_info
    162                       | string   | creator                | tr_info
    163                       | number   | dateCreated            | tr_info
    164                       | number   | pieceCount             | tr_info
    165                       | number   | pieceSize              | tr_info
    166                       | 'boolean'| isPrivate              | tr_torrent
    167    -------------------+----------+------------------------+-------------
    168    limits, 128        | number   | downloadLimit          | tr_torrent
    169                       | number   | downloadLimitMode      | tr_torrent
    170                       | number   | maxConnectedPeers      | tr_torrent
    171                       | number   | uploadLimit            | tr_torrent
    172                       | number   | uploadLimitMode        | tr_torrent
    173    -------------------+----------+------------------------+-------------
    174    peers, 256         | not defined yet
    175    -------------------+----------+------------------------+-------------
    176    peer stats, 512    | number   | fromCache              | tr_stat
    177                       | number   | fromIncoming           | tr_stat
    178                       | number   | fromPex                | tr_stat
    179                       | number   | fromTracker            | tr_stat
    180    -------------------+----------+------------------------+-------------
    181    priorities, 1024   | array    | priorities             | tr_info
    182                       | array    | wanted                 | tr_info
    183                       +----------+--------------------------------------
    184                       | priorities is an array of tr_info.fileCount
    185                       | numbers.  Each is the tr_priority_t mode for
    186                       | the corresponding file.
    187                       +-------------------------------------------------
    188                       | wanted is an array of tr_info.fileCount
    189                       | 'booleans' true if the corresponding file
    190                       | is to be downloaded.
    191    -------------------+----------+------------------------+-------------
    192    scrape, 2048       | number   | lastScrapeTime         | tr_stat
    193                       | number   | nextScrapeTime         | tr_stat
    194                       | string   | scrapeResponse         | tr_stat
    195                       | string   | scrapeURL              | tr_stat
    196    -------------------+----------+------------------------+-------------
    197    size, 4096         | number   | haveUnchecked          | tr_stat
    198                       | number   | haveValid              | tr_stat
    199                       | number   | leftUntilDone          | tr_stat
    200                       | number   | sizeWhenDone           | tr_stat
    201                       | number   | totalSize              | tr_info
    202    -------------------+----------+------------------------+-------------
    203    tracker stats,     | number   | leechers               | tr_stat
    204    8192               | number   | peersKnown             | tr_stat
    205                       | number   | seeders                | tr_stat
    206                       | number   | timesCompleted         | tr_stat
    207    -------------------+----------+--------------------------------------
    208    trackers, 16384    | array    | trackers
    209                       +----------+--------------------------------------
    210                       | trackers is an array of objects that contain:
    211                       +----------+------------------------+-------------
    212                       | string   | announce               | tr_info
    213                       | string   | scrape                 | tr_info
    214                       | number   | tier                   | tr_info
    215    -------------------+----------+------------------------+-------------
    216    webseeds, 32768    | array    | webseeds
    217                       +----------+--------------------------------------
    218                       | webseeds is an array of strings:
    219                       +----------+------------------------+-------------
    220                       | string   | webseed URL            | tr_info
    221    -------------------+----------+------------------------+-------------
     108   (1) A "torrents" array of objects, each of which contains
     109       the key/value pairs matching the request's "fields" argument.
     110
     111   key                    | type                                 | source
     112   -----------------------+--------------------------------------+---------
     113   activityDate           | number                               | tr_stat
     114   addedDate              | number                               | tr_stat
     115   announceResponse       | string                               | tr_stat
     116   announceURL            | string                               | tr_stat
     117   comment                | string                               | tr_info
     118   corruptEver            | number                               | tr_stat
     119   creator                | string                               | tr_info
     120   dateCreated            | number                               | tr_info
     121   desiredAvailable       | number                               | tr_stat
     122   doneDate               | number                               | tr_stat
     123   downloadedEver         | number                               | tr_stat
     124   downloadLimitMode      | number                               | tr_torrent
     125   downloadLimit          | number                               | tr_torrent
     126   error                  | number                               | tr_stat
     127   errorString            | number                               | tr_stat
     128   eta                    | number                               | tr_stat
     129   files                  | array (see below)                    | n/a
     130   hashString             | string                               | tr_info
     131   haveUnchecked          | number                               | tr_stat
     132   haveValid              | number                               | tr_stat
     133   id                     | number                               | tr_torrent
     134   isPrivate              | 'boolean                             | tr_torrent
     135   lastAnnounceTime       | number                               | tr_stat
     136   lastScrapeTime         | number                               | tr_stat
     137   leechers               | number                               | tr_stat
     138   leftUntilDone          | number                               | tr_stat
     139   manualAnnounceTime     | number                               | tr_stat
     140   maxConnectedPeers      | number                               | tr_torrent
     141   name                   | string                               | tr_info
     142   nextAnnounceTime       | number                               | tr_stat
     143   nextScrapeTime         | number                               | tr_stat
     144   peersConnected         | number                               | tr_stat
     145   peersFrom              | object (see below)                   | n/a
     146   peersGettingFromUs     | number                               | tr_stat
     147   peersKnown             | number                               | tr_stat
     148   peersSendingToUs       | number                               | tr_stat
     149   pieceCount             | tnumber                              | tr_info
     150   pieceSize              | tnumber                              | tr_info
     151   priorities             | array (see below)                    | n/a
     152   rateDownload           | number                               | tr_stat
     153   rateUpload             | number                               | tr_stat
     154   recheckProgress        | number                               | tr_stat
     155   scrapeResponse         | string                               | tr_stat
     156   scrapeURL              | string                               | tr_stat
     157   seeders                | number                               | tr_stat
     158   sizeWhenDone           | number                               | tr_stat
     159   startDate              | number                               | tr_stat
     160   status                 | number                               | tr_stat
     161   swarmSpeed (K/s)       | number                               | tr_stat
     162   timesCompleted         | number                               | tr_stat
     163   trackers               | array (see below)                    | n/a
     164   totalSize              | number                               | tr_info
     165   uploadedEver           | number                               | tr_stat
     166   uploadLimitMode        | number                               | tr_torrent
     167   uploadLimit            | number                               | tr_torrent
     168   uploadRatio            | 'double'                             | tr_stat
     169   wanted                 | array (see below)                    | n/a
     170   webseeds               | array (see below)                    | n/a
     171   webseedsSendingToUs    | number                               | tr_stat
     172                          |                                      |
     173                          |                                      |
     174   -----------------------+--------------------------------------+
     175   files                  | array of objects, each containing:   |
     176                          +------------------+-------------------+
     177                          | key              | type              |
     178                          | bytesCompleted   | number            | tr_torrent
     179                          | length           | number            | tr_info
     180                          | name             | string            | tr_info
     181   -----------------------+--------------------------------------+
     182   peersFrom              | an object containing:                |
     183                          +------------------+-------------------+
     184                          | fromCache        | number            | tr_stat
     185                          | fromIncoming     | number            | tr_stat
     186                          | fromPex          | number            | tr_stat
     187                          | fromTracker      | number            | tr_stat
     188   -----------------------+--------------------------------------+
     189   priorities             | an array of tr_info.filecount        | tr_info
     190                          | numbers. each is the tr_priority_t   |
     191                          | mode for the corresponding file.     |
     192   -----------------------+--------------------------------------+
     193   trackers               | array of objects, each containing:   |
     194                          +------------------+-------------------+
     195                          | announce         | string            | tr_info
     196                          | scrape           | string            | tr_info
     197                          | tier             | number            | tr_info
     198   -----------------------+--------------------------------------+
     199   wanted                 | an array of tr_info.fileCount        | tr_info
     200                          | 'booleans' true if the corresponding |
     201                          | file is to be downloaded.            |
     202   -----------------------+--------------------------------------+
     203   webseeds               | an array of strings:                 |
     204                          +------------------+-------------------+
     205                          | webseed          | string            | tr_info
     206                          +------------------+-------------------+
    222207
    223208   Example:
    224209
    225210   Say we want to get the name and total size of torrents #7 and #10.
    226    name is in the "id" section (32) and total size is in "size" (2048),
    227    so the "fields" argument will be 32 + 2048 == 2080.
    228211
    229212   Request:
     
    232215         "arguments": {
    233216             "fields": 2080,
    234              "ids": [ 7, 10 ],
     217             "fields": [ "name", "totalSize" ],
    235218             "sort-method": "name"
    236219         }
     
    247230            "torrents": [
    248231               {
    249                    "hashString": "sijioejisoefjiosejfioi",
    250                    "haveUnchecked", 23023,
    251                    "haveValid", 27986795145,
    252                    "leftUntilDone", 0,
     232                   "id": 10,
    253233                   "name": "Fedora x86_64 DVD",
    254                    "sizeWhenDone", 34983493932,
    255234                   "totalSize", 34983493932,
    256                    "uniqueId": 10,
    257235               }
    258236               {
    259                    "hashString": "asdasiofjosejfoasjfiosj",
    260                    "haveUnchecked", 0,
    261                    "haveValid", 9923890123,
    262                    "leftUntilDone", 0,
     237                   "id": 7,
    263238                   "name": "Ubuntu x86_64 DVD",
    264                    "sizeWhenDone", 9923890123,
    265239                   "totalSize", 9923890123,
    266                    "uniqueId": 7,
    267240               },
    268241            ]
  • trunk/libtransmission/rpc.c

    r6377 r6404  
    199199
    200200static void
    201 addInfo( const tr_torrent * tor, tr_benc * d, uint64_t fields )
     201addField( const tr_torrent * tor, tr_benc * d, const char * key )
    202202{
    203203    const tr_info * inf = tr_torrentInfo( tor );
    204204    const tr_stat * st = tr_torrentStat( (tr_torrent*)tor );
    205205
    206     tr_bencInitDict( d, 64 );
    207 
    208     if( fields & TR_RPC_TORRENT_ACTIVITY ) {
    209         tr_bencDictAddInt( d, "desiredAvailable", st->desiredAvailable );
    210         tr_bencDictAddInt( d, "eta", st->eta );
    211         tr_bencDictAddInt( d, "peersConnected", st->peersConnected );
    212         tr_bencDictAddInt( d, "peersGettingFromUs", st->peersGettingFromUs );
    213         tr_bencDictAddInt( d, "peersSendingToUs", st->peersSendingToUs );
    214         tr_bencDictAddInt( d, "rateDownload", (int)(st->rateDownload*1024) );
    215         tr_bencDictAddInt( d, "rateUpload", (int)(st->rateUpload*1024) );
    216         tr_bencDictAddDouble( d, "recheckProgress", st->recheckProgress );
    217         tr_bencDictAddInt( d, "status", st->status );
    218         tr_bencDictAddInt( d, "swarmSpeed", (int)(st->swarmSpeed*1024) );
    219         tr_bencDictAddInt( d, "webseedsSendingToUs", st->webseedsSendingToUs );
    220         tr_bencDictAddDouble( d, "uploadRatio", tr_getRatio( st->uploadedEver, st->downloadedEver ) );
    221     }
    222 
    223     if( fields & TR_RPC_TORRENT_ANNOUNCE ) {
    224         tr_bencDictAddStr( d, "announceResponse", st->announceResponse );
    225         tr_bencDictAddStr( d, "announceURL", st->announceURL );
    226         tr_bencDictAddInt( d, "lastAnnounceTime", st->lastAnnounceTime );
    227         tr_bencDictAddInt( d, "manualAnnounceTime", st->manualAnnounceTime );
    228         tr_bencDictAddInt( d, "nextAnnounceTime", st->nextAnnounceTime );
    229     }
    230 
    231     if( fields & TR_RPC_TORRENT_ERROR ) {
    232         tr_bencDictAddInt( d, "error", st->error );
    233         tr_bencDictAddStr( d, "errorString", st->errorString );
    234     }
    235 
    236     if( fields & TR_RPC_TORRENT_FILES )
    237         addFiles( tor, tr_bencDictAddList( d, "files", inf->fileCount ) );
    238 
    239     if( fields & TR_RPC_TORRENT_HISTORY ) {
    240         tr_bencDictAddInt( d, "activityDate", st->activityDate );
    241         tr_bencDictAddInt( d, "addedDate", st->addedDate );
    242         tr_bencDictAddInt( d, "corruptEver", st->corruptEver );
    243         tr_bencDictAddInt( d, "doneDate", st->doneDate );
    244         tr_bencDictAddInt( d, "downloadedEver", st->downloadedEver );
    245         tr_bencDictAddInt( d, "startDate", st->startDate );
    246         tr_bencDictAddInt( d, "uploadedEver", st->uploadedEver );
    247     }
    248 
    249     if( fields & TR_RPC_TORRENT_ID ) {
    250         tr_bencDictAddInt( d, "id", st->id );
    251         tr_bencDictAddStr( d, "hashString", tor->info.hashString );
    252         tr_bencDictAddStr( d, "name", inf->name );
    253     }
    254 
    255     if( fields & TR_RPC_TORRENT_INFO ) {
    256         tr_bencDictAddStr( d, "comment", inf->comment ? inf->comment : "" );
    257         tr_bencDictAddStr( d, "creator", inf->creator ? inf->creator : "" );
    258         tr_bencDictAddInt( d, "dateCreated", inf->dateCreated );
    259         tr_bencDictAddInt( d, "isPrivate", tr_torrentIsPrivate( tor ) );
    260         tr_bencDictAddInt( d, "pieceCount", inf->pieceCount );
    261         tr_bencDictAddInt( d, "pieceSize", inf->pieceSize );
    262     }
    263 
    264     if( fields & TR_RPC_TORRENT_LIMITS ) {
    265         tr_bencDictAddInt( d, "downloadLimit", tr_torrentGetSpeedLimit( tor, TR_DOWN ) );
    266         tr_bencDictAddInt( d, "downloadLimitMode", tr_torrentGetSpeedMode( tor, TR_DOWN ) );
    267         tr_bencDictAddInt( d, "maxConnectedPeers",  tr_torrentGetPeerLimit( tor ) );
    268         tr_bencDictAddInt( d, "uploadLimit", tr_torrentGetSpeedLimit( tor, TR_UP ) );
    269         tr_bencDictAddInt( d, "uploadLimitMode",   tr_torrentGetSpeedMode( tor, TR_UP ) );
    270     }
    271 
    272     if( fields & TR_RPC_TORRENT_PEER_STATS ) {
     206    if( !strcmp( key, "activityDate" ) )
     207        tr_bencDictAddInt( d, key, st->activityDate );
     208    else if( !strcmp( key, "addedDate" ) )
     209        tr_bencDictAddInt( d, key, st->addedDate );
     210    else if( !strcmp( key, "announceResponse" ) )
     211        tr_bencDictAddStr( d, key, st->announceResponse );
     212    else if( !strcmp( key, "announceURL" ) )
     213        tr_bencDictAddStr( d, key, st->announceURL );
     214    else if( !strcmp( key, "comment" ) )
     215        tr_bencDictAddStr( d, key, inf->comment ? inf->comment : "" );
     216    else if( !strcmp( key, "corruptEver" ) )
     217        tr_bencDictAddInt( d, key, st->corruptEver );
     218    else if( !strcmp( key, "creator" ) )
     219        tr_bencDictAddStr( d, key, inf->creator ? inf->creator : "" );
     220    else if( !strcmp( key, "dateCreated" ) )
     221        tr_bencDictAddInt( d, key, inf->dateCreated );
     222    else if( !strcmp( key, "desiredAvailable" ) )
     223        tr_bencDictAddInt( d, key, st->desiredAvailable );
     224    else if( !strcmp( key, "doneDate" ) )
     225        tr_bencDictAddInt( d, key, st->doneDate );
     226    else if( !strcmp( key, "downloadedEver" ) )
     227        tr_bencDictAddInt( d, key, st->downloadedEver );
     228    else if( !strcmp( key, "downloadLimitMode" ) )
     229        tr_bencDictAddInt( d, key, tr_torrentGetSpeedMode( tor, TR_DOWN ) );
     230    else if( !strcmp( key, "downloadLimit" ) )
     231        tr_bencDictAddInt( d, key, tr_torrentGetSpeedLimit( tor, TR_DOWN ) );
     232    else if( !strcmp( key, "error" ) )
     233        tr_bencDictAddInt( d, key, st->error );
     234    else if( !strcmp( key, "errorString" ) )
     235        tr_bencDictAddStr( d, key, st->errorString );
     236    else if( !strcmp( key, "eta" ) )
     237        tr_bencDictAddInt( d, key, st->eta );
     238    else if( !strcmp( key, "files" ) )
     239        addFiles( tor, tr_bencDictAddList( d, key, inf->fileCount ) );
     240    else if( !strcmp( key, "hashString" ) )
     241        tr_bencDictAddStr( d, key, tor->info.hashString );
     242    else if( !strcmp( key, "haveUnchecked" ) )
     243        tr_bencDictAddInt( d, key, st->haveUnchecked );
     244    else if( !strcmp( key, "haveValid" ) )
     245        tr_bencDictAddInt( d, key, st->haveValid );
     246    else if( !strcmp( key, "id" ) )
     247        tr_bencDictAddInt( d, key, st->id );
     248    else if( !strcmp( key, "isPrivate" ) )
     249        tr_bencDictAddInt( d, key, tr_torrentIsPrivate( tor ) );
     250    else if( !strcmp( key, "lastAnnounceTime" ) )
     251        tr_bencDictAddInt( d, key, st->lastAnnounceTime );
     252    else if( !strcmp( key, "lastScrapeTime" ) )
     253        tr_bencDictAddInt( d, key, st->lastScrapeTime );
     254    else if( !strcmp( key, "leechers" ) )
     255        tr_bencDictAddInt( d, key, st->leechers );
     256    else if( !strcmp( key, "leftUntilDone" ) )
     257        tr_bencDictAddInt( d, key, st->leftUntilDone );
     258    else if( !strcmp( key, "manualAnnounceTime" ) )
     259        tr_bencDictAddInt( d, key, st->manualAnnounceTime );
     260    else if( !strcmp( key, "maxConnectedPeers" ) )
     261        tr_bencDictAddInt( d, key,  tr_torrentGetPeerLimit( tor ) );
     262    else if( !strcmp( key, "name" ) )
     263        tr_bencDictAddStr( d, key, inf->name );
     264    else if( !strcmp( key, "nextAnnounceTime" ) )
     265        tr_bencDictAddInt( d, key, st->nextAnnounceTime );
     266    else if( !strcmp( key, "nextScrapeTime" ) )
     267        tr_bencDictAddInt( d, key, st->nextScrapeTime );
     268    else if( !strcmp( key, "peersConnected" ) )
     269        tr_bencDictAddInt( d, key, st->peersConnected );
     270    else if( !strcmp( key, "peersFrom" ) ) {
     271        tr_benc * tmp = tr_bencDictAddDict( d, key, 4 );
    273272        const int * f = st->peersFrom;
    274         tr_bencDictAddInt( d, "fromCache",    f[TR_PEER_FROM_CACHE] );
    275         tr_bencDictAddInt( d, "fromIncoming", f[TR_PEER_FROM_INCOMING] );
    276         tr_bencDictAddInt( d, "fromPex",      f[TR_PEER_FROM_PEX] );
    277         tr_bencDictAddInt( d, "fromTracker",  f[TR_PEER_FROM_TRACKER] );
    278     }
    279 
    280     if( fields & TR_RPC_TORRENT_PRIORITIES ) {
     273        tr_bencDictAddInt( tmp, "fromCache",    f[TR_PEER_FROM_CACHE] );
     274        tr_bencDictAddInt( tmp, "fromIncoming", f[TR_PEER_FROM_INCOMING] );
     275        tr_bencDictAddInt( tmp, "fromPex",      f[TR_PEER_FROM_PEX] );
     276        tr_bencDictAddInt( tmp, "fromTracker",  f[TR_PEER_FROM_TRACKER] );
     277    }
     278    else if( !strcmp( key, "peersGettingFromUs" ) )
     279        tr_bencDictAddInt( d, key, st->peersGettingFromUs );
     280    else if( !strcmp( key, "peersKnown" ) )
     281        tr_bencDictAddInt( d, key, st->peersKnown );
     282    else if( !strcmp( key, "peersSendingToUs" ) )
     283        tr_bencDictAddInt( d, key, st->peersSendingToUs );
     284    else if( !strcmp( key, "pieceCount" ) )
     285        tr_bencDictAddInt( d, key, inf->pieceCount );
     286    else if( !strcmp( key, "pieceSize" ) )
     287        tr_bencDictAddInt( d, key, inf->pieceSize );
     288    else if( !strcmp( key, "priorities" ) ) {
    281289        tr_file_index_t i;
    282         tr_benc * p = tr_bencDictAddList( d, "priorities", inf->fileCount );
    283         tr_benc * w = tr_bencDictAddList( d, "wanted", inf->fileCount );
    284         for( i=0; i<inf->fileCount; ++i ) {
     290        tr_benc * p = tr_bencDictAddList( d, key, inf->fileCount );
     291        for( i=0; i<inf->fileCount; ++i )
    285292            tr_bencListAddInt( p, inf->files[i].priority );
     293    }
     294    else if( !strcmp( key, "rateDownload" ) )
     295        tr_bencDictAddInt( d, key, (int)(st->rateDownload*1024) );
     296    else if( !strcmp( key, "rateUpload" ) )
     297        tr_bencDictAddInt( d, key, (int)(st->rateUpload*1024) );
     298    else if( !strcmp( key, "recheckProgress" ) )
     299        tr_bencDictAddDouble( d, key, st->recheckProgress );
     300    else if( !strcmp( key, "scrapeResponse" ) )
     301        tr_bencDictAddStr( d, key, st->scrapeResponse );
     302    else if( !strcmp( key, "scrapeURL" ) )
     303        tr_bencDictAddStr( d, key, st->scrapeURL );
     304    else if( !strcmp( key, "seeders" ) )
     305        tr_bencDictAddInt( d, key, st->seeders );
     306    else if( !strcmp( key, "sizeWhenDone" ) )
     307        tr_bencDictAddInt( d, key, st->sizeWhenDone );
     308    else if( !strcmp( key, "startDate" ) )
     309        tr_bencDictAddInt( d, key, st->startDate );
     310    else if( !strcmp( key, "status" ) )
     311        tr_bencDictAddInt( d, key, st->status );
     312    else if( !strcmp( key, "swarmSpeed" ) )
     313        tr_bencDictAddInt( d, key, (int)(st->swarmSpeed*1024) );
     314    else if( !strcmp( key, "timesCompleted" ) )
     315        tr_bencDictAddInt( d, key, st->timesCompleted );
     316    else if( !strcmp( key, "trackers" ) )
     317        addTrackers( inf, tr_bencDictAddList( d, key, inf->trackerCount ) );
     318    else if( !strcmp( key, "totalSize" ) )
     319        tr_bencDictAddInt( d, key, inf->totalSize );
     320    else if( !strcmp( key, "uploadedEver" ) )
     321        tr_bencDictAddInt( d, key, st->uploadedEver );
     322    else if( !strcmp( key, "uploadLimitMode" ) )
     323        tr_bencDictAddInt( d, key,   tr_torrentGetSpeedMode( tor, TR_UP ) );
     324    else if( !strcmp( key, "uploadLimit" ) )
     325        tr_bencDictAddInt( d, key, tr_torrentGetSpeedLimit( tor, TR_UP ) );
     326    else if( !strcmp( key, "uploadRatio" ) )
     327        tr_bencDictAddDouble( d, key, tr_getRatio( st->uploadedEver, st->downloadedEver ) );
     328    else if( !strcmp( key, "wanted" ) ) {
     329        tr_file_index_t i;
     330        tr_benc * w = tr_bencDictAddList( d, key, inf->fileCount );
     331        for( i=0; i<inf->fileCount; ++i )
    286332            tr_bencListAddInt( w, inf->files[i].dnd ? 0 : 1 );
    287         }
    288     }
    289 
    290     if( fields & TR_RPC_TORRENT_SCRAPE ) {
    291         tr_bencDictAddInt( d, "lastScrapeTime", st->lastScrapeTime );
    292         tr_bencDictAddInt( d, "nextScrapeTime", st->nextScrapeTime );
    293         tr_bencDictAddStr( d, "scrapeResponse", st->scrapeResponse );
    294         tr_bencDictAddStr( d, "scrapeURL", st->scrapeURL );
    295     }
    296 
    297     if( fields & TR_RPC_TORRENT_SIZE ) {
    298         tr_bencDictAddInt( d, "haveUnchecked", st->haveUnchecked );
    299         tr_bencDictAddInt( d, "haveValid", st->haveValid );
    300         tr_bencDictAddInt( d, "leftUntilDone", st->leftUntilDone );
    301         tr_bencDictAddInt( d, "sizeWhenDone", st->sizeWhenDone );
    302         tr_bencDictAddInt( d, "totalSize", inf->totalSize );
    303     }
    304 
    305     if( fields & TR_RPC_TORRENT_TRACKER_STATS ) {
    306         tr_bencDictAddInt( d, "leechers", st->leechers );
    307         tr_bencDictAddInt( d, "peersKnown", st->peersKnown );
    308         tr_bencDictAddInt( d, "seeders", st->seeders );
    309         tr_bencDictAddInt( d, "timesCompleted", st->timesCompleted );
    310     }
    311 
    312     if( fields & TR_RPC_TORRENT_TRACKERS )
    313         addTrackers( inf, tr_bencDictAddList( d, "trackers", inf->trackerCount ) );
    314 
    315     if( fields & TR_RPC_TORRENT_WEBSEEDS )
    316         addWebseeds( inf, tr_bencDictAddList( d, "webseeds", inf->trackerCount ) );
     333    }
     334    else if( !strcmp( key, "webseeds" ) )
     335        addWebseeds( inf, tr_bencDictAddList( d, key, inf->trackerCount ) );
     336    else if( !strcmp( key, "webseedsSendingToUs" ) )
     337        tr_bencDictAddInt( d, key, st->webseedsSendingToUs );
     338}
     339
     340static void
     341addInfo( const tr_torrent * tor, tr_benc * d, tr_benc * fields )
     342{
     343    int i;
     344    const int n = tr_bencListSize( fields );
     345    const char * str;
     346
     347    tr_bencInitDict( d, n );
     348
     349    for( i=0; i<n; ++i )
     350        if( tr_bencGetStr( tr_bencListChild( fields, i ), &str ) )
     351            addField( tor, d, str );
    317352}
    318353
     
    323358    tr_torrent ** torrents = getTorrents( handle, args_in, &torrentCount );
    324359    tr_benc * list = tr_bencDictAddList( args_out, "torrents", torrentCount );
    325     int64_t fields = 0;
    326 
    327     if( !tr_bencDictFindInt( args_in, "fields", &fields ) )
    328         fields = ~(int64_t)0;
    329     tr_bencDictAddInt( args_out, "fields", fields );
     360    tr_benc * fields;
     361
     362    if( !tr_bencDictFindList( args_in, "fields", &fields ) )
     363        return "no fields specified";
    330364
    331365    for( i=0; i<torrentCount; ++i )
     
    485519
    486520        if( tor ) {
    487             addInfo( tor, tr_bencDictAdd( args_out, "torrent-added" ), TR_RPC_TORRENT_ID );
     521            tr_benc fields;
     522            tr_bencInitList( &fields, 3 );
     523            tr_bencListAddStr( &fields, "id" );
     524            tr_bencListAddStr( &fields, "name" );
     525            tr_bencListAddStr( &fields, "hashString" );
     526            addInfo( tor, tr_bencDictAdd( args_out, "torrent-added" ), &fields );
    488527            notify( h, TR_RPC_TORRENT_ADDED, tor );
     528            tr_bencFree( &fields );
    489529        } else if( err == TR_EDUPLICATE ) {
    490530            return "duplicate torrent";
  • trunk/libtransmission/rpc.h

    r6346 r6404  
    1717****  RPC processing
    1818***/
    19 
    20 enum
    21 {
    22     TR_RPC_TORRENT_ACTIVITY        = (1<<0),
    23     TR_RPC_TORRENT_ANNOUNCE        = (1<<1),
    24     TR_RPC_TORRENT_ERROR           = (1<<2),
    25     TR_RPC_TORRENT_FILES           = (1<<3),
    26     TR_RPC_TORRENT_HISTORY         = (1<<4),
    27     TR_RPC_TORRENT_ID              = (1<<5),
    28     TR_RPC_TORRENT_INFO            = (1<<6),
    29     TR_RPC_TORRENT_LIMITS          = (1<<7),
    30     TR_RPC_TORRENT_PEERS           = (1<<8),
    31     TR_RPC_TORRENT_PEER_STATS      = (1<<9),
    32     TR_RPC_TORRENT_PRIORITIES      = (1<<10),
    33     TR_RPC_TORRENT_SCRAPE          = (1<<11),
    34     TR_RPC_TORRENT_SIZE            = (1<<12),
    35     TR_RPC_TORRENT_TRACKER_STATS   = (1<<13),
    36     TR_RPC_TORRENT_TRACKERS        = (1<<14),
    37     TR_RPC_TORRENT_WEBSEEDS        = (1<<15)
    38 };
    3919
    4020struct tr_benc;
  • trunk/web/javascript/transmission.remote.js

    r6346 r6404  
    2121RPC._UpSpeedLimited         = 'speed-limit-up-enabled';
    2222RPC._DownSpeedLimited       = 'speed-limit-down-enabled';
    23 
    24 RPC._TorrentActivity        = (1<<0);
    25 RPC._TorrentAnnounce        = (1<<1);
    26 RPC._TorrentError           = (1<<2);
    27 RPC._TorrentFiles           = (1<<3);
    28 RPC._TorrentHistory         = (1<<4);
    29 RPC._TorrentId              = (1<<5);
    30 RPC._TorrentInfo            = (1<<6);
    31 RPC._TorrentLimits          = (1<<7);
    32 RPC._TorrentPeers           = (1<<8);
    33 RPC._TorrentPeerStats       = (1<<9);
    34 RPC._TorrentPriorities      = (1<<10);
    35 RPC._TorrentScrape          = (1<<11);
    36 RPC._TorrentSize            = (1<<12);
    37 RPC._TorrentTrackerStats    = (1<<13);
    38 RPC._TorrentTrackers        = (1<<14);
    39 RPC._TorrentWebseeds        = (1<<15);
    4023
    4124function TransmissionRemote( controller )
     
    10487                o.method = 'torrent-get'
    10588                o.arguments = { };
    106                 o.arguments.fields = RPC._TorrentActivity
    107                                    + RPC._TorrentAnnounce
    108                                    + RPC._TorrentError
    109                                    + RPC._TorrentHistory
    110                                    + RPC._TorrentId
    111                                    + RPC._TorrentInfo
    112                                    + RPC._TorrentLimits
    113                                    + RPC._TorrentScrape
    114                                    + RPC._TorrentSize
    115                                    + RPC._TorrentTrackerStats;
     89                o.arguments.fields = [
     90                        'addedDate', 'announceURL', 'comment', 'creator',
     91                        'dateCreated', 'downloadedEver', 'error', 'errorString',
     92                        'eta', 'hashString', 'haveUnchecked', 'haveValid', 'id',
     93                        'isPrivate', 'leechers', 'leftUntilDone', 'name',
     94                        'peersGettingFromUs', 'peersKnown', 'peersSendingToUs',
     95                        'rateDownload', 'rateUpload', 'seeders', 'sizeWhenDone',
     96                        'status', 'swarmSpeed', 'totalSize', 'uploadedEver' ];
    11697                this.sendRequest( RPC._Root, $.toJSON(o), function(data) {
    11798                        tr.updateTorrents( data.arguments.torrents );
Note: See TracChangeset for help on using the changeset viewer.