]> granicus.if.org Git - transmission/commitdiff
(trunk, libT) #5063 'remaining time unknown with magnets that have webseeds' -- fixed.
authorJordan Lee <jordan@transmissionbt.com>
Fri, 5 Oct 2012 22:04:08 +0000 (22:04 +0000)
committerJordan Lee <jordan@transmissionbt.com>
Fri, 5 Oct 2012 22:04:08 +0000 (22:04 +0000)
libtransmission/peer-mgr.c

index 3a6b63d383c8b0455eea81226a10e90f7beba624..ce8b0a55ddb8f2eb4b5b4bc086569682afb96d4f 100644 (file)
@@ -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<peerCount; ++i )
         tr_peerUpdateProgress( tor, peers[i] );
+
 }
 
 void