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
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"
{
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 */
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,
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 ) );
}
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
tr_runInEventThread( tor->session, tr_torrentManualUpdateImpl, tor );
}
-int
+tr_bool
tr_torrentCanManualUpdate( const tr_torrent * tor )
{
return ( tr_isTorrent( 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 )
{
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 );
{
tr_trackerCompleted( tor->tracker );
- tor->doneDate = time( NULL );
+ tor->doneDate = tor->anyDate = time( NULL );
}
tr_torrentSaveResume( 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 */
assert( tr_isTorrent( tor ) );
tor->doneDate = t;
+
+ if( tor->anyDate < tor->doneDate )
+ tor->anyDate = tor->doneDate;
}
/**
}
tr_verify_state;
+void tr_torrentSetVerifyState( tr_torrent * tor,
+ tr_verify_state state );
+
struct tr_torrent
{
tr_session * session;
time_t activityDate;
time_t doneDate;
time_t startDate;
+ time_t anyDate;
tr_torrent_completeness_func * completeness_func;
void * completeness_func_user_data;
void tr_torrentManualUpdate( tr_torrent * torrent );
-int tr_torrentCanManualUpdate( const tr_torrent * torrent );
+tr_bool tr_torrentCanManualUpdate( const tr_torrent * torrent );
/***********************************************************************
* tr_torrentPeers
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 )
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 );