From: Mitchell Livingston Date: Sat, 4 Apr 2009 02:17:39 +0000 (+0000) Subject: libT support for #1679 Schedule Speed Limit mode based on days, not just time X-Git-Tag: 1.60~176 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f3cf4b4ef506c35c23e3a0743b98493dae875113;p=transmission libT support for #1679 Schedule Speed Limit mode based on days, not just time --- diff --git a/doc/rpc-spec.txt b/doc/rpc-spec.txt index 54fd3e7d7..a3db15cf5 100644 --- a/doc/rpc-spec.txt +++ b/doc/rpc-spec.txt @@ -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 diff --git a/libtransmission/rpcimpl.c b/libtransmission/rpcimpl.c index c68361396..87cb83739 100644 --- a/libtransmission/rpcimpl.c +++ b/libtransmission/rpcimpl.c @@ -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 ) ); diff --git a/libtransmission/session.c b/libtransmission/session.c index b6253ae3f..841b99c09 100644 --- a/libtransmission/session.c +++ b/libtransmission/session.c @@ -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; - - if( currentMinute == session->altSpeedTimeBegin ) - { - useAltSpeed( session, TRUE, FALSE ); - } - else if( currentMinute == session->altSpeedTimeEnd ) + day = tm.tm_wday; + + isBeginTime = currentMinute == session->altSpeedTimeBegin; + isEndTime = currentMinute == session->altSpeedTimeEnd; + if( isBeginTime || isEndTime ) { - useAltSpeed( session, FALSE, FALSE ); + /* 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( 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 ) { diff --git a/libtransmission/session.h b/libtransmission/session.h index 826f518e7..e7b6b7060 100644 --- a/libtransmission/session.h +++ b/libtransmission/session.h @@ -77,6 +77,7 @@ struct tr_session int altSpeedTimeBegin; int altSpeedTimeEnd; + tr_sched_day altSpeedTimeDay; tr_bool altSpeedTimeEnabled; tr_bool altSpeedChangedByUser; diff --git a/libtransmission/transmission.h b/libtransmission/transmission.h index 2f1dc7226..094748649 100644 --- a/libtransmission/transmission.h +++ b/libtransmission/transmission.h @@ -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 * );