mirror of
https://github.com/transmission/transmission
synced 2025-03-03 02:05:19 +00:00
libT support for #1679 Schedule Speed Limit mode based on days, not just time
This commit is contained in:
parent
cb179b58ba
commit
f3cf4b4ef5
5 changed files with 98 additions and 17 deletions
|
@ -360,6 +360,7 @@
|
|||
"alt-speed-time-begin" | number when to turn on alt speeds (units: minutes after midnight)
|
||||
"alt-speed-time-enabled" | 'boolean' true means the scheduled on/off times are used
|
||||
"alt-speed-time-end" | number when to turn off alt speeds (units: same)
|
||||
"alt-speed-time-day" | number what day(s) to turn on alt speeds (look at tr_sched_day)
|
||||
"alt-speed-up" | number max global upload speed (in K/s)
|
||||
"blocklist-enabled" | 'boolean' true means enabled
|
||||
"blocklist-size" | number number of rules in the blocklist
|
||||
|
|
|
@ -1017,6 +1017,8 @@ sessionSet( tr_session * session,
|
|||
tr_sessionSetAltSpeedBegin( session, i );
|
||||
if( tr_bencDictFindInt( args_in, TR_PREFS_KEY_ALT_SPEED_TIME_END, &i ) )
|
||||
tr_sessionSetAltSpeedEnd( session, i );
|
||||
if( tr_bencDictFindInt( args_in, TR_PREFS_KEY_ALT_SPEED_TIME_DAY, &i ) )
|
||||
tr_sessionSetAltSpeedDay( session, i );
|
||||
if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_ALT_SPEED_TIME_ENABLED, &boolVal ) )
|
||||
tr_sessionUseAltSpeedTime( session, boolVal );
|
||||
if( tr_bencDictFindBool( args_in, TR_PREFS_KEY_BLOCKLIST_ENABLED, &boolVal ) )
|
||||
|
@ -1127,6 +1129,7 @@ sessionGet( tr_session * s,
|
|||
tr_bencDictAddBool( d, TR_PREFS_KEY_ALT_SPEED_ENABLED, tr_sessionUsesAltSpeed(s) );
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_ALT_SPEED_TIME_BEGIN, tr_sessionGetAltSpeedBegin(s) );
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_ALT_SPEED_TIME_END,tr_sessionGetAltSpeedEnd(s) );
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_ALT_SPEED_TIME_DAY,tr_sessionGetAltSpeedDay(s) );
|
||||
tr_bencDictAddBool( d, TR_PREFS_KEY_ALT_SPEED_TIME_ENABLED, tr_sessionUsesAltSpeedTime(s) );
|
||||
tr_bencDictAddBool( d, TR_PREFS_KEY_BLOCKLIST_ENABLED, tr_blocklistIsEnabled( s ) );
|
||||
tr_bencDictAddInt ( d, "blocklist-size", tr_blocklistGetRuleCount( s ) );
|
||||
|
|
|
@ -209,22 +209,37 @@ loadBlocklists( tr_session * session )
|
|||
static tr_bool
|
||||
isAltTime( const tr_session * s )
|
||||
{
|
||||
tr_bool is;
|
||||
int minutes;
|
||||
int minutes, day;
|
||||
tr_bool withinTime;
|
||||
struct tm tm;
|
||||
const time_t now = time( NULL );
|
||||
const int begin = s->altSpeedTimeBegin;
|
||||
const int end = s->altSpeedTimeEnd;
|
||||
const tr_bool toNextDay = begin > end;
|
||||
|
||||
tr_localtime_r( &now, &tm );
|
||||
minutes = tm.tm_hour*60 + tm.tm_min;
|
||||
|
||||
if( begin <= end )
|
||||
is = ( begin <= minutes ) && ( minutes < end );
|
||||
day = tm.tm_wday;
|
||||
|
||||
if( !toNextDay )
|
||||
withinTime = ( begin <= minutes ) && ( minutes < end );
|
||||
else /* goes past midnight */
|
||||
is = ( begin <= minutes ) || ( minutes < end );
|
||||
|
||||
return is;
|
||||
withinTime = ( begin <= minutes ) || ( minutes < end );
|
||||
|
||||
if( !withinTime )
|
||||
return FALSE;
|
||||
|
||||
if( toNextDay && (minutes < end) )
|
||||
day = (day - 1) % 7;
|
||||
|
||||
if( s->altSpeedTimeDay == TR_SCHED_ALL )
|
||||
return TRUE;
|
||||
else if( s->altSpeedTimeDay == TR_SCHED_WEEKDAY )
|
||||
return (day != 0) && day != 6;
|
||||
else if( s->altSpeedTimeDay == TR_SCHED_WEEKEND )
|
||||
return (day == 0) || (day == 6);
|
||||
else
|
||||
return day == s->altSpeedTimeDay;
|
||||
}
|
||||
|
||||
/***
|
||||
|
@ -283,6 +298,7 @@ tr_sessionGetDefaultSettings( tr_benc * d )
|
|||
tr_bencDictAddInt ( d, TR_PREFS_KEY_ALT_SPEED_TIME_BEGIN, 540 ); /* 9am */
|
||||
tr_bencDictAddBool( d, TR_PREFS_KEY_ALT_SPEED_TIME_ENABLED, FALSE );
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_ALT_SPEED_TIME_END, 1020 ); /* 5pm */
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_ALT_SPEED_TIME_DAY, TR_SCHED_ALL );
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_USPEED, 100 );
|
||||
tr_bencDictAddBool( d, TR_PREFS_KEY_USPEED_ENABLED, FALSE );
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_UPLOAD_SLOTS_PER_TORRENT, 14 );
|
||||
|
@ -337,6 +353,7 @@ tr_sessionGetSettings( tr_session * s, struct tr_benc * d )
|
|||
tr_bencDictAddInt ( d, TR_PREFS_KEY_ALT_SPEED_TIME_BEGIN, tr_sessionGetAltSpeedBegin( s ) );
|
||||
tr_bencDictAddBool( d, TR_PREFS_KEY_ALT_SPEED_TIME_ENABLED, tr_sessionUsesAltSpeedTime( s ) );
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_ALT_SPEED_TIME_END, tr_sessionGetAltSpeedEnd( s ) );
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_ALT_SPEED_TIME_DAY, tr_sessionGetAltSpeedDay( s ) );
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_USPEED, tr_sessionGetSpeedLimit( s, TR_UP ) );
|
||||
tr_bencDictAddBool( d, TR_PREFS_KEY_USPEED_ENABLED, tr_sessionIsSpeedLimited( s, TR_UP ) );
|
||||
tr_bencDictAddInt ( d, TR_PREFS_KEY_UPLOAD_SLOTS_PER_TORRENT, s->uploadSlotsPerTorrent );
|
||||
|
@ -606,7 +623,7 @@ tr_sessionInitImpl( void * vdata )
|
|||
assert( found );
|
||||
session->peerPort = session->isPortRandom ? getRandomPort( session ) : j;
|
||||
session->shared = tr_sharedInit( session, boolVal, session->peerPort );
|
||||
session->isPortSet = session->isPortRandom || j>0;
|
||||
session->isPortSet = session->peerPort > 0;
|
||||
|
||||
/**
|
||||
**/
|
||||
|
@ -652,6 +669,10 @@ tr_sessionInitImpl( void * vdata )
|
|||
found = tr_bencDictFindInt( &settings, TR_PREFS_KEY_ALT_SPEED_TIME_END, &i );
|
||||
assert( found );
|
||||
session->altSpeedTimeEnd = i;
|
||||
|
||||
found = tr_bencDictFindInt( &settings, TR_PREFS_KEY_ALT_SPEED_TIME_DAY, &i );
|
||||
assert( found );
|
||||
session->altSpeedTimeDay = i;
|
||||
|
||||
found = tr_bencDictFindBool( &settings, TR_PREFS_KEY_ALT_SPEED_TIME_ENABLED, &boolVal );
|
||||
assert( found );
|
||||
|
@ -963,17 +984,31 @@ onAltTimer( int foo UNUSED, short bar UNUSED, void * vsession )
|
|||
{
|
||||
const time_t now = time( NULL );
|
||||
struct tm tm;
|
||||
int currentMinute;
|
||||
int currentMinute, day;
|
||||
tr_bool isBeginTime, isEndTime, isDay;
|
||||
tr_localtime_r( &now, &tm );
|
||||
currentMinute = tm.tm_hour*60 + tm.tm_min;
|
||||
day = tm.tm_wday;
|
||||
|
||||
isBeginTime = currentMinute == session->altSpeedTimeBegin;
|
||||
isEndTime = currentMinute == session->altSpeedTimeEnd;
|
||||
if( isBeginTime || isEndTime )
|
||||
{
|
||||
/* if looking at the end date, look at the next day if end time is before begin time */
|
||||
if( isEndTime && !isBeginTime && session->altSpeedTimeEnd < session->altSpeedTimeBegin )
|
||||
day = (day - 1) % 7;
|
||||
|
||||
if( session->altSpeedTimeDay == TR_SCHED_ALL )
|
||||
isDay = TRUE;
|
||||
else if( session->altSpeedTimeDay == TR_SCHED_WEEKDAY )
|
||||
isDay = (day != 0) && (day != 6);
|
||||
else if( session->altSpeedTimeDay == TR_SCHED_WEEKEND )
|
||||
isDay = (day == 0) || (day == 6);
|
||||
else
|
||||
isDay = day == session->altSpeedTimeDay;
|
||||
|
||||
if( currentMinute == session->altSpeedTimeBegin )
|
||||
{
|
||||
useAltSpeed( session, TRUE, FALSE );
|
||||
}
|
||||
else if( currentMinute == session->altSpeedTimeEnd )
|
||||
{
|
||||
useAltSpeed( session, FALSE, FALSE );
|
||||
if( isDay )
|
||||
useAltSpeed( session, isBeginTime, FALSE );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1128,6 +1163,28 @@ tr_sessionGetAltSpeedEnd( const tr_session * s )
|
|||
return s->altSpeedTimeEnd;
|
||||
}
|
||||
|
||||
void
|
||||
tr_sessionSetAltSpeedDay( tr_session * s, tr_sched_day day )
|
||||
{
|
||||
assert( tr_isSession( s ) );
|
||||
|
||||
if( s->altSpeedTimeDay != day )
|
||||
{
|
||||
s->altSpeedTimeDay = day;
|
||||
|
||||
if( tr_sessionUsesAltSpeedTime( s ) )
|
||||
useAltSpeed( s, isAltTime( s ), TRUE );
|
||||
}
|
||||
}
|
||||
|
||||
tr_sched_day
|
||||
tr_sessionGetAltSpeedDay( const tr_session * s )
|
||||
{
|
||||
assert( tr_isSession( s ) );
|
||||
|
||||
return s->altSpeedTimeDay;
|
||||
}
|
||||
|
||||
void
|
||||
useAltSpeed( tr_session * s, tr_bool enabled, tr_bool byUser )
|
||||
{
|
||||
|
|
|
@ -77,6 +77,7 @@ struct tr_session
|
|||
|
||||
int altSpeedTimeBegin;
|
||||
int altSpeedTimeEnd;
|
||||
tr_sched_day altSpeedTimeDay;
|
||||
tr_bool altSpeedTimeEnabled;
|
||||
tr_bool altSpeedChangedByUser;
|
||||
|
||||
|
|
|
@ -166,6 +166,7 @@ static TR_INLINE tr_bool tr_isEncryptionMode( tr_encryption_mode m )
|
|||
#define TR_PREFS_KEY_ALT_SPEED_TIME_BEGIN "alt-speed-time-begin"
|
||||
#define TR_PREFS_KEY_ALT_SPEED_TIME_ENABLED "alt-speed-time-enabled"
|
||||
#define TR_PREFS_KEY_ALT_SPEED_TIME_END "alt-speed-time-end"
|
||||
#define TR_PREFS_KEY_ALT_SPEED_TIME_DAY "alt-speed-time-day"
|
||||
#define TR_PREFS_KEY_BLOCKLIST_ENABLED "blocklist-enabled"
|
||||
#define TR_PREFS_KEY_DOWNLOAD_DIR "download-dir"
|
||||
#define TR_PREFS_KEY_DSPEED "download-limit"
|
||||
|
@ -602,6 +603,24 @@ int tr_sessionGetAltSpeedBegin ( const tr_session * );
|
|||
void tr_sessionSetAltSpeedEnd ( tr_session *, int minsSinceMidnight );
|
||||
int tr_sessionGetAltSpeedEnd ( const tr_session * );
|
||||
|
||||
typedef enum
|
||||
{
|
||||
TR_SCHED_SUN = 0, //specific days correspond to stuct tm's tm_wday
|
||||
TR_SCHED_MON,
|
||||
TR_SCHED_TUES,
|
||||
TR_SCHED_WED,
|
||||
TR_SCHED_THURS,
|
||||
TR_SCHED_FRI,
|
||||
TR_SCHED_SAT,
|
||||
TR_SCHED_WEEKDAY,
|
||||
TR_SCHED_WEEKEND,
|
||||
TR_SCHED_ALL
|
||||
}
|
||||
tr_sched_day;
|
||||
|
||||
void tr_sessionSetAltSpeedDay ( tr_session *, tr_sched_day day );
|
||||
tr_sched_day tr_sessionGetAltSpeedDay ( const tr_session * );
|
||||
|
||||
typedef void ( tr_altSpeedFunc ) ( tr_session *, tr_bool active, tr_bool userDriven, void * );
|
||||
void tr_sessionClearAltSpeedFunc ( tr_session * );
|
||||
void tr_sessionSetAltSpeedFunc ( tr_session *, tr_altSpeedFunc *, void * );
|
||||
|
|
Loading…
Reference in a new issue