Ticket #2175: tagging-torrent.patch

File tagging-torrent.patch, 9.0 KB (added by Elbandi, 12 years ago)
  • daemon/remote.c

    diff --git a/daemon/remote.c b/daemon/remote.c
    index 3641a2f..ec58829 100644
    a b static tr_option opts[] = 
    100100    { 's', "start",                "Start the current torrent(s)", "s",  0, NULL },
    101101    { 'S', "stop",                 "Stop the current torrent(s)", "S",  0, NULL },
    102102    { 't', "torrent",              "Set the current torrent(s)", "t",  1, "<torrent>" },
     103    { 'T', "tags",                 "Tags the current torrent(s)", "T",  1, "<tag>" },
    103104    { 'u', "uplimit",              "Set the maximum global upload speed in KB/s", "u",  1, "<speed>" },
    104105    { 'U', "no-uplimit",           "Don't limit the global upload speed", "U",  0, NULL },
    105106    { 'v', "verify",               "Verify the current torrent(s)", "v",  0, NULL },
    addIdArg( tr_benc * args, 
    210211}
    211212
    212213static void
     214addTags( tr_benc *    args,
     215          const char * key,
     216          const char * arg )
     217{
     218    tr_benc * tags = tr_bencDictAddList( args, key, 100 );
     219
     220    if( arg )
     221    {
     222        const char * walk;
     223
     224        walk = arg;
     225        while( walk && *walk )
     226        {
     227            const char * pch = strchr( walk, ',' );
     228            char * str;
     229            if( pch ) {
     230                str = tr_strndup( walk, pch-walk);
     231                walk = pch + 1;
     232            } else {
     233                str = tr_strdup ( walk );
     234                walk += strlen( walk );
     235            }
     236            tr_bencListAddStr( tags, str );
     237            tr_free( str );
     238        }
     239    }
     240}
     241
     242static void
    213243addFiles( tr_benc *    args,
    214244          const char * key,
    215245          const char * arg )
    static const char * details_keys[] = { 
    277307    "recheckProgress",
    278308    "scrapeResponse",
    279309    "seeders",
     310    "tags",
    280311    "sizeWhenDone",
    281312    "startDate",
    282313    "status",
    readargs( int argc, 
    468499                addArg = FALSE;
    469500                break;
    470501
     502            case 'T':
     503                tr_bencDictAddStr( &top, "method", "torrent-set" );
     504                addIdArg( args, id );
     505                addTags( args, "tags", optarg );
     506                break;
     507
    471508            case 'u':
    472509                tr_bencDictAddStr( &top, "method", "session-set" );
    473510                tr_bencDictAddInt( args, "speed-limit-up", numarg( optarg ) );
    printDetails( tr_benc * top ) 
    10321069                        PRId64
    10331070                        " web seeds\n", i, n );
    10341071            }
     1072
     1073            if( tr_bencDictFindList( t, "tags", &l ) )
     1074            {
     1075                int i, n = tr_bencListSize( l );
     1076                const char *str;
     1077                printf( "  Tags: ");
     1078                for (i = 0; i < n; i++)
     1079                {
     1080                    if( tr_bencGetStr( tr_bencListChild( l, i ), &str ) )
     1081                    {
     1082                        if ( i == 0 )
     1083                            printf( "%s", str);
     1084                        else
     1085                            printf( ", %s", str);
     1086                    }
     1087                }
     1088                printf( "\n" );
     1089            }
    10351090            printf( "\n" );
    10361091
    10371092            printf( "HISTORY\n" );
  • libtransmission/resume.c

    diff --git a/libtransmission/resume.c b/libtransmission/resume.c
    index 1f7c672..07d8300 100644
    a b  
    4444#define KEY_SPEEDLIMIT_DOWN     "speed-limit-down"
    4545#define KEY_RATIOLIMIT          "ratio-limit"
    4646#define KEY_UPLOADED            "uploaded"
     47#define KEY_TAGS                "tags"
    4748
    4849#define KEY_SPEED                  "speed"
    4950#define KEY_USE_GLOBAL_SPEED_LIMIT "use-global-speed-limit"
    loadPeers( tr_benc * dict, 
    136137***/
    137138
    138139static void
     140saveTags( tr_benc *          dict,
     141          const tr_torrent * tor )
     142{
     143    int i, n = tr_ptrArraySize( tor->tags );
     144    tr_benc *             list;
     145
     146    list = tr_bencDictAddList( dict, KEY_TAGS, n );
     147    for( i = 0; i < n; ++i )
     148        tr_bencListAddStr( list, tr_ptrArrayNth( tor->tags, i ) );
     149}
     150
     151static uint64_t
     152loadTags( tr_benc * dict, tr_torrent * tor )
     153{
     154    uint64_t              ret = 0;
     155    tr_benc *             list;
     156
     157    if( tr_bencDictFindList( dict, KEY_TAGS, &list ) )
     158    {
     159        int i, n = tr_bencListSize( list );
     160        const char * str;
     161        for( i = 0; i < n; ++i )
     162            if (tr_bencGetStr( tr_bencListChild( list, i ), &str ) )
     163                tr_ptrArrayAppend( tor->tags, tr_strdup( str ) );
     164        ret = TR_FR_TAGS;
     165    }
     166
     167    return ret;
     168}
     169
     170static void
    139171saveDND( tr_benc *          dict,
    140172         const tr_torrent * tor )
    141173{
    tr_torrentSaveResume( const tr_torrent * tor ) 
    510542    saveProgress( &top, tor );
    511543    saveSpeedLimits( &top, tor );
    512544    saveRatioLimits( &top, tor );
     545    saveTags( &top, tor );
    513546
    514547    filename = getResumeFilename( tor );
    515548    tr_bencToFile( &top, TR_FMT_BENC, filename );
    loadFromFile( tr_torrent * tor, 
    641674    if( fieldsToLoad & TR_FR_RATIOLIMIT )
    642675        fieldsLoaded |= loadRatioLimits( &top, tor );
    643676
     677    if( fieldsToLoad & TR_FR_TAGS )
     678        fieldsLoaded |= loadTags( &top, tor );
     679
    644680    tr_bencFree( &top );
    645681    tr_free( filename );
    646682    return fieldsLoaded;
  • libtransmission/resume.h

    diff --git a/libtransmission/resume.h b/libtransmission/resume.h
    index 7f8df63..99b5208 100644
    a b enum 
    3434    TR_FR_ADDED_DATE          = ( 1 << 12 ),
    3535    TR_FR_DONE_DATE           = ( 1 << 13 ),
    3636    TR_FR_ACTIVITY_DATE       = ( 1 << 14 ),
    37     TR_FR_RATIOLIMIT          = ( 1 << 15 )
     37    TR_FR_RATIOLIMIT          = ( 1 << 15 ),
     38    TR_FR_TAGS                = ( 1 << 16 )
    3839};
    3940
    4041/**
  • libtransmission/rpcimpl.c

    diff --git a/libtransmission/rpcimpl.c b/libtransmission/rpcimpl.c
    index d6951f3..76c553c 100644
    a b torrentVerify( tr_session * session, 
    300300***/
    301301
    302302static void
     303addTags( const tr_torrent * tor,
     304         tr_benc *          list )
     305{
     306    int            i;
     307    int            tagsCount = tr_ptrArraySize( tor->tags );
     308
     309    tr_bencInitList( list, tagsCount );
     310
     311    for( i = 0; i < tagsCount; ++i )
     312        tr_bencListAddStr( list, tr_ptrArrayNth( tor->tags, i ) );
     313}
     314
     315static void
    303316addFileStats( const tr_torrent * tor, tr_benc * list )
    304317{
    305318    tr_file_index_t i;
    addField( const tr_torrent * tor, tr_benc * d, const char * key ) 
    548561        tr_bencDictAddInt( d, key, st->activity );
    549562    else if( tr_streq( key, keylen, "swarmSpeed" ) )
    550563        tr_bencDictAddInt( d, key, (int)( st->swarmSpeed * 1024 ) );
     564    else if( tr_streq( key, keylen, "tags" ) )
     565        addTags( tor, tr_bencDictAdd( d, key ) );
    551566    else if( tr_streq( key, keylen, "timesCompleted" ) )
    552567        tr_bencDictAddInt( d, key, st->timesCompleted );
    553568    else if( tr_streq( key, keylen, "trackers" ) )
    torrentGet( tr_session * session, 
    636651****
    637652***/
    638653
     654static void
     655setTags( tr_torrent * tor,
     656         tr_benc    * list )
     657{
     658    int i;
     659    const char * str;
     660    const int n = tr_bencListSize( list );
     661    tr_ptrArrayForeach( tor->tags, (PtrArrayForeachFunc)tr_free );
     662    tr_ptrArrayClear( tor->tags );
     663    for (i = 0; i < n; i++)
     664    {
     665        if (tr_bencGetStr( tr_bencListChild( list, i ), &str ) ) {
     666            tr_ptrArrayAppend( tor->tags, tr_strdup( str ) );
     667        }
     668    }
     669}
     670
    639671static const char*
    640672setFilePriorities( tr_torrent * tor,
    641673                   int          priority,
    torrentSet( tr_session * session, 
    735767        if( tr_bencDictFindInt( args_in, "bandwidthPriority", &tmp ) )
    736768            if( tr_isPriority( tmp ) )
    737769                tr_torrentSetPriority( tor, tmp );
     770        if( tr_bencDictFindList( args_in, "tags", &files ) )
     771            setTags( tor, files );
    738772        if( tr_bencDictFindList( args_in, "files-unwanted", &files ) )
    739773            setFileDLs( tor, FALSE, files );
    740774        if( tr_bencDictFindList( args_in, "files-wanted", &files ) )
  • libtransmission/torrent.c

    diff --git a/libtransmission/torrent.c b/libtransmission/torrent.c
    index b798c94..e95b22d 100644
    a b tr_torrentNew( const tr_ctor * ctor, 
    719719    {
    720720        tor = tr_new0( tr_torrent, 1 );
    721721        tor->info = tmpInfo;
     722        tor->tags = tr_ptrArrayNew( );
    722723        torrentRealInit( tor, ctor );
    723724    }
    724725    else if( setmeError )
    freeTorrent( tr_torrent * tor ) 
    12111212    session->torrentCount--;
    12121213
    12131214    tr_bandwidthFree( tor->bandwidth );
     1215    tr_ptrArrayFree( tor->tags, (PtrArrayForeachFunc)tr_free );
    12141216
    12151217    tr_metainfoFree( inf );
    12161218    tr_free( tor );
  • libtransmission/torrent.h

    diff --git a/libtransmission/torrent.h b/libtransmission/torrent.h
    index f559b1a..b5ba1ca 100644
    a b  
    2121#include "ratecontrol.h" /* tr_ratecontrol */
    2222#include "session.h" /* tr_globalLock(), tr_globalUnlock() */
    2323#include "utils.h" /* tr_bitfield */
     24#include "ptrarray.h"
    2425
    2526struct tr_bandwidth;
    2627struct tr_ratecontrol;
    struct tr_torrent 
    219220
    220221    double                     desiredRatio;
    221222    tr_ratiolimit              ratioLimitMode;
     223    tr_ptrArray              * tags;
    222224};
    223225
    224226/* get the index of this piece's first block */