diff --git a/Transmission.xcodeproj/project.pbxproj b/Transmission.xcodeproj/project.pbxproj
index 3e4ddf0e1..6927fe197 100644
--- a/Transmission.xcodeproj/project.pbxproj
+++ b/Transmission.xcodeproj/project.pbxproj
@@ -2207,6 +2207,7 @@
INFOPLIST_PREFIX_HEADER = "$(SRCROOT)/libtransmission/version.h";
INFOPLIST_PREPROCESS = YES;
MACOSX_DEPLOYMENT_TARGET = 10.5;
+ ONLY_ACTIVE_ARCH = YES;
OTHER_CFLAGS = "$(inherited)";
OTHER_LDFLAGS = "";
PREBINDING = NO;
diff --git a/macosx/Controller.h b/macosx/Controller.h
index 101a81f80..5f2fbc2b8 100644
--- a/macosx/Controller.h
+++ b/macosx/Controller.h
@@ -101,8 +101,6 @@ typedef enum
Badger * fBadger;
IBOutlet NSMenu * fDockMenu;
- NSTimer * fSpeedLimitTimer;
-
NSMutableArray * fAutoImportedNames;
NSTimer * fAutoImportTimer;
@@ -213,9 +211,7 @@ typedef enum
- (void) toggleSpeedLimit: (id) sender;
- (void) speedLimitChanged: (id) sender;
-- (void) autoSpeedLimitChange: (NSNotification *) notification;
-- (void) autoSpeedLimit: (NSTimer *) timer;
-- (void) setAutoSpeedLimitTimer: (BOOL) nextIsLimit;
+- (void) altSpeedToggledCallbackIsLimited: (NSNumber *) limited;
- (void) setLimitGlobalEnabled: (id) sender;
- (void) setQuickLimitGlobal: (id) sender;
diff --git a/macosx/Controller.m b/macosx/Controller.m
index 992910621..78b63aee7 100644
--- a/macosx/Controller.m
+++ b/macosx/Controller.m
@@ -143,6 +143,12 @@ typedef enum
#define TRAC_URL @"http://trac.transmissionbt.com/"
#define DONATE_URL @"http://www.transmissionbt.com/donate.php"
+static void altSpeedToggledCallback(tr_session * handle UNUSED, tr_bool active, void * controller)
+{
+ [(Controller *)controller performSelectorOnMainThread: @selector(altSpeedToggledCallbackIsLimited:)
+ withObject: [[NSNumber alloc] initWithBool: active] waitUntilDone: NO];
+}
+
static tr_rpc_callback_status rpcCallback(tr_session * handle UNUSED, tr_rpc_callback_type type, struct tr_torrent * torrentStruct, void * controller)
{
[(Controller *)controller rpcCallback: type forTorrentStruct: torrentStruct];
@@ -200,10 +206,40 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
{
fDefaults = [NSUserDefaults standardUserDefaults];
+ //checks for old version speeds of -1
+ if ([fDefaults integerForKey: @"UploadLimit"] < 0)
+ {
+ [fDefaults removeObjectForKey: @"UploadLimit"];
+ [fDefaults setBool: NO forKey: @"CheckUpload"];
+ }
+ if ([fDefaults integerForKey: @"DownloadLimit"] < 0)
+ {
+ [fDefaults removeObjectForKey: @"DownloadLimit"];
+ [fDefaults setBool: NO forKey: @"CheckDownload"];
+ }
+
tr_benc settings;
- tr_bencInitDict(&settings, 22);
+ tr_bencInitDict(&settings, 28);
tr_sessionGetDefaultSettings(&settings);
+ #warning how to work with schedule?
+ if (![fDefaults boolForKey: @"SpeedLimitAuto"])
+ tr_bencDictAddInt(&settings, TR_PREFS_KEY_ALT_SPEED_ENABLED, [fDefaults boolForKey: @"SpeedLimit"]);
+
+ tr_bencDictAddInt(&settings, TR_PREFS_KEY_ALT_SPEED_UP, [fDefaults integerForKey: @"SpeedLimitUploadLimit"]);
+ tr_bencDictAddInt(&settings, TR_PREFS_KEY_ALT_SPEED_DOWN, [fDefaults integerForKey: @"SpeedLimitDownloadLimit"]);
+
+ tr_bencDictAddInt(&settings, TR_PREFS_KEY_ALT_SPEED_TIME_ENABLED, [fDefaults boolForKey: @"SpeedLimitAuto"]);
+ tr_bencDictAddInt(&settings, TR_PREFS_KEY_ALT_SPEED_TIME_BEGIN, [PrefsController dateToTimeSum:
+ [fDefaults objectForKey: @"SpeedLimitAutoOnDate"]]);
+ tr_bencDictAddInt(&settings, TR_PREFS_KEY_ALT_SPEED_TIME_END, [PrefsController dateToTimeSum:
+ [fDefaults objectForKey: @"SpeedLimitAutoOffDate"]]);
+
+ tr_bencDictAddInt(&settings, TR_PREFS_KEY_DSPEED, [fDefaults integerForKey: @"DownloadLimit"]);
+ tr_bencDictAddInt(&settings, TR_PREFS_KEY_DSPEED_ENABLED, [fDefaults boolForKey: @"CheckDownload"]);
+ tr_bencDictAddInt(&settings, TR_PREFS_KEY_USPEED, [fDefaults integerForKey: @"UploadLimit"]);
+ tr_bencDictAddInt(&settings, TR_PREFS_KEY_USPEED_ENABLED, [fDefaults boolForKey: @"CheckUpload"]);
+
tr_bencDictAddInt(&settings, TR_PREFS_KEY_BLOCKLIST_ENABLED, [fDefaults boolForKey: @"Blocklist"]);
#warning update when changing in prefs
@@ -256,6 +292,9 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
fSoundPlaying = NO;
+ #warning needs to set before init
+ tr_sessionSetAltSpeedFunc(fLib, altSpeedToggledCallback, self);
+
tr_sessionSetRPCCallback(fLib, rpcCallback, self);
[GrowlApplicationBridge setGrowlDelegate: self];
@@ -423,9 +462,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[nc addObserver: self selector: @selector(torrentTableViewSelectionDidChange:)
name: NSOutlineViewSelectionDidChangeNotification object: fTableView];
- [nc addObserver: self selector: @selector(autoSpeedLimitChange:)
- name: @"AutoSpeedLimitChange" object: nil];
-
[nc addObserver: self selector: @selector(changeAutoImport)
name: @"AutoImportSettingChange" object: nil];
@@ -474,9 +510,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
if ([fDefaults boolForKey: @"InfoVisible"])
[self showInfo: nil];
-
- //set up the speed limit
- [self autoSpeedLimitChange: nil];
}
- (void) applicationDidFinishLaunching: (NSNotification *) notification
@@ -552,7 +585,6 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
[[NSNotificationCenter defaultCenter] removeObserver: self];
[fTimer invalidate];
- [fSpeedLimitTimer invalidate];
if (fAutoImportTimer)
{
@@ -2284,96 +2316,26 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
- (void) speedLimitChanged: (id) sender
{
- [fPrefsController applySpeedSettings: nil];
+ tr_sessionUseAltSpeed(fLib, [fDefaults boolForKey: @"SpeedLimit"]);
+ [self updateSpeedFieldsToolTips];
}
-- (void) autoSpeedLimitChange: (NSNotification *) notification
+//limited has been retained
+- (void) altSpeedToggledCallbackIsLimited: (NSNumber *) limited
{
- //clear timer here in case it's not being reset
- [fSpeedLimitTimer invalidate];
- fSpeedLimitTimer = nil;
-
- if (![fDefaults boolForKey: @"SpeedLimitAuto"])
- return;
-
- NSCalendar * calendar = [NSCalendar currentCalendar];
- NSDateComponents * nowComponents = [calendar components: NSHourCalendarUnit | NSMinuteCalendarUnit fromDate: [NSDate date]],
- * onComponents = [calendar components: NSHourCalendarUnit | NSMinuteCalendarUnit
- fromDate: [fDefaults objectForKey: @"SpeedLimitAutoOnDate"]],
- * offComponents = [calendar components: NSHourCalendarUnit | NSMinuteCalendarUnit
- fromDate: [fDefaults objectForKey: @"SpeedLimitAutoOffDate"]];
-
- //check if should be on if within range
- NSInteger onTime = [onComponents hour] * 60 + [onComponents minute],
- offTime = [offComponents hour] * 60 + [offComponents minute],
- nowTime = [nowComponents hour] * 60 + [nowComponents minute];
-
- BOOL shouldBeOn = NO;
- if (onTime < offTime)
- shouldBeOn = onTime <= nowTime && nowTime < offTime;
- else if (onTime > offTime)
- shouldBeOn = onTime <= nowTime || nowTime < offTime;
- else;
-
- if ([fDefaults boolForKey: @"SpeedLimit"] != shouldBeOn)
- [self toggleSpeedLimit: nil];
-
- //no need to set the timer if both times are equal
- if (onTime == offTime)
- return;
-
- [self setAutoSpeedLimitTimer: !shouldBeOn];
-}
+ const BOOL isLimited = [limited boolValue];
-//only called by fSpeedLimitTimer
-- (void) autoSpeedLimit: (NSTimer *) timer
-{
- BOOL shouldLimit = [[timer userInfo] boolValue];
+ [fDefaults setBool: isLimited forKey: @"SpeedLimit"];
+ [self updateSpeedFieldsToolTips];
- if ([fDefaults boolForKey: @"SpeedLimit"] != shouldLimit)
- {
- [self toggleSpeedLimit: nil];
-
- [GrowlApplicationBridge notifyWithTitle: [fDefaults boolForKey: @"SpeedLimit"]
- ? NSLocalizedString(@"Speed Limit Auto Enabled", "Growl notification title")
- : NSLocalizedString(@"Speed Limit Auto Disabled", "Growl notification title")
- description: NSLocalizedString(@"Bandwidth settings changed", "Growl notification description")
- notificationName: GROWL_AUTO_SPEED_LIMIT iconData: nil priority: 0 isSticky: NO clickContext: nil];
- }
+ #warning don't show on startup or on manual changed
+ [GrowlApplicationBridge notifyWithTitle: isLimited
+ ? NSLocalizedString(@"Speed Limit Auto Enabled", "Growl notification title")
+ : NSLocalizedString(@"Speed Limit Auto Disabled", "Growl notification title")
+ description: NSLocalizedString(@"Bandwidth settings changed", "Growl notification description")
+ notificationName: GROWL_AUTO_SPEED_LIMIT iconData: nil priority: 0 isSticky: NO clickContext: nil];
- [self setAutoSpeedLimitTimer: !shouldLimit];
-}
-
-- (void) setAutoSpeedLimitTimer: (BOOL) nextIsLimit
-{
- NSDate * timerDate = [fDefaults objectForKey: nextIsLimit ? @"SpeedLimitAutoOnDate" : @"SpeedLimitAutoOffDate"];
-
- //create date with combination of the current date and the date to go off
- NSCalendar * calendar = [NSCalendar currentCalendar];
- NSDateComponents * nowComponents = [calendar components: NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit
- | NSHourCalendarUnit | NSMinuteCalendarUnit fromDate: [NSDate date]],
- * timerComponents = [calendar components: NSHourCalendarUnit | NSMinuteCalendarUnit fromDate: timerDate];
-
- //check if should be the next day
- NSInteger nowTime = [nowComponents hour] * 60 + [nowComponents minute],
- timerTime = [timerComponents hour] * 60 + [timerComponents minute];
- if (timerTime < nowTime)
- [nowComponents setDay: [nowComponents day] + 1]; //properly goes to next month when appropriate
-
- [nowComponents setHour: [timerComponents hour]];
- [nowComponents setMinute: [timerComponents minute]];
- [nowComponents setSecond: 0];
-
- NSDate * dateToUse = [calendar dateFromComponents: nowComponents];
-
- fSpeedLimitTimer = [[NSTimer alloc] initWithFireDate: dateToUse interval: 0 target: self selector: @selector(autoSpeedLimit:)
- userInfo: [NSNumber numberWithBool: nextIsLimit] repeats: NO];
-
- NSRunLoop * loop = [NSRunLoop mainRunLoop];
- [loop addTimer: fSpeedLimitTimer forMode: NSDefaultRunLoopMode];
- [loop addTimer: fSpeedLimitTimer forMode: NSModalPanelRunLoopMode];
- [loop addTimer: fSpeedLimitTimer forMode: NSEventTrackingRunLoopMode];
- [fSpeedLimitTimer release];
+ [limited release];
}
- (void) setLimitGlobalEnabled: (id) sender
@@ -3774,7 +3736,8 @@ static void sleepCallback(void * controller, io_service_t y, natural_t messageTy
case kIOMessageSystemHasPoweredOn:
//resume sleeping transfers after we wake up
[fTorrents makeObjectsPerformSelector: @selector(wakeUp)];
- [self autoSpeedLimitChange: nil];
+ #warning check speed limit timer?
+ //[self autoSpeedLimitChange: nil];
break;
}
}
diff --git a/macosx/PrefsController.h b/macosx/PrefsController.h
index 12c694482..7cd4ea71f 100644
--- a/macosx/PrefsController.h
+++ b/macosx/PrefsController.h
@@ -107,12 +107,15 @@
- (void) setRatioStop: (id) sender;
- (void) applySpeedSettings: (id) sender;
+- (void) applyAltSpeedSettings;
- (void) updateLimitFields;
- (void) setGlobalLimit: (id) sender;
- (void) setSpeedLimit: (id) sender;
- (void) setAutoSpeedLimit: (id) sender;
+- (void) setAutoSpeedLimitTime: (id) sender;
++ (NSInteger) dateToTimeSum: (NSDate *) date;
- (void) setAutoImport: (id) sender;
- (void) importFolderSheetShow: (id) sender;
diff --git a/macosx/PrefsController.m b/macosx/PrefsController.m
index 1f6a7aa66..91cf9375e 100644
--- a/macosx/PrefsController.m
+++ b/macosx/PrefsController.m
@@ -90,18 +90,6 @@ tr_session * fHandle;
{
fDefaults = [NSUserDefaults standardUserDefaults];
- //checks for old version speeds of -1
- if ([fDefaults integerForKey: @"UploadLimit"] < 0)
- {
- [fDefaults removeObjectForKey: @"UploadLimit"];
- [fDefaults setBool: NO forKey: @"CheckUpload"];
- }
- if ([fDefaults integerForKey: @"DownloadLimit"] < 0)
- {
- [fDefaults removeObjectForKey: @"DownloadLimit"];
- [fDefaults setBool: NO forKey: @"CheckDownload"];
- }
-
//check for old version download location (before 1.1)
NSString * choice;
if ((choice = [fDefaults stringForKey: @"DownloadChoice"]))
@@ -127,9 +115,6 @@ tr_session * fHandle;
//set encryption
[self setEncryptionMode: nil];
- //actually set bandwidth limits
- [self applySpeedSettings: nil];
-
//set proxy type
[self updateProxyType];
[self updateProxyPassword];
@@ -547,23 +532,20 @@ tr_session * fHandle;
- (void) applySpeedSettings: (id) sender
{
- if ([fDefaults boolForKey: @"SpeedLimit"])
- {
- tr_sessionSetSpeedLimitEnabled(fHandle, TR_UP, 1);
- tr_sessionSetSpeedLimit(fHandle, TR_UP, [fDefaults integerForKey: @"SpeedLimitUploadLimit"]);
-
- tr_sessionSetSpeedLimitEnabled(fHandle, TR_DOWN, 1);
- tr_sessionSetSpeedLimit(fHandle, TR_DOWN, [fDefaults integerForKey: @"SpeedLimitDownloadLimit"]);
- }
- else
- {
- tr_sessionSetSpeedLimitEnabled(fHandle, TR_UP, [fDefaults boolForKey: @"CheckUpload"]);
- tr_sessionSetSpeedLimit(fHandle, TR_UP, [fDefaults integerForKey: @"UploadLimit"]);
-
- tr_sessionSetSpeedLimitEnabled(fHandle, TR_DOWN, [fDefaults boolForKey: @"CheckDownload"]);
- tr_sessionSetSpeedLimit(fHandle, TR_DOWN, [fDefaults integerForKey: @"DownloadLimit"]);
- }
+ tr_sessionLimitSpeed(fHandle, TR_UP, [fDefaults boolForKey: @"CheckUpload"]);
+ tr_sessionSetSpeedLimit(fHandle, TR_UP, [fDefaults integerForKey: @"UploadLimit"]);
+ tr_sessionLimitSpeed(fHandle, TR_DOWN, [fDefaults boolForKey: @"CheckDownload"]);
+ tr_sessionSetSpeedLimit(fHandle, TR_DOWN, [fDefaults integerForKey: @"DownloadLimit"]);
+
+ [[NSNotificationCenter defaultCenter] postNotificationName: @"SpeedLimitUpdate" object: nil];
+}
+
+- (void) applyAltSpeedSettings
+{
+ tr_sessionSetAltSpeed(fHandle, TR_UP, [fDefaults integerForKey: @"SpeedLimitUploadLimit"]);
+ tr_sessionSetAltSpeed(fHandle, TR_DOWN, [fDefaults integerForKey: @"SpeedLimitDownloadLimit"]);
+
[[NSNotificationCenter defaultCenter] postNotificationName: @"SpeedLimitUpdate" object: nil];
}
@@ -608,12 +590,25 @@ tr_session * fHandle;
{
[fDefaults setInteger: [sender intValue] forKey: sender == fSpeedLimitUploadField
? @"SpeedLimitUploadLimit" : @"SpeedLimitDownloadLimit"];
- [self applySpeedSettings: self];
+ [self applyAltSpeedSettings];
}
- (void) setAutoSpeedLimit: (id) sender
{
- [[NSNotificationCenter defaultCenter] postNotificationName: @"AutoSpeedLimitChange" object: self];
+ tr_sessionUseAltSpeedTime(fHandle, [fDefaults boolForKey: @"SpeedLimitAuto"]);
+}
+
+- (void) setAutoSpeedLimitTime: (id) sender
+{
+ tr_sessionSetAltSpeedBegin(fHandle, [PrefsController dateToTimeSum: [fDefaults objectForKey: @"SpeedLimitAutoOnDate"]]);
+ tr_sessionSetAltSpeedEnd(fHandle, [PrefsController dateToTimeSum: [fDefaults objectForKey: @"SpeedLimitAutoOffDate"]]);
+}
+
++ (NSInteger) dateToTimeSum: (NSDate *) date
+{
+ NSCalendar * calendar = [NSCalendar currentCalendar];
+ NSDateComponents * components = [calendar components: NSHourCalendarUnit | NSMinuteCalendarUnit fromDate: date];
+ return [components hour] * 60 + [components minute];
}
- (BOOL) control: (NSControl *) control textShouldBeginEditing: (NSText *) fieldEditor
@@ -1048,6 +1043,7 @@ tr_session * fHandle;
inBook: [[NSBundle mainBundle] objectForInfoDictionaryKey: @"CFBundleHelpBookName"]];
}
+#warning probably needs to be updated
- (void) rpcUpdatePrefs
{
//encryption
@@ -1079,14 +1075,14 @@ tr_session * fHandle;
[self updatePortStatus];
//speed limit - down
- BOOL downLimitEnabled = tr_sessionIsSpeedLimitEnabled(fHandle, TR_DOWN);
+ BOOL downLimitEnabled = tr_sessionIsSpeedLimited(fHandle, TR_DOWN);
[fDefaults setBool: downLimitEnabled forKey: @"CheckDownload"];
int downLimit = tr_sessionGetSpeedLimit(fHandle, TR_DOWN);
[fDefaults setInteger: downLimit forKey: @"DownloadLimit"];
//speed limit - up
- BOOL upLimitEnabled = tr_sessionIsSpeedLimitEnabled(fHandle, TR_UP);
+ BOOL upLimitEnabled = tr_sessionIsSpeedLimited(fHandle, TR_UP);
[fDefaults setBool: upLimitEnabled forKey: @"CheckUpload"];
int upLimit = tr_sessionGetSpeedLimit(fHandle, TR_UP);
diff --git a/macosx/Torrent.m b/macosx/Torrent.m
index f77ab6ad7..b304bb3a0 100644
--- a/macosx/Torrent.m
+++ b/macosx/Torrent.m
@@ -394,7 +394,7 @@ int trashDataFile(const char * filename)
- (BOOL) usesSpeedLimit: (BOOL) upload
{
- return tr_torrentIsUsingSpeedLimit(fHandle, upload ? TR_UP : TR_DOWN);
+ return tr_torrentUsesSpeedLimit(fHandle, upload ? TR_UP : TR_DOWN);
}
- (void) setUseSpeedLimit: (BOOL) use upload: (BOOL) upload
@@ -414,16 +414,12 @@ int trashDataFile(const char * filename)
- (BOOL) usesGlobalSpeedLimit
{
- const BOOL up = tr_torrentIsUsingGlobalSpeedLimit(fHandle, TR_UP);
- const BOOL down = tr_torrentIsUsingGlobalSpeedLimit(fHandle, TR_DOWN);
- NSAssert(up == down, @"upload and download global limit settings should have the same value");
- return up;
+ return tr_torrentUsesSessionLimits(fHandle);
}
- (void) setUseGlobalSpeedLimit: (BOOL) use
{
- tr_torrentUseGlobalSpeedLimit(fHandle, TR_UP, use);
- tr_torrentUseGlobalSpeedLimit(fHandle, TR_DOWN, use);
+ tr_torrentUseSessionLimits(fHandle, use);
}
- (void) setMaxPeerConnect: (uint16_t) count
diff --git a/macosx/en.lproj/PrefsWindow.xib b/macosx/en.lproj/PrefsWindow.xib
index edc64f781..58c39f02b 100644
--- a/macosx/en.lproj/PrefsWindow.xib
+++ b/macosx/en.lproj/PrefsWindow.xib
@@ -3068,6 +3068,7 @@ zcfN584IzijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE0
{{1, 1}, {141, 169}}
+
4
@@ -3095,6 +3096,7 @@ zcfN584IzijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE0
{{20, 49}, {143, 171}}
+
530
@@ -5363,6 +5365,7 @@ AAABAAAAAQ
{{1, 1}, {291, 76}}
+
4
@@ -5389,6 +5392,7 @@ AAABAAAAAQ
{{103, 96}, {308, 78}}
+
18
@@ -6129,22 +6133,6 @@ AAABAAAAAQ
531
-
-
-
- setAutoSpeedLimit:
-
-
-
- 533
-
value: values.SpeedLimitAutoOnDate
@@ -8707,6 +8695,22 @@ AAABAAAAAQ
1900
+
+
+ setAutoSpeedLimitTime:
+
+
+
+ 1902
+
+
+
+ setAutoSpeedLimitTime:
+
+
+
+ 1903
+
@@ -12495,7 +12499,7 @@ AAABAAAAAQ
- 1901
+ 1903
@@ -12650,6 +12654,7 @@ AAABAAAAAQ
setAutoImport:
setAutoSize:
setAutoSpeedLimit:
+ setAutoSpeedLimitTime:
setAutoUpdateToBeta:
setBadge:
setBlocklistAutoUpdate:
@@ -12736,6 +12741,7 @@ AAABAAAAAQ
id
id
id
+ id