diff --git a/macosx/Controller.m b/macosx/Controller.m index 5a4ef08a7..01356b774 100644 --- a/macosx/Controller.m +++ b/macosx/Controller.m @@ -1154,7 +1154,7 @@ static void sleepCallBack(void * controller, io_service_t y, natural_t messageTy { Torrent * torrent = [notification object]; - [fInfoController updateInfoSettings]; + [fInfoController updateInfoStats]; [self applyFilter: nil]; [self checkToStartWaiting: torrent]; @@ -1648,7 +1648,6 @@ static void sleepCallBack(void * controller, io_service_t y, natural_t messageTy { [self applyFilter: nil]; [fInfoController updateInfoStats]; - [fInfoController updateInfoSettings]; if ([fDefaults boolForKey: @"PlaySeedingSound"]) { diff --git a/macosx/English.lproj/InfoWindow.nib/classes.nib b/macosx/English.lproj/InfoWindow.nib/classes.nib index 7833cd1b8..9399d8d0c 100644 --- a/macosx/English.lproj/InfoWindow.nib/classes.nib +++ b/macosx/English.lproj/InfoWindow.nib/classes.nib @@ -12,8 +12,10 @@ revealDataFile = id; revealFile = id; revealTorrentFile = id; + setLimitCheck = id; setRatioCheck = id; setRatioLimit = id; + setSpeedLimit = id; }; CLASS = InfoWindowController; LANGUAGE = ObjC; @@ -25,6 +27,8 @@ fDataLocationField = NSTextField; fDateCreatedField = NSTextField; fDateStartedField = NSTextField; + fDownloadLimitCheck = NSButton; + fDownloadLimitField = NSTextField; fDownloadedTotalField = NSTextField; fDownloadedValidField = NSTextField; fDownloadingFromField = NSTextField; @@ -51,6 +55,8 @@ fTabView = NSTabView; fTorrentLocationField = NSTextField; fTrackerField = NSTextField; + fUploadLimitCheck = NSButton; + fUploadLimitField = NSTextField; fUploadedTotalField = NSTextField; fUploadingToField = NSTextField; }; diff --git a/macosx/English.lproj/InfoWindow.nib/keyedobjects.nib b/macosx/English.lproj/InfoWindow.nib/keyedobjects.nib index df6d5e0cd..c5abe85b4 100644 Binary files a/macosx/English.lproj/InfoWindow.nib/keyedobjects.nib and b/macosx/English.lproj/InfoWindow.nib/keyedobjects.nib differ diff --git a/macosx/InfoWindowController.h b/macosx/InfoWindowController.h index e83d8337a..6d5b8eff3 100644 --- a/macosx/InfoWindowController.h +++ b/macosx/InfoWindowController.h @@ -56,13 +56,13 @@ IBOutlet NSTableView * fFileTable; IBOutlet NSTextField * fFileTableStatusField; + IBOutlet NSButton * fUploadLimitCheck, * fDownloadLimitCheck; IBOutlet NSMatrix * fRatioMatrix; - IBOutlet NSTextField * fRatioLimitField; + IBOutlet NSTextField * fUploadLimitField, * fDownloadLimitField, * fRatioLimitField; } - (void) updateInfoForTorrents: (NSArray *) torrents; - (void) updateInfoStats; -- (void) updateInfoSettings; - (void) setNextTab; - (void) setPreviousTab; @@ -71,6 +71,9 @@ - (void) revealDataFile: (id) sender; - (void) revealFile: (id) sender; +- (void) setLimitCheck: (id) sender; +- (void) setSpeedLimit: (id) sender; + - (void) setRatioCheck: (id) sender; - (void) setRatioLimit: (id) sender; diff --git a/macosx/InfoWindowController.m b/macosx/InfoWindowController.m index c9d8de9db..ebf371cb6 100644 --- a/macosx/InfoWindowController.m +++ b/macosx/InfoWindowController.m @@ -43,7 +43,7 @@ #define TAB_ACTIVITY_HEIGHT 170.0 #define TAB_PEERS_HEIGHT 268.0 #define TAB_FILES_HEIGHT 268.0 -#define TAB_OPTIONS_HEIGHT 83.0 +#define TAB_OPTIONS_HEIGHT 147.0 #define INVALID -99 @@ -52,6 +52,7 @@ - (void) updateInfoGeneral; - (void) updateInfoActivity; - (void) updateInfoPeers; +- (void) updateInfoSettings; - (void) setWindowForTab: (NSString *) identifier animate: (BOOL) animate; - (NSArray *) peerSortDescriptors; @@ -293,9 +294,14 @@ return; Torrent * torrent = [fTorrents objectAtIndex: 0]; + NSString * tracker = [[torrent trackerAddress] stringByAppendingString: [torrent trackerAddressAnnounce]]; [fTrackerField setStringValue: tracker]; [fTrackerField setToolTip: tracker]; + + NSString * location = [torrent dataLocation]; + [fDataLocationField setStringValue: [location stringByAbbreviatingWithTildeInPath]]; + [fDataLocationField setToolTip: location]; } - (void) updateInfoActivity @@ -374,15 +380,56 @@ { Torrent * torrent; - if (numberSelected == 1) + //set bandwidth limits + NSEnumerator * enumerator = [fTorrents objectEnumerator]; + torrent = [enumerator nextObject]; //first torrent + + int checkUpload = [torrent checkUpload] ? 1 : 0, + checkDownload = [torrent checkDownload] ? 1 : 0, + uploadLimit = [torrent uploadLimit], + downloadLimit = [torrent downloadLimit]; + + while ((checkUpload != INVALID || uploadLimit != INVALID + || checkDownload != INVALID || downloadLimit != INVALID) + && (torrent = [enumerator nextObject])) { - torrent = [fTorrents objectAtIndex: 0]; - [fDataLocationField setStringValue: [[torrent dataLocation] stringByAbbreviatingWithTildeInPath]]; - [fDataLocationField setToolTip: [torrent dataLocation]]; + if (checkUpload != INVALID && checkUpload != ([torrent checkUpload] ? 1 : 0)) + checkUpload = INVALID; + + if (uploadLimit != INVALID && uploadLimit != [torrent uploadLimit]) + uploadLimit = INVALID; + + if (checkDownload != INVALID && checkDownload != ([torrent checkDownload] ? 1 : 0)) + checkDownload = INVALID; + + if (downloadLimit != INVALID && downloadLimit != [torrent downloadLimit]) + downloadLimit = INVALID; } + [fUploadLimitCheck setEnabled: YES]; + [fDownloadLimitCheck setEnabled: YES]; + + [fUploadLimitField setEnabled: checkUpload != 0]; + [fDownloadLimitField setEnabled: checkDownload != 0]; + + [fUploadLimitCheck setState: checkUpload == INVALID ? NSMixedState + : (checkUpload == 1 ? NSOnState : NSOffState)]; + + if (uploadLimit != INVALID) + [fUploadLimitField setIntValue: uploadLimit]; + else + [fUploadLimitField setStringValue: @""]; + + [fDownloadLimitCheck setState: checkDownload == INVALID ? NSMixedState + : (checkDownload == 1 ? NSOnState : NSOffState)]; + + if (downloadLimit != INVALID) + [fDownloadLimitField setIntValue: downloadLimit]; + else + [fDownloadLimitField setStringValue: @""]; + //set ratio settings - NSEnumerator * enumerator = [fTorrents objectEnumerator]; + enumerator = [fTorrents objectEnumerator]; torrent = [enumerator nextObject]; //first torrent int ratioSetting = [torrent stopRatioSetting]; @@ -429,6 +476,16 @@ [fRatioLimitField setEnabled: NO]; [fRatioLimitField setStringValue: @""]; + + [fUploadLimitCheck setState: NSOffState]; + [fUploadLimitCheck setEnabled: NO]; + [fUploadLimitField setEnabled: NO]; + [fUploadLimitField setStringValue: @""]; + + [fDownloadLimitCheck setState: NSOffState]; + [fDownloadLimitCheck setEnabled: NO]; + [fDownloadLimitField setEnabled: NO]; + [fDownloadLimitField setStringValue: @""]; } [self updateInfoStats]; @@ -470,9 +527,7 @@ [fPiecesView updateView: YES]; } else if ([identifier isEqualToString: TAB_PEERS_IDENT]) - { height = TAB_PEERS_HEIGHT; - } else if ([identifier isEqualToString: TAB_FILES_IDENT]) height = TAB_FILES_HEIGHT; else if ([identifier isEqualToString: TAB_OPTIONS_IDENT]) @@ -636,6 +691,58 @@ inFileViewerRootedAtPath: nil]; } +- (void) setLimitCheck: (id) sender +{ + BOOL upload = sender == fUploadLimitCheck, + limit = [sender state] != NSOffState; + + if (limit) + [sender setState: NSOnState]; + + Torrent * torrent; + NSEnumerator * enumerator = [fTorrents objectEnumerator]; + while ((torrent = [enumerator nextObject])) + upload ? [torrent setLimitUpload: limit] : [torrent setLimitDownload: limit]; + + NSTextField * field = upload ? fUploadLimitField : fDownloadLimitField; + + if (![[field stringValue] isEqualToString: @""]) + [self setSpeedLimit: field]; + + [field setEnabled: limit]; +} + +- (void) setSpeedLimit: (id) sender +{ + BOOL upload = sender == fUploadLimitField; + + Torrent * torrent; + NSEnumerator * enumerator = [fTorrents objectEnumerator]; + + int limit = [sender intValue]; + if (![[sender stringValue] isEqualToString: [NSString stringWithFormat: @"%i", limit]] || limit < 0) + { + NSBeep(); + + torrent = [enumerator nextObject]; //use first torrent + + limit = upload ? [torrent uploadLimit] : [torrent downloadLimit]; + while ((torrent = [enumerator nextObject])) + if (limit != upload ? [torrent uploadLimit] : [torrent downloadLimit]) + { + [sender setStringValue: @""]; + return; + } + + [sender setIntValue: limit]; + } + else + { + while ((torrent = [enumerator nextObject])) + upload ? [torrent setUploadLimit: limit] : [torrent setDownloadLimit: limit]; + } +} + - (void) setRatioCheck: (id) sender { int ratioSetting, tag = [[fRatioMatrix selectedCell] tag]; diff --git a/macosx/Torrent.h b/macosx/Torrent.h index 8221e8fdf..c86651a06 100644 --- a/macosx/Torrent.h +++ b/macosx/Torrent.h @@ -50,9 +50,10 @@ NSImage * fIcon, * fIconFlipped, * fIconSmall; NSMutableString * fNameString, * fProgressString, * fStatusString, * fShortStatusString, * fRemainingTimeString; - int fStopRatioSetting; + + int fUploadLimit, fDownloadLimit, fStopRatioSetting; float fRatioLimit; - BOOL fFinishedSeeding, fWaitToStart, fError; + BOOL fCheckUpload, fCheckDownload, fFinishedSeeding, fWaitToStart, fError; int fOrderValue; @@ -89,6 +90,15 @@ - (float) ratioLimit; - (void) setRatioLimit: (float) limit; +- (void) setLimitUpload: (BOOL) limit; +- (void) setUploadLimit: (int) limit; +- (void) setLimitDownload: (BOOL) limit; +- (void) setDownloadLimit: (int) limit; +- (BOOL) checkUpload; +- (int) uploadLimit; +- (BOOL) checkDownload; +- (int) downloadLimit; + - (void) setWaitToStart: (BOOL) wait; - (BOOL) waitingToStart; diff --git a/macosx/Torrent.m b/macosx/Torrent.m index 40be873ec..09b28240b 100644 --- a/macosx/Torrent.m +++ b/macosx/Torrent.m @@ -35,8 +35,10 @@ - (id) initWithHash: (NSString *) hashString path: (NSString *) path lib: (tr_handle_t *) lib publicTorrent: (NSNumber *) publicTorrent date: (NSDate *) date stopRatioSetting: (NSNumber *) stopRatioSetting - ratioLimit: (NSNumber *) ratioLimit waitToStart: (NSNumber *) waitToStart - orderValue: (NSNumber *) orderValue; + ratioLimit: (NSNumber *) ratioLimit + checkUpload: (NSNumber *) checkUpload uploadLimit: (NSNumber *) uploadLimit + checkDownload: (NSNumber *) checkDownload downloadLimit: (NSNumber *) downloadLimit + waitToStart: (NSNumber *) waitToStart orderValue: (NSNumber *) orderValue; - (NSImage *) advancedBar; @@ -62,7 +64,10 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 { self = [self initWithHash: nil path: path lib: lib publicTorrent: delete ? [NSNumber numberWithBool: NO] : nil - date: nil stopRatioSetting: nil ratioLimit: nil waitToStart: nil orderValue: nil]; + date: nil stopRatioSetting: nil ratioLimit: nil + checkUpload: nil uploadLimit: nil + checkDownload: nil downloadLimit: nil + waitToStart: nil orderValue: nil]; if (self) { @@ -83,6 +88,10 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 date: [history objectForKey: @"Date"] stopRatioSetting: [history objectForKey: @"StopRatioSetting"] ratioLimit: [history objectForKey: @"RatioLimit"] + checkUpload: [history objectForKey: @"CheckUpload"] + uploadLimit: [history objectForKey: @"UploadLimit"] + checkDownload: [history objectForKey: @"CheckDownload"] + downloadLimit: [history objectForKey: @"DownloadLimit"] waitToStart: [history objectForKey: @"WaitToStart"] orderValue: [history objectForKey: @"OrderValue"]]; @@ -132,6 +141,10 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 [self date], @"Date", [NSNumber numberWithInt: fStopRatioSetting], @"StopRatioSetting", [NSNumber numberWithFloat: fRatioLimit], @"RatioLimit", + [NSNumber numberWithBool: fCheckUpload], @"CheckUpload", + [NSNumber numberWithInt: fUploadLimit], @"UploadLimit", + [NSNumber numberWithBool: fCheckDownload], @"CheckDownload", + [NSNumber numberWithInt: fDownloadLimit], @"DownloadLimit", [NSNumber numberWithBool: fWaitToStart], @"WaitToStart", [self orderValue], @"OrderValue", nil]; @@ -506,6 +519,50 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 fRatioLimit = limit; } +- (void) setLimitUpload: (BOOL) limit +{ + fCheckUpload = limit; + tr_setUploadLimit(fHandle, fCheckUpload ? fUploadLimit : -1); +} + +- (void) setUploadLimit: (int) limit +{ + fUploadLimit = limit; + tr_setUploadLimit(fHandle, fCheckUpload ? fUploadLimit : -1); +} + +- (void) setLimitDownload: (BOOL) limit +{ + fCheckDownload = limit; + tr_setDownloadLimit(fHandle, fCheckDownload ? fDownloadLimit : -1); +} + +- (void) setDownloadLimit: (int) limit +{ + fDownloadLimit = limit; + tr_setDownloadLimit(fHandle, fCheckDownload ? fDownloadLimit : -1); +} + +- (BOOL) checkUpload +{ + return fCheckUpload; +} + +- (int) uploadLimit +{ + return fUploadLimit; +} + +- (BOOL) checkDownload +{ + return fCheckDownload; +} + +- (int) downloadLimit +{ + return fDownloadLimit; +} + - (void) setWaitToStart: (BOOL) wait { fWaitToStart = wait; @@ -1037,8 +1094,10 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 - (id) initWithHash: (NSString *) hashString path: (NSString *) path lib: (tr_handle_t *) lib publicTorrent: (NSNumber *) publicTorrent date: (NSDate *) date stopRatioSetting: (NSNumber *) stopRatioSetting - ratioLimit: (NSNumber *) ratioLimit waitToStart: (NSNumber *) waitToStart - orderValue: (NSNumber *) orderValue + ratioLimit: (NSNumber *) ratioLimit + checkUpload: (NSNumber *) checkUpload uploadLimit: (NSNumber *) uploadLimit + checkDownload: (NSNumber *) checkDownload downloadLimit: (NSNumber *) downloadLimit + waitToStart: (NSNumber *) waitToStart orderValue: (NSNumber *) orderValue { if (!(self = [super init])) return nil; @@ -1071,6 +1130,14 @@ static uint32_t kRed = BE(0xFF6450FF), //255, 100, 80 fRatioLimit = ratioLimit ? [ratioLimit floatValue] : [fDefaults floatForKey: @"RatioLimit"]; fFinishedSeeding = NO; + fCheckUpload = checkUpload && [checkUpload boolValue]; + fUploadLimit = uploadLimit ? [uploadLimit intValue] : 10; + tr_setUploadLimit(fHandle, fCheckUpload ? fUploadLimit : -1); + + fCheckDownload = checkDownload && [checkDownload boolValue]; + fDownloadLimit = downloadLimit ? [downloadLimit intValue] : 10; + tr_setDownloadLimit(fHandle, fCheckDownload ? fDownloadLimit : -1); + fWaitToStart = waitToStart ? [waitToStart boolValue] : [fDefaults boolForKey: @"AutoStartDownload"]; fOrderValue = orderValue ? [orderValue intValue] : tr_torrentCount(fLib) - 1; fError = NO;