From a4520742e571ec131ed9b1e6a2c406509d466640 Mon Sep 17 00:00:00 2001 From: Mitchell Livingston Date: Mon, 2 Jun 2008 19:42:14 +0000 Subject: [PATCH] for now don't allow modification of non-user added trackers --- macosx/InfoWindowController.m | 17 ++++-- macosx/Torrent.h | 3 +- macosx/Torrent.m | 112 ++++++++++++++++++---------------- 3 files changed, 74 insertions(+), 58 deletions(-) diff --git a/macosx/InfoWindowController.m b/macosx/InfoWindowController.m index 28d28e4b0..1289fb304 100644 --- a/macosx/InfoWindowController.m +++ b/macosx/InfoWindowController.m @@ -933,7 +933,7 @@ typedef enum [fTrackers replaceObjectAtIndex: row withObject: object]; Torrent * torrent= [fTorrents objectAtIndex: 0]; - if (![torrent updateAllTrackers: fTrackers forAdd: YES]) + if (![torrent updateAllTrackersForAdd: fTrackers]) NSBeep(); //reset table with either new or old value @@ -959,7 +959,17 @@ typedef enum - (BOOL) tableView: (NSTableView *) tableView shouldEditTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row { - return ![[fTrackers objectAtIndex: row] isKindOfClass: [NSNumber class]]; + if (tableView != fTrackerTable) + return NO; + + //only allow modification of custom-added trackers + if ([[fTrackers objectAtIndex: row] isKindOfClass: [NSNumber class]] || ![[fTorrents objectAtIndex: 0] hasAddedTrackers]) + return NO; + + NSUInteger i; + for (i = row-1; ![[fTrackers objectAtIndex: i] isKindOfClass: [NSNumber class]]; i--); + + return [[fTrackers objectAtIndex: i] intValue] == 0; } - (BOOL) shouldQuickLookFileView @@ -1500,7 +1510,6 @@ typedef enum //determine if removing trackers built into the torrent if (numberBuiltIn > 0 && [[NSUserDefaults standardUserDefaults] boolForKey: @"WarningRemoveBuiltInTracker"]) { - #warning pluralize? NSAlert * alert = [[NSAlert alloc] init]; if (numberBuiltIn > 1) @@ -1539,7 +1548,7 @@ typedef enum [fTrackers removeObjectsAtIndexes: indexes]; - if (![torrent updateAllTrackers: fTrackers forAdd: NO]) + if (![torrent updateAllTrackersForRemove: fTrackers]) NSBeep(); else [fTrackerTable deselectAll: self]; diff --git a/macosx/Torrent.h b/macosx/Torrent.h index 1b82bc5ea..d9a9a5397 100644 --- a/macosx/Torrent.h +++ b/macosx/Torrent.h @@ -151,7 +151,8 @@ typedef enum - (NSString *) scrapeResponse; - (NSMutableArray *) allTrackers: (BOOL) separators; -- (BOOL) updateAllTrackers: (NSMutableArray *) trackers forAdd: (BOOL) add; +- (BOOL) updateAllTrackersForAdd: (NSMutableArray *) trackers; +- (BOOL) updateAllTrackersForRemove: (NSMutableArray *) trackers; - (BOOL) hasAddedTrackers; - (NSString *) comment; diff --git a/macosx/Torrent.m b/macosx/Torrent.m index 52173ad37..d89518b99 100644 --- a/macosx/Torrent.m +++ b/macosx/Torrent.m @@ -54,6 +54,8 @@ - (NSString *) etaString: (int) eta; +- (BOOL) updateAllTrackers: (NSMutableArray *) trackers; + - (void) trashFile: (NSString *) path; - (void) setTimeMachineExclude: (BOOL) exclude forPath: (NSString *) path; @@ -803,66 +805,37 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * return allTrackers; } -- (BOOL) updateAllTrackers: (NSMutableArray *) trackers forAdd: (BOOL) add +- (BOOL) updateAllTrackersForAdd: (NSMutableArray *) trackers { - #warning break up into methods - if (add) + //find added tracker at end of first tier + int i; + for (i = 1; i < [trackers count]; i++) + if ([[trackers objectAtIndex: i] isKindOfClass: [NSNumber class]]) + break; + i--; + + NSString * tracker = [trackers objectAtIndex: i]; + if ([tracker rangeOfString: @"://"].location == NSNotFound) { - //find added tracker at end of first tier - int i; - for (i = 1; i < [trackers count]; i++) - if ([[trackers objectAtIndex: i] isKindOfClass: [NSNumber class]]) - break; - i--; - - NSString * tracker = [trackers objectAtIndex: i]; - if ([tracker rangeOfString: @"://"].location == NSNotFound) - { - tracker = [@"http://" stringByAppendingString: tracker]; - [trackers replaceObjectAtIndex: i withObject: tracker]; - } - - if (!tr_httpIsValidURL([tracker UTF8String])) - return NO; - - fAddedTrackers = YES; - } - else - { - //check if any user-added groups - if ([[trackers objectAtIndex: 0] intValue] != 0) - fAddedTrackers = NO; + tracker = [@"http://" stringByAppendingString: tracker]; + [trackers replaceObjectAtIndex: i withObject: tracker]; } - //get count - int count = 0; - NSEnumerator * enumerator = [trackers objectEnumerator]; - id object; - while ((object = [enumerator nextObject])) - if (![object isKindOfClass: [NSNumber class]]) - count++; + if (!tr_httpIsValidURL([tracker UTF8String])) + return NO; - //recreate the tracker structure - tr_tracker_info * trackerStructs = tr_new(tr_tracker_info, count); - int tier = 0; - int i = 0; - enumerator = [trackers objectEnumerator]; - while ((object = [enumerator nextObject])) - { - if (![object isKindOfClass: [NSNumber class]]) - { - trackerStructs[i].tier = tier; - trackerStructs[i].announce = (char *)[object UTF8String]; - i++; - } - else - tier++; - } + fAddedTrackers = YES; - tr_torrentSetAnnounceList(fHandle, trackerStructs, count); - tr_free(trackerStructs); + return [self updateAllTrackers: trackers]; +} + +- (BOOL) updateAllTrackersForRemove: (NSMutableArray *) trackers +{ + //check if any user-added groups + if ([[trackers objectAtIndex: 0] intValue] != 0) + fAddedTrackers = NO; - return YES; + return [self updateAllTrackers: trackers]; } - (BOOL) hasAddedTrackers @@ -1929,6 +1902,39 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * } } +- (BOOL) updateAllTrackers: (NSMutableArray *) trackers +{ + //get count + int count = 0; + NSEnumerator * enumerator = [trackers objectEnumerator]; + id object; + while ((object = [enumerator nextObject])) + if (![object isKindOfClass: [NSNumber class]]) + count++; + + //recreate the tracker structure + tr_tracker_info * trackerStructs = tr_new(tr_tracker_info, count); + int tier = 0; + int i = 0; + enumerator = [trackers objectEnumerator]; + while ((object = [enumerator nextObject])) + { + if (![object isKindOfClass: [NSNumber class]]) + { + trackerStructs[i].tier = tier; + trackerStructs[i].announce = (char *)[object UTF8String]; + i++; + } + else + tier++; + } + + tr_torrentSetAnnounceList(fHandle, trackerStructs, count); + tr_free(trackerStructs); + + return YES; +} + - (void) trashFile: (NSString *) path { //attempt to move to trash