diff --git a/macosx/CreatorWindowController.m b/macosx/CreatorWindowController.m index c090b49e7..b18f6a355 100644 --- a/macosx/CreatorWindowController.m +++ b/macosx/CreatorWindowController.m @@ -25,7 +25,7 @@ #import "CreatorWindowController.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" -#include "utils.h" //tr_httpParseURL +#include "utils.h" //tr_httpIsValidURL @interface CreatorWindowController (Private) diff --git a/macosx/English.lproj/InfoWindow.xib b/macosx/English.lproj/InfoWindow.xib index b59f97abd..cb50b14ce 100644 --- a/macosx/English.lproj/InfoWindow.xib +++ b/macosx/English.lproj/InfoWindow.xib @@ -2,14 +2,14 @@ 1050 - 9C7010 - 658 - 949.26 + 9D34 + 667 + 949.33 352.00 YES + - YES @@ -39,7 +39,7 @@ {3.40282e+38, 3.40282e+38} {350, 73} - + 256 YES @@ -404,7 +404,6 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA {350, 75} - {{0, 0}, {1680, 1028}} {350, 89} @@ -1592,7 +1591,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 67239424 262144 - + LucidaGrande 9.000000e+00 3614 @@ -1729,7 +1728,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 290 - {{114, 147}, {256, 14}} + {{114, 147}, {258, 14}} YES @@ -1746,7 +1745,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 290 - {{114, 131}, {256, 14}} + {{114, 131}, {258, 14}} YES @@ -1816,7 +1815,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 290 - {{114, 99}, {256, 14}} + {{114, 99}, {258, 14}} YES @@ -1833,7 +1832,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 290 - {{10, 91}, {360, 5}} + {{10, 91}, {362, 5}} {0, 0} @@ -1871,7 +1870,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 290 - {{114, 115}, {256, 14}} + {{114, 115}, {258, 14}} YES @@ -1888,7 +1887,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 290 - {{114, 58}, {256, 14}} + {{114, 58}, {258, 14}} YES @@ -1937,7 +1936,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 290 - {{114, 26}, {256, 14}} + {{114, 26}, {258, 14}} YES @@ -1954,7 +1953,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 290 - {{114, 10}, {256, 14}} + {{114, 10}, {258, 14}} YES @@ -1971,7 +1970,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 290 - {{114, 42}, {256, 14}} + {{114, 42}, {258, 14}} YES @@ -2067,18 +2066,18 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 256 - {358, 86} + {360, 143} YES - 256 - {{373, 1}, {16, 17}} + -2147483392 + {{350, 0}, {12, 17}} YES - 3.550000e+02 + 3.570000e+02 4.000000e+01 1.000000e+03 @@ -2115,7 +2114,7 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA - 3 + 1 YES YES @@ -2134,14 +2133,14 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 1.400000e+01 - 306184192 + 440401920 4 15 0 NO - {{1, 1}, {358, 86}} + {{1, 1}, {360, 143}} @@ -2151,12 +2150,12 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA -2147483392 - {{377, 1}, {11, 125}} + {{350, 1}, {11, 138}} 256 _doScroller: - 9.921260e-01 + 9.928058e-01 @@ -2166,10 +2165,11 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA 1 _doScroller: + 2.777778e-03 9.973190e-01 - {{10, 182}, {360, 88}} + {{10, 202}, {362, 145}} 530 @@ -2178,8 +2178,45 @@ AAB0ZXh0AAAAAENvcHlyaWdodCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA QSAAAEEgAABBgAAAQYAAAA + + + 292 + {{10, 181}, {67, 19}} + + YES + + -2080244224 + 262144 + + + + YES + + 3.200000e+01 + + NSImage + NSAddTemplate + + + 0 + + + 3.200000e+01 + + NSImage + NSRemoveTemplate + + + 1 + 0 + + + 2 + 6 + + - {380, 275} + {382, 352} NSView @@ -4299,14 +4336,14 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW NSResponder - + 258 YES 268 - {{214, 54}, {45, 20}} + {{207, 54}, {45, 20}} YES @@ -4405,7 +4442,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 266 - {{9, 141}, {278, 14}} + {{9, 142}, {278, 14}} YES @@ -4421,7 +4458,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 268 - {{222, 98}, {35, 20}} + {{216, 98}, {35, 20}} YES @@ -4485,7 +4522,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 268 - {{262, 101}, {29, 14}} + {{256, 101}, {29, 14}} YES @@ -4501,15 +4538,15 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 268 - {{98, 96}, {119, 22}} + {{98, 96}, {116, 22}} YES -2076049856 - 133120 + 134350848 - 109199615 + -2038284033 1 @@ -4593,7 +4630,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 268 - {{222, 120}, {35, 20}} + {{216, 120}, {35, 20}} YES @@ -4657,7 +4694,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 268 - {{262, 123}, {29, 14}} + {{256, 123}, {29, 14}} YES @@ -4673,15 +4710,15 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 268 - {{98, 118}, {119, 22}} + {{98, 118}, {116, 22}} YES -2076049856 - 133120 + 134350848 - 109199615 + -2038284033 1 @@ -4759,15 +4796,15 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 268 - {{89, 52}, {120, 22}} + {{89, 52}, {116, 22}} YES -2076049856 - 133120 + 134350848 - 109199615 + -2038284033 1 @@ -4953,7 +4990,8 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW - {351, 160} + {351, 161} + NSView @@ -5654,6 +5692,22 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 1749 + + + fTrackerAddRemoveControl + + + + 1758 + + + + addRemoveTracker: + + + + 1765 + @@ -6669,7 +6723,6 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW YES - @@ -6680,12 +6733,13 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW - + + Options @@ -7526,6 +7580,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW + Tracker @@ -7896,6 +7951,20 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW + + 1753 + + + YES + + + + + + 1754 + + + @@ -8019,6 +8088,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 1055.ImportedFromIB2 1056.IBPluginDependency 1056.ImportedFromIB2 + 1057.IBEditorWindowLastContentRect 1057.IBPluginDependency 1057.ImportedFromIB2 1057.editorWindowContentRectSynchronizationRect @@ -8035,6 +8105,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 1063.ImportedFromIB2 1064.IBPluginDependency 1064.ImportedFromIB2 + 1066.IBEditorWindowLastContentRect 1066.IBPluginDependency 1066.ImportedFromIB2 1066.editorWindowContentRectSynchronizationRect @@ -8050,6 +8121,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 1073.ImportedFromIB2 1074.IBPluginDependency 1074.ImportedFromIB2 + 1075.IBEditorWindowLastContentRect 1075.IBPluginDependency 1075.ImportedFromIB2 1076.IBPluginDependency @@ -8078,6 +8150,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 1088.ImportedFromIB2 1089.IBPluginDependency 1089.ImportedFromIB2 + 1090.IBEditorWindowLastContentRect 1090.IBPluginDependency 1090.ImportedFromIB2 1091.IBPluginDependency @@ -8179,6 +8252,8 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW 1747.IBShouldRemoveOnLegacySave 1748.IBPluginDependency 1748.ImportedFromIB2 + 1753.IBPluginDependency + 1754.IBPluginDependency 28.IBPluginDependency 28.ImportedFromIB2 29.IBPluginDependency @@ -8401,6 +8476,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW com.apple.InterfaceBuilder.CocoaPlugin + {{0, 648}, {340, 347}} com.apple.InterfaceBuilder.CocoaPlugin {{0, 648}, {340, 347}} @@ -8417,6 +8493,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW com.apple.InterfaceBuilder.CocoaPlugin + {{0, 835}, {351, 161}} com.apple.InterfaceBuilder.CocoaPlugin {{519, 803}, {351, 160}} @@ -8432,6 +8509,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW com.apple.InterfaceBuilder.CocoaPlugin + {{87, 899}, {138, 54}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -8460,6 +8538,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW com.apple.InterfaceBuilder.CocoaPlugin + {{78, 855}, {138, 54}} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -8501,7 +8580,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin - {{0, 720}, {380, 275}} + {{464, 366}, {382, 352}} com.apple.InterfaceBuilder.CocoaPlugin {{476, 437}, {380, 275}} @@ -8562,6 +8641,8 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -8685,7 +8766,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW - 1752 + 1765 @@ -8774,6 +8855,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW YES YES + addRemoveTracker: revealDataFile: revealTorrentFile: setPeersConnectLimit: @@ -8795,6 +8877,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW id id id + id @@ -8855,6 +8938,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW fSwarmSpeedField fTabMatrix fTorrentLocationField + fTrackerAddRemoveControl fTrackerField fTrackerTable fTrackerView @@ -8920,6 +9004,7 @@ zijOSc5pzorOqs66ztvO+88czzzPXc99z57Pvs/fz+/QANAg0EHQYdCC0KLQw9Dj0PPRFNE00VXRddGW NSTextField NSMatrix NSTextField + NSSegmentedControl NSTextField TrackerTableView NSView diff --git a/macosx/GroupsWindowController.m b/macosx/GroupsWindowController.m index 6d4aacaf3..22d56da8e 100644 --- a/macosx/GroupsWindowController.m +++ b/macosx/GroupsWindowController.m @@ -28,11 +28,8 @@ #define GROUP_TABLE_VIEW_DATA_TYPE @"GroupTableViewDataType" -typedef enum -{ - ADD_TAG = 0, - REMOVE_TAG = 1 -} controlTag; +#define ADD_TAG 0 +#define REMOVE_TAG 1 @interface GroupsWindowController (Private) diff --git a/macosx/InfoWindowController.h b/macosx/InfoWindowController.h index 7bc0e7439..524db4240 100644 --- a/macosx/InfoWindowController.h +++ b/macosx/InfoWindowController.h @@ -32,7 +32,8 @@ @interface InfoWindowController : NSWindowController { - NSArray * fTorrents, * fPeers, * fTrackers; + NSArray * fTorrents, * fPeers; + NSMutableArray * fTrackers; IBOutlet NSView * fInfoView, * fActivityView, * fTrackerView, * fPeersView, * fFilesView, * fOptionsView; int fCurrentTabTag; @@ -52,6 +53,7 @@ IBOutlet NSButton * fRevealDataButton, * fRevealTorrentButton; IBOutlet TrackerTableView * fTrackerTable; + IBOutlet NSSegmentedControl * fTrackerAddRemoveControl; IBOutlet NSTextField * fAnnounceAddressField, * fAnnounceLastField, * fAnnounceResponseField, * fAnnounceNextField, * fScrapeAddressField, * fScrapeLastField, * fScrapeResponseField, * fScrapeNextField; @@ -80,6 +82,8 @@ - (void) setNextTab; - (void) setPreviousTab; +- (void) addRemoveTracker: (id) sender; + - (BOOL) shouldQuickLookFileView; - (NSArray *) quickLookURLs; - (BOOL) canQuickLook; diff --git a/macosx/InfoWindowController.m b/macosx/InfoWindowController.m index 1a348fc7c..d96e2bea5 100644 --- a/macosx/InfoWindowController.m +++ b/macosx/InfoWindowController.m @@ -49,6 +49,9 @@ #define INVALID -99 +#define TRACKER_ADD_TAG 0 +#define TRACKER_REMOVE_TAG 1 + typedef enum { TAB_INFO_TAG = 0, @@ -70,6 +73,9 @@ typedef enum - (NSView *) tabViewForTag: (int) tag; - (NSArray *) peerSortDescriptors; +- (void) addTrackers; +- (void) removeTrackers; + @end @implementation InfoWindowController @@ -346,6 +352,9 @@ typedef enum [fTrackers release]; fTrackers = nil; + + [fTrackerAddRemoveControl setEnabled: NO forSegment: TRACKER_ADD_TAG]; + [fTrackerAddRemoveControl setEnabled: NO forSegment: TRACKER_REMOVE_TAG]; } else { @@ -428,6 +437,10 @@ typedef enum //get trackers for table [fTrackers release]; fTrackers = [[torrent allTrackers: YES] retain]; + [fTrackerTable deselectAll: self]; + + [fTrackerAddRemoveControl setEnabled: YES forSegment: TRACKER_ADD_TAG]; + [fTrackerAddRemoveControl setEnabled: NO forSegment: TRACKER_REMOVE_TAG]; } //update stats and settings @@ -436,6 +449,7 @@ typedef enum [fTrackerTable setTrackers: fTrackers]; [fTrackerTable reloadData]; + [fPeerTable reloadData]; } @@ -786,7 +800,13 @@ typedef enum { id item = [fTrackers objectAtIndex: row]; if ([item isKindOfClass: [NSNumber class]]) - return [NSString stringWithFormat: NSLocalizedString(@"Tier %d", "Inspector -> tracker table"), [item intValue]+1]; + { + int tier = [item intValue]; + if (tier == 0) + return NSLocalizedString(@"User-Added", "Inspector -> tracker table"); + else + return [NSString stringWithFormat: NSLocalizedString(@"Tier %d", "Inspector -> tracker table"), tier]; + } else return item; } @@ -809,7 +829,17 @@ typedef enum - (BOOL) tableView: (NSTableView *) tableView shouldSelectRow: (int) row { - return NO; + return tableView == fTrackerTable; +} + +- (void) tableViewSelectionDidChange: (NSNotification *) notification +{ + if ([notification object] == fTrackerTable) + { + #warning disable when all selected + int numSelected = [fTrackerTable numberOfSelectedRows]; + [fTrackerAddRemoveControl setEnabled: numSelected > 0 forSegment: TRACKER_REMOVE_TAG]; + } } - (BOOL) tableView: (NSTableView *) tableView isGroupRow: (NSInteger) row @@ -894,6 +924,44 @@ typedef enum return nil; } +- (void) tableView: (NSTableView *) tableView setObjectValue: (id) object forTableColumn: (NSTableColumn *) tableColumn + row: (NSInteger) row +{ + if (tableView != fTrackerTable) + return; + + [fTrackers replaceObjectAtIndex: row withObject: object]; + + Torrent * torrent= [fTorrents objectAtIndex: 0]; + if (![torrent updateAllTrackers: fTrackers forAdd: YES]) + NSBeep(); + + //reset table with either new or old value + [fTrackers release]; + fTrackers = [[torrent allTrackers: YES] retain]; + [fTrackerTable deselectAll: self]; + + [fTrackerTable setTrackers: fTrackers]; + [fTrackerTable reloadData]; +} + +- (void) addRemoveTracker: (id) sender +{ + //don't allow add/remove when currently adding - it leads to weird results + if ([fTrackerTable editedRow] != -1) + return; + + if ([[sender cell] tagForSegment: [sender selectedSegment]] == TRACKER_REMOVE_TAG) + [self removeTrackers]; + else + [self addTrackers]; +} + +- (BOOL) tableView: (NSTableView *) tableView shouldEditTableColumn: (NSTableColumn *) tableColumn row: (NSInteger) row +{ + return ![[fTrackers objectAtIndex: row] isKindOfClass: [NSNumber class]]; +} + - (BOOL) shouldQuickLookFileView { return [[self window] isVisible] && fCurrentTabTag == TAB_FILES_TAG && [[fFileController outlineView] numberOfSelectedRows] > 0; @@ -1357,4 +1425,60 @@ typedef enum return descriptors; } +- (void) addTrackers +{ + [[self window] makeKeyWindow]; + + int i; + if ([[fTorrents objectAtIndex: 0] hasAddedTrackers]) + { + for (i = 1; i < [fTrackers count]; i++) + if ([[fTrackers objectAtIndex: i] isKindOfClass: [NSNumber class]]) + break; + } + else + { + [fTrackers insertObject: [NSNumber numberWithInt: 0] atIndex: 0]; + i = 1; + } + + [fTrackers insertObject: @"" atIndex: i]; + [fTrackerTable reloadData]; + [fTrackerTable selectRow: i byExtendingSelection: NO]; + [fTrackerTable editColumn: 0 row: i withEvent: nil select: YES]; +} + +#warning warning when removing built-in +- (void) removeTrackers +{ + NSMutableIndexSet * indexes = [[fTrackerTable selectedRowIndexes] mutableCopy]; + + NSUInteger i; + for (i = [indexes firstIndex]; i != NSNotFound; i = [indexes indexGreaterThanIndex: i]) + { + if ([[fTrackers objectAtIndex: i] isKindOfClass: [NSNumber class]]) + { + for (i = i+1; i < [fTrackers count] && ![[fTrackers objectAtIndex: i] isKindOfClass: [NSNumber class]]; i++) + [indexes addIndex: i]; + i--; + } + } + + [fTrackers removeObjectsAtIndexes: indexes]; + [indexes release]; + + Torrent * torrent = [fTorrents objectAtIndex: 0]; + if (![torrent updateAllTrackers: fTrackers forAdd: NO]) + NSBeep(); + else + [fTrackerTable deselectAll: self]; + + //reset table with either new or old value + [fTrackers release]; + fTrackers = [[torrent allTrackers: YES] retain]; + + [fTrackerTable setTrackers: fTrackers]; + [fTrackerTable reloadData]; +} + @end diff --git a/macosx/Torrent.h b/macosx/Torrent.h index b13a1b550..1b82bc5ea 100644 --- a/macosx/Torrent.h +++ b/macosx/Torrent.h @@ -67,6 +67,8 @@ typedef enum int fOrderValue, fGroupValue; + BOOL fAddedTrackers; + NSDictionary * fQuickPauseDict; } @@ -148,7 +150,9 @@ typedef enum - (int) nextScrapeTime; - (NSString *) scrapeResponse; -- (NSArray *) allTrackers: (BOOL) separators; +- (NSMutableArray *) allTrackers: (BOOL) separators; +- (BOOL) updateAllTrackers: (NSMutableArray *) trackers forAdd: (BOOL) add; +- (BOOL) hasAddedTrackers; - (NSString *) comment; - (NSString *) creator; diff --git a/macosx/Torrent.m b/macosx/Torrent.m index 50ed2f83d..eb245ed3b 100644 --- a/macosx/Torrent.m +++ b/macosx/Torrent.m @@ -27,6 +27,7 @@ #import "FileListNode.h" #import "NSApplicationAdditions.h" #import "NSStringAdditions.h" +#include "utils.h" //tr_httpIsValidURL @interface Torrent (Private) @@ -38,7 +39,7 @@ dateActivity: (NSDate *) dateActivity ratioSetting: (NSNumber *) ratioSetting ratioLimit: (NSNumber *) ratioLimit waitToStart: (NSNumber *) waitToStart - orderValue: (NSNumber *) orderValue groupValue: (NSNumber *) groupValue; + orderValue: (NSNumber *) orderValue groupValue: (NSNumber *) groupValue addedTrackers: (NSNumber *) addedTrackers; - (BOOL) shouldUseIncompleteFolderForName: (NSString *) name; - (void) updateDownloadFolder; @@ -78,7 +79,7 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * dateAdded: nil dateCompleted: nil dateActivity: nil ratioSetting: nil ratioLimit: nil - waitToStart: nil orderValue: nil groupValue: nil]; + waitToStart: nil orderValue: nil groupValue: nil addedTrackers: nil]; if (self) { @@ -97,7 +98,7 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * dateAdded: nil dateCompleted: nil dateActivity: nil ratioSetting: nil ratioLimit: nil - waitToStart: nil orderValue: nil groupValue: nil]; + waitToStart: nil orderValue: nil groupValue: nil addedTrackers: nil]; return self; } @@ -117,7 +118,8 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * ratioLimit: [history objectForKey: @"RatioLimit"] waitToStart: [history objectForKey: @"WaitToStart"] orderValue: [history objectForKey: @"OrderValue"] - groupValue: [history objectForKey: @"GroupValue"]]; + groupValue: [history objectForKey: @"GroupValue"] + addedTrackers: [history objectForKey: @"AddedTrackers"]]; if (self) { @@ -145,7 +147,8 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * [NSNumber numberWithFloat: fRatioLimit], @"RatioLimit", [NSNumber numberWithBool: fWaitToStart], @"WaitToStart", [NSNumber numberWithInt: fOrderValue], @"OrderValue", - [NSNumber numberWithInt: fGroupValue], @"GroupValue", nil]; + [NSNumber numberWithInt: fGroupValue], @"GroupValue", + [NSNumber numberWithBool: fAddedTrackers], @"AddedTrackers", nil]; if (fIncompleteFolder) [history setObject: fIncompleteFolder forKey: @"IncompleteFolder"]; @@ -778,7 +781,7 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * return [NSString stringWithUTF8String: fStat->scrapeResponse]; } -- (NSArray *) allTrackers: (BOOL) separators +- (NSMutableArray *) allTrackers: (BOOL) separators { int count = fInfo->trackerCount, capacity = count; if (separators) @@ -791,7 +794,7 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * if (separators && tier != fInfo->trackers[i].tier) { tier = fInfo->trackers[i].tier; - [allTrackers addObject: [NSNumber numberWithInt: tier]]; + [allTrackers addObject: [NSNumber numberWithInt: fAddedTrackers ? tier : tier + 1]]; } [allTrackers addObject: [NSString stringWithUTF8String: fInfo->trackers[i].announce]]; @@ -800,6 +803,86 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * return allTrackers; } +- (BOOL) updateAllTrackers: (NSMutableArray *) trackers forAdd: (BOOL) add +{ + #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) + { + tracker = [@"http://" stringByAppendingString: tracker]; + [trackers replaceObjectAtIndex: i withObject: tracker]; + } + + if (!tr_httpIsValidURL([tracker UTF8String])) + return NO; + + fAddedTrackers = YES; + } + else + { + //remove empty groups + int i; + for (i = 0; i < [trackers count]; i++) + if ([[trackers objectAtIndex: i] isKindOfClass: [NSNumber class]] + && (i+1 == [trackers count] || [[trackers objectAtIndex: i+1] isKindOfClass: [NSNumber class]])) + { + [trackers removeObjectAtIndex: i]; + i--; + } + + if ([trackers count] == 0) + return NO; + + //check if any user-added groups + if ([[trackers objectAtIndex: 0] intValue] != 0) + fAddedTrackers = NO; + } + + //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; +} + +- (BOOL) hasAddedTrackers +{ + return fAddedTrackers; +} + - (NSString *) comment { return [NSString stringWithUTF8String: fInfo->comment]; @@ -1538,7 +1621,7 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * dateActivity: (NSDate *) dateActivity ratioSetting: (NSNumber *) ratioSetting ratioLimit: (NSNumber *) ratioLimit waitToStart: (NSNumber *) waitToStart - orderValue: (NSNumber *) orderValue groupValue: (NSNumber *) groupValue; + orderValue: (NSNumber *) orderValue groupValue: (NSNumber *) groupValue addedTrackers: (NSNumber *) addedTrackers { if (!(self = [super init])) return nil; @@ -1636,6 +1719,8 @@ void completenessChangeCallback(tr_torrent * torrent, cp_status_t status, void * fOrderValue = orderValue ? [orderValue intValue] : tr_sessionCountTorrents(lib) - 1; fGroupValue = groupValue ? [groupValue intValue] : -1; + fAddedTrackers = addedTrackers ? [addedTrackers boolValue] : NO; + [self createFileList]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(checkGroupValueForRemoval:) diff --git a/macosx/TrackerTableView.m b/macosx/TrackerTableView.m index 93df85520..d17b84c49 100644 --- a/macosx/TrackerTableView.m +++ b/macosx/TrackerTableView.m @@ -26,6 +26,12 @@ @implementation TrackerTableView +- (void) mouseDown: (NSEvent *) event +{ + [[self window] makeKeyWindow]; + [super mouseDown: event]; +} + - (void) setTrackers: (NSArray *) trackers { fTrackers = trackers; @@ -68,7 +74,7 @@ continue; } - if (!start) + if (!start && ![self isRowSelected: i]) NSRectFill([self rectOfRow: i]); start = !start;