Ignore:
Timestamp:
Feb 2, 2010, 10:45:22 PM (12 years ago)
Author:
charles
Message:

(trunk) #2802, #2716, #2717 -- remember magnet links and their settings between sessions, and allow their trackers to be modified

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/libtransmission/torrent.c

    r10078 r10084  
    713713static tr_parse_result
    714714torrentParseImpl( const tr_ctor * ctor, tr_info * setmeInfo,
    715                   int * dictOffset, int * dictLength )
     715                  tr_bool * setmeHasInfo, int * dictOffset, int * dictLength )
    716716{
    717717    int             doFree;
    718718    tr_bool         didParse;
     719    tr_bool         hasInfo = FALSE;
    719720    tr_info         tmp;
    720721    const tr_benc * metainfo;
     
    729730        return TR_PARSE_ERR;
    730731
    731     didParse = tr_metainfoParse( session, setmeInfo, dictOffset, dictLength, metainfo );
     732    didParse = tr_metainfoParse( session, metainfo, setmeInfo,
     733                                 &hasInfo, dictOffset, dictLength );
    732734    doFree = didParse && ( setmeInfo == &tmp );
    733735
     
    735737        result = TR_PARSE_ERR;
    736738
    737     if( didParse && !getBlockSize( setmeInfo->pieceSize ) )
     739    if( didParse && hasInfo && !getBlockSize( setmeInfo->pieceSize ) )
    738740        result = TR_PARSE_ERR;
    739741
     
    744746        tr_metainfoFree( setmeInfo );
    745747
     748    if( setmeHasInfo != NULL )
     749        *setmeHasInfo = hasInfo;
     750
    746751    return result;
    747752}
     
    750755tr_torrentParse( const tr_ctor * ctor, tr_info * setmeInfo )
    751756{
    752     return torrentParseImpl( ctor, setmeInfo, NULL, NULL );
     757    return torrentParseImpl( ctor, setmeInfo, NULL, NULL, NULL );
    753758}
    754759
     
    756761tr_torrentNew( const tr_ctor * ctor, int * setmeError )
    757762{
     763    int off, len;
     764    tr_bool hasInfo;
    758765    tr_info tmpInfo;
     766    tr_parse_result r;
    759767    tr_torrent * tor = NULL;
    760     const tr_magnet_info * magnetInfo;
    761768    tr_session * session = tr_ctorGetSession( ctor );
    762769
     
    764771    assert( tr_isSession( session ) );
    765772
    766     if( !tr_ctorGetMagnet( ctor, &magnetInfo ) )
    767     {
    768         if( tr_torrentFindFromHash( session, magnetInfo->hash ) != NULL )
     773    r = torrentParseImpl( ctor, &tmpInfo, &hasInfo, &off, &len );
     774    if( r == TR_PARSE_OK )
     775    {
     776        tor = tr_new0( tr_torrent, 1 );
     777        tor->info = tmpInfo;
     778        if( hasInfo )
    769779        {
    770             if( setmeError )
    771                 *setmeError = TR_PARSE_DUPLICATE;
    772         }
    773         else
    774         {
    775             tor = tr_new0( tr_torrent, 1 );
    776             tr_metainfoSetFromMagnet( &tor->info, magnetInfo );
    777             torrentInit( tor, ctor );
    778         }
    779     }
    780     else
    781     {
    782         int off, len;
    783         tr_parse_result r = torrentParseImpl( ctor, &tmpInfo, &off, &len );
    784         if( r == TR_PARSE_OK )
    785         {
    786             tor = tr_new0( tr_torrent, 1 );
    787             tor->info = tmpInfo;
    788780            tor->infoDictOffset = off;
    789781            tor->infoDictLength = len;
    790             torrentInit( tor, ctor );
    791782        }
    792         else if( setmeError )
    793         {
    794             *setmeError = r;
    795         }
     783        torrentInit( tor, ctor );
     784    }
     785    else if( setmeError )
     786    {
     787        *setmeError = r;
    796788    }
    797789
     
    14701462    assert( tr_isTorrent( tor ) );
    14711463
    1472     if( tor->isDirty && tr_torrentHasMetadata( tor ) )
     1464    if( tor->isDirty )
    14731465    {
    14741466        tor->isDirty = FALSE;
     
    21322124    if( ok && !tr_bencLoadFile( &metainfo, TR_FMT_BENC, tor->info.torrent ) )
    21332125    {
    2134         tr_info   tmpInfo;
     2126        tr_bool hasInfo;
     2127        tr_info tmpInfo;
    21352128
    21362129        /* remove the old fields */
     
    21612154        /* try to parse it back again, to make sure it's good */
    21622155        memset( &tmpInfo, 0, sizeof( tr_info ) );
    2163         if( tr_metainfoParse( tor->session, &tmpInfo,
    2164                               &tor->infoDictOffset,
    2165                               &tor->infoDictLength,
    2166                               &metainfo ) )
     2156        if( tr_metainfoParse( tor->session, &metainfo, &tmpInfo,
     2157                              &hasInfo, &tor->infoDictOffset, &tor->infoDictLength ) )
    21672158        {
    21682159            /* it's good, so keep these new trackers and free the old ones */
Note: See TracChangeset for help on using the changeset viewer.