795
762
tr_sessionSetRatioLimited( session, boolVal );
798
*** Alternate speed limits
768
/* update the turtle mode's fields */
801
769
if( tr_bencDictFindInt( settings, TR_PREFS_KEY_ALT_SPEED_UP, &i ) )
802
tr_sessionSetAltSpeed( session, TR_UP, i );
770
turtle->speedLimit[TR_UP] = i;
803
771
if( tr_bencDictFindInt( settings, TR_PREFS_KEY_ALT_SPEED_DOWN, &i ) )
804
tr_sessionSetAltSpeed( session, TR_DOWN, i );
772
turtle->speedLimit[TR_DOWN] = i;
805
773
if( tr_bencDictFindInt( settings, TR_PREFS_KEY_ALT_SPEED_TIME_BEGIN, &i ) )
806
tr_sessionSetAltSpeedBegin( session, i );
774
turtle->beginMinute = i;
807
775
if( tr_bencDictFindInt( settings, TR_PREFS_KEY_ALT_SPEED_TIME_END, &i ) )
808
tr_sessionSetAltSpeedEnd( session, i );
776
turtle->endMinute = i;
809
777
if( tr_bencDictFindInt( settings, TR_PREFS_KEY_ALT_SPEED_TIME_DAY, &i ) )
810
tr_sessionSetAltSpeedDay( session, i );
811
779
if( tr_bencDictFindBool( settings, TR_PREFS_KEY_ALT_SPEED_TIME_ENABLED, &boolVal ) )
812
useAltSpeedTime( session, boolVal, FALSE );
814
useAltSpeed( session, isAltTime( session ), FALSE );
815
else if( tr_bencDictFindBool( settings, TR_PREFS_KEY_ALT_SPEED_ENABLED, &boolVal ) )
816
useAltSpeed( session, boolVal, FALSE );
780
turtle->isClockEnabled = boolVal;
781
if( tr_bencDictFindBool( settings, TR_PREFS_KEY_ALT_SPEED_ENABLED, &boolVal ) )
782
turtle->isEnabled = boolVal;
783
turtleBootstrap( session, turtle );
818
785
data->done = TRUE;
1076
turtleFindNextChange( struct tr_turtle_info * t )
1080
time_t today_began_at;
1083
const time_t now = tr_time( );
1084
const int SECONDS_PER_DAY = 86400;
1086
tr_localtime_r( &now, &tm );
1087
tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
1088
today_began_at = mktime( &tm );
1090
next_begin = today_began_at + ( t->beginMinute * 60 );
1091
if( next_begin <= now )
1092
next_begin += SECONDS_PER_DAY;
1094
next_end = today_began_at + ( t->endMinute * 60 );
1095
if( next_end <= now )
1096
next_end += SECONDS_PER_DAY;
1098
if( next_begin < next_end ) {
1099
t->_nextChangeAt = next_begin;
1100
t->_nextChangeValue = TRUE;
1102
t->_nextChangeAt = next_end;
1103
t->_nextChangeValue = FALSE;
1106
/* if the next change is today, look for today in t->days.
1107
if the next change is tomorrow to turn limits OFF, look for today in t->days.
1108
if the next change is tomorrow to turn limits ON, look for tomorrow in t->days. */
1109
if( t->_nextChangeValue && (( t->_nextChangeAt >= today_began_at + SECONDS_PER_DAY )))
1110
day = ( tm.tm_wday + 1 ) % 7;
1113
t->_nextChangeAllowed = ( t->days & (1<<day) ) != 0;
1115
if( t->isClockEnabled && t->_nextChangeAllowed ) {
1117
tr_localtime_r( &t->_nextChangeAt, &tm );
1118
strftime( buf, sizeof( buf ), "%a %b %d %T %Y", &tm );
1119
tr_inf( "Turtle clock updated: at %s we'll turn limits %s", buf, (t->_nextChangeValue?"on":"off") );
1107
1124
altSpeedToggled( void * vsession )
1109
1126
tr_session * session = vsession;
1127
struct tr_turtle_info * t = &session->turtle;
1111
1129
assert( tr_isSession( session ) );
1113
1131
updateBandwidth( session, TR_UP );
1114
1132
updateBandwidth( session, TR_DOWN );
1116
if( session->altCallback != NULL )
1117
(*session->altCallback)( session, session->altSpeedEnabled, session->altSpeedChangedByUser, session->altCallbackUserData );
1120
/* tell the alt speed limit timer to fire again at the top of the minute */
1122
setAltTimer( tr_session * session )
1124
const time_t now = time( NULL );
1127
assert( tr_isSession( session ) );
1128
assert( session->altTimer != NULL );
1130
tr_localtime_r( &now, &tm );
1131
tr_timerAdd( session->altTimer, 60-tm.tm_sec, 0 );
1134
/* this is called once a minute to:
1135
* (1) update session->isAltTime
1136
* (2) alter the speed limits when the alt limits go on and off */
1138
onAltTimer( int foo UNUSED, short bar UNUSED, void * vsession )
1140
tr_session * session = vsession;
1142
assert( tr_isSession( session ) );
1144
if( session->altSpeedTimeEnabled )
1146
const time_t now = time( NULL );
1148
int currentMinute, day;
1149
tr_bool isBeginTime, isEndTime, isDay;
1150
tr_localtime_r( &now, &tm );
1151
currentMinute = tm.tm_hour*60 + tm.tm_min;
1154
isBeginTime = currentMinute == session->altSpeedTimeBegin;
1155
isEndTime = currentMinute == session->altSpeedTimeEnd;
1156
if( isBeginTime || isEndTime )
1133
turtleFindNextChange( t );
1135
if( t->callback != NULL )
1136
(*t->callback)( session, t->isEnabled, t->changedByUser, t->callbackUserData );
1140
useAltSpeed( tr_session * s, struct tr_turtle_info * t, tr_bool enabled, tr_bool byUser )
1142
assert( tr_isSession( s ) );
1143
assert( t != NULL );
1144
assert( tr_isBool( enabled ) );
1145
assert( tr_isBool( byUser ) );
1147
if( t->isEnabled != enabled )
1149
t->isEnabled = enabled;
1150
t->changedByUser = byUser;
1151
tr_runInEventThread( s, altSpeedToggled, s );
1156
turtleCheckClock( tr_session * session, struct tr_turtle_info * t, tr_bool byUser )
1158
const time_t now = tr_time( );
1159
const tr_bool hit = ( t->testedAt < t->_nextChangeAt ) && ( t->_nextChangeAt <= tr_time( ));
1165
const tr_bool enabled = t->_nextChangeValue;
1167
if( t->isClockEnabled && t->_nextChangeAllowed )
1158
/* if looking at the end date, look at the next day if end time is before begin time */
1159
if( isEndTime && !isBeginTime && session->altSpeedTimeEnd < session->altSpeedTimeBegin )
1166
isDay = ((1<<day) & session->altSpeedTimeDay) != 0;
1169
useAltSpeed( session, isBeginTime, FALSE );
1169
tr_inf( "Time to turn %s turtle mode!", (enabled?"on":"off") );
1170
useAltSpeed( session, t, enabled, byUser );
1173
turtleFindNextChange( t );
1173
setAltTimer( session );
1177
/* Called after the turtle's fields are loaded from an outside source.
1178
* It initializes the implementation fields
1179
* and turns on turtle mode if the clock settings say to. */
1181
turtleBootstrap( tr_session * session, struct tr_turtle_info * turtle )
1185
turtleFindNextChange( turtle );
1187
if( turtle->isClockEnabled )
1188
isEnabled = !turtle->_nextChangeValue;
1190
isEnabled = turtle->isEnabled;
1192
useAltSpeed( session, turtle, isEnabled, FALSE );
1241
1260
assert( tr_isSession( s ) );
1242
1261
assert( tr_isDirection( d ) );
1244
return s->altSpeed[d];
1263
return s->turtle.speedLimit[d];
1248
useAltSpeedTime( tr_session * session, tr_bool enabled, tr_bool byUser )
1267
userPokedTheClock( tr_session * s, struct tr_turtle_info * t )
1250
assert( tr_isSession( session ) );
1251
assert( tr_isBool( enabled ) );
1252
assert( tr_isBool( byUser ) );
1254
if( session->altSpeedTimeEnabled != enabled )
1256
const tr_bool isAlt = isAltTime( session );
1258
session->altSpeedTimeEnabled = enabled;
1260
if( enabled && session->altSpeedEnabled != isAlt )
1261
useAltSpeed( session, isAlt, byUser );
1269
tr_dbg( "Refreshing the turtle mode clock due to user changes" );
1272
turtleFindNextChange( t );
1274
if( t->isClockEnabled && t->_nextChangeAllowed )
1275
useAltSpeed( s, t, !t->_nextChangeValue, TRUE );
1265
1279
tr_sessionUseAltSpeedTime( tr_session * s, tr_bool b )
1267
useAltSpeedTime( s, b, TRUE );
1281
struct tr_turtle_info * t = &s->turtle;
1283
assert( tr_isSession( s ) );
1284
assert( tr_isBool ( b ) );
1286
if( t->isClockEnabled != b ) {
1287
t->isClockEnabled = b;
1288
userPokedTheClock( s, t );
1730
struct port_forwarding_data
1733
struct tr_shared * shared;
1737
setPortForwardingEnabled( void * vdata )
1739
struct port_forwarding_data * data = vdata;
1740
tr_sharedTraversalEnable( data->shared, data->enabled );
1735
tr_sessionSetPortForwardingEnabled( tr_session * session,
1745
tr_sessionSetPortForwardingEnabled( tr_session * session, tr_bool enabled )
1738
assert( tr_isSession( session ) );
1740
tr_sessionLock( session );
1741
tr_sharedTraversalEnable( session->shared, enabled );
1742
tr_sessionUnlock( session );
1747
struct port_forwarding_data * d;
1748
d = tr_new0( struct port_forwarding_data, 1 );
1749
d->shared = session->shared;
1750
d->enabled = enabled;
1751
tr_runInEventThread( session, setPortForwardingEnabled, d );