From b31ee4f03c39b7efc17d046215846ef79dbb05ca Mon Sep 17 00:00:00 2001 From: Mitchell Livingston Date: Wed, 27 Dec 2006 02:57:55 +0000 Subject: [PATCH] individual download/upload speed caps accessible under options in the inspector --- macosx/Controller.m | 3 +- .../English.lproj/InfoWindow.nib/classes.nib | 6 + .../InfoWindow.nib/keyedobjects.nib | Bin 37921 -> 41159 bytes macosx/InfoWindowController.h | 7 +- macosx/InfoWindowController.m | 123 ++++++++++++++++-- macosx/Torrent.h | 14 +- macosx/Torrent.m | 77 ++++++++++- 7 files changed, 211 insertions(+), 19 deletions(-) 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 df6d5e0cd3e0285797459c42ea758b02881bf8d2..c5abe85b40317d7b44645e5a99481e022ea2e21c 100644 GIT binary patch literal 41159 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 V|JCs=JLdoC{muXT|L?Zy{|EA?UCjUh literal 37921 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

8P3$REghWD~LlsX=Oy-N;^KKXMQ`f*eCmAg7SC z$a&;%q#3!4Tt#jmw~>3u1LQIC40(yXLEa-DkLI$=pJNdA;8PgW$CB$p;v zBv&TaB-bT3CbuMOlC{a*$-T+_$%Dxw$z#bA$y3R*$qUJg$xF$r$s5Vr$$QC%$tTI@ z$ydp@$q&g-$**V|v_0Ap?TmIsd!T7(UvvPPj%J`)=m>N)Iu0eG6qJs#P!7sRMW_^2 zplVdt0-9P-JL*EcXaLPcBWM(jp>Z^c;^=sE5;_H)h8ChlXfZkuEk(=FpV7r=C0d0p zM}J3GqifL(=w@^qx&z&X?m_F(2J{fxh#p5zqNmYwXcO9uUPiB>H_NkiH*UsF%m|_7#JJlVggKz$uK3R z!St93vtka+jrp)324EltWBC|@p;!u=fPIhsfKA6{VzaRlY(BOC`w1(@DzGKkQfvjb z5?h0NQj-A9#W9P6YtQotEUBhl-cd+}|BkU>m0(*_U z!~VrSALGyPm-rj} zJ^m5@l4_l5m-;5vDb*#_J=H7KC)GbSFf}-pnHrWFnHrPIPLWdVR8ESUlBMJ+Rmz;Q er0l6cD*V6va;sKtS}=$IO*h5=?f-vM*na`-mnHWA 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;