libT support for #1679 Schedule Speed Limit mode based on days, not just time

This commit is contained in:
Mitchell Livingston 2009-04-04 02:17:39 +00:00
parent cb179b58ba
commit f3cf4b4ef5
5 changed files with 98 additions and 17 deletions

View File

@ -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

View File

@ -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 ) );

View File

@ -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 )
{

View File

@ -77,6 +77,7 @@ struct tr_session
int altSpeedTimeBegin;
int altSpeedTimeEnd;
tr_sched_day altSpeedTimeDay;
tr_bool altSpeedTimeEnabled;
tr_bool altSpeedChangedByUser;

View File

@ -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 * );