]> granicus.if.org Git - transmission/commitdiff
(trunk) rpc changes:
authorCharles Kerr <charles@transmissionbt.com>
Thu, 26 Mar 2009 18:06:54 +0000 (18:06 +0000)
committerCharles Kerr <charles@transmissionbt.com>
Thu, 26 Mar 2009 18:06:54 +0000 (18:06 +0000)
1. new field "blocklist-size" to session-info, so RPC clients can know how big the blocklist is
2. new method "torrent-reannounce" so RPC clients can ask the tracker for more peers

doc/rpc-spec.txt
libtransmission/rpcimpl.c
libtransmission/torrent.c
libtransmission/torrent.h
libtransmission/transmission.h
libtransmission/verify.c

index 2284c7bf8de489dfe17e6ea8f59c10d46f830b0f..d93b7027b3b5fa1b74ce65f3dc5b6a016405a5c6 100644 (file)
 
 3.1.  Torrent Action Requests
 
-   Method name         | libtransmission function
-   --------------------+-------------------------------------------------
-   "torrent-start"     | tr_torrentStart
-   "torrent-stop"      | tr_torrentStop
-   "torrent-verify"    | tr_torrentVerify
+   Method name          | libtransmission function
+   ---------------------+-------------------------------------------------
+   "torrent-start"      | tr_torrentStart
+   "torrent-stop"       | tr_torrentStop
+   "torrent-verify"     | tr_torrentVerify
+   "torrent-reannounce" | tr_torrentManualUpdate ("ask tracker for more peers")
 
    Request arguments: "ids", which specifies which torrents to use.
                       All torrents are used if the "ids" argument is omitted.
    "alt-speed-limit-begin"    | number     minutes after midnight. (ex: 60 means starting at 1 am)
    "alt-speed-limit-end"      | number     minutes after midnight. (ex: 300 means ending at 5 am)
    "blocklist-enabled"        | 'boolean'  true means enabled
+   "blocklist-size"           | number     number of rules in the blocklist
    "encryption"               | string     "required", "preferred", "tolerated"
    "download-dir"             | string     default path to download torrents
    "peer-limit-global"        | number     maximum global number of peers
    "pex-enabled"              | 'boolean'  true means allow pex in public torrents
    "peer-port"                | number     port number
    "port-forwarding-enabled"  | 'boolean'  true means enabled
+   "rpc-version"              | number     the current RPC API version
+   "rpc-version-minimum"      | number     the minimum RPC API version supported
    "speed-limit-down"         | number     max global download speed (in K/s)
    "speed-limit-down-enabled" | 'boolean'  true means enabled
    "speed-limit-up"           | number     max global upload speed (in K/s)
    "speed-limit-up-enabled"   | 'boolean'  true means enabled
    "version"                  | string     long version string "$version ($revision)"
-   "rpc-version"              | number     the current RPC API version
-   "rpc-version-minimum"      | number     the minimum RPC API version supported
 
    "rpc-version" indicates the RPC interface version supported by the RPC server.
    It is incremented when a new version of Transmission changes the RPC interface.
 4.1.1.  Mutators
 
    Method name: "session-set"
-   Request arguments: one or more of 4.1's arguments, except "version"
+   Request arguments: one or more of 4.1's arguments, except: "blocklist-size",
+                      "rpc-version", "rpc-version-minimum", and "version"
    Response arguments: none
 
 4.1.2.  Accessors
          |         | yes       | session-get    | new arg "alt-speed-limit-begin"
          |         | yes       | session-get    | new arg "alt-speed-limit-end"
          |         | yes       | session-get    | new arg "blocklist-enabled"
+         |         | yes       | session-get    | new arg "blocklist-size"
          |         | yes       | session-get    | new arg "peer-limit-per-torrent"
+         |         | yes       |                | new method "torrent-reannounce"
          |         |        NO | torrent-get    | removed arg "downloadLimit"
          |         |        NO | torrent-get    | removed arg "downloadLimitMode"
          |         |        NO | torrent-get    | removed arg "uploadLimit"
index df53beb00e1a4eb3e173052fe953d972c9cc5053..df7ece627ede21870f129d80d725842bd99af637 100644 (file)
@@ -147,17 +147,12 @@ getTorrents( tr_session * session,
         {
             tr_torrent * tor = NULL;
             const time_t now = time( NULL );
-            const time_t window = 120;
+            const time_t window = 60;
             const int n = tr_sessionCountTorrents( session );
             torrents = tr_new0( tr_torrent *, n );
-            while( ( tor = tr_torrentNext( session, tor ) ) ) {
-                time_t a = tor->activityDate;
-                a = MAX( a, tor->addedDate );
-                a = MAX( a, tor->doneDate );
-                a = MAX( a, tor->startDate );
-                if( a >= now - window )
+            while( ( tor = tr_torrentNext( session, tor ) ) )
+                if( tor->anyDate >= now - window )
                     torrents[torrentCount++] = tor;
-            }
         }
     }
     else /* all of them */
@@ -242,6 +237,31 @@ torrentRemove( tr_session               * session,
     return NULL;
 }
 
+static const char*
+torrentReannounce( tr_session               * session,
+                   tr_benc                  * args_in,
+                   tr_benc                  * args_out UNUSED,
+                   struct tr_rpc_idle_data  * idle_data )
+{
+    int i, torrentCount;
+    tr_torrent ** torrents = getTorrents( session, args_in, &torrentCount );
+
+    assert( idle_data == NULL );
+
+    for( i=0; i<torrentCount; ++i )
+    {
+        tr_torrent * tor = torrents[i];
+        if( tr_torrentCanManualUpdate( tor ) )
+        {
+            tr_torrentManualUpdate( tor );
+            notify( session, TR_RPC_TORRENT_CHANGED, tor );
+        }
+    }
+
+    tr_free( torrents );
+    return NULL;
+}
+
 static const char*
 torrentVerify( tr_session               * session,
                tr_benc                  * args_in,
@@ -956,6 +976,7 @@ sessionGet( tr_session               * s,
     tr_bencDictAddInt( d, TR_PREFS_KEY_ALT_BEGIN, tr_sessionGetAltSpeedLimitBegin( s ) );
     tr_bencDictAddInt( d, TR_PREFS_KEY_ALT_END, tr_sessionGetAltSpeedLimitEnd( s ) );
     tr_bencDictAddInt( d, TR_PREFS_KEY_BLOCKLIST_ENABLED, tr_blocklistIsEnabled( s ) );
+    tr_bencDictAddInt( d, "blocklist-size", tr_blocklistGetRuleCount( s ) );
     tr_bencDictAddStr( d, TR_PREFS_KEY_DOWNLOAD_DIR, tr_sessionGetDownloadDir( s ) );
     tr_bencDictAddInt( d, TR_PREFS_KEY_PEER_LIMIT_GLOBAL, tr_sessionGetPeerLimit( s ) );
     tr_bencDictAddInt( d, TR_PREFS_KEY_PEER_LIMIT_TORRENT, tr_sessionGetPeerLimitPerTorrent( s ) );
@@ -995,16 +1016,17 @@ static struct method
 }
 methods[] =
 {
-    { "session-get",    TRUE,  sessionGet          },
-    { "session-set",    TRUE,  sessionSet          },
-    { "session-stats",  TRUE,  sessionStats        },
-    { "torrent-add",    FALSE, torrentAdd          },
-    { "torrent-get",    TRUE,  torrentGet          },
-    { "torrent-remove", TRUE,  torrentRemove       },
-    { "torrent-set",    TRUE,  torrentSet          },
-    { "torrent-start",  TRUE,  torrentStart        },
-    { "torrent-stop",   TRUE,  torrentStop         },
-    { "torrent-verify", TRUE,  torrentVerify       }
+    { "session-get",        TRUE,  sessionGet          },
+    { "session-set",        TRUE,  sessionSet          },
+    { "session-stats",      TRUE,  sessionStats        },
+    { "torrent-add",        FALSE, torrentAdd          },
+    { "torrent-get",        TRUE,  torrentGet          },
+    { "torrent-remove",     TRUE,  torrentRemove       },
+    { "torrent-set",        TRUE,  torrentSet          },
+    { "torrent-start",      TRUE,  torrentStart        },
+    { "torrent-stop",       TRUE,  torrentStop         },
+    { "torrent-verify",     TRUE,  torrentVerify       },
+    { "torrent-reannounce", TRUE,  torrentReannounce   }
 };
 
 static void
index ecc777a6b8bc414add8a167f6ea1d9a92e1f3078..45fc5eebfb5addf6d81789c9a99a6a6901f69d4b 100644 (file)
@@ -757,7 +757,7 @@ tr_torrentManualUpdate( tr_torrent * tor )
     tr_runInEventThread( tor->session, tr_torrentManualUpdateImpl, tor );
 }
 
-int
+tr_bool
 tr_torrentCanManualUpdate( const tr_torrent * tor )
 {
     return ( tr_isTorrent( tor  ) )
@@ -781,6 +781,16 @@ tr_torrentStatCached( tr_torrent * tor )
          : tr_torrentStat( tor );
 }
 
+void
+tr_torrentSetVerifyState( tr_torrent * tor, tr_verify_state state )
+{
+    assert( tr_isTorrent( tor ) );
+    assert( state==TR_VERIFY_NONE || state==TR_VERIFY_WAIT || state==TR_VERIFY_NOW );
+
+    tor->verifyState = state;
+    tor->anyDate = time( NULL );
+}
+
 tr_torrent_activity
 tr_torrentGetActivity( tr_torrent * tor )
 {
@@ -1180,7 +1190,7 @@ checkAndStartImpl( void * vtor )
     tr_torrentResetTransferStats( tor );
     tor->completeness = tr_cpGetStatus( &tor->completion );
     tr_torrentSaveResume( tor );
-    tor->startDate = time( NULL );
+    tor->startDate = tor->anyDate = time( NULL );
     tr_trackerStart( tor->tracker );
     tr_peerMgrStartTorrent( tor );
     tr_torrentCheckSeedRatio( tor );
@@ -1455,7 +1465,7 @@ tr_torrentRecheckCompleteness( tr_torrent * tor )
         {
             tr_trackerCompleted( tor->tracker );
 
-            tor->doneDate = time( NULL );
+            tor->doneDate = tor->anyDate = time( NULL );
         }
 
         tr_torrentSaveResume( tor );
@@ -1917,6 +1927,9 @@ tr_torrentSetActivityDate( tr_torrent * tor,
     assert( tr_isTorrent( tor ) );
 
     tor->activityDate = t;
+
+    if( tor->anyDate < tor->activityDate )
+        tor->anyDate = tor->activityDate;
 }
 
 /** @deprecated this method will be removed in 1.40 */
@@ -1927,6 +1940,9 @@ tr_torrentSetDoneDate( tr_torrent * tor,
     assert( tr_isTorrent( tor ) );
 
     tor->doneDate = t;
+
+    if( tor->anyDate < tor->doneDate )
+        tor->anyDate = tor->doneDate;
 }
 
 /**
index 7828852e06256b75498f76918fbd6ca2c130a1f2..5b555b3c6207b449b8fff7dfbb71f1bcfb4418d5 100644 (file)
@@ -127,6 +127,9 @@ typedef enum
 }
 tr_verify_state;
 
+void             tr_torrentSetVerifyState( tr_torrent      * tor,
+                                           tr_verify_state   state );
+
 struct tr_torrent
 {
     tr_session *             session;
@@ -182,6 +185,7 @@ struct tr_torrent
     time_t                     activityDate;
     time_t                     doneDate;
     time_t                     startDate;
+    time_t                     anyDate;
 
     tr_torrent_completeness_func *   completeness_func;
     void *                     completeness_func_user_data;
index 066874592e5a2f396793d83de78c1d7b91375f70..976c8791be3597c42a3b7601879404d279f0abf2 100644 (file)
@@ -1135,7 +1135,7 @@ void tr_torrentClearRatioLimitHitCallback( tr_torrent * torrent );
 
 void tr_torrentManualUpdate( tr_torrent * torrent );
 
-int  tr_torrentCanManualUpdate( const tr_torrent * torrent );
+tr_bool tr_torrentCanManualUpdate( const tr_torrent * torrent );
 
 /***********************************************************************
 * tr_torrentPeers
index 3b1ec595dc64ac9b5d7a8440f1b4b649520350d0..7ed00020f05c3cbf454c2148ec548d80cd2c3522 100644 (file)
@@ -142,13 +142,12 @@ verifyThreadFunc( void * unused UNUSED )
         tr_lockUnlock( getVerifyLock( ) );
 
         tr_torinf( tor, _( "Verifying torrent" ) );
-        assert( tr_isTorrent( tor ) );
-        tor->verifyState = TR_VERIFY_NOW;
+        tr_torrentSetVerifyState( tor, TR_VERIFY_NOW );
         buffer = tr_new( uint8_t, tor->info.pieceSize );
         for( i = 0; i < tor->info.fileCount && !stopCurrent; ++i )
             changed |= checkFile( tor, buffer, tor->info.pieceSize, i, &stopCurrent );
         tr_free( buffer );
-        tor->verifyState = TR_VERIFY_NONE;
+        tr_torrentSetVerifyState( tor, TR_VERIFY_NONE );
         assert( tr_isTorrent( tor ) );
 
         if( !stopCurrent )
@@ -187,7 +186,7 @@ tr_verifyAdd( tr_torrent *      tor,
         node->verify_done_cb = verify_done_cb;
 
         tr_lockLock( getVerifyLock( ) );
-        tor->verifyState = verifyList ? TR_VERIFY_WAIT : TR_VERIFY_NOW;
+        tr_torrentSetVerifyState( tor, verifyList ? TR_VERIFY_WAIT : TR_VERIFY_NOW );
         tr_list_append( &verifyList, node );
         if( verifyThread == NULL )
             verifyThread = tr_threadNew( verifyThreadFunc, NULL );