From ebd4b5e3864c2f4bcaa0e3c27c741443884ee297 Mon Sep 17 00:00:00 2001 From: Jordan Lee Date: Fri, 5 Oct 2012 22:04:08 +0000 Subject: [PATCH] (trunk, libT) #5063 'remaining time unknown with magnets that have webseeds' -- fixed. --- libtransmission/peer-mgr.c | 36 +++++++++++++++++++++++++++--------- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/libtransmission/peer-mgr.c b/libtransmission/peer-mgr.c index 3a6b63d38..ce8b0a55d 100644 --- a/libtransmission/peer-mgr.c +++ b/libtransmission/peer-mgr.c @@ -508,10 +508,27 @@ torrentFree( void * vt ) static void peerCallbackFunc( tr_peer *, const tr_peer_event *, void * ); +static void +rebuildWebseedArray( Torrent * t, tr_torrent * tor ) +{ + int i; + const tr_info * inf = &tor->info; + + /* clear the array */ + tr_ptrArrayDestruct( &t->webseeds, (PtrArrayForeachFunc)tr_webseedFree ); + t->webseeds = TR_PTR_ARRAY_INIT; + + /* repopulate it */ + for( i = 0; i < inf->webseedCount; ++i ) + { + tr_webseed * w = tr_webseedNew( tor, inf->webseeds[i], peerCallbackFunc, t ); + tr_ptrArrayAppend( &t->webseeds, w ); + } +} + static Torrent* torrentNew( tr_peerMgr * manager, tr_torrent * tor ) { - int i; Torrent * t; t = tr_new0( Torrent, 1 ); @@ -522,12 +539,7 @@ torrentNew( tr_peerMgr * manager, tr_torrent * tor ) t->webseeds = TR_PTR_ARRAY_INIT; t->outgoingHandshakes = TR_PTR_ARRAY_INIT; - for( i = 0; i < tor->info.webseedCount; ++i ) - { - tr_webseed * w = - tr_webseedNew( tor, tor->info.webseeds[i], peerCallbackFunc, t ); - tr_ptrArrayAppend( &t->webseeds, w ); - } + rebuildWebseedArray( t, tor ); return t; } @@ -2517,13 +2529,19 @@ void tr_peerMgrOnTorrentGotMetainfo( tr_torrent * tor ) { int i; - const int peerCount = tr_ptrArraySize( &tor->torrentPeers->peers ); - tr_peer ** peers = (tr_peer**) tr_ptrArrayBase( &tor->torrentPeers->peers ); + int peerCount; + tr_peer ** peers; + + /* the webseed list may have changed... */ + rebuildWebseedArray( tor->torrentPeers, tor ); /* some peer_msgs' progress fields may not be accurate if we didn't have the metadata before now... so refresh them all... */ + peerCount = tr_ptrArraySize( &tor->torrentPeers->peers ); + peers = (tr_peer**) tr_ptrArrayBase( &tor->torrentPeers->peers ); for( i=0; i