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: - - - - 532 - - - - 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