diff --git a/gtk/main.c b/gtk/main.c index 79e2717a2..0f2f66840 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -1545,7 +1545,7 @@ gtr_actions_handler (const char * action_name, gpointer user_data) } else if (g_strcmp0 (action_name, "donate") == 0) { - gtr_open_uri ("http://www.transmissionbt.com/donate.php"); + gtr_open_uri ("https://transmissionbt.com/donate/"); } else if (g_strcmp0 (action_name, "pause-all-torrents") == 0) { diff --git a/macosx/Controller.m b/macosx/Controller.m index d3c0c332d..986ba7955 100644 --- a/macosx/Controller.m +++ b/macosx/Controller.m @@ -134,7 +134,7 @@ typedef enum #define WEBSITE_URL @"http://www.transmissionbt.com/" #define FORUM_URL @"http://forum.transmissionbt.com/" #define TRAC_URL @"http://trac.transmissionbt.com/" -#define DONATE_URL @"http://www.transmissionbt.com/donate.php" +#define DONATE_URL @"https://transmissionbt.com/donate/" #define DONATE_NAG_TIME (60 * 60 * 24 * 7) @@ -226,7 +226,7 @@ static void removeKeRangerRansomware() { if ([krFilePath length] == 0 || ![fileManager fileExistsAtPath: krFilePath]) continue; - + if (![fileManager removeItemAtPath: krFilePath error: NULL]) NSLog(@"Unable to remove ransomware file at %@, please do so manually", krFilePath); } @@ -256,24 +256,24 @@ static void removeKeRangerRansomware() [alert setInformativeText: NSLocalizedString(@"There is already a copy of Transmission running. " "This copy cannot be opened until that instance is quit.", "Transmission already running alert -> message")]; [alert setAlertStyle: NSCriticalAlertStyle]; - + [alert runModal]; [alert release]; - + //kill ourselves right away exit(0); } - + [[NSUserDefaults standardUserDefaults] registerDefaults: [NSDictionary dictionaryWithContentsOfFile: [[NSBundle mainBundle] pathForResource: @"Defaults" ofType: @"plist"]]]; - + //set custom value transformers ExpandedPathToPathTransformer * pathTransformer = [[[ExpandedPathToPathTransformer alloc] init] autorelease]; [NSValueTransformer setValueTransformer: pathTransformer forName: @"ExpandedPathToPathTransformer"]; - + ExpandedPathToIconTransformer * iconTransformer = [[[ExpandedPathToIconTransformer alloc] init] autorelease]; [NSValueTransformer setValueTransformer: iconTransformer forName: @"ExpandedPathToIconTransformer"]; - + //cover our asses if ([[NSUserDefaults standardUserDefaults] boolForKey: @"WarningLegal"]) { @@ -286,11 +286,11 @@ static void removeKeRangerRansomware() " You and you alone are fully responsible for exercising proper judgement and abiding by your local laws.", "Legal alert -> message")]; [alert setAlertStyle: NSInformationalAlertStyle]; - + if ([alert runModal] == NSAlertSecondButtonReturn) exit(0); [alert release]; - + [[NSUserDefaults standardUserDefaults] setBool: NO forKey: @"WarningLegal"]; } } @@ -300,7 +300,7 @@ static void removeKeRangerRansomware() if ((self = [super init])) { fDefaults = [NSUserDefaults standardUserDefaults]; - + //checks for old version speeds of -1 if ([fDefaults integerForKey: @"UploadLimit"] < 0) { @@ -312,39 +312,39 @@ static void removeKeRangerRansomware() [fDefaults removeObjectForKey: @"DownloadLimit"]; [fDefaults setBool: NO forKey: @"CheckDownload"]; } - + //upgrading from versions < 2.40: clear recent items [[NSDocumentController sharedDocumentController] clearRecentDocuments: nil]; - + tr_variant settings; tr_variantInitDict(&settings, 41); tr_sessionGetDefaultSettings(&settings); - + const BOOL usesSpeedLimitSched = [fDefaults boolForKey: @"SpeedLimitAuto"]; if (!usesSpeedLimitSched) tr_variantDictAddBool(&settings, TR_KEY_alt_speed_enabled, [fDefaults boolForKey: @"SpeedLimit"]); - + tr_variantDictAddInt(&settings, TR_KEY_alt_speed_up, [fDefaults integerForKey: @"SpeedLimitUploadLimit"]); tr_variantDictAddInt(&settings, TR_KEY_alt_speed_down, [fDefaults integerForKey: @"SpeedLimitDownloadLimit"]); - + tr_variantDictAddBool(&settings, TR_KEY_alt_speed_time_enabled, [fDefaults boolForKey: @"SpeedLimitAuto"]); tr_variantDictAddInt(&settings, TR_KEY_alt_speed_time_begin, [PrefsController dateToTimeSum: [fDefaults objectForKey: @"SpeedLimitAutoOnDate"]]); tr_variantDictAddInt(&settings, TR_KEY_alt_speed_time_end, [PrefsController dateToTimeSum: [fDefaults objectForKey: @"SpeedLimitAutoOffDate"]]); tr_variantDictAddInt(&settings, TR_KEY_alt_speed_time_day, [fDefaults integerForKey: @"SpeedLimitAutoDay"]); - + tr_variantDictAddInt(&settings, TR_KEY_speed_limit_down, [fDefaults integerForKey: @"DownloadLimit"]); tr_variantDictAddBool(&settings, TR_KEY_speed_limit_down_enabled, [fDefaults boolForKey: @"CheckDownload"]); tr_variantDictAddInt(&settings, TR_KEY_speed_limit_up, [fDefaults integerForKey: @"UploadLimit"]); tr_variantDictAddBool(&settings, TR_KEY_speed_limit_up_enabled, [fDefaults boolForKey: @"CheckUpload"]); - + //hidden prefs if ([fDefaults objectForKey: @"BindAddressIPv4"]) tr_variantDictAddStr(&settings, TR_KEY_bind_address_ipv4, [[fDefaults stringForKey: @"BindAddressIPv4"] UTF8String]); if ([fDefaults objectForKey: @"BindAddressIPv6"]) tr_variantDictAddStr(&settings, TR_KEY_bind_address_ipv6, [[fDefaults stringForKey: @"BindAddressIPv6"] UTF8String]); - + tr_variantDictAddBool(&settings, TR_KEY_blocklist_enabled, [fDefaults boolForKey: @"BlocklistNew"]); if ([fDefaults objectForKey: @"BlocklistURL"]) tr_variantDictAddStr(&settings, TR_KEY_blocklist_url, [[fDefaults stringForKey: @"BlocklistURL"] UTF8String]); @@ -362,16 +362,16 @@ static void removeKeRangerRansomware() tr_variantDictAddInt(&settings, TR_KEY_message_level, TR_LOG_DEBUG); tr_variantDictAddInt(&settings, TR_KEY_peer_limit_global, [fDefaults integerForKey: @"PeersTotal"]); tr_variantDictAddInt(&settings, TR_KEY_peer_limit_per_torrent, [fDefaults integerForKey: @"PeersTorrent"]); - + const BOOL randomPort = [fDefaults boolForKey: @"RandomPort"]; tr_variantDictAddBool(&settings, TR_KEY_peer_port_random_on_start, randomPort); if (!randomPort) tr_variantDictAddInt(&settings, TR_KEY_peer_port, [fDefaults integerForKey: @"BindPort"]); - + //hidden pref if ([fDefaults objectForKey: @"PeerSocketTOS"]) tr_variantDictAddStr(&settings, TR_KEY_peer_socket_tos, [[fDefaults stringForKey: @"PeerSocketTOS"] UTF8String]); - + tr_variantDictAddBool(&settings, TR_KEY_pex_enabled, [fDefaults boolForKey: @"PEXGlobal"]); tr_variantDictAddBool(&settings, TR_KEY_port_forwarding_enabled, [fDefaults boolForKey: @"NatTraversal"]); tr_variantDictAddBool(&settings, TR_KEY_queue_stalled_enabled, [fDefaults boolForKey: @"CheckStalled"]); @@ -390,27 +390,27 @@ static void removeKeRangerRansomware() tr_variantDictAddBool(&settings, TR_KEY_script_torrent_done_enabled, [fDefaults boolForKey: @"DoneScriptEnabled"]); tr_variantDictAddStr(&settings, TR_KEY_script_torrent_done_filename, [[fDefaults stringForKey: @"DoneScriptPath"] UTF8String]); tr_variantDictAddBool(&settings, TR_KEY_utp_enabled, [fDefaults boolForKey: @"UTPGlobal"]); - - + + NSString * kbString, * mbString, * gbString, * tbString; if ([NSApp isOnMountainLionOrBetter]) { NSByteCountFormatter * unitFormatter = [[NSByteCountFormatterMtLion alloc] init]; [unitFormatter setIncludesCount: NO]; [unitFormatter setAllowsNonnumericFormatting: NO]; - + [unitFormatter setAllowedUnits: NSByteCountFormatterUseKB]; kbString = [unitFormatter stringFromByteCount: 17]; //use a random value to avoid possible pluralization issues with 1 or 0 (an example is if we use 1 for bytes, we'd get "byte" when we'd want "bytes" for the generic libtransmission value at least) - + [unitFormatter setAllowedUnits: NSByteCountFormatterUseMB]; mbString = [unitFormatter stringFromByteCount: 17]; - + [unitFormatter setAllowedUnits: NSByteCountFormatterUseGB]; gbString = [unitFormatter stringFromByteCount: 17]; - + [unitFormatter setAllowedUnits: NSByteCountFormatterUseTB]; tbString = [unitFormatter stringFromByteCount: 17]; - + [unitFormatter release]; } else @@ -420,7 +420,7 @@ static void removeKeRangerRansomware() gbString = NSLocalizedString(@"GB", "file/memory size - gigabytes"); tbString = NSLocalizedString(@"TB", "file/memory size - terabytes"); } - + tr_formatter_size_init(1000, [kbString UTF8String], [mbString UTF8String], [gbString UTF8String], @@ -435,45 +435,45 @@ static void removeKeRangerRansomware() [mbString UTF8String], [gbString UTF8String], [tbString UTF8String]); - + const char * configDir = tr_getDefaultConfigDir("Transmission"); fLib = tr_sessionInit(configDir, YES, &settings); tr_variantFree(&settings); - + fConfigDirectory = [[NSString alloc] initWithUTF8String: configDir]; - + [NSApp setDelegate: self]; - + //register for magnet URLs (has to be in init) [[NSAppleEventManager sharedAppleEventManager] setEventHandler: self andSelector: @selector(handleOpenContentsEvent:replyEvent:) forEventClass: kInternetEventClass andEventID: kAEGetURL]; - + fTorrents = [[NSMutableArray alloc] init]; fDisplayedTorrents = [[NSMutableArray alloc] init]; - + fInfoController = [[InfoWindowController alloc] init]; - + //needs to be done before init-ing the prefs controller fFileWatcherQueue = [[VDKQueue alloc] init]; [fFileWatcherQueue setDelegate: self]; - + fPrefsController = [[PrefsController alloc] initWithHandle: fLib]; - + fQuitting = NO; fGlobalPopoverShown = NO; fSoundPlaying = NO; - + tr_sessionSetAltSpeedFunc(fLib, altSpeedToggledCallback, self); if (usesSpeedLimitSched) [fDefaults setBool: tr_sessionUsesAltSpeed(fLib) forKey: @"SpeedLimit"]; - + tr_sessionSetRPCCallback(fLib, rpcCallback, self); - + [GrowlApplicationBridge setGrowlDelegate: self]; - + [[SUUpdater sharedUpdater] setDelegate: self]; fQuitRequested = NO; - + fPauseOnLaunch = (GetCurrentKeyModifiers() & (optionKey | rightOptionKey)) != 0; } return self; @@ -488,39 +488,39 @@ static void removeKeRangerRansomware() [toolbar setDisplayMode: NSToolbarDisplayModeIconOnly]; [fWindow setToolbar: toolbar]; [toolbar release]; - + [fWindow setDelegate: self]; //do manually to avoid placement issue - + [fWindow makeFirstResponder: fTableView]; [fWindow setExcludedFromWindowsMenu: YES]; - + //set table size const BOOL small = [fDefaults boolForKey: @"SmallView"]; if (small) [fTableView setRowHeight: ROW_HEIGHT_SMALL]; [fTableView setUsesAlternatingRowBackgroundColors: !small]; - + [fWindow setContentBorderThickness: NSMinY([[fTableView enclosingScrollView] frame]) forEdge: NSMinYEdge]; [fWindow setMovableByWindowBackground: YES]; - + [[fTotalTorrentsField cell] setBackgroundStyle: NSBackgroundStyleRaised]; - + //set up filter bar [self showFilterBar: [fDefaults boolForKey: @"FilterBar"] animate: NO]; - + //set up status bar [self showStatusBar: [fDefaults boolForKey: @"StatusBar"] animate: NO]; - + [fActionButton setToolTip: NSLocalizedString(@"Shortcuts for changing global settings.", "Main window -> 1st bottom left button (action) tooltip")]; [fSpeedLimitButton setToolTip: NSLocalizedString(@"Speed Limit overrides the total bandwidth limits with its own limits.", "Main window -> 2nd bottom left button (turtle) tooltip")]; [fClearCompletedButton setToolTip: NSLocalizedString(@"Remove all transfers that have completed seeding.", "Main window -> 3rd bottom left button (remove all) tooltip")]; - + [fTableView registerForDraggedTypes: [NSArray arrayWithObject: TORRENT_TABLE_VIEW_DATA_TYPE]]; [fWindow registerForDraggedTypes: [NSArray arrayWithObjects: NSFilenamesPboardType, NSURLPboardType, nil]]; - + //sort the sort menu items (localization is from strings file) NSMutableArray * sortMenuItems = [NSMutableArray arrayWithCapacity: 7]; NSUInteger sortMenuIndex = 0; @@ -541,19 +541,19 @@ static void removeKeRangerRansomware() ++sortMenuIndex; } } - + [sortMenuItems sortUsingDescriptors: [NSArray arrayWithObject: [NSSortDescriptor sortDescriptorWithKey: @"title" ascending: YES selector: @selector(localizedCompare:)]]]; - + for (NSMenuItem * item in sortMenuItems) [fSortMenu insertItem: item atIndex: sortMenuIndex++]; - + //you would think this would be called later in this method from updateUI, but it's not reached in awakeFromNib //this must be called after showStatusBar: [fStatusBar updateWithDownload: 0.0 upload: 0.0]; //this should also be after the rest of the setup [self updateForAutoSize]; - + //register for sleep notifications IONotificationPortRef notify; io_object_t iterator; @@ -561,7 +561,7 @@ static void removeKeRangerRansomware() CFRunLoopAddSource(CFRunLoopGetCurrent(), IONotificationPortGetRunLoopSource(notify), kCFRunLoopCommonModes); else NSLog(@"Could not IORegisterForSystemPower"); - + //load previous transfers NSString * historyFile = [fConfigDirectory stringByAppendingPathComponent: TRANSFER_PLIST]; NSArray * history = [NSArray arrayWithContentsOfFile: historyFile]; @@ -571,91 +571,91 @@ static void removeKeRangerRansomware() if ((history = [fDefaults arrayForKey: @"History"])) [fDefaults removeObjectForKey: @"History"]; } - + if (history) { NSMutableArray * waitToStartTorrents = [NSMutableArray arrayWithCapacity: (([history count] > 0 && !fPauseOnLaunch) ? [history count]-1 : 0)]; //theoretical max without doing a lot of work - + for (NSDictionary * historyItem in history) { Torrent * torrent; if ((torrent = [[Torrent alloc] initWithHistory: historyItem lib: fLib forcePause: fPauseOnLaunch])) { [fTorrents addObject: torrent]; - + NSNumber * waitToStart; if (!fPauseOnLaunch && (waitToStart = [historyItem objectForKey: @"WaitToStart"]) && [waitToStart boolValue]) [waitToStartTorrents addObject: torrent]; - + [torrent release]; } } - + //now that all are loaded, let's set those in the queue to waiting for (Torrent * torrent in waitToStartTorrents) [torrent startTransfer]; } - + fBadger = [[Badger alloc] initWithLib: fLib]; - + if ([NSApp isOnMountainLionOrBetter]) [[NSUserNotificationCenterMtLion defaultUserNotificationCenter] setDelegate: self]; - + // remove Share menu items if (![NSApp isOnMountainLionOrBetter]) { [[fShareMenuItem menu] removeItem:fShareMenuItem]; [[fShareContextMenuItem menu] removeItem:fShareContextMenuItem]; } - + //observe notifications NSNotificationCenter * nc = [NSNotificationCenter defaultCenter]; - + [nc addObserver: self selector: @selector(updateUI) name: @"UpdateUI" object: nil]; - + [nc addObserver: self selector: @selector(torrentFinishedDownloading:) name: @"TorrentFinishedDownloading" object: nil]; - + [nc addObserver: self selector: @selector(torrentRestartedDownloading:) name: @"TorrentRestartedDownloading" object: nil]; - + [nc addObserver: self selector: @selector(torrentFinishedSeeding:) name: @"TorrentFinishedSeeding" object: nil]; - + [nc addObserver: self selector: @selector(applyFilter) name: kTorrentDidChangeGroupNotification object: nil]; - + //avoids need of setting delegate [nc addObserver: self selector: @selector(torrentTableViewSelectionDidChange:) name: NSOutlineViewSelectionDidChangeNotification object: fTableView]; - + [nc addObserver: self selector: @selector(changeAutoImport) name: @"AutoImportSettingChange" object: nil]; - + [nc addObserver: self selector: @selector(updateForAutoSize) name: @"AutoSizeSettingChange" object: nil]; - + [nc addObserver: self selector: @selector(updateForExpandCollape) name: @"OutlineExpandCollapse" object: nil]; - + [nc addObserver: fWindow selector: @selector(makeKeyWindow) name: @"MakeWindowKey" object: nil]; - + #warning rename [nc addObserver: self selector: @selector(fullUpdateUI) name: @"UpdateQueue" object: nil]; - + [nc addObserver: self selector: @selector(applyFilter) name: @"ApplyFilter" object: nil]; - + //open newly created torrent file [nc addObserver: self selector: @selector(beginCreateFile:) name: @"BeginCreateTorrentFile" object: nil]; - + //open newly created torrent file [nc addObserver: self selector: @selector(openCreatedFile:) name: @"OpenCreatedTorrentFile" object: nil]; - + [nc addObserver: self selector: @selector(applyFilter) name: @"UpdateGroups" object: nil]; @@ -665,11 +665,11 @@ static void removeKeRangerRansomware() selector: @selector(updateUI) userInfo: nil repeats: YES] retain]; [[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSModalPanelRunLoopMode]; [[NSRunLoop currentRunLoop] addTimer: fTimer forMode: NSEventTrackingRunLoopMode]; - + [self applyFilter]; - + [fWindow makeKeyAndOrderFront: nil]; - + if ([fDefaults boolForKey: @"InfoVisible"]) [self showInfo: nil]; } @@ -677,11 +677,11 @@ static void removeKeRangerRansomware() - (void) applicationDidFinishLaunching: (NSNotification *) notification { [NSApp setServicesProvider: self]; - + //register for dock icon drags (has to be in applicationDidFinishLaunching: to work) [[NSAppleEventManager sharedAppleEventManager] setEventHandler: self andSelector: @selector(handleOpenContentsEvent:replyEvent:) forEventClass: kCoreEventClass andEventID: kAEOpenContents]; - + //if we were opened from a user notification, do the corresponding action if ([NSApp isOnMountainLionOrBetter]) { @@ -689,56 +689,56 @@ static void removeKeRangerRansomware() if (launchNotification) [self userNotificationCenter: nil didActivateNotification: launchNotification]; } - + //auto importing [self checkAutoImportDirectory]; - + //registering the Web UI to Bonjour if ([fDefaults boolForKey: @"RPC"] && [fDefaults boolForKey: @"RPCWebDiscovery"]) [[BonjourController defaultController] startWithPort: [fDefaults integerForKey: @"RPCPort"]]; - + //shamelessly ask for donations if ([fDefaults boolForKey: @"WarningDonate"]) { tr_session_stats stats; tr_sessionGetCumulativeStats(fLib, &stats); const BOOL firstLaunch = stats.sessionCount <= 1; - + NSDate * lastDonateDate = [fDefaults objectForKey: @"DonateAskDate"]; const BOOL timePassed = !lastDonateDate || (-1 * [lastDonateDate timeIntervalSinceNow]) >= DONATE_NAG_TIME; - + if (!firstLaunch && timePassed) { [fDefaults setObject: [NSDate date] forKey: @"DonateAskDate"]; - + NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: NSLocalizedString(@"Support open-source indie software", "Donation beg -> title")]; - + NSString * donateMessage = [NSString stringWithFormat: @"%@\n\n%@", NSLocalizedString(@"Transmission is a full-featured torrent application." " A lot of time and effort have gone into development, coding, and refinement." " If you enjoy using it, please consider showing your love with a donation.", "Donation beg -> message"), NSLocalizedString(@"Donate or not, there will be no difference to your torrenting experience.", "Donation beg -> message")]; - + [alert setInformativeText: donateMessage]; [alert setAlertStyle: NSInformationalAlertStyle]; - + [alert addButtonWithTitle: [NSLocalizedString(@"Donate", "Donation beg -> button") stringByAppendingEllipsis]]; NSButton * noDonateButton = [alert addButtonWithTitle: NSLocalizedString(@"Nope", "Donation beg -> button")]; [noDonateButton setKeyEquivalent: @"\e"]; //escape key - + const BOOL allowNeverAgain = lastDonateDate != nil; //hide the "don't show again" check the first time - give them time to try the app [alert setShowsSuppressionButton: allowNeverAgain]; if (allowNeverAgain) [[alert suppressionButton] setTitle: NSLocalizedString(@"Don't bug me about this ever again.", "Donation beg -> button")]; - + const NSInteger donateResult = [alert runModal]; if (donateResult == NSAlertFirstButtonReturn) [self linkDonate: self]; - + if (allowNeverAgain) [fDefaults setBool: ([[alert suppressionButton] state] != NSOnState) forKey: @"WarningDonate"]; - + [alert release]; } } @@ -749,7 +749,7 @@ static void removeKeRangerRansomware() NSWindow * mainWindow = [NSApp mainWindow]; if (!mainWindow || ![mainWindow isVisible]) [fWindow makeKeyAndOrderFront: nil]; - + return NO; } @@ -765,7 +765,7 @@ static void removeKeRangerRansomware() if (![torrent allDownloaded]) downloading++; } - + if ([fDefaults boolForKey: @"CheckQuitDownloading"] ? downloading > 0 : active > 0) { NSString * message = active == 1 @@ -781,7 +781,7 @@ static void removeKeRangerRansomware() return NSTerminateLater; } } - + return NSTerminateNow; } @@ -793,7 +793,7 @@ static void removeKeRangerRansomware() - (void) applicationWillTerminate: (NSNotification *) notification { fQuitting = YES; - + //stop the Bonjour service if ([BonjourController defaultControllerExists]) [[BonjourController defaultController] stop]; @@ -801,22 +801,22 @@ static void removeKeRangerRansomware() //stop blocklist download if ([BlocklistDownloader isRunning]) [[BlocklistDownloader downloader] cancelDownload]; - + //stop timers and notification checking [[NSNotificationCenter defaultCenter] removeObserver: self]; - + [fTimer invalidate]; [fTimer release]; - + if (fAutoImportTimer) - { + { if ([fAutoImportTimer isValid]) [fAutoImportTimer invalidate]; [fAutoImportTimer release]; } - + [fBadger setQuitting]; - + //remove all torrent downloads if (fPendingTorrentDownloads) { @@ -828,48 +828,48 @@ static void removeKeRangerRansomware() } [fPendingTorrentDownloads release]; } - + //remember window states and close all windows [fDefaults setBool: [[fInfoController window] isVisible] forKey: @"InfoVisible"]; - + if ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]) [[QLPreviewPanel sharedPreviewPanel] updateController]; - + for (NSWindow * window in [NSApp windows]) [window close]; - + [self showStatusBar: NO animate: NO]; [self showFilterBar: NO animate: NO]; - + //save history [self updateTorrentHistory]; [fTableView saveCollapsedGroups]; - - //remaining calls the same as dealloc + + //remaining calls the same as dealloc [fInfoController release]; [fMessageController release]; [fPrefsController release]; - + [fStatusBar release]; [fFilterBar release]; - + [fTorrents release]; [fDisplayedTorrents release]; - + [fAddWindows release]; [fAddingTransfers release]; - + [fOverlayWindow release]; [fBadger release]; - + [fAutoImportedNames release]; - + [fPreviewPanel release]; - + [fConfigDirectory release]; - + [fFileWatcherQueue release]; - + //complete cleanup tr_sessionClose(fLib); } @@ -892,7 +892,7 @@ static void removeKeRangerRansomware() } else urlString = [directObject stringValue]; - + if (urlString) [self openURL: urlString]; } @@ -902,20 +902,20 @@ static void removeKeRangerRansomware() if ([[suggestedName pathExtension] caseInsensitiveCompare: @"torrent"] != NSOrderedSame) { [download cancel]; - + [fPendingTorrentDownloads removeObjectForKey: [[download request] URL]]; if ([fPendingTorrentDownloads count] == 0) { [fPendingTorrentDownloads release]; fPendingTorrentDownloads = nil; } - + NSRunAlertPanel(NSLocalizedString(@"Torrent download failed", "Download not a torrent -> title"), [NSString stringWithFormat: NSLocalizedString(@"It appears that the file \"%@\" from %@ is not a torrent file.", "Download not a torrent -> message"), suggestedName, [[[[download request] URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding]], NSLocalizedString(@"OK", "Download not a torrent -> button"), nil, nil); - + [download release]; } else @@ -935,33 +935,33 @@ static void removeKeRangerRansomware() "Torrent download failed -> message"), [[[[download request] URL] absoluteString] stringByReplacingPercentEscapesUsingEncoding: NSUTF8StringEncoding], [error localizedDescription]], NSLocalizedString(@"OK", "Torrent download failed -> button"), nil, nil); - + [fPendingTorrentDownloads removeObjectForKey: [[download request] URL]]; if ([fPendingTorrentDownloads count] == 0) { [fPendingTorrentDownloads release]; fPendingTorrentDownloads = nil; } - + [download release]; } - (void) downloadDidFinish: (NSURLDownload *) download { NSString * path = [[fPendingTorrentDownloads objectForKey: [[download request] URL]] objectForKey: @"Path"]; - + [self openFiles: [NSArray arrayWithObject: path] addType: ADD_URL forcePath: nil]; - + //delete the torrent file after opening [[NSFileManager defaultManager] removeItemAtPath: path error: NULL]; - + [fPendingTorrentDownloads removeObjectForKey: [[download request] URL]]; if ([fPendingTorrentDownloads count] == 0) { [fPendingTorrentDownloads release]; fPendingTorrentDownloads = nil; } - + [download release]; } @@ -985,17 +985,17 @@ static void removeKeRangerRansomware() deleteTorrentFile = [fDefaults boolForKey: @"DeleteOriginalTorrent"]; canToggleDelete = YES; } - + for (NSString * torrentPath in filenames) { //ensure torrent doesn't already exist tr_ctor * ctor = tr_ctorNew(fLib); tr_ctorSetMetainfoFromFile(ctor, [torrentPath UTF8String]); - + tr_info info; const tr_parse_result result = tr_torrentParse(ctor, &info); tr_ctorFree(ctor); - + if (result != TR_PARSE_OK) { if (result == TR_PARSE_DUPLICATE) @@ -1007,11 +1007,11 @@ static void removeKeRangerRansomware() } else NSAssert2(NO, @"Unknown error code (%d) when attempting to open \"%@\"", result, torrentPath); - + tr_metainfoFree(&info); continue; } - + //determine download location NSString * location; BOOL lockDestination = NO; //don't override the location with a group location if it has a hardcoded path @@ -1026,29 +1026,29 @@ static void removeKeRangerRansomware() location = [torrentPath stringByDeletingLastPathComponent]; else location = nil; - + //determine to show the options window const BOOL showWindow = type == ADD_SHOW_OPTIONS || ([fDefaults boolForKey: @"DownloadAsk"] && (info.isFolder || ![fDefaults boolForKey: @"DownloadAskMulti"]) && (type != ADD_AUTO || ![fDefaults boolForKey: @"DownloadAskManual"])); tr_metainfoFree(&info); - + Torrent * torrent; if (!(torrent = [[Torrent alloc] initWithPath: torrentPath location: location deleteTorrentFile: showWindow ? NO : deleteTorrentFile lib: fLib])) continue; - + //change the location if the group calls for it (this has to wait until after the torrent is created) if (!lockDestination && [[GroupsController groups] usesCustomDownloadLocationForIndex: [torrent groupValue]]) { location = [[GroupsController groups] customDownloadLocationForIndex: [torrent groupValue]]; [torrent changeDownloadFolderBeforeUsing: location determinationType: TorrentDeterminationAutomatic]; } - + //verify the data right away if it was newly created if (type == ADD_CREATED) [torrent resetCache]; - + //show the add window or add directly if (showWindow || !location) { @@ -1056,7 +1056,7 @@ static void removeKeRangerRansomware() lockDestination: lockDestination controller: self torrentFile: torrentPath deleteTorrentCheckEnableInitially: deleteTorrentFile canToggleDelete: canToggleDelete]; [addController showWindow: self]; - + if (!fAddWindows) fAddWindows = [[NSMutableSet alloc] init]; [fAddWindows addObject: addController]; @@ -1066,11 +1066,11 @@ static void removeKeRangerRansomware() { if ([fDefaults boolForKey: @"AutoStartDownload"]) [torrent startTransfer]; - + [torrent update]; [fTorrents addObject: torrent]; [torrent release]; - + if (!fAddingTransfers) fAddingTransfers = [[NSMutableSet alloc] init]; [fAddingTransfers addObject: torrent]; @@ -1083,19 +1083,19 @@ static void removeKeRangerRansomware() - (void) askOpenConfirmed: (AddWindowController *) addController add: (BOOL) add { Torrent * torrent = [addController torrent]; - + if (add) { [torrent setQueuePosition: [fTorrents count]]; - + [torrent update]; [fTorrents addObject: torrent]; [torrent release]; - + if (!fAddingTransfers) fAddingTransfers = [[NSMutableSet alloc] init]; [fAddingTransfers addObject: torrent]; - + [self fullUpdateUI]; } else @@ -1103,7 +1103,7 @@ static void removeKeRangerRansomware() [torrent closeRemoveTorrent: NO]; [torrent release]; } - + [fAddWindows removeObject: addController]; if ([fAddWindows count] == 0) { @@ -1122,32 +1122,32 @@ static void removeKeRangerRansomware() [self duplicateOpenMagnetAlert: address transferName: name]; return; } - + //determine download location NSString * location = nil; if ([fDefaults boolForKey: @"DownloadLocationConstant"]) location = [[fDefaults stringForKey: @"DownloadFolder"] stringByExpandingTildeInPath]; - + Torrent * torrent; if (!(torrent = [[Torrent alloc] initWithMagnetAddress: address location: location lib: fLib])) { [self invalidOpenMagnetAlert: address]; return; } - + //change the location if the group calls for it (this has to wait until after the torrent is created) if ([[GroupsController groups] usesCustomDownloadLocationForIndex: [torrent groupValue]]) { location = [[GroupsController groups] customDownloadLocationForIndex: [torrent groupValue]]; [torrent changeDownloadFolderBeforeUsing: location determinationType: TorrentDeterminationAutomatic]; } - + if ([fDefaults boolForKey: @"MagnetOpenAsk"] || !location) { AddMagnetWindowController * addController = [[AddMagnetWindowController alloc] initWithTorrent: torrent destination: location controller: self]; [addController showWindow: self]; - + if (!fAddWindows) fAddWindows = [[NSMutableSet alloc] init]; [fAddWindows addObject: addController]; @@ -1157,11 +1157,11 @@ static void removeKeRangerRansomware() { if ([fDefaults boolForKey: @"AutoStartDownload"]) [torrent startTransfer]; - + [torrent update]; [fTorrents addObject: torrent]; [torrent release]; - + if (!fAddingTransfers) fAddingTransfers = [[NSMutableSet alloc] init]; [fAddingTransfers addObject: torrent]; @@ -1173,19 +1173,19 @@ static void removeKeRangerRansomware() - (void) askOpenMagnetConfirmed: (AddMagnetWindowController *) addController add: (BOOL) add { Torrent * torrent = [addController torrent]; - + if (add) { [torrent setQueuePosition: [fTorrents count]]; - + [torrent update]; [fTorrents addObject: torrent]; [torrent release]; - + if (!fAddingTransfers) fAddingTransfers = [[NSMutableSet alloc] init]; [fAddingTransfers addObject: torrent]; - + [self fullUpdateUI]; } else @@ -1193,7 +1193,7 @@ static void removeKeRangerRansomware() [torrent closeRemoveTorrent: NO]; [torrent release]; } - + [fAddWindows removeObject: addController]; if ([fAddWindows count] == 0) { @@ -1212,7 +1212,7 @@ static void removeKeRangerRansomware() - (void) openFilesWithDict: (NSDictionary *) dictionary { [self openFiles: [dictionary objectForKey: @"Filenames"] addType: [[dictionary objectForKey: @"AddType"] intValue] forcePath: nil]; - + [dictionary release]; } @@ -1227,20 +1227,20 @@ static void removeKeRangerRansomware() - (void) openShowSheet: (id) sender { NSOpenPanel * panel = [NSOpenPanel openPanel]; - + [panel setAllowsMultipleSelection: YES]; [panel setCanChooseFiles: YES]; [panel setCanChooseDirectories: NO]; - + [panel setAllowedFileTypes: [NSArray arrayWithObjects: @"org.bittorrent.torrent", @"torrent", nil]]; - + [panel beginSheetModalForWindow: fWindow completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { NSMutableArray * filenames = [NSMutableArray arrayWithCapacity: [[panel URLs] count]]; for (NSURL * url in [panel URLs]) [filenames addObject: [url path]]; - + NSDictionary * dictionary = [[NSDictionary alloc] initWithObjectsAndKeys: filenames, @"Filenames", [NSNumber numberWithInt: sender == fOpenIgnoreDownloadFolder ? ADD_SHOW_OPTIONS : ADD_MANUAL], @"AddType", nil]; [self performSelectorOnMainThread: @selector(openFilesWithDict:) withObject: dictionary waitUntilDone: NO]; @@ -1252,7 +1252,7 @@ static void removeKeRangerRansomware() { if (![fDefaults boolForKey: @"WarningInvalidOpen"]) return; - + NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"\"%@\" is not a valid torrent file.", "Open invalid alert -> title"), filename]]; @@ -1261,7 +1261,7 @@ static void removeKeRangerRansomware() "Open invalid alert -> message")]; [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Open invalid alert -> button")]; - + [alert runModal]; if ([[alert suppressionButton] state] == NSOnState) [fDefaults setBool: NO forKey: @"WarningInvalidOpen"]; @@ -1272,14 +1272,14 @@ static void removeKeRangerRansomware() { if (![fDefaults boolForKey: @"WarningInvalidOpen"]) return; - + NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: NSLocalizedString(@"Adding magnetized transfer failed.", "Magnet link failed -> title")]; [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"There was an error when adding the magnet link \"%@\"." " The transfer will not occur.", "Magnet link failed -> message"), address]]; [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Magnet link failed -> button")]; - + [alert runModal]; if ([[alert suppressionButton] state] == NSOnState) [fDefaults setBool: NO forKey: @"WarningInvalidOpen"]; @@ -1290,7 +1290,7 @@ static void removeKeRangerRansomware() { if (![fDefaults boolForKey: @"WarningDuplicate"]) return; - + NSAlert * alert = [[NSAlert alloc] init]; [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"A transfer of \"%@\" already exists.", "Open duplicate alert -> title"), name]]; @@ -1300,7 +1300,7 @@ static void removeKeRangerRansomware() [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Open duplicate alert -> button")]; [alert setShowsSuppressionButton: YES]; - + [alert runModal]; if ([[alert suppressionButton] state]) [fDefaults setBool: NO forKey: @"WarningDuplicate"]; @@ -1311,7 +1311,7 @@ static void removeKeRangerRansomware() { if (![fDefaults boolForKey: @"WarningDuplicate"]) return; - + NSAlert * alert = [[NSAlert alloc] init]; if (name) [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"A transfer of \"%@\" already exists.", @@ -1325,7 +1325,7 @@ static void removeKeRangerRansomware() [alert setAlertStyle: NSWarningAlertStyle]; [alert addButtonWithTitle: NSLocalizedString(@"OK", "Open duplicate magnet alert -> button")]; [alert setShowsSuppressionButton: YES]; - + [alert runModal]; if ([[alert suppressionButton] state]) [fDefaults setBool: NO forKey: @"WarningDuplicate"]; @@ -1353,18 +1353,18 @@ static void removeKeRangerRansomware() else urlString = [@"http://" stringByAppendingString: urlString]; } - + NSURLRequest * request = [NSURLRequest requestWithURL: [NSURL URLWithString: urlString] cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval: 60]; - + if ([fPendingTorrentDownloads objectForKey: [request URL]]) { NSLog(@"Already downloading %@", [request URL]); return; } - + NSURLDownload * download = [[NSURLDownload alloc] initWithRequest: request delegate: self]; - + if (!fPendingTorrentDownloads) fPendingTorrentDownloads = [[NSMutableDictionary alloc] init]; [fPendingTorrentDownloads setObject: [NSMutableDictionary dictionaryWithObject: download forKey: @"Download"] forKey: [request URL]]; @@ -1376,7 +1376,7 @@ static void removeKeRangerRansomware() if (!fUrlSheetController) { fUrlSheetController = [[URLSheetWindowController alloc] initWithController: self]; - + [NSApp beginSheet: [fUrlSheetController window] modalForWindow: fWindow modalDelegate: self didEndSelector: @selector(urlSheetDidEnd:returnCode:contextInfo:) contextInfo: nil]; } } @@ -1388,7 +1388,7 @@ static void removeKeRangerRansomware() NSString * urlString = [fUrlSheetController urlString]; [self performSelectorOnMainThread: @selector(openURL:) withObject: urlString waitUntilDone: NO]; } - + [fUrlSheetController release]; fUrlSheetController = nil; } @@ -1406,11 +1406,11 @@ static void removeKeRangerRansomware() - (void) resumeAllTorrents: (id) sender { NSMutableArray * torrents = [NSMutableArray arrayWithCapacity: [fTorrents count]]; - + for (Torrent * torrent in fTorrents) if (![torrent isFinishedSeeding]) [torrents addObject: torrent]; - + [self resumeTorrents: torrents]; } @@ -1418,7 +1418,7 @@ static void removeKeRangerRansomware() { for (Torrent * torrent in torrents) [torrent startTransfer]; - + [self fullUpdateUI]; } @@ -1430,11 +1430,11 @@ static void removeKeRangerRansomware() - (void) resumeWaitingTorrents: (id) sender { NSMutableArray * torrents = [NSMutableArray arrayWithCapacity: [fTorrents count]]; - + for (Torrent * torrent in fTorrents) if ([torrent waitingToStart]) [torrents addObject: torrent]; - + [self resumeTorrentsNoWait: torrents]; } @@ -1443,7 +1443,7 @@ static void removeKeRangerRansomware() //iterate through instead of all at once to ensure no conflicts for (Torrent * torrent in torrents) [torrent startTransferNoQueue]; - + [self fullUpdateUI]; } @@ -1463,10 +1463,10 @@ static void removeKeRangerRansomware() for (Torrent * torrent in torrents) if ([torrent waitingToStart]) [torrent stopTransfer]; - + for (Torrent * torrent in torrents) [torrent stopTransfer]; - + [self fullUpdateUI]; } @@ -1487,14 +1487,14 @@ static void removeKeRangerRansomware() { NSDictionary * dict = @{ @"Torrents" : torrents, @"DeleteData" : @(deleteData) }; - + NSString * title, * message; - + const NSInteger selected = [torrents count]; if (selected == 1) { NSString * torrentName = [(Torrent *)[torrents objectAtIndex: 0] name]; - + if (deleteData) title = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove \"%@\" from the transfer list" @@ -1503,7 +1503,7 @@ static void removeKeRangerRansomware() title = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove \"%@\" from the transfer list?", "Removal confirm panel -> title"), torrentName]; - + message = NSLocalizedString(@"This transfer is active." " Once removed, continuing the transfer will require the torrent file or magnet link.", "Removal confirm panel -> message"); @@ -1518,7 +1518,7 @@ static void removeKeRangerRansomware() title = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove %@ transfers from the transfer list?", "Removal confirm panel -> title"), [NSString formattedUInteger: selected]]; - + if (selected == active) message = [NSString stringWithFormat: NSLocalizedString(@"There are %@ active transfers.", "Removal confirm panel -> message part 1"), [NSString formattedUInteger: active]]; @@ -1529,14 +1529,14 @@ static void removeKeRangerRansomware() NSLocalizedString(@"Once removed, continuing the transfers will require the torrent files or magnet links.", "Removal confirm panel -> message part 2")]; } - + NSBeginAlertSheet(title, NSLocalizedString(@"Remove", "Removal confirm panel -> button"), NSLocalizedString(@"Cancel", "Removal confirm panel -> button"), nil, fWindow, self, nil, @selector(removeSheetDidEnd:returnCode:contextInfo:), [dict retain], @"%@", message); return; } } - + [self confirmRemoveTorrents: torrents deleteData: deleteData]; } @@ -1556,14 +1556,14 @@ static void removeKeRangerRansomware() //don't want any of these starting then stopping if ([torrent waitingToStart]) [torrent stopTransfer]; - + //let's expand all groups that have removed items - they either don't exist anymore, are already expanded, or are collapsed (rpc) [fTableView removeCollapsedGroup: [torrent groupValue]]; - + //we can't assume the window is active - RPC removal, for example [fBadger removeTorrent: torrent]; } - + //#5106 - don't try to remove torrents that have already been removed (fix for a bug, but better safe than crash anyway) NSIndexSet * indexesToRemove = [torrents indexesOfObjectsWithOptions: NSEnumerationConcurrent passingTest: ^BOOL(Torrent * torrent, NSUInteger idx, BOOL * stop) { return [fTorrents indexOfObjectIdenticalTo: torrent] != NSNotFound; @@ -1572,46 +1572,46 @@ static void removeKeRangerRansomware() { NSLog(@"trying to remove %ld transfers, but %ld have already been removed", [torrents count], [torrents count] - [indexesToRemove count]); torrents = [torrents objectsAtIndexes: indexesToRemove]; - + if ([indexesToRemove count] == 0) { [self fullUpdateUI]; return; } } - + [fTorrents removeObjectsInArray: torrents]; - + //set up helpers to remove from the table __block BOOL beganUpdate = NO; - + void (^doTableRemoval)(NSMutableArray *, id) = ^(NSMutableArray * displayedTorrents, id parent) { NSIndexSet * indexes = [displayedTorrents indexesOfObjectsWithOptions: NSEnumerationConcurrent passingTest: ^(id obj, NSUInteger idx, BOOL * stop) { return [torrents containsObject: obj]; }]; - + if ([indexes count] > 0) { if (!beganUpdate) { [NSAnimationContext beginGrouping]; //this has to be before we set the completion handler (#4874) - + //we can't closeRemoveTorrent: until it's no longer in the GUI at all [[NSAnimationContext currentContext] setCompletionHandler: ^{ for (Torrent * torrent in torrents) [torrent closeRemoveTorrent: deleteData]; }]; - + [fTableView beginUpdates]; beganUpdate = YES; } - + [fTableView removeItemsAtIndexes: indexes inParent: parent withAnimation: NSTableViewAnimationSlideLeft]; [displayedTorrents removeObjectsAtIndexes: indexes]; } }; - + //if not removed from the displayed torrents here, fullUpdateUI might cause a crash if ([fDisplayedTorrents count] > 0) { @@ -1622,21 +1622,21 @@ static void removeKeRangerRansomware() } else doTableRemoval(fDisplayedTorrents, nil); - + if (beganUpdate) { [fTableView endUpdates]; [NSAnimationContext endGrouping]; } } - + if (!beganUpdate) { //do here if we're not doing it at the end of the animation for (Torrent * torrent in torrents) [torrent closeRemoveTorrent: deleteData]; } - + [self fullUpdateUI]; } @@ -1653,11 +1653,11 @@ static void removeKeRangerRansomware() - (void) clearCompleted: (id) sender { NSMutableArray * torrents = [NSMutableArray array]; - + for (Torrent * torrent in fTorrents) if ([torrent isFinishedSeeding]) [torrents addObject: torrent]; - + if ([fDefaults boolForKey: @"WarningRemoveCompleted"]) { NSString * message, * info; @@ -1666,7 +1666,7 @@ static void removeKeRangerRansomware() NSString * torrentName = [(Torrent *)[torrents objectAtIndex: 0] name]; message = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove \"%@\" from the transfer list?", "Remove completed confirm panel -> title"), torrentName]; - + info = NSLocalizedString(@"Once removed, continuing the transfer will require the torrent file or magnet link.", "Remove completed confirm panel -> message"); } @@ -1674,11 +1674,11 @@ static void removeKeRangerRansomware() { message = [NSString stringWithFormat: NSLocalizedString(@"Are you sure you want to remove %@ completed transfers from the transfer list?", "Remove completed confirm panel -> title"), [NSString formattedUInteger: [torrents count]]]; - + info = NSLocalizedString(@"Once removed, continuing the transfers will require the torrent files or magnet links.", "Remove completed confirm panel -> message"); } - + NSAlert * alert = [[[NSAlert alloc] init] autorelease]; [alert setMessageText: message]; [alert setInformativeText: info]; @@ -1686,15 +1686,15 @@ static void removeKeRangerRansomware() [alert addButtonWithTitle: NSLocalizedString(@"Remove", "Remove completed confirm panel -> button")]; [alert addButtonWithTitle: NSLocalizedString(@"Cancel", "Remove completed confirm panel -> button")]; [alert setShowsSuppressionButton: YES]; - + const NSInteger returnCode = [alert runModal]; if ([[alert suppressionButton] state]) [fDefaults setBool: NO forKey: @"WarningRemoveCompleted"]; - + if (returnCode != NSAlertFirstButtonReturn) return; } - + [self confirmRemoveTorrents: torrents deleteData: NO]; } @@ -1711,7 +1711,7 @@ static void removeKeRangerRansomware() [panel setCanChooseFiles: NO]; [panel setCanChooseDirectories: YES]; [panel setCanCreateDirectories: YES]; - + NSInteger count = [torrents count]; if (count == 1) [panel setMessage: [NSString stringWithFormat: NSLocalizedString(@"Select the new folder for \"%@\".", @@ -1719,7 +1719,7 @@ static void removeKeRangerRansomware() else [panel setMessage: [NSString stringWithFormat: NSLocalizedString(@"Select the new folder for %d data files.", "Move torrent -> select destination folder"), count]]; - + [panel beginSheetModalForWindow: fWindow completionHandler: ^(NSInteger result) { if (result == NSFileHandlingPanelOKButton) { @@ -1741,22 +1741,22 @@ static void removeKeRangerRansomware() [torrents release]; return; } - + Torrent * torrent = [torrents objectAtIndex: 0]; - + if (![torrent isMagnet] && [[NSFileManager defaultManager] fileExistsAtPath: [torrent torrentLocation]]) { NSSavePanel * panel = [NSSavePanel savePanel]; [panel setAllowedFileTypes: [NSArray arrayWithObjects: @"org.bittorrent.torrent", @"torrent", nil]]; [panel setExtensionHidden: NO]; - + [panel setNameFieldStringValue: [torrent name]]; - + [panel beginSheetModalForWindow: fWindow completionHandler: ^(NSInteger result) { //copy torrent to new location with name of data file if (result == NSFileHandlingPanelOKButton) [torrent copyTorrentFileTo: [[panel URL] path]]; - + [torrents removeObjectAtIndex: 0]; [self performSelectorOnMainThread: @selector(copyTorrentFileForTorrents:) withObject: torrents waitUntilDone: NO]; }]; @@ -1769,15 +1769,15 @@ static void removeKeRangerRansomware() [alert addButtonWithTitle: NSLocalizedString(@"OK", "Torrent file copy alert -> button")]; [alert setMessageText: [NSString stringWithFormat: NSLocalizedString(@"Copy of \"%@\" Cannot Be Created", "Torrent file copy alert -> title"), [torrent name]]]; - [alert setInformativeText: [NSString stringWithFormat: + [alert setInformativeText: [NSString stringWithFormat: NSLocalizedString(@"The torrent file (%@) cannot be found.", "Torrent file copy alert -> message"), [torrent torrentLocation]]]; [alert setAlertStyle: NSWarningAlertStyle]; - + [alert runModal]; [alert release]; } - + [torrents removeObjectAtIndex: 0]; [self copyTorrentFileForTorrents: torrents]; } @@ -1786,16 +1786,16 @@ static void removeKeRangerRansomware() - (void) copyMagnetLinks: (id) sender { NSArray * torrents = [fTableView selectedTorrents]; - + if ([torrents count] <= 0) return; - + NSMutableArray * links = [NSMutableArray arrayWithCapacity: [torrents count]]; for (Torrent * torrent in torrents) [links addObject: [torrent magnetLink]]; - + NSString * text = [links componentsJoinedByString: @"\n"]; - + NSPasteboard * pb = [NSPasteboard generalPasteboard]; [pb clearContents]; [pb writeObjects: [NSArray arrayWithObject: text]]; @@ -1811,7 +1811,7 @@ static void removeKeRangerRansomware() if (location) [paths addObject: [NSURL fileURLWithPath: location]]; } - + if ([paths count] > 0) [[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs: paths]; } @@ -1821,13 +1821,13 @@ static void removeKeRangerRansomware() NSArray * selected = [fTableView selectedTorrents]; NSAssert([selected count] == 1, @"1 transfer needs to be selected to rename, but %ld are selected", [selected count]); Torrent * torrent = [selected objectAtIndex:0]; - + [FileRenameSheetController presentSheetForTorrent:torrent modalForWindow: fWindow completionHandler: ^(BOOL didRename) { if (didRename) { dispatch_async(dispatch_get_main_queue(), ^{ [self fullUpdateUI]; - + [[NSNotificationCenter defaultCenter] postNotificationName: @"ResetInspector" object: self userInfo: @{ @"Torrent" : torrent }]; }); } @@ -1852,7 +1852,7 @@ static void removeKeRangerRansomware() { for (Torrent * torrent in torrents) [torrent resetCache]; - + [self applyFilter]; } @@ -1883,18 +1883,18 @@ static void removeKeRangerRansomware() { [fInfoController updateInfoStats]; [[fInfoController window] orderFront: nil]; - + if ([fInfoController canQuickLook] && [QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]) [[QLPreviewPanel sharedPreviewPanel] reloadData]; } - + [[fWindow toolbar] validateVisibleItems]; } - (void) resetInfo { [fInfoController setInfoForTorrents: [fTableView selectedTorrents]]; - + if ([QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]) [[QLPreviewPanel sharedPreviewPanel] reloadData]; } @@ -1911,7 +1911,7 @@ static void removeKeRangerRansomware() { if (!fMessageController) fMessageController = [[MessageWindowController alloc] init]; - + return fMessageController; } @@ -1932,22 +1932,22 @@ static void removeKeRangerRansomware() for (Torrent * torrent in fTorrents) { [torrent update]; - + //pull the upload and download speeds - most consistent by using current stats dlRate += [torrent downloadRate]; ulRate += [torrent uploadRate]; - + anyCompleted |= [torrent isFinishedSeeding]; } - + if (![NSApp isHidden]) { if ([fWindow isVisible]) { [self sortTorrents: NO]; - + [fStatusBar updateWithDownload: dlRate upload: ulRate]; - + [fClearCompletedButton setHidden: !anyCompleted]; } @@ -1955,7 +1955,7 @@ static void removeKeRangerRansomware() if ([[fInfoController window] isVisible]) [fInfoController updateInfoStats]; } - + //badge dock [fBadger updateBadgeWithDownload: dlRate upload: ulRate]; } @@ -1978,17 +1978,17 @@ static void removeKeRangerRansomware() [NSString formattedUInteger: totalCount]]; else totalTorrentsString = NSLocalizedString(@"1 transfer", "Status bar transfer count"); - + if (filtering) { NSUInteger count = [fTableView numberOfRows]; //have to factor in collapsed rows if (count > 0 && ![[fDisplayedTorrents objectAtIndex: 0] isKindOfClass: [Torrent class]]) count -= [fDisplayedTorrents count]; - + totalTorrentsString = [NSString stringWithFormat: NSLocalizedString(@"%@ of %@", "Status bar transfer count"), [NSString formattedUInteger: count], totalTorrentsString]; } - + [fTotalTorrentsField setStringValue: totalTorrentsString]; } @@ -2001,7 +2001,7 @@ static void removeKeRangerRansomware() { if (![notification userInfo]) return; - + if ([notification activationType] == NSUserNotificationActivationTypeActionButtonClicked) //reveal { Torrent * torrent = [self torrentForHash: [[notification userInfo] objectForKey: @"Hash"]]; @@ -2037,15 +2037,15 @@ static void removeKeRangerRansomware() row = [fTableView rowForItem: torrent]; } } - + if (row == -1) { //not found - must be filtering NSAssert([fDefaults boolForKey: @"FilterBar"], @"expected the filter to be enabled"); [fFilterBar reset: YES]; - + row = [fTableView rowForItem: torrent]; - + //if it's not shown, it has to be in a collapsed row...again if ([fDefaults boolForKey: @"SortByGroup"]) { @@ -2065,7 +2065,7 @@ static void removeKeRangerRansomware() } } } - + NSAssert1(row != -1, @"expected a row to be found for torrent %@", torrent); [self showMainWindow: nil]; @@ -2077,7 +2077,7 @@ static void removeKeRangerRansomware() - (Torrent *) torrentForHash: (NSString *) hash { NSParameterAssert(hash != nil); - + __block Torrent * torrent = nil; [fTorrents enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL * stop) { if ([[(Torrent *)obj hashString] isEqualToString: hash]) @@ -2092,7 +2092,7 @@ static void removeKeRangerRansomware() - (void) torrentFinishedDownloading: (NSNotification *) notification { Torrent * torrent = [notification object]; - + if ([[[notification userInfo] objectForKey: @"WasRunning"] boolValue]) { if (!fSoundPlaying && [fDefaults boolForKey: @"PlayDownloadSound"]) @@ -2105,48 +2105,48 @@ static void removeKeRangerRansomware() [sound play]; } } - + NSString * location = [torrent dataLocation]; - + NSString * notificationTitle = NSLocalizedString(@"Download Complete", "notification title"); if ([NSApp isOnMountainLionOrBetter]) { NSUserNotification * notification = [[NSUserNotificationMtLion alloc] init]; [notification setTitle: notificationTitle]; [notification setInformativeText: [torrent name]]; - + [notification setHasActionButton: YES]; [notification setActionButtonTitle: NSLocalizedString(@"Show", "notification button")]; - + NSMutableDictionary * userInfo = [NSMutableDictionary dictionaryWithObject: [torrent hashString] forKey: @"Hash"]; if (location) [userInfo setObject: location forKey: @"Location"]; [notification setUserInfo: userInfo]; - + [[NSUserNotificationCenterMtLion defaultUserNotificationCenter] deliverNotification: notification]; [notification release]; } - + NSMutableDictionary * clickContext = [NSMutableDictionary dictionaryWithObjectsAndKeys: GROWL_DOWNLOAD_COMPLETE, @"Type", nil]; - + if (location) [clickContext setObject: location forKey: @"Location"]; - + [GrowlApplicationBridge notifyWithTitle: notificationTitle description: [torrent name] notificationName: GROWL_DOWNLOAD_COMPLETE iconData: nil priority: 0 isSticky: NO clickContext: clickContext]; - + //NSLog(@"delegate: %@", [[NSUserNotificationCenterMtLion defaultUserNotificationCenter] delegate]); - + if (![fWindow isMainWindow]) [fBadger addCompletedTorrent: torrent]; - + //bounce download stack [[NSDistributedNotificationCenter defaultCenter] postNotificationName: @"com.apple.DownloadFileFinished" object: [torrent dataLocation]]; } - + [self fullUpdateUI]; } @@ -2158,7 +2158,7 @@ static void removeKeRangerRansomware() - (void) torrentFinishedSeeding: (NSNotification *) notification { Torrent * torrent = [notification object]; - + if (!fSoundPlaying && [fDefaults boolForKey: @"PlaySeedingSound"]) { NSSound * sound; @@ -2169,37 +2169,37 @@ static void removeKeRangerRansomware() [sound play]; } } - + NSString * location = [torrent dataLocation]; - + NSString * notificationTitle = NSLocalizedString(@"Seeding Complete", "notification title"); if ([NSApp isOnMountainLionOrBetter]) { NSUserNotification * notification = [[NSUserNotificationMtLion alloc] init]; [notification setTitle: notificationTitle]; [notification setInformativeText: [torrent name]]; - + [notification setHasActionButton: YES]; [notification setActionButtonTitle: NSLocalizedString(@"Show", "notification button")]; - + NSMutableDictionary * userInfo = [NSMutableDictionary dictionaryWithObject: [torrent hashString] forKey: @"Hash"]; if (location) [userInfo setObject: location forKey: @"Location"]; [notification setUserInfo: userInfo]; - + [[NSUserNotificationCenterMtLion defaultUserNotificationCenter] deliverNotification: notification]; [notification release]; } - + NSMutableDictionary * clickContext = [NSMutableDictionary dictionaryWithObject: GROWL_SEEDING_COMPLETE forKey: @"Type"]; - + if (location) [clickContext setObject: location forKey: @"Location"]; - + [GrowlApplicationBridge notifyWithTitle: notificationTitle description: [torrent name] notificationName: GROWL_SEEDING_COMPLETE iconData: nil priority: 0 isSticky: NO clickContext: clickContext]; - + //removing from the list calls fullUpdateUI if ([torrent removeWhenFinishSeeding]) [self confirmRemoveTorrents: @[ torrent ] deleteData: NO]; @@ -2207,9 +2207,9 @@ static void removeKeRangerRansomware() { if (![fWindow isMainWindow]) [fBadger addCompletedTorrent: torrent]; - + [self fullUpdateUI]; - + if ([[fTableView selectedTorrents] containsObject: torrent]) { [fInfoController updateInfoStats]; @@ -2221,10 +2221,10 @@ static void removeKeRangerRansomware() - (void) updateTorrentHistory { NSMutableArray * history = [NSMutableArray arrayWithCapacity: [fTorrents count]]; - + for (Torrent * torrent in fTorrents) [history addObject: [torrent history]]; - + NSString * historyFile = [fConfigDirectory stringByAppendingPathComponent: TRANSFER_PLIST]; [history writeToFile: historyFile atomically: YES]; } @@ -2263,9 +2263,9 @@ static void removeKeRangerRansomware() NSAssert1(NO, @"Unknown sort tag received: %ld", [(NSMenuItem *)sender tag]); return; } - + [fDefaults setObject: sortType forKey: @"Sort"]; - + [self sortTorrents: YES]; } @@ -2273,7 +2273,7 @@ static void removeKeRangerRansomware() { BOOL sortByGroup = ![fDefaults boolForKey: @"SortByGroup"]; [fDefaults setBool: sortByGroup forKey: @"SortByGroup"]; - + [self applyFilter]; } @@ -2297,17 +2297,17 @@ static void removeKeRangerRansomware() - (void) sortTorrentsCallUpdates: (BOOL) callUpdates includeQueueOrder: (BOOL) includeQueueOrder { const BOOL asc = ![fDefaults boolForKey: @"SortReverse"]; - + NSArray * descriptors; NSSortDescriptor * nameDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"name" ascending: asc selector: @selector(localizedStandardCompare:)]; - + NSString * sortType = [fDefaults stringForKey: @"Sort"]; if ([sortType isEqualToString: SORT_STATE]) { NSSortDescriptor * stateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"stateSortKey" ascending: !asc], * progressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progress" ascending: !asc], * ratioDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"ratio" ascending: !asc]; - + descriptors = [NSArray arrayWithObjects: stateDescriptor, progressDescriptor, ratioDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_PROGRESS]) @@ -2315,32 +2315,32 @@ static void removeKeRangerRansomware() NSSortDescriptor * progressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progress" ascending: asc], * ratioProgressDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"progressStopRatio" ascending: asc], * ratioDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"ratio" ascending: asc]; - + descriptors = [NSArray arrayWithObjects: progressDescriptor, ratioProgressDescriptor, ratioDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_TRACKER]) { NSSortDescriptor * trackerDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"trackerSortKey" ascending: asc selector: @selector(localizedCaseInsensitiveCompare:)]; - + descriptors = [NSArray arrayWithObjects: trackerDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_ACTIVITY]) { NSSortDescriptor * rateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"totalRate" ascending: !asc]; NSSortDescriptor * activityDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"dateActivityOrAdd" ascending: !asc]; - + descriptors = [NSArray arrayWithObjects: rateDescriptor, activityDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_DATE]) { NSSortDescriptor * dateDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"dateAdded" ascending: asc]; - + descriptors = [NSArray arrayWithObjects: dateDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_SIZE]) { NSSortDescriptor * sizeDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"size" ascending: asc]; - + descriptors = [NSArray arrayWithObjects: sizeDescriptor, nameDescriptor, nil]; } else if ([sortType isEqualToString: SORT_NAME]) @@ -2350,17 +2350,17 @@ static void removeKeRangerRansomware() else { NSAssert1([sortType isEqualToString: SORT_ORDER], @"Unknown sort type received: %@", sortType); - + if (!includeQueueOrder) return; - + NSSortDescriptor * orderDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"queuePosition" ascending: asc]; - + descriptors = [NSArray arrayWithObject: orderDescriptor]; } - + BOOL beganTableUpdate = !callUpdates; - + //actually sort if ([fDefaults boolForKey: @"SortByGroup"]) { @@ -2369,7 +2369,7 @@ static void removeKeRangerRansomware() } else [self rearrangeTorrentTableArray: fDisplayedTorrents forParent: nil withSortDescriptors: descriptors beganTableUpdate: &beganTableUpdate]; - + if (beganTableUpdate && callUpdates) { [fTableView endUpdates]; @@ -2389,10 +2389,10 @@ static void removeKeRangerRansomware() if (result != NSOrderedSame) return result; } - + return NSOrderedSame; }]; - + if (insertIndex != currentIndex) { if (!*beganTableUpdate) @@ -2400,12 +2400,12 @@ static void removeKeRangerRansomware() *beganTableUpdate = YES; [fTableView beginUpdates]; } - + [rearrangeArray moveObjectAtIndex: currentIndex toIndex: insertIndex]; [fTableView moveItemAtIndex: currentIndex inParent: parent toIndex: insertIndex inParent: parent]; } } - + NSAssert2([rearrangeArray isEqualToArray: [rearrangeArray sortedArrayUsingDescriptors: descriptors]], @"Torrent rearranging didn't work! %@ %@", rearrangeArray, [rearrangeArray sortedArrayUsingDescriptors: descriptors]); } @@ -2424,15 +2424,15 @@ static void removeKeRangerRansomware() filterPause = YES; else filterStatus = NO; - + const NSInteger groupFilterValue = [fDefaults integerForKey: @"FilterGroup"]; const BOOL filterGroup = groupFilterValue != GROUP_FILTER_ALL_TAG; - + NSArray * searchStrings = [fFilterBar searchStrings]; if (searchStrings && [searchStrings count] == 0) searchStrings = nil; const BOOL filterTracker = searchStrings && [[fDefaults stringForKey: @"FilterSearchType"] isEqualToString: FILTER_TYPE_TRACKER]; - + //filter & get counts of each type NSIndexSet * indexesOfNonFilteredTorrents = [fTorrents indexesOfObjectsWithOptions: NSEnumerationConcurrent passingTest: ^BOOL(Torrent * torrent, NSUInteger idx, BOOL * stop) { //check status @@ -2441,7 +2441,7 @@ static void removeKeRangerRansomware() const BOOL isActive = ![torrent isStalled]; if (isActive) OSAtomicIncrement32(&active); - + if ([torrent isSeeding]) { OSAtomicIncrement32(&seeding); @@ -2461,12 +2461,12 @@ static void removeKeRangerRansomware() if (filterStatus && !filterPause) return NO; } - + //checkGroup if (filterGroup) if ([torrent groupValue] != groupFilterValue) return NO; - + //check text field if (searchStrings) { @@ -2474,7 +2474,7 @@ static void removeKeRangerRansomware() if (filterTracker) { NSArray * trackers = [torrent allTrackersFlat]; - + //to count, we need each string in at least 1 tracker [searchStrings enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id searchString, NSUInteger idx, BOOL * stop) { __block BOOL found = NO; @@ -2502,24 +2502,24 @@ static void removeKeRangerRansomware() } }]; } - + if (removeTextField) return NO; } - + return YES; }]; - + NSArray * allTorrents = [fTorrents objectsAtIndexes: indexesOfNonFilteredTorrents]; - + //set button tooltips if (fFilterBar) [fFilterBar setCountAll: [fTorrents count] active: active downloading: downloading seeding: seeding paused: paused]; - + //if either the previous or current lists are blank, set its value to the other const BOOL groupRows = [allTorrents count] > 0 ? [fDefaults boolForKey: @"SortByGroup"] : ([fDisplayedTorrents count] > 0 && [[fDisplayedTorrents objectAtIndex: 0] isKindOfClass: [TorrentGroup class]]); const BOOL wasGroupRows = [fDisplayedTorrents count] > 0 ? [[fDisplayedTorrents objectAtIndex: 0] isKindOfClass: [TorrentGroup class]] : groupRows; - + #warning could probably be merged with later code somehow //clear display cache for not-shown torrents if ([fDisplayedTorrents count] > 0) @@ -2530,7 +2530,7 @@ static void removeKeRangerRansomware() if (![allTorrents containsObject: torrent]) [torrent setPreviousFinishedPieces: nil]; }; - + if (wasGroupRows) [fDisplayedTorrents enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^(id obj, NSUInteger idx, BOOL * stop) { [[(TorrentGroup *)obj torrents] enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: removePreviousFinishedPieces]; @@ -2538,7 +2538,7 @@ static void removeKeRangerRansomware() else [fDisplayedTorrents enumerateObjectsWithOptions: NSEnumerationConcurrent usingBlock: removePreviousFinishedPieces]; } - + BOOL beganUpdates = NO; //don't animate torrents when first launching @@ -2547,13 +2547,13 @@ static void removeKeRangerRansomware() [[NSAnimationContext currentContext] setDuration: 0]; }); [NSAnimationContext beginGrouping]; - + //add/remove torrents (and rearrange for groups), one by one if (!groupRows && !wasGroupRows) { NSMutableIndexSet * addIndexes = [NSMutableIndexSet indexSet], * removePreviousIndexes = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fDisplayedTorrents count])]; - + //for each of the torrents to add, find if it already exists (and keep track of those we've already added & those we need to remove) [allTorrents enumerateObjectsWithOptions: 0 usingBlock: ^(id objAll, NSUInteger previousIndex, BOOL * stop) { const NSUInteger currentIndex = [fDisplayedTorrents indexOfObjectAtIndexes: removePreviousIndexes options: NSEnumerationConcurrent passingTest: ^(id objDisplay, NSUInteger idx, BOOL *stop) { @@ -2564,19 +2564,19 @@ static void removeKeRangerRansomware() else [removePreviousIndexes removeIndex: currentIndex]; }]; - + if ([addIndexes count] > 0 || [removePreviousIndexes count] > 0) { beganUpdates = YES; [fTableView beginUpdates]; - + //remove torrents we didn't find if ([removePreviousIndexes count] > 0) { [fDisplayedTorrents removeObjectsAtIndexes: removePreviousIndexes]; [fTableView removeItemsAtIndexes: removePreviousIndexes inParent: nil withAnimation: NSTableViewAnimationSlideDown]; } - + //add new torrents if ([addIndexes count] > 0) { @@ -2586,13 +2586,13 @@ static void removeKeRangerRansomware() NSIndexSet * newAddIndexes = [allTorrents indexesOfObjectsAtIndexes: addIndexes options: NSEnumerationConcurrent passingTest: ^BOOL(id obj, NSUInteger idx, BOOL * stop) { return [fAddingTransfers containsObject: obj]; }]; - + [addIndexes removeIndexes: newAddIndexes]; - + [fDisplayedTorrents addObjectsFromArray: [allTorrents objectsAtIndexes: newAddIndexes]]; [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange([fDisplayedTorrents count] - [newAddIndexes count], [newAddIndexes count])] inParent: nil withAnimation: NSTableViewAnimationSlideLeft]; } - + [fDisplayedTorrents addObjectsFromArray: [allTorrents objectsAtIndexes: addIndexes]]; [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange([fDisplayedTorrents count] - [addIndexes count], [addIndexes count])] inParent: nil withAnimation: NSTableViewAnimationSlideDown]; } @@ -2601,24 +2601,24 @@ static void removeKeRangerRansomware() else if (groupRows && wasGroupRows) { NSAssert(groupRows && wasGroupRows, @"Should have had group rows and should remain with group rows"); - + #warning don't always do? beganUpdates = YES; [fTableView beginUpdates]; - + NSMutableIndexSet * unusedAllTorrentsIndexes = [NSMutableIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [allTorrents count])]; - + NSMutableDictionary * groupsByIndex = [NSMutableDictionary dictionaryWithCapacity: [fDisplayedTorrents count]]; for (TorrentGroup * group in fDisplayedTorrents) [groupsByIndex setObject: group forKey: [NSNumber numberWithInteger: [group groupIndex]]]; - + const NSUInteger originalGroupCount = [fDisplayedTorrents count]; for (NSUInteger index = 0; index < originalGroupCount; ++index) { TorrentGroup * group = [fDisplayedTorrents objectAtIndex: index]; - + NSMutableIndexSet * removeIndexes = [NSMutableIndexSet indexSet]; - + //needs to be a signed integer for (NSInteger indexInGroup = 0; indexInGroup < [[group torrents] count]; ++indexInGroup) { @@ -2631,7 +2631,7 @@ static void removeKeRangerRansomware() else { BOOL markTorrentAsUsed = YES; - + const NSInteger groupValue = [torrent groupValue]; if (groupValue != [group groupIndex]) { @@ -2651,27 +2651,27 @@ static void removeKeRangerRansomware() if ([fDisplayedTorrents indexOfObject: newGroup inRange: NSMakeRange(index+1, originalGroupCount-(index+1))] != NSNotFound) markTorrentAsUsed = NO; } - + [[group torrents] removeObjectAtIndex: indexInGroup]; [[newGroup torrents] addObject: torrent]; [fTableView moveItemAtIndex: indexInGroup inParent: group toIndex: [[newGroup torrents] count]-1 inParent: newGroup]; - + --indexInGroup; } - + if (markTorrentAsUsed) [unusedAllTorrentsIndexes removeIndex: allIndex]; } } - + if ([removeIndexes count] > 0) { [[group torrents] removeObjectsAtIndexes: removeIndexes]; [fTableView removeItemsAtIndexes: removeIndexes inParent: group withAnimation: NSTableViewAnimationEffectFade]; } } - + //add remaining new torrents for (Torrent * torrent in [allTorrents objectsAtIndexes: unusedAllTorrentsIndexes]) { @@ -2686,24 +2686,24 @@ static void removeKeRangerRansomware() [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndex: [fDisplayedTorrents count]-1] inParent: nil withAnimation: NSTableViewAnimationEffectFade]; [fTableView isGroupCollapsed: groupValue] ? [fTableView collapseItem: group] : [fTableView expandItem: group]; } - + [[group torrents] addObject: torrent]; const BOOL newTorrent = fAddingTransfers && [fAddingTransfers containsObject: torrent]; [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndex: [[group torrents] count]-1] inParent: group withAnimation: newTorrent ? NSTableViewAnimationSlideLeft : NSTableViewAnimationSlideDown]; } - + //remove empty groups NSIndexSet * removeGroupIndexes = [fDisplayedTorrents indexesOfObjectsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, originalGroupCount)] options: NSEnumerationConcurrent passingTest: ^BOOL(id obj, NSUInteger idx, BOOL * stop) { return [[(TorrentGroup *)obj torrents] count] == 0; }]; - + if ([removeGroupIndexes count] > 0) { [fDisplayedTorrents removeObjectsAtIndexes: removeGroupIndexes]; [fTableView removeItemsAtIndexes: removeGroupIndexes inParent: nil withAnimation: NSTableViewAnimationEffectFade]; } - + //now that all groups are there, sort them - don't insert on the fly in case groups were reordered in prefs NSSortDescriptor * groupDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"groupOrderValue" ascending: YES]; [self rearrangeTorrentTableArray: fDisplayedTorrents forParent: nil withSortDescriptors: [NSArray arrayWithObject: groupDescriptor] beganTableUpdate: &beganUpdates]; @@ -2711,19 +2711,19 @@ static void removeKeRangerRansomware() else { NSAssert(groupRows != wasGroupRows, @"Trying toggling group-torrent reordering when we weren't expecting to."); - + //set all groups as expanded [fTableView removeAllCollapsedGroups]; - + //since we're not doing this the right way (boo buggy animation), we need to remember selected values #warning when Lion-only and using views instead of cells, this likely won't be needed NSArray * selectedValues = [fTableView selectedValues]; - + beganUpdates = YES; [fTableView beginUpdates]; [fTableView removeItemsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fDisplayedTorrents count])] inParent: nil withAnimation: NSTableViewAnimationSlideDown]; - + if (groupRows) { //a map for quickly finding groups @@ -2737,12 +2737,12 @@ static void removeKeRangerRansomware() group = [[[TorrentGroup alloc] initWithGroup: groupValue] autorelease]; [groupsByIndex setObject: group forKey: [NSNumber numberWithInteger: groupValue]]; } - + [[group torrents] addObject: torrent]; } - + [fDisplayedTorrents setArray: [groupsByIndex allValues]]; - + //we need the groups to be sorted, and we can do it without moving items in the table, too! NSSortDescriptor * groupDescriptor = [NSSortDescriptor sortDescriptorWithKey: @"groupOrderValue" ascending: YES]; [fDisplayedTorrents sortUsingDescriptors: [NSArray arrayWithObject: groupDescriptor]]; @@ -2751,33 +2751,33 @@ static void removeKeRangerRansomware() [fDisplayedTorrents setArray: allTorrents]; [fTableView insertItemsAtIndexes: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fDisplayedTorrents count])] inParent: nil withAnimation: NSTableViewAnimationEffectFade]; - - if (groupRows) - { - //actually expand group rows - for (TorrentGroup * group in fDisplayedTorrents) - [fTableView expandItem: group]; - } - + + if (groupRows) + { + //actually expand group rows + for (TorrentGroup * group in fDisplayedTorrents) + [fTableView expandItem: group]; + } + if (selectedValues) [fTableView selectValues: selectedValues]; } - + //sort the torrents (won't sort the groups, though) [self sortTorrentsCallUpdates: !beganUpdates includeQueueOrder: YES]; if (beganUpdates) [fTableView endUpdates]; [fTableView setNeedsDisplay: YES]; - + [NSAnimationContext endGrouping]; [self resetInfo]; //if group is already selected, but the torrents in it change - + [self setBottomCountText: groupRows || filterStatus || filterGroup || searchStrings]; - + [self setWindowSizeToFit]; - + if (fAddingTransfers) { [fAddingTransfers release]; @@ -2794,15 +2794,15 @@ static void removeKeRangerRansomware() { if (fGlobalPopoverShown) return; - + NSPopover * popover = [[NSPopover alloc] init]; [popover setBehavior: NSPopoverBehaviorTransient]; GlobalOptionsPopoverViewController * viewController = [[GlobalOptionsPopoverViewController alloc] initWithHandle: fLib]; [popover setContentViewController: viewController]; [popover setDelegate: self]; - + [popover showRelativeToRect: [sender frame] ofView: sender preferredEdge: NSMaxYEdge]; - + [viewController release]; [popover release]; } @@ -2824,9 +2824,9 @@ static void removeKeRangerRansomware() { for (NSInteger i = [menu numberOfItems]-1; i >= 0; i--) [menu removeItemAtIndex: i]; - + NSMenu * groupMenu = [[GroupsController groups] groupMenuWithTarget: self action: @selector(setGroup:) isSmall: NO]; - + const NSInteger groupMenuCount = [groupMenu numberOfItems]; for (NSInteger i = 0; i < groupMenuCount; i++) { @@ -2838,7 +2838,7 @@ static void removeKeRangerRansomware() } else if (menu == fShareMenu || menu == fShareContextMenu) { [menu removeAllItems]; - + for (NSMenuItem * item in [[ShareTorrentFileHelper sharedHelper] menuItems]) { [menu addItem:item]; @@ -2852,10 +2852,10 @@ static void removeKeRangerRansomware() for (Torrent * torrent in [fTableView selectedTorrents]) { [fTableView removeCollapsedGroup: [torrent groupValue]]; //remove old collapsed group - + [torrent setGroupValue: [(NSMenuItem *)sender tag] determinationType: TorrentDeterminationUserSpecified]; } - + [self applyFilter]; [self updateUI]; [self updateTorrentHistory]; @@ -2880,7 +2880,7 @@ static void removeKeRangerRansomware() [fDefaults setBool: isLimited forKey: @"SpeedLimit"]; [fStatusBar updateSpeedFieldsToolTips]; - + if (![[dict objectForKey: @"ByUser"] boolValue]) [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") @@ -2890,7 +2890,7 @@ static void removeKeRangerRansomware() isSticky: NO clickContext: nil identifier: GROWL_AUTO_SPEED_LIMIT]; - + [dict release]; } @@ -2902,18 +2902,18 @@ static void removeKeRangerRansomware() -(void) VDKQueue: (VDKQueue *) queue receivedNotification: (NSString*) notification forPath: (NSString*) fpath { //don't assume that just because we're watching for write notification, we'll only receive write notifications - + if (![fDefaults boolForKey: @"AutoImport"] || ![fDefaults stringForKey: @"AutoImportDirectory"]) return; - + if ([fAutoImportTimer isValid]) [fAutoImportTimer invalidate]; [fAutoImportTimer release]; - + //check again in 10 seconds in case torrent file wasn't complete - fAutoImportTimer = [[NSTimer scheduledTimerWithTimeInterval: 10.0 target: self + fAutoImportTimer = [[NSTimer scheduledTimerWithTimeInterval: 10.0 target: self selector: @selector(checkAutoImportDirectory) userInfo: nil repeats: NO] retain]; - + [self checkAutoImportDirectory]; } @@ -2923,10 +2923,10 @@ static void removeKeRangerRansomware() [fAutoImportTimer invalidate]; [fAutoImportTimer release]; fAutoImportTimer = nil; - + [fAutoImportedNames release]; fAutoImportedNames = nil; - + [self checkAutoImportDirectory]; } @@ -2935,70 +2935,70 @@ static void removeKeRangerRansomware() NSString * path; if (![fDefaults boolForKey: @"AutoImport"] || !(path = [fDefaults stringForKey: @"AutoImportDirectory"])) return; - + path = [path stringByExpandingTildeInPath]; - + NSArray * importedNames; if (!(importedNames = [[NSFileManager defaultManager] contentsOfDirectoryAtPath: path error: NULL])) return; - + //only check files that have not been checked yet NSMutableArray * newNames = [importedNames mutableCopy]; - + if (fAutoImportedNames) [newNames removeObjectsInArray: fAutoImportedNames]; else fAutoImportedNames = [[NSMutableArray alloc] init]; [fAutoImportedNames setArray: importedNames]; - + for (NSString * file in newNames) { if ([file hasPrefix: @"."]) continue; - + NSString * fullFile = [path stringByAppendingPathComponent: file]; - + if (!([[[NSWorkspace sharedWorkspace] typeOfFile: fullFile error: NULL] isEqualToString: @"org.bittorrent.torrent"] || [[fullFile pathExtension] caseInsensitiveCompare: @"torrent"] == NSOrderedSame)) continue; - + tr_ctor * ctor = tr_ctorNew(fLib); tr_ctorSetMetainfoFromFile(ctor, [fullFile UTF8String]); - + switch (tr_torrentParse(ctor, NULL)) { case TR_PARSE_OK: [self openFiles: [NSArray arrayWithObject: fullFile] addType: ADD_AUTO forcePath: nil]; - + NSString * notificationTitle = NSLocalizedString(@"Torrent File Auto Added", "notification title"); if ([NSApp isOnMountainLionOrBetter]) { NSUserNotification* notification = [[NSUserNotificationMtLion alloc] init]; [notification setTitle: notificationTitle]; [notification setInformativeText: file]; - + [notification setHasActionButton: NO]; - + [[NSUserNotificationCenterMtLion defaultUserNotificationCenter] deliverNotification: notification]; [notification release]; } - + [GrowlApplicationBridge notifyWithTitle: notificationTitle description: file notificationName: GROWL_AUTO_ADD iconData: nil priority: 0 isSticky: NO clickContext: nil]; break; - + case TR_PARSE_ERR: [fAutoImportedNames removeObject: file]; break; - + case TR_PARSE_DUPLICATE: //let's ignore this (but silence a warning) break; } - + tr_ctorFree(ctor); } - + [newNames release]; } @@ -3006,10 +3006,10 @@ static void removeKeRangerRansomware() { if (![fDefaults boolForKey: @"AutoImport"]) return; - + NSString * location = [(NSURL *)[notification object] path], * path = [fDefaults stringForKey: @"AutoImportDirectory"]; - + if (location && path && [[[location stringByDeletingLastPathComponent] stringByExpandingTildeInPath] isEqualToString: [path stringByExpandingTildeInPath]]) [fAutoImportedNames addObject: [location lastPathComponent]]; @@ -3065,7 +3065,7 @@ static void removeKeRangerRansomware() else { TorrentGroup * group = (TorrentGroup *)item; - + if ([fDefaults boolForKey: @"DisplayGroupRowRatio"]) return [NSString stringForRatio: [group ratio]]; else @@ -3087,10 +3087,10 @@ static void removeKeRangerRansomware() { if (![torrent isKindOfClass: [Torrent class]]) return NO; - + [indexSet addIndex: [fTableView rowForItem: torrent]]; } - + [pasteboard declareTypes: [NSArray arrayWithObject: TORRENT_TABLE_VIEW_DATA_TYPE] owner: self]; [pasteboard setData: [NSKeyedArchiver archivedDataWithRootObject: indexSet] forType: TORRENT_TABLE_VIEW_DATA_TYPE]; return YES; @@ -3108,7 +3108,7 @@ static void removeKeRangerRansomware() { if (!item) return NSDragOperationNone; - + if ([[fDefaults stringForKey: @"Sort"] isEqualToString: SORT_ORDER]) { if ([item isKindOfClass: [Torrent class]]) @@ -3129,18 +3129,18 @@ static void removeKeRangerRansomware() { if (index == NSOutlineViewDropOnItemIndex) return NSDragOperationNone; - + if (item) { index = [fTableView rowForItem: item] + 1; item = nil; } } - + [fTableView setDropItem: item dropChildIndex: index]; return NSDragOperationGeneric; } - + return NSDragOperationNone; } @@ -3150,19 +3150,19 @@ static void removeKeRangerRansomware() if ([[pasteboard types] containsObject: TORRENT_TABLE_VIEW_DATA_TYPE]) { NSIndexSet * indexes = [NSKeyedUnarchiver unarchiveObjectWithData: [pasteboard dataForType: TORRENT_TABLE_VIEW_DATA_TYPE]]; - + //get the torrents to move NSMutableArray * movingTorrents = [NSMutableArray arrayWithCapacity: [indexes count]]; for (NSUInteger i = [indexes firstIndex]; i != NSNotFound; i = [indexes indexGreaterThanIndex: i]) { Torrent * torrent = [fTableView itemAtRow: i]; [movingTorrents addObject: torrent]; - + //change groups if (item) [torrent setGroupValue: [item groupIndex] determinationType: TorrentDeterminationUserSpecified]; } - + //reorder queue order if (newRow != NSOutlineViewDropOnItemIndex) { @@ -3178,15 +3178,15 @@ static void removeKeRangerRansomware() break; } } - + //remove objects to reinsert [fTorrents removeObjectsInArray: movingTorrents]; - + //insert objects at new location const NSUInteger insertIndex = topTorrent ? [fTorrents indexOfObject: topTorrent] + 1 : 0; NSIndexSet * insertIndexes = [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(insertIndex, [movingTorrents count])]; [fTorrents insertObjects: movingTorrents atIndexes: insertIndexes]; - + //we need to make sure the queue order is updated in the Torrent object before we sort - safest to just reset all queue positions NSUInteger i = 0; for (Torrent * torrent in fTorrents) @@ -3194,18 +3194,18 @@ static void removeKeRangerRansomware() [torrent setQueuePosition: i++]; [torrent update]; } - + //do the drag animation here so that the dragged torrents are the ones that are animated as moving, and not the torrents around them [fTableView beginUpdates]; - + NSUInteger insertDisplayIndex = topTorrent ? [groupTorrents indexOfObject: topTorrent] + 1 : 0; - + for (Torrent * torrent in movingTorrents) { TorrentGroup * oldParent = item ? [fTableView parentForItem: torrent] : nil; NSMutableArray * oldTorrents = oldParent ? [oldParent torrents] : fDisplayedTorrents; const NSUInteger oldIndex = [oldTorrents indexOfObject: torrent]; - + if (item == oldParent) { if (oldIndex < insertDisplayIndex) @@ -3215,23 +3215,23 @@ static void removeKeRangerRansomware() else { NSAssert(item && oldParent, @"Expected to be dragging between group rows"); - + NSMutableArray * newTorrents = [(TorrentGroup *)item torrents]; [newTorrents insertObject: torrent atIndex: insertDisplayIndex]; [oldTorrents removeObjectAtIndex: oldIndex]; } [fTableView moveItemAtIndex: oldIndex inParent: oldParent toIndex: insertDisplayIndex inParent: item]; - + ++insertDisplayIndex; } [fTableView endUpdates]; } - + [self applyFilter]; } - + return YES; } @@ -3262,20 +3262,20 @@ static void removeKeRangerRansomware() if (!fOverlayWindow) fOverlayWindow = [[DragOverlayWindow alloc] initWithLib: fLib forWindow: fWindow]; [fOverlayWindow setTorrents: files]; - + return NSDragOperationCopy; } tr_ctorFree(ctor); } } - + //create a torrent file if a single file if (!torrent && [files count] == 1) { if (!fOverlayWindow) fOverlayWindow = [[DragOverlayWindow alloc] initWithLib: fLib forWindow: fWindow]; [fOverlayWindow setFile: [[files objectAtIndex: 0] lastPathComponent]]; - + return NSDragOperationCopy; } } @@ -3284,11 +3284,11 @@ static void removeKeRangerRansomware() if (!fOverlayWindow) fOverlayWindow = [[DragOverlayWindow alloc] initWithLib: fLib forWindow: fWindow]; [fOverlayWindow setURL: [[NSURL URLFromPasteboard: pasteboard] relativeString]]; - + return NSDragOperationCopy; } else; - + return NSDragOperationNone; } @@ -3302,12 +3302,12 @@ static void removeKeRangerRansomware() { if (fOverlayWindow) [fOverlayWindow fadeOut]; - + NSPasteboard * pasteboard = [info draggingPasteboard]; if ([[pasteboard types] containsObject: NSFilenamesPboardType]) { BOOL torrent = NO, accept = YES; - + //create an array of files that can be opened NSArray * files = [pasteboard propertyListForType: NSFilenamesPboardType]; NSMutableArray * filesToOpen = [NSMutableArray arrayWithCapacity: [files count]]; @@ -3324,7 +3324,7 @@ static void removeKeRangerRansomware() tr_ctorFree(ctor); } } - + if ([filesToOpen count] > 0) [self application: NSApp openFiles: filesToOpen]; else @@ -3334,7 +3334,7 @@ static void removeKeRangerRansomware() else accept = NO; } - + return accept; } else if ([[pasteboard types] containsObject: NSURLPboardType]) @@ -3347,7 +3347,7 @@ static void removeKeRangerRansomware() } } else; - + return NO; } @@ -3355,24 +3355,24 @@ static void removeKeRangerRansomware() { BOOL makeSmall = ![fDefaults boolForKey: @"SmallView"]; [fDefaults setBool: makeSmall forKey: @"SmallView"]; - + [fTableView setUsesAlternatingRowBackgroundColors: !makeSmall]; - + [fTableView setRowHeight: makeSmall ? ROW_HEIGHT_SMALL : ROW_HEIGHT_REGULAR]; [fTableView beginUpdates]; [fTableView noteHeightOfRowsWithIndexesChanged: [NSIndexSet indexSetWithIndexesInRange: NSMakeRange(0, [fTableView numberOfRows])]]; [fTableView endUpdates]; - + //resize for larger min height if not set to auto size if (![fDefaults boolForKey: @"AutoSize"]) { const NSSize contentSize = [[fWindow contentView] frame].size; - + NSSize contentMinSize = [fWindow contentMinSize]; contentMinSize.height = [self minWindowContentSizeAllowed]; [fWindow setContentMinSize: contentMinSize]; - + //make sure the window already isn't too small if (!makeSmall && contentSize.height < contentMinSize.height) { @@ -3380,7 +3380,7 @@ static void removeKeRangerRansomware() CGFloat heightChange = contentMinSize.height - contentSize.height; frame.size.height += heightChange; frame.origin.y -= heightChange; - + [fWindow setFrame: frame display: YES]; } } @@ -3403,18 +3403,18 @@ static void removeKeRangerRansomware() - (NSRect) windowFrameByAddingHeight: (CGFloat) height checkLimits: (BOOL) check { NSScrollView * scrollView = [fTableView enclosingScrollView]; - + //convert pixels to points NSRect windowFrame = [fWindow frame]; NSSize windowSize = [scrollView convertSize: windowFrame.size fromView: nil]; windowSize.height += height; - + if (check) { //we can't call minSize, since it might be set to the current size (auto size) const CGFloat minHeight = [self minWindowContentSizeAllowed] + (NSHeight([fWindow frame]) - NSHeight([[fWindow contentView] frame])); //contentView to window - + if (windowSize.height <= minHeight) windowSize.height = minHeight; else @@ -3454,31 +3454,31 @@ static void removeKeRangerRansomware() const BOOL prevShown = fStatusBar != nil; if (show == prevShown) return; - + if (show) { fStatusBar = [[StatusBarController alloc] initWithLib: fLib]; - + NSView * contentView = [fWindow contentView]; const NSSize windowSize = [contentView convertSize: [fWindow frame].size fromView: nil]; - + NSRect statusBarFrame = [[fStatusBar view] frame]; statusBarFrame.size.width = windowSize.width; [[fStatusBar view] setFrame: statusBarFrame]; - + [contentView addSubview: [fStatusBar view]]; [[fStatusBar view] setFrameOrigin: NSMakePoint(0.0, NSMaxY([contentView frame]))]; } - + CGFloat heightChange = [[fStatusBar view] frame].size.height; if (!show) heightChange *= -1; - + //allow bar to show even if not enough room if (show && ![fDefaults boolForKey: @"AutoSize"]) { NSRect frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; - + NSScreen * screen = [fWindow screen]; if (screen) { @@ -3492,11 +3492,11 @@ static void removeKeRangerRansomware() } } } - + [self updateUI]; - + NSScrollView * scrollView = [fTableView enclosingScrollView]; - + //set views to not autoresize const NSUInteger statsMask = [[fStatusBar view] autoresizingMask]; [[fStatusBar view] setAutoresizingMask: NSViewNotSizable]; @@ -3508,23 +3508,23 @@ static void removeKeRangerRansomware() } const NSUInteger scrollMask = [scrollView autoresizingMask]; [scrollView setAutoresizingMask: NSViewNotSizable]; - + NSRect frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; - [fWindow setFrame: frame display: YES animate: animate]; - + [fWindow setFrame: frame display: YES animate: animate]; + //re-enable autoresize [[fStatusBar view] setAutoresizingMask: statsMask]; if (fFilterBar) [[fFilterBar view] setAutoresizingMask: filterMask]; [scrollView setAutoresizingMask: scrollMask]; - + if (!show) { [[fStatusBar view] removeFromSuperviewWithoutNeedingDisplay]; [fStatusBar release]; fStatusBar = nil; } - + if ([fDefaults boolForKey: @"AutoSize"]) [self setWindowMinMaxToCurrent]; else @@ -3539,15 +3539,15 @@ static void removeKeRangerRansomware() - (void) toggleFilterBar: (id) sender { const BOOL show = fFilterBar == nil; - + //disable filtering when hiding (have to do before showFilterBar:animate:) if (!show) [fFilterBar reset: NO]; - + [self showFilterBar: show animate: YES]; [fDefaults setBool: show forKey: @"FilterBar"]; [[fWindow toolbar] validateVisibleItems]; - + [self applyFilter]; //do even if showing to ensure tooltips are updated } @@ -3557,18 +3557,18 @@ static void removeKeRangerRansomware() const BOOL prevShown = fFilterBar != nil; if (show == prevShown) return; - + if (show) { fFilterBar = [[FilterBarController alloc] init]; - + NSView * contentView = [fWindow contentView]; const NSSize windowSize = [contentView convertSize: [fWindow frame].size fromView: nil]; - + NSRect filterBarFrame = [[fFilterBar view] frame]; filterBarFrame.size.width = windowSize.width; [[fFilterBar view] setFrame: filterBarFrame]; - + if (fStatusBar) [contentView addSubview: [fFilterBar view] positioned: NSWindowBelow relativeTo: [fStatusBar view]]; else @@ -3578,16 +3578,16 @@ static void removeKeRangerRansomware() } else [fWindow makeFirstResponder: fTableView]; - + CGFloat heightChange = NSHeight([[fFilterBar view] frame]); if (!show) heightChange *= -1; - + //allow bar to show even if not enough room if (show && ![fDefaults boolForKey: @"AutoSize"]) { NSRect frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; - + NSScreen * screen = [fWindow screen]; if (screen) { @@ -3601,7 +3601,7 @@ static void removeKeRangerRansomware() } } } - + NSScrollView * scrollView = [fTableView enclosingScrollView]; //set views to not autoresize @@ -3609,21 +3609,21 @@ static void removeKeRangerRansomware() const NSUInteger scrollMask = [scrollView autoresizingMask]; [[fFilterBar view] setAutoresizingMask: NSViewNotSizable]; [scrollView setAutoresizingMask: NSViewNotSizable]; - + const NSRect frame = [self windowFrameByAddingHeight: heightChange checkLimits: NO]; [fWindow setFrame: frame display: YES animate: animate]; - + //re-enable autoresize [[fFilterBar view] setAutoresizingMask: filterMask]; [scrollView setAutoresizingMask: scrollMask]; - + if (!show) { [[fFilterBar view] removeFromSuperviewWithoutNeedingDisplay]; [fFilterBar release]; fFilterBar = nil; } - + if ([fDefaults boolForKey: @"AutoSize"]) [self setWindowMinMaxToCurrent]; else @@ -3664,11 +3664,11 @@ static void removeKeRangerRansomware() { NSArray * selectedTorrents = [fTableView selectedTorrents]; NSMutableArray * qlArray = [NSMutableArray arrayWithCapacity: [selectedTorrents count]]; - + for (Torrent * torrent in selectedTorrents) if (([torrent isFolder] || [torrent isComplete]) && [torrent dataLocation]) [qlArray addObject: torrent]; - + return qlArray; } @@ -3695,7 +3695,7 @@ static void removeKeRangerRansomware() [super keyDown: event]; return YES; }*/ - + return NO; } @@ -3707,16 +3707,16 @@ static void removeKeRangerRansomware() { if (![fWindow isVisible]) return NSZeroRect; - + const NSInteger row = [fTableView rowForItem: item]; if (row == -1) return NSZeroRect; - + NSRect frame = [fTableView iconRectForRow: row]; - + if (!NSIntersectsRect([fTableView visibleRect], frame)) return NSZeroRect; - + frame.origin = [fTableView convertPoint: frame.origin toView: nil]; frame = [fWindow convertRectToScreen: frame]; frame.origin.y -= frame.size.height; @@ -3727,10 +3727,10 @@ static void removeKeRangerRansomware() - (void) showToolbarShare: (id) sender { NSParameterAssert([sender isKindOfClass:[NSButton class]]); - + NSSharingServicePicker * picker = [[NSSharingServicePicker alloc] initWithItems: [[ShareTorrentFileHelper sharedHelper] shareTorrentURLs]]; picker.delegate = self; - + [picker showRelativeToRect:[sender bounds] ofView:sender preferredEdge:NSMinYEdge]; } @@ -3752,18 +3752,18 @@ static void removeKeRangerRansomware() - (id) toolbarButtonWithIdentifier: (NSString *) ident forToolbarButtonClass:(Class)class { ButtonToolbarItem * item = [[class alloc] initWithItemIdentifier: ident]; - + NSButton * button = [[NSButton alloc] init]; [button setBezelStyle: NSTexturedRoundedBezelStyle]; [button setStringValue: @""]; - + [item setView: button]; [button release]; - + const NSSize buttonSize = NSMakeSize(36.0, 25.0); [item setMinSize: buttonSize]; [item setMaxSize: buttonSize]; - + return [item autorelease]; } @@ -3772,7 +3772,7 @@ static void removeKeRangerRansomware() if ([ident isEqualToString: TOOLBAR_CREATE]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; - + [item setLabel: NSLocalizedString(@"Create", "Create toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Create Torrent File", "Create toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Create torrent file", "Create toolbar item -> tooltip")]; @@ -3780,13 +3780,13 @@ static void removeKeRangerRansomware() [item setTarget: self]; [item setAction: @selector(createFile:)]; [item setAutovalidates: NO]; - + return item; } else if ([ident isEqualToString: TOOLBAR_OPEN_FILE]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; - + [item setLabel: NSLocalizedString(@"Open", "Open toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Open Torrent Files", "Open toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Open torrent files", "Open toolbar item -> tooltip")]; @@ -3794,13 +3794,13 @@ static void removeKeRangerRansomware() [item setTarget: self]; [item setAction: @selector(openShowSheet:)]; [item setAutovalidates: NO]; - + return item; } else if ([ident isEqualToString: TOOLBAR_OPEN_WEB]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; - + [item setLabel: NSLocalizedString(@"Open Address", "Open address toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Open Torrent Address", "Open address toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Open torrent web address", "Open address toolbar item -> tooltip")]; @@ -3808,13 +3808,13 @@ static void removeKeRangerRansomware() [item setTarget: self]; [item setAction: @selector(openURLShowSheet:)]; [item setAutovalidates: NO]; - + return item; } else if ([ident isEqualToString: TOOLBAR_REMOVE]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; - + [item setLabel: NSLocalizedString(@"Remove", "Remove toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Remove Selected", "Remove toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Remove selected transfers", "Remove toolbar item -> tooltip")]; @@ -3822,134 +3822,134 @@ static void removeKeRangerRansomware() [item setTarget: self]; [item setAction: @selector(removeNoDelete:)]; [item setVisibilityPriority: NSToolbarItemVisibilityPriorityHigh]; - + return item; } else if ([ident isEqualToString: TOOLBAR_INFO]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; [[(NSButton *)[item view] cell] setShowsStateBy: NSContentsCellMask]; //blue when enabled - + [item setLabel: NSLocalizedString(@"Inspector", "Inspector toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Toggle Inspector", "Inspector toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Toggle the torrent inspector", "Inspector toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: @"ToolbarInfoTemplate"]]; [item setTarget: self]; [item setAction: @selector(showInfo:)]; - + return item; } else if ([ident isEqualToString: TOOLBAR_PAUSE_RESUME_ALL]) { GroupToolbarItem * groupItem = [[GroupToolbarItem alloc] initWithItemIdentifier: ident]; - + NSSegmentedControl * segmentedControl = [[NSSegmentedControl alloc] initWithFrame: NSZeroRect]; [segmentedControl setCell: [[[ToolbarSegmentedCell alloc] init] autorelease]]; [groupItem setView: segmentedControl]; NSSegmentedCell * segmentedCell = (NSSegmentedCell *)[segmentedControl cell]; - + if ([NSApp isOnYosemiteOrBetter]) { segmentedControl.segmentStyle = NSSegmentStyleSeparated; } - + [segmentedControl setSegmentCount: 2]; [segmentedCell setTrackingMode: NSSegmentSwitchTrackingMomentary]; - + const NSSize groupSize = NSMakeSize(72.0, 25.0); [groupItem setMinSize: groupSize]; [groupItem setMaxSize: groupSize]; - + [groupItem setLabel: NSLocalizedString(@"Apply All", "All toolbar item -> label")]; [groupItem setPaletteLabel: NSLocalizedString(@"Pause / Resume All", "All toolbar item -> palette label")]; [groupItem setTarget: self]; [groupItem setAction: @selector(allToolbarClicked:)]; - + [groupItem setIdentifiers: [NSArray arrayWithObjects: TOOLBAR_PAUSE_ALL, TOOLBAR_RESUME_ALL, nil]]; - + [segmentedCell setTag: TOOLBAR_PAUSE_TAG forSegment: TOOLBAR_PAUSE_TAG]; [segmentedControl setImage: [NSImage imageNamed: @"ToolbarPauseAllTemplate"] forSegment: TOOLBAR_PAUSE_TAG]; [segmentedCell setToolTip: NSLocalizedString(@"Pause all transfers", "All toolbar item -> tooltip") forSegment: TOOLBAR_PAUSE_TAG]; - + [segmentedCell setTag: TOOLBAR_RESUME_TAG forSegment: TOOLBAR_RESUME_TAG]; [segmentedControl setImage: [NSImage imageNamed: @"ToolbarResumeAllTemplate"] forSegment: TOOLBAR_RESUME_TAG]; [segmentedCell setToolTip: NSLocalizedString(@"Resume all transfers", "All toolbar item -> tooltip") forSegment: TOOLBAR_RESUME_TAG]; - + [groupItem createMenu: [NSArray arrayWithObjects: NSLocalizedString(@"Pause All", "All toolbar item -> label"), NSLocalizedString(@"Resume All", "All toolbar item -> label"), nil]]; - + [segmentedControl release]; - + [groupItem setVisibilityPriority: NSToolbarItemVisibilityPriorityHigh]; - + return [groupItem autorelease]; } else if ([ident isEqualToString: TOOLBAR_PAUSE_RESUME_SELECTED]) { GroupToolbarItem * groupItem = [[GroupToolbarItem alloc] initWithItemIdentifier: ident]; - + NSSegmentedControl * segmentedControl = [[NSSegmentedControl alloc] initWithFrame: NSZeroRect]; [segmentedControl setCell: [[[ToolbarSegmentedCell alloc] init] autorelease]]; [groupItem setView: segmentedControl]; NSSegmentedCell * segmentedCell = (NSSegmentedCell *)[segmentedControl cell]; - + if ([NSApp isOnYosemiteOrBetter]) { segmentedControl.segmentStyle = NSSegmentStyleSeparated; } - + [segmentedControl setSegmentCount: 2]; [segmentedCell setTrackingMode: NSSegmentSwitchTrackingMomentary]; - + const NSSize groupSize = NSMakeSize(72.0, 25.0); [groupItem setMinSize: groupSize]; [groupItem setMaxSize: groupSize]; - + [groupItem setLabel: NSLocalizedString(@"Apply Selected", "Selected toolbar item -> label")]; [groupItem setPaletteLabel: NSLocalizedString(@"Pause / Resume Selected", "Selected toolbar item -> palette label")]; [groupItem setTarget: self]; [groupItem setAction: @selector(selectedToolbarClicked:)]; - + [groupItem setIdentifiers: [NSArray arrayWithObjects: TOOLBAR_PAUSE_SELECTED, TOOLBAR_RESUME_SELECTED, nil]]; - + [segmentedCell setTag: TOOLBAR_PAUSE_TAG forSegment: TOOLBAR_PAUSE_TAG]; [segmentedControl setImage: [NSImage imageNamed: @"ToolbarPauseSelectedTemplate"] forSegment: TOOLBAR_PAUSE_TAG]; [segmentedCell setToolTip: NSLocalizedString(@"Pause selected transfers", "Selected toolbar item -> tooltip") forSegment: TOOLBAR_PAUSE_TAG]; - + [segmentedCell setTag: TOOLBAR_RESUME_TAG forSegment: TOOLBAR_RESUME_TAG]; [segmentedControl setImage: [NSImage imageNamed: @"ToolbarResumeSelectedTemplate"] forSegment: TOOLBAR_RESUME_TAG]; [segmentedCell setToolTip: NSLocalizedString(@"Resume selected transfers", "Selected toolbar item -> tooltip") forSegment: TOOLBAR_RESUME_TAG]; - + [groupItem createMenu: [NSArray arrayWithObjects: NSLocalizedString(@"Pause Selected", "Selected toolbar item -> label"), NSLocalizedString(@"Resume Selected", "Selected toolbar item -> label"), nil]]; - + [segmentedControl release]; - + [groupItem setVisibilityPriority: NSToolbarItemVisibilityPriorityHigh]; - + return [groupItem autorelease]; } else if ([ident isEqualToString: TOOLBAR_FILTER]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; [[(NSButton *)[item view] cell] setShowsStateBy: NSContentsCellMask]; //blue when enabled - + [item setLabel: NSLocalizedString(@"Filter", "Filter toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Toggle Filter", "Filter toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Toggle the filter bar", "Filter toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: @"ToolbarFilterTemplate"]]; [item setTarget: self]; [item setAction: @selector(toggleFilterBar:)]; - + return item; } else if ([ident isEqualToString: TOOLBAR_QUICKLOOK]) { ButtonToolbarItem * item = [self standardToolbarButtonWithIdentifier: ident]; [[(NSButton *)[item view] cell] setShowsStateBy: NSContentsCellMask]; //blue when enabled - + [item setLabel: NSLocalizedString(@"Quick Look", "QuickLook toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Quick Look", "QuickLook toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Quick Look", "QuickLook toolbar item -> tooltip")]; @@ -3957,24 +3957,24 @@ static void removeKeRangerRansomware() [item setTarget: self]; [item setAction: @selector(toggleQuickLook:)]; [item setVisibilityPriority: NSToolbarItemVisibilityPriorityLow]; - + return item; } else if ([ident isEqualToString: TOOLBAR_SHARE]) { ShareToolbarItem * item = [self toolbarButtonWithIdentifier: ident forToolbarButtonClass: [ShareToolbarItem class]]; - + [item setLabel: NSLocalizedString(@"Share", "Share toolbar item -> label")]; [item setPaletteLabel: NSLocalizedString(@"Share", "Share toolbar item -> palette label")]; [item setToolTip: NSLocalizedString(@"Share torrent file", "Share toolbar item -> tooltip")]; [item setImage: [NSImage imageNamed: NSImageNameShareTemplate]]; [item setVisibilityPriority: NSToolbarItemVisibilityPriorityLow]; - + NSButton *itemButton = (NSButton *)[item view]; [itemButton setTarget: self]; [itemButton setAction: @selector(showToolbarShare:)]; [itemButton sendActionOn:NSLeftMouseDownMask]; - + return item; } else @@ -4042,7 +4042,7 @@ static void removeKeRangerRansomware() - (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem { NSString * ident = [toolbarItem itemIdentifier]; - + //enable remove item if ([ident isEqualToString: TOOLBAR_REMOVE]) return [fTableView numberOfSelectedRows] > 0; @@ -4073,7 +4073,7 @@ static void removeKeRangerRansomware() return YES; return NO; } - + //enable resume item if ([ident isEqualToString: TOOLBAR_RESUME_SELECTED]) { @@ -4082,52 +4082,52 @@ static void removeKeRangerRansomware() return YES; return NO; } - + //set info item if ([ident isEqualToString: TOOLBAR_INFO]) { [(NSButton *)[toolbarItem view] setState: [[fInfoController window] isVisible]]; return YES; } - + //set filter item if ([ident isEqualToString: TOOLBAR_FILTER]) { [(NSButton *)[toolbarItem view] setState: fFilterBar != nil]; return YES; } - + //set quick look item if ([ident isEqualToString: TOOLBAR_QUICKLOOK]) { [(NSButton *)[toolbarItem view] setState: [QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]]; return YES; } - + //enable share item if ([ident isEqualToString: TOOLBAR_SHARE]) return [fTableView numberOfSelectedRows] > 0; - + return YES; } - (BOOL) validateMenuItem: (NSMenuItem *) menuItem { SEL action = [menuItem action]; - + if (action == @selector(toggleSpeedLimit:)) { [menuItem setState: [fDefaults boolForKey: @"SpeedLimit"] ? NSOnState : NSOffState]; return YES; } - + //only enable some items if it is in a context menu or the window is useable BOOL canUseTable = [fWindow isKeyWindow] || [[menuItem menu] supermenu] != [NSApp mainMenu]; //enable open items if (action == @selector(openShowSheet:) || action == @selector(openURLShowSheet:)) return [fWindow attachedSheet] == nil; - + //enable sort options if (action == @selector(setSort:)) { @@ -4161,15 +4161,15 @@ static void removeKeRangerRansomware() default: NSAssert1(NO, @"Unknown sort tag received: %ld", [menuItem tag]); } - + [menuItem setState: [sortType isEqualToString: [fDefaults stringForKey: @"Sort"]] ? NSOnState : NSOffState]; return [fWindow isVisible]; } - + if (action == @selector(setGroup:)) { BOOL checked = NO; - + NSInteger index = [menuItem tag]; for (Torrent * torrent in [fTableView selectedTorrents]) if (index == [torrent groupValue]) @@ -4177,29 +4177,29 @@ static void removeKeRangerRansomware() checked = YES; break; } - + [menuItem setState: checked ? NSOnState : NSOffState]; return canUseTable && [fTableView numberOfSelectedRows] > 0; } - + if (action == @selector(toggleSmallView:)) { [menuItem setState: [fDefaults boolForKey: @"SmallView"] ? NSOnState : NSOffState]; return [fWindow isVisible]; } - + if (action == @selector(togglePiecesBar:)) { [menuItem setState: [fDefaults boolForKey: @"PiecesBar"] ? NSOnState : NSOffState]; return [fWindow isVisible]; } - + if (action == @selector(toggleAvailabilityBar:)) { [menuItem setState: [fDefaults boolForKey: @"DisplayProgressBarAvailable"] ? NSOnState : NSOffState]; return [fWindow isVisible]; } - + //enable show info if (action == @selector(showInfo:)) { @@ -4209,11 +4209,11 @@ static void removeKeRangerRansomware() return YES; } - + //enable prev/next inspector tab if (action == @selector(setInfoTab:)) return [[fInfoController window] isVisible]; - + //enable toggle status bar if (action == @selector(toggleStatusBar:)) { @@ -4223,7 +4223,7 @@ static void removeKeRangerRansomware() return [fWindow isVisible]; } - + //enable toggle filter bar if (action == @selector(toggleFilterBar:)) { @@ -4233,15 +4233,15 @@ static void removeKeRangerRansomware() return [fWindow isVisible]; } - + //enable prev/next filter button if (action == @selector(switchFilter:)) return [fWindow isVisible] && fFilterBar; - + //enable reveal in finder if (action == @selector(revealFile:)) return canUseTable && [fTableView numberOfSelectedRows] > 0; - + //enable renaming file/folder if (action == @selector(renameSelected:)) return canUseTable && [fTableView numberOfSelectedRows] == 1; @@ -4250,7 +4250,7 @@ static void removeKeRangerRansomware() if (action == @selector(removeNoDelete:) || action == @selector(removeDeleteData:)) { BOOL warning = NO; - + for (Torrent * torrent in [fTableView selectedTorrents]) { if ([torrent isActive]) @@ -4262,7 +4262,7 @@ static void removeKeRangerRansomware() } } } - + //append or remove ellipsis when needed NSString * title = [menuItem title], * ellipsis = [NSString ellipsis]; if (warning && [fDefaults boolForKey: @"CheckRemove"]) @@ -4275,10 +4275,10 @@ static void removeKeRangerRansomware() if ([title hasSuffix: ellipsis]) [menuItem setTitle: [title substringToIndex: [title rangeOfString: ellipsis].location]]; } - + return canUseTable && [fTableView numberOfSelectedRows] > 0; } - + //remove all completed transfers item if (action == @selector(clearCompleted:)) { @@ -4294,7 +4294,7 @@ static void removeKeRangerRansomware() if ([title hasSuffix: ellipsis]) [menuItem setTitle: [title substringToIndex: [title rangeOfString: ellipsis].location]]; } - + for (Torrent * torrent in fTorrents) if ([torrent isFinishedSeeding]) return YES; @@ -4309,7 +4309,7 @@ static void removeKeRangerRansomware() return YES; return NO; } - + //enable resume all item if (action == @selector(resumeAllTorrents:)) { @@ -4318,25 +4318,25 @@ static void removeKeRangerRansomware() return YES; return NO; } - + //enable resume all waiting item if (action == @selector(resumeWaitingTorrents:)) { if (![fDefaults boolForKey: @"Queue"] && ![fDefaults boolForKey: @"QueueSeed"]) return NO; - + for (Torrent * torrent in fTorrents) if ([torrent waitingToStart]) return YES; return NO; } - + //enable resume selected waiting item if (action == @selector(resumeSelectedTorrentsNoWait:)) { if (!canUseTable) return NO; - + for (Torrent * torrent in [fTableView selectedTorrents]) if (![torrent isActive]) return YES; @@ -4348,69 +4348,69 @@ static void removeKeRangerRansomware() { if (!canUseTable) return NO; - + for (Torrent * torrent in [fTableView selectedTorrents]) if ([torrent isActive] || [torrent waitingToStart]) return YES; return NO; } - + //enable resume item if (action == @selector(resumeSelectedTorrents:)) { if (!canUseTable) return NO; - + for (Torrent * torrent in [fTableView selectedTorrents]) if (![torrent isActive] && ![torrent waitingToStart]) return YES; return NO; } - + //enable manual announce item if (action == @selector(announceSelectedTorrents:)) { if (!canUseTable) return NO; - + for (Torrent * torrent in [fTableView selectedTorrents]) if ([torrent canManualAnnounce]) return YES; return NO; } - + //enable reset cache item if (action == @selector(verifySelectedTorrents:)) { if (!canUseTable) return NO; - + for (Torrent * torrent in [fTableView selectedTorrents]) if (![torrent isMagnet]) return YES; return NO; } - + //enable move torrent file item if (action == @selector(moveDataFilesSelected:)) return canUseTable && [fTableView numberOfSelectedRows] > 0; - + //enable copy torrent file item if (action == @selector(copyTorrentFiles:)) { if (!canUseTable) return NO; - + for (Torrent * torrent in [fTableView selectedTorrents]) if (![torrent isMagnet]) return YES; return NO; } - + //enable copy torrent file item if (action == @selector(copyMagnetLinks:)) return canUseTable && [fTableView numberOfSelectedRows] > 0; - + //enable reverse sort item if (action == @selector(setSortReverse:)) { @@ -4418,14 +4418,14 @@ static void removeKeRangerRansomware() [menuItem setState: (isReverse == [fDefaults boolForKey: @"SortReverse"]) ? NSOnState : NSOffState]; return ![[fDefaults stringForKey: @"Sort"] isEqualToString: SORT_ORDER]; } - + //enable group sort item if (action == @selector(setSortByGroup:)) { [menuItem setState: [fDefaults boolForKey: @"SortByGroup"] ? NSOnState : NSOffState]; return YES; } - + if (action == @selector(toggleQuickLook:)) { const BOOL visible =[QLPreviewPanel sharedPreviewPanelExists] && [[QLPreviewPanel sharedPreviewPanel] isVisible]; @@ -4433,10 +4433,10 @@ static void removeKeRangerRansomware() NSString * title = !visible ? NSLocalizedString(@"Quick Look", "View menu -> Quick Look") : NSLocalizedString(@"Close Quick Look", "View menu -> Quick Look"); [menuItem setTitle: title]; - + return YES; } - + return YES; } @@ -4454,13 +4454,13 @@ static void removeKeRangerRansomware() anyActive = YES; [torrent sleep]; //have to call on all, regardless if they are active } - + //if there are any running transfers, wait 15 seconds for them to stop if (anyActive) { sleep(15); } - + IOAllowPowerChange(fRootPort, (long) messageArgument); break; } @@ -4476,7 +4476,7 @@ static void removeKeRangerRansomware() return; } } - + IOAllowPowerChange(fRootPort, (long) messageArgument); break; @@ -4492,7 +4492,7 @@ static void removeKeRangerRansomware() { if (fQuitting) return nil; - + NSUInteger seeding = 0, downloading = 0; for (Torrent * torrent in fTorrents) { @@ -4502,29 +4502,29 @@ static void removeKeRangerRansomware() downloading++; else; } - + NSMenu * menu = [[NSMenu alloc] init]; - + if (seeding > 0) { NSString * title = [NSString stringWithFormat: NSLocalizedString(@"%d Seeding", "Dock item - Seeding"), seeding]; [menu addItemWithTitle: title action: nil keyEquivalent: @""]; } - + if (downloading > 0) { NSString * title = [NSString stringWithFormat: NSLocalizedString(@"%d Downloading", "Dock item - Downloading"), downloading]; [menu addItemWithTitle: title action: nil keyEquivalent: @""]; } - + if (seeding > 0 || downloading > 0) [menu addItem: [NSMenuItem separatorItem]]; - + [menu addItemWithTitle: NSLocalizedString(@"Pause All", "Dock item") action: @selector(stopAllTorrents:) keyEquivalent: @""]; [menu addItemWithTitle: NSLocalizedString(@"Resume All", "Dock item") action: @selector(resumeAllTorrents:) keyEquivalent: @""]; [menu addItem: [NSMenuItem separatorItem]]; [menu addItemWithTitle: NSLocalizedString(@"Speed Limit", "Dock item") action: @selector(toggleSpeedLimit:) keyEquivalent: @""]; - + return [menu autorelease]; } @@ -4532,7 +4532,7 @@ static void removeKeRangerRansomware() { //if auto size is enabled, the current frame shouldn't need to change NSRect frame = [fDefaults boolForKey: @"AutoSize"] ? [window frame] : [self sizedWindowFrame]; - + frame.size.width = [fDefaults boolForKey: @"SmallView"] ? [fWindow minSize].width : WINDOW_REGULAR_WIDTH; return frame; } @@ -4542,11 +4542,11 @@ static void removeKeRangerRansomware() if ([fDefaults boolForKey: @"AutoSize"]) { NSScrollView * scrollView = [fTableView enclosingScrollView]; - + [scrollView setHasVerticalScroller: NO]; [fWindow setFrame: [self sizedWindowFrame] display: YES animate: YES]; [scrollView setHasVerticalScroller: YES]; - + [self setWindowMinMaxToCurrent]; } } @@ -4555,11 +4555,11 @@ static void removeKeRangerRansomware() { NSUInteger groups = ([fDisplayedTorrents count] > 0 && ![[fDisplayedTorrents objectAtIndex: 0] isKindOfClass: [Torrent class]]) ? [fDisplayedTorrents count] : 0; - + CGFloat heightChange = (GROUP_SEPARATOR_HEIGHT + [fTableView intercellSpacing].height) * groups + ([fTableView rowHeight] + [fTableView intercellSpacing].height) * ([fTableView numberOfRows] - groups) - NSHeight([[fTableView enclosingScrollView] frame]); - + return [self windowFrameByAddingHeight: heightChange checkLimits: YES]; } @@ -4571,9 +4571,9 @@ static void removeKeRangerRansomware() { NSSize contentMinSize = [fWindow contentMinSize]; contentMinSize.height = [self minWindowContentSizeAllowed]; - + [fWindow setContentMinSize: contentMinSize]; - + NSSize contentMaxSize = [fWindow contentMaxSize]; contentMaxSize.height = FLT_MAX; [fWindow setContentMaxSize: contentMaxSize]; @@ -4583,12 +4583,12 @@ static void removeKeRangerRansomware() - (void) setWindowMinMaxToCurrent { const CGFloat height = NSHeight([[fWindow contentView] frame]); - + NSSize minSize = [fWindow contentMinSize], maxSize = [fWindow contentMaxSize]; minSize.height = height; maxSize.height = height; - + [fWindow setContentMinSize: minSize]; [fWindow setContentMaxSize: maxSize]; } @@ -4658,7 +4658,7 @@ static void removeKeRangerRansomware() - (NSDictionary *) registrationDictionaryForGrowl { NSArray * notifications = @[GROWL_DOWNLOAD_COMPLETE, GROWL_SEEDING_COMPLETE, GROWL_AUTO_ADD, GROWL_AUTO_SPEED_LIMIT]; - + return @{GROWL_NOTIFICATIONS_ALL : notifications, GROWL_NOTIFICATIONS_DEFAULT : notifications }; } @@ -4667,7 +4667,7 @@ static void removeKeRangerRansomware() { if (![clickContext isKindOfClass: [NSDictionary class]]) return; - + NSString * type = [clickContext objectForKey: @"Type"], * location; if (([type isEqualToString: GROWL_DOWNLOAD_COMPLETE] || [type isEqualToString: GROWL_SEEDING_COMPLETE]) && (location = [clickContext objectForKey: @"Location"])) @@ -4692,55 +4692,55 @@ static void removeKeRangerRansomware() *stop = YES; } }]; - + if (!torrent) { NSLog(@"No torrent found matching the given torrent struct from the RPC callback!"); return; } } - + dispatch_async(dispatch_get_main_queue(), ^{ switch (type) { case TR_RPC_TORRENT_ADDED: [self rpcAddTorrentStruct: torrentStruct]; break; - + case TR_RPC_TORRENT_STARTED: case TR_RPC_TORRENT_STOPPED: [self rpcStartedStoppedTorrent: torrent]; break; - + case TR_RPC_TORRENT_REMOVING: [self rpcRemoveTorrent: torrent deleteData: NO]; break; - + case TR_RPC_TORRENT_TRASHING: [self rpcRemoveTorrent: torrent deleteData: YES]; break; - + case TR_RPC_TORRENT_CHANGED: [self rpcChangedTorrent: torrent]; break; - + case TR_RPC_TORRENT_MOVED: [self rpcMovedTorrent: torrent]; break; - + case TR_RPC_SESSION_QUEUE_POSITIONS_CHANGED: [self rpcUpdateQueue]; break; - + case TR_RPC_SESSION_CHANGED: [fPrefsController rpcUpdatePrefs]; break; - + case TR_RPC_SESSION_CLOSE: fQuitRequested = YES; [NSApp terminate: self]; break; - + default: NSAssert1(NO, @"Unknown RPC command received: %d", type); } @@ -4753,24 +4753,24 @@ static void removeKeRangerRansomware() NSString * location = nil; if (tr_torrentGetDownloadDir(torrentStruct) != NULL) location = [NSString stringWithUTF8String: tr_torrentGetDownloadDir(torrentStruct)]; - + Torrent * torrent = [[Torrent alloc] initWithTorrentStruct: torrentStruct location: location lib: fLib]; - + //change the location if the group calls for it (this has to wait until after the torrent is created) if ([[GroupsController groups] usesCustomDownloadLocationForIndex: [torrent groupValue]]) { location = [[GroupsController groups] customDownloadLocationForIndex: [torrent groupValue]]; [torrent changeDownloadFolderBeforeUsing: location determinationType: TorrentDeterminationAutomatic]; } - + [torrent update]; [fTorrents addObject: torrent]; [torrent release]; - + if (!fAddingTransfers) fAddingTransfers = [[NSMutableSet alloc] init]; [fAddingTransfers addObject: torrent]; - + [self fullUpdateUI]; } @@ -4782,7 +4782,7 @@ static void removeKeRangerRansomware() - (void) rpcStartedStoppedTorrent: (Torrent *) torrent { [torrent update]; - + [self updateUI]; [self applyFilter]; [self updateTorrentHistory]; @@ -4791,7 +4791,7 @@ static void removeKeRangerRansomware() - (void) rpcChangedTorrent: (Torrent *) torrent { [torrent update]; - + if ([[fTableView selectedTorrents] containsObject: torrent]) { [fInfoController updateInfoStats]; //this will reload the file table @@ -4803,7 +4803,7 @@ static void removeKeRangerRansomware() { [torrent update]; [torrent updateTimeMachineExclude]; - + if ([[fTableView selectedTorrents] containsObject: torrent]) [fInfoController updateInfoStats]; } @@ -4812,11 +4812,11 @@ static void removeKeRangerRansomware() { for (Torrent * torrent in fTorrents) [torrent update]; - + NSSortDescriptor * descriptor = [NSSortDescriptor sortDescriptorWithKey: @"queuePosition" ascending: YES]; NSArray * descriptors = [NSArray arrayWithObject: descriptor]; [fTorrents sortUsingDescriptors: descriptors]; - + [self sortTorrents: YES]; } diff --git a/qt/MainWindow.cc b/qt/MainWindow.cc index 259f7a913..2bab20c95 100644 --- a/qt/MainWindow.cc +++ b/qt/MainWindow.cc @@ -621,7 +621,7 @@ MainWindow::openStats () void MainWindow::openDonate () { - QDesktopServices::openUrl (QUrl (QLatin1String ("http://www.transmissionbt.com/donate.php"))); + QDesktopServices::openUrl (QUrl (QLatin1String ("https://transmissionbt.com/donate/"))); } void diff --git a/web/javascript/transmission.js b/web/javascript/transmission.js index 45c1b254f..989153dd9 100644 --- a/web/javascript/transmission.js +++ b/web/javascript/transmission.js @@ -724,7 +724,7 @@ Transmission.prototype = { break; case 'tipjar': - window.open('http://www.transmissionbt.com/donate.php'); + window.open('https://transmissionbt.com/donate/'); break; case 'unlimited_download_rate':