Handle "fields" argument in "session-get" RPC request

If "fields" array is present in arguments, only return session fields
specified. Otherwise return all the fields as before.
This commit is contained in:
Mike Gelfand 2016-09-04 13:16:20 +03:00
parent b82f6009dd
commit ff73e65069
2 changed files with 258 additions and 62 deletions

View File

@ -525,8 +525,9 @@
4.1.2. Accessors
Method name: "session-get"
Request arguments: none
Response arguments: all of 4.1's arguments
Request arguments: an optional "fields" array of keys (see 4.1)
Response arguments: key/value pairs matching the request's "fields"
argument if present, or all supported fields (see 4.1) otherwise.
4.2. Session Statistics
@ -743,7 +744,7 @@
13 | 2.30 | yes | session-get | new arg "isUTP" to the "peers" list
| | yes | torrent-add | new arg "cookies"
| | NO | torrent-get | removed arg "peersKnown"
------+---------+-----------+--------------------------+-------------------------------
------+---------+-----------+----------------------+-------------------------------
14 | 2.40 | NO | torrent-get | values of "status" field changed
| | yes | torrent-get | new arg "queuePosition"
| | yes | torrent-get | new arg "isStalled"
@ -760,11 +761,13 @@
| | yes | | new method "queue-move-down"
| | yes | | new method "queue-move-bottom"
| | yes | | new method "torrent-start-now"
------+---------+-----------+--------------------------+-------------------------------
------+---------+-----------+----------------------+-------------------------------
15 | 2.80 | yes | torrent-get | new arg "etaIdle"
| | yes | torrent-rename-path | new method
| | yes | free-space | new method
| | yes | torrent-add | new return return arg "torrent-duplicate"
| | yes | torrent-add | new return arg "torrent-duplicate"
------+---------+-----------+----------------------+-------------------------------
16 | 3.00 | yes | session-get | new request arg "fields"
5.1. Upcoming Breakage

View File

@ -32,7 +32,7 @@
#include "version.h"
#include "web.h"
#define RPC_VERSION 15
#define RPC_VERSION 16
#define RPC_VERSION_MIN 1
#define RECENTLY_ACTIVE_SECONDS 60
@ -2039,71 +2039,264 @@ sessionStats (tr_session * session,
return NULL;
}
static void
addSessionField (tr_session * s,
tr_variant * d,
tr_quark key)
{
switch (key)
{
case TR_KEY_alt_speed_up:
tr_variantDictAddInt (d, key, tr_sessionGetAltSpeed_KBps (s, TR_UP));
break;
case TR_KEY_alt_speed_down:
tr_variantDictAddInt (d, key, tr_sessionGetAltSpeed_KBps (s, TR_DOWN));
break;
case TR_KEY_alt_speed_enabled:
tr_variantDictAddBool (d, key, tr_sessionUsesAltSpeed (s));
break;
case TR_KEY_alt_speed_time_begin:
tr_variantDictAddInt (d, key, tr_sessionGetAltSpeedBegin (s));
break;
case TR_KEY_alt_speed_time_end:
tr_variantDictAddInt (d, key,tr_sessionGetAltSpeedEnd (s));
break;
case TR_KEY_alt_speed_time_day:
tr_variantDictAddInt (d, key,tr_sessionGetAltSpeedDay (s));
break;
case TR_KEY_alt_speed_time_enabled:
tr_variantDictAddBool (d, key, tr_sessionUsesAltSpeedTime (s));
break;
case TR_KEY_blocklist_enabled:
tr_variantDictAddBool (d, key, tr_blocklistIsEnabled (s));
break;
case TR_KEY_blocklist_url:
tr_variantDictAddStr (d, key, tr_blocklistGetURL (s));
break;
case TR_KEY_cache_size_mb:
tr_variantDictAddInt (d, key, tr_sessionGetCacheLimit_MB (s));
break;
case TR_KEY_blocklist_size:
tr_variantDictAddInt (d, key, tr_blocklistGetRuleCount (s));
break;
case TR_KEY_config_dir:
tr_variantDictAddStr (d, key, tr_sessionGetConfigDir (s));
break;
case TR_KEY_download_dir:
tr_variantDictAddStr (d, key, tr_sessionGetDownloadDir (s));
break;
case TR_KEY_download_dir_free_space:
tr_variantDictAddInt (d, key, tr_device_info_get_free_space (s->downloadDir));
break;
case TR_KEY_download_queue_enabled:
tr_variantDictAddBool (d, key, tr_sessionGetQueueEnabled (s, TR_DOWN));
break;
case TR_KEY_download_queue_size:
tr_variantDictAddInt (d, key, tr_sessionGetQueueSize (s, TR_DOWN));
break;
case TR_KEY_peer_limit_global:
tr_variantDictAddInt (d, key, tr_sessionGetPeerLimit (s));
break;
case TR_KEY_peer_limit_per_torrent:
tr_variantDictAddInt (d, key, tr_sessionGetPeerLimitPerTorrent (s));
break;
case TR_KEY_incomplete_dir:
tr_variantDictAddStr (d, key, tr_sessionGetIncompleteDir (s));
break;
case TR_KEY_incomplete_dir_enabled:
tr_variantDictAddBool (d, key, tr_sessionIsIncompleteDirEnabled (s));
break;
case TR_KEY_pex_enabled:
tr_variantDictAddBool (d, key, tr_sessionIsPexEnabled (s));
break;
case TR_KEY_utp_enabled:
tr_variantDictAddBool (d, key, tr_sessionIsUTPEnabled (s));
break;
case TR_KEY_dht_enabled:
tr_variantDictAddBool (d, key, tr_sessionIsDHTEnabled (s));
break;
case TR_KEY_lpd_enabled:
tr_variantDictAddBool (d, key, tr_sessionIsLPDEnabled (s));
break;
case TR_KEY_peer_port:
tr_variantDictAddInt (d, key, tr_sessionGetPeerPort (s));
break;
case TR_KEY_peer_port_random_on_start:
tr_variantDictAddBool (d, key, tr_sessionGetPeerPortRandomOnStart (s));
break;
case TR_KEY_port_forwarding_enabled:
tr_variantDictAddBool (d, key, tr_sessionIsPortForwardingEnabled (s));
break;
case TR_KEY_rename_partial_files:
tr_variantDictAddBool (d, key, tr_sessionIsIncompleteFileNamingEnabled (s));
break;
case TR_KEY_rpc_version:
tr_variantDictAddInt (d, key, RPC_VERSION);
break;
case TR_KEY_rpc_version_minimum:
tr_variantDictAddInt (d, key, RPC_VERSION_MIN);
break;
case TR_KEY_seedRatioLimit:
tr_variantDictAddReal (d, key, tr_sessionGetRatioLimit (s));
break;
case TR_KEY_seedRatioLimited:
tr_variantDictAddBool (d, key, tr_sessionIsRatioLimited (s));
break;
case TR_KEY_idle_seeding_limit:
tr_variantDictAddInt (d, key, tr_sessionGetIdleLimit (s));
break;
case TR_KEY_idle_seeding_limit_enabled:
tr_variantDictAddBool (d, key, tr_sessionIsIdleLimited (s));
break;
case TR_KEY_seed_queue_enabled:
tr_variantDictAddBool (d, key, tr_sessionGetQueueEnabled (s, TR_UP));
break;
case TR_KEY_seed_queue_size:
tr_variantDictAddInt (d, key, tr_sessionGetQueueSize (s, TR_UP));
break;
case TR_KEY_start_added_torrents:
tr_variantDictAddBool (d, key, !tr_sessionGetPaused (s));
break;
case TR_KEY_trash_original_torrent_files:
tr_variantDictAddBool (d, key, tr_sessionGetDeleteSource (s));
break;
case TR_KEY_speed_limit_up:
tr_variantDictAddInt (d, key, tr_sessionGetSpeedLimit_KBps (s, TR_UP));
break;
case TR_KEY_speed_limit_up_enabled:
tr_variantDictAddBool (d, key, tr_sessionIsSpeedLimited (s, TR_UP));
break;
case TR_KEY_speed_limit_down:
tr_variantDictAddInt (d, key, tr_sessionGetSpeedLimit_KBps (s, TR_DOWN));
break;
case TR_KEY_speed_limit_down_enabled:
tr_variantDictAddBool (d, key, tr_sessionIsSpeedLimited (s, TR_DOWN));
break;
case TR_KEY_script_torrent_done_filename:
tr_variantDictAddStr (d, key, tr_sessionGetTorrentDoneScript (s));
break;
case TR_KEY_script_torrent_done_enabled:
tr_variantDictAddBool (d, key, tr_sessionIsTorrentDoneScriptEnabled (s));
break;
case TR_KEY_queue_stalled_enabled:
tr_variantDictAddBool (d, key, tr_sessionGetQueueStalledEnabled (s));
break;
case TR_KEY_queue_stalled_minutes:
tr_variantDictAddInt (d, key, tr_sessionGetQueueStalledMinutes (s));
break;
case TR_KEY_units:
tr_formatter_get_units (tr_variantDictAddDict (d, key, 0));
break;
case TR_KEY_version:
tr_variantDictAddStr (d, key, LONG_VERSION_STRING);
break;
case TR_KEY_encryption:
{
const char * str;
switch (tr_sessionGetEncryption (s))
{
case TR_CLEAR_PREFERRED:
str = "tolerated";
break;
case TR_ENCRYPTION_REQUIRED:
str = "required";
break;
default:
str = "preferred";
break;
}
tr_variantDictAddStr (d, key, str);
break;
}
}
}
static const char*
sessionGet (tr_session * s,
tr_variant * args_in UNUSED,
tr_variant * args_in,
tr_variant * args_out,
struct tr_rpc_idle_data * idle_data UNUSED)
{
const char * str;
tr_variant * d = args_out;
tr_variant * fields;
assert (idle_data == NULL);
tr_variantDictAddInt (d, TR_KEY_alt_speed_up, tr_sessionGetAltSpeed_KBps (s,TR_UP));
tr_variantDictAddInt (d, TR_KEY_alt_speed_down, tr_sessionGetAltSpeed_KBps (s,TR_DOWN));
tr_variantDictAddBool (d, TR_KEY_alt_speed_enabled, tr_sessionUsesAltSpeed (s));
tr_variantDictAddInt (d, TR_KEY_alt_speed_time_begin, tr_sessionGetAltSpeedBegin (s));
tr_variantDictAddInt (d, TR_KEY_alt_speed_time_end,tr_sessionGetAltSpeedEnd (s));
tr_variantDictAddInt (d, TR_KEY_alt_speed_time_day,tr_sessionGetAltSpeedDay (s));
tr_variantDictAddBool (d, TR_KEY_alt_speed_time_enabled, tr_sessionUsesAltSpeedTime (s));
tr_variantDictAddBool (d, TR_KEY_blocklist_enabled, tr_blocklistIsEnabled (s));
tr_variantDictAddStr (d, TR_KEY_blocklist_url, tr_blocklistGetURL (s));
tr_variantDictAddInt (d, TR_KEY_cache_size_mb, tr_sessionGetCacheLimit_MB (s));
tr_variantDictAddInt (d, TR_KEY_blocklist_size, tr_blocklistGetRuleCount (s));
tr_variantDictAddStr (d, TR_KEY_config_dir, tr_sessionGetConfigDir (s));
tr_variantDictAddStr (d, TR_KEY_download_dir, tr_sessionGetDownloadDir (s));
tr_variantDictAddInt (d, TR_KEY_download_dir_free_space, tr_device_info_get_free_space (s->downloadDir));
tr_variantDictAddBool (d, TR_KEY_download_queue_enabled, tr_sessionGetQueueEnabled (s, TR_DOWN));
tr_variantDictAddInt (d, TR_KEY_download_queue_size, tr_sessionGetQueueSize (s, TR_DOWN));
tr_variantDictAddInt (d, TR_KEY_peer_limit_global, tr_sessionGetPeerLimit (s));
tr_variantDictAddInt (d, TR_KEY_peer_limit_per_torrent, tr_sessionGetPeerLimitPerTorrent (s));
tr_variantDictAddStr (d, TR_KEY_incomplete_dir, tr_sessionGetIncompleteDir (s));
tr_variantDictAddBool (d, TR_KEY_incomplete_dir_enabled, tr_sessionIsIncompleteDirEnabled (s));
tr_variantDictAddBool (d, TR_KEY_pex_enabled, tr_sessionIsPexEnabled (s));
tr_variantDictAddBool (d, TR_KEY_utp_enabled, tr_sessionIsUTPEnabled (s));
tr_variantDictAddBool (d, TR_KEY_dht_enabled, tr_sessionIsDHTEnabled (s));
tr_variantDictAddBool (d, TR_KEY_lpd_enabled, tr_sessionIsLPDEnabled (s));
tr_variantDictAddInt (d, TR_KEY_peer_port, tr_sessionGetPeerPort (s));
tr_variantDictAddBool (d, TR_KEY_peer_port_random_on_start, tr_sessionGetPeerPortRandomOnStart (s));
tr_variantDictAddBool (d, TR_KEY_port_forwarding_enabled, tr_sessionIsPortForwardingEnabled (s));
tr_variantDictAddBool (d, TR_KEY_rename_partial_files, tr_sessionIsIncompleteFileNamingEnabled (s));
tr_variantDictAddInt (d, TR_KEY_rpc_version, RPC_VERSION);
tr_variantDictAddInt (d, TR_KEY_rpc_version_minimum, RPC_VERSION_MIN);
tr_variantDictAddReal (d, TR_KEY_seedRatioLimit, tr_sessionGetRatioLimit (s));
tr_variantDictAddBool (d, TR_KEY_seedRatioLimited, tr_sessionIsRatioLimited (s));
tr_variantDictAddInt (d, TR_KEY_idle_seeding_limit, tr_sessionGetIdleLimit (s));
tr_variantDictAddBool (d, TR_KEY_idle_seeding_limit_enabled, tr_sessionIsIdleLimited (s));
tr_variantDictAddBool (d, TR_KEY_seed_queue_enabled, tr_sessionGetQueueEnabled (s, TR_UP));
tr_variantDictAddInt (d, TR_KEY_seed_queue_size, tr_sessionGetQueueSize (s, TR_UP));
tr_variantDictAddBool (d, TR_KEY_start_added_torrents, !tr_sessionGetPaused (s));
tr_variantDictAddBool (d, TR_KEY_trash_original_torrent_files, tr_sessionGetDeleteSource (s));
tr_variantDictAddInt (d, TR_KEY_speed_limit_up, tr_sessionGetSpeedLimit_KBps (s, TR_UP));
tr_variantDictAddBool (d, TR_KEY_speed_limit_up_enabled, tr_sessionIsSpeedLimited (s, TR_UP));
tr_variantDictAddInt (d, TR_KEY_speed_limit_down, tr_sessionGetSpeedLimit_KBps (s, TR_DOWN));
tr_variantDictAddBool (d, TR_KEY_speed_limit_down_enabled, tr_sessionIsSpeedLimited (s, TR_DOWN));
tr_variantDictAddStr (d, TR_KEY_script_torrent_done_filename, tr_sessionGetTorrentDoneScript (s));
tr_variantDictAddBool (d, TR_KEY_script_torrent_done_enabled, tr_sessionIsTorrentDoneScriptEnabled (s));
tr_variantDictAddBool (d, TR_KEY_queue_stalled_enabled, tr_sessionGetQueueStalledEnabled (s));
tr_variantDictAddInt (d, TR_KEY_queue_stalled_minutes, tr_sessionGetQueueStalledMinutes (s));
tr_formatter_get_units (tr_variantDictAddDict (d, TR_KEY_units, 0));
tr_variantDictAddStr (d, TR_KEY_version, LONG_VERSION_STRING);
switch (tr_sessionGetEncryption (s))
if (tr_variantDictFindList (args_in, TR_KEY_fields, &fields))
{
case TR_CLEAR_PREFERRED: str = "tolerated"; break;
case TR_ENCRYPTION_REQUIRED: str = "required"; break;
default: str = "preferred"; break;
const size_t field_count = tr_variantListSize (fields);
for (size_t i = 0; i < field_count; ++i)
{
const char * field_name;
size_t field_name_len;
tr_quark field_id;
if (!tr_variantGetStr (tr_variantListChild (fields, i), &field_name, &field_name_len))
continue;
if (!tr_quark_lookup (field_name, field_name_len, &field_id))
continue;
addSessionField (s, args_out, field_id);
}
}
else
{
for (tr_quark field_id = TR_KEY_NONE + 1; field_id < TR_N_KEYS; ++field_id)
addSessionField (s, args_out, field_id);
}
tr_variantDictAddStr (d, TR_KEY_encryption, str);
return NULL;
}