void tr_magnetCreateMetainfo( const tr_magnet_info * info, tr_benc * top ) { int i; tr_benc * d; tr_bencInitDict( top, 4 ); /* announce list */ if( info->trackerCount == 1 ) tr_bencDictAddStr( top, "announce", info->trackers[0] ); else { tr_benc * trackers = tr_bencDictAddList( top, "announce-list", info->trackerCount ); for( i=0; i<info->trackerCount; ++i ) tr_bencListAddStr( tr_bencListAddList( trackers, 1 ), info->trackers[i] ); } /* webseeds */ if( info->webseedCount > 0 ) { tr_benc * urls = tr_bencDictAddList( top, "url-list", info->webseedCount ); for( i=0; i<info->webseedCount; ++i ) tr_bencListAddStr( urls, info->webseeds[i] ); } /* nonstandard keys */ d = tr_bencDictAddDict( top, "magnet-info", 2 ); tr_bencDictAddRaw( d, "info_hash", info->hash, 20 ); if( info->displayName != NULL ) tr_bencDictAddStr( d, "display-name", info->displayName ); }
static bool addURL (tr_benc * metainfo, const char * url) { const char * announce = NULL; tr_benc * announce_list = NULL; bool changed = false; const bool had_announce = tr_bencDictFindStr (metainfo, "announce", &announce); const bool had_announce_list = tr_bencDictFindList (metainfo, "announce-list", &announce_list); if (!had_announce && !had_announce_list) { /* this new tracker is the only one, so add it to "announce"... */ printf ("\tAdded \"%s\" in \"announce\"\n", url); tr_bencDictAddStr (metainfo, "announce", url); changed = true; } else { if (!had_announce_list) { announce_list = tr_bencDictAddList (metainfo, "announce-list", 2); if (had_announce) { /* we're moving from an 'announce' to an 'announce-list', * so copy the old announce URL to the list */ tr_benc * tier = tr_bencListAddList (announce_list, 1); tr_bencListAddStr (tier, announce); changed = true; } } /* If the user-specified URL isn't in the announce list yet, add it */ if (!announce_list_has_url (announce_list, url)) { tr_benc * tier = tr_bencListAddList (announce_list, 1); tr_bencListAddStr (tier, url); printf ("\tAdded \"%s\" to \"announce-list\" tier %zu\n", url, tr_bencListSize (announce_list)); changed = true; } } return changed; }
static tr_bool addURL( tr_benc * metainfo, const char * url ) { const char * str; tr_benc * announce_list; tr_bool changed = FALSE; tr_bool match = FALSE; /* maybe add it to "announce" */ if( !tr_bencDictFindStr( metainfo, "announce", &str ) ) { printf( "\tAdded \"%s\" in \"announce\"\n", url ); tr_bencDictAddStr( metainfo, "announce", url ); changed = TRUE; } /* see if it's already in announce-list */ if( tr_bencDictFindList( metainfo, "announce-list", &announce_list ) ) { tr_benc * tier; int tierCount = 0; while(( tier = tr_bencListChild( announce_list, tierCount++ ))) { tr_benc * node; int nodeCount = 0; while(( node = tr_bencListChild( tier, nodeCount++ ))) if( tr_bencGetStr( node, &str ) && !strcmp( str, url ) ) match = TRUE; } } /* if it's not in announce-list, add it now */ if( !match ) { tr_benc * tier; if( !tr_bencDictFindList( metainfo, "announce-list", &announce_list ) ) announce_list = tr_bencDictAddList( metainfo, "announce-list", 1 ); tier = tr_bencListAddList( announce_list, 1 ); tr_bencListAddStr( tier, url ); printf( "\tAdded \"%s\" to \"announce-list\" tier %zu\n", url, tr_bencListSize( announce_list ) ); changed = TRUE; } return changed; }