1 /******************************************************************************
2 * $Id: TrackerNode.m 13175 2012-01-21 14:58:39Z livings124 $
4 * Copyright (c) 2009-2012 Transmission authors and contributors
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 *****************************************************************************/
25 #import "TrackerNode.h"
26 #import "NSStringAdditions.h"
28 @implementation TrackerNode
30 #warning remove ivars in header when 64-bit only (or it compiles in 32-bit mode)
31 @synthesize torrent = fTorrent;
33 - (id) initWithTrackerStat: (tr_tracker_stat *) stat torrent: (Torrent *) torrent
35 if ((self = [super init]))
38 fTorrent = torrent; //weak reference
44 - (NSString *) description
46 return [@"Tracker: " stringByAppendingString: [self fullAnnounceAddress]];
49 - (id) copyWithZone: (NSZone *) zone
51 //this object is essentially immutable after initial setup
55 - (BOOL) isEqual: (id) object
60 if (![object isKindOfClass: [self class]])
63 if ([self torrent] != [object torrent])
66 return [self tier] == [object tier] && [[self fullAnnounceAddress] isEqualToString: [object fullAnnounceAddress]];
71 return [NSString stringWithUTF8String: fStat.host];
74 - (NSString *) fullAnnounceAddress
76 return [NSString stringWithUTF8String: fStat.announce];
84 - (NSUInteger) identifier
89 - (NSInteger) totalSeeders
91 return fStat.seederCount;
94 - (NSInteger) totalLeechers
96 return fStat.leecherCount;
99 - (NSInteger) totalDownloaded
101 return fStat.downloadCount;
104 - (NSString *) lastAnnounceStatusString
106 NSString * dateString;
107 if (fStat.hasAnnounced)
109 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
110 [dateFormatter setDateStyle: NSDateFormatterFullStyle];
111 [dateFormatter setTimeStyle: NSDateFormatterShortStyle];
112 [dateFormatter setDoesRelativeDateFormatting: YES];
114 dateString = [dateFormatter stringFromDate: [NSDate dateWithTimeIntervalSince1970: fStat.lastAnnounceTime]];
115 [dateFormatter release];
118 dateString = NSLocalizedString(@"N/A", "Tracker last announce");
120 NSString * baseString;
121 if (fStat.hasAnnounced && fStat.lastAnnounceTimedOut)
122 baseString = [NSLocalizedString(@"Announce timed out", "Tracker last announce") stringByAppendingFormat: @": %@", dateString];
123 else if (fStat.hasAnnounced && !fStat.lastAnnounceSucceeded)
125 baseString = NSLocalizedString(@"Announce error", "Tracker last announce");
127 NSString * errorString = [NSString stringWithUTF8String: fStat.lastAnnounceResult];
128 if ([errorString isEqualToString: @""])
129 baseString = [baseString stringByAppendingFormat: @": %@", dateString];
131 baseString = [baseString stringByAppendingFormat: @": %@ - %@", errorString, dateString];
135 baseString = [NSLocalizedString(@"Last Announce", "Tracker last announce") stringByAppendingFormat: @": %@", dateString];
136 if (fStat.hasAnnounced && fStat.lastAnnounceSucceeded && fStat.lastAnnouncePeerCount > 0)
138 NSString * peerString;
139 if (fStat.lastAnnouncePeerCount == 1)
140 peerString = NSLocalizedString(@"got 1 peer", "Tracker last announce");
142 peerString = [NSString stringWithFormat: NSLocalizedString(@"got %d peers", "Tracker last announce"),
143 fStat.lastAnnouncePeerCount];
144 baseString = [baseString stringByAppendingFormat: @" (%@)", peerString];
151 - (NSString *) nextAnnounceStatusString
153 switch (fStat.announceState)
155 case TR_TRACKER_ACTIVE:
156 return [NSLocalizedString(@"Announce in progress", "Tracker next announce") stringByAppendingEllipsis];
158 case TR_TRACKER_WAITING:
159 return [NSString stringWithFormat: NSLocalizedString(@"Next announce in %@", "Tracker next announce"),
160 [NSString timeString: fStat.nextAnnounceTime - [[NSDate date] timeIntervalSince1970] showSeconds: YES]];
162 case TR_TRACKER_QUEUED:
163 return [NSLocalizedString(@"Announce is queued", "Tracker next announce") stringByAppendingEllipsis];
165 case TR_TRACKER_INACTIVE:
166 return fStat.isBackup ? NSLocalizedString(@"Tracker will be used as a backup", "Tracker next announce")
167 : NSLocalizedString(@"Announce not scheduled", "Tracker next announce");
170 NSAssert1(NO, @"unknown announce state: %d", fStat.announceState);
175 - (NSString *) lastScrapeStatusString
177 NSString * dateString;
178 if (fStat.hasScraped)
180 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc] init];
181 [dateFormatter setDateStyle: NSDateFormatterFullStyle];
182 [dateFormatter setTimeStyle: NSDateFormatterShortStyle];
183 [dateFormatter setDoesRelativeDateFormatting: YES];
185 dateString = [dateFormatter stringFromDate: [NSDate dateWithTimeIntervalSince1970: fStat.lastScrapeTime]];
186 [dateFormatter release];
189 dateString = NSLocalizedString(@"N/A", "Tracker last scrape");
191 NSString * baseString;
192 if (fStat.hasScraped && fStat.lastScrapeTimedOut)
193 baseString = [NSLocalizedString(@"Scrape timed out", "Tracker last scrape") stringByAppendingFormat: @": %@", dateString];
194 else if (fStat.hasScraped && !fStat.lastScrapeSucceeded)
196 baseString = NSLocalizedString(@"Scrape error", "Tracker last scrape");
198 NSString * errorString = [NSString stringWithUTF8String: fStat.lastScrapeResult];
199 if ([errorString isEqualToString: @""])
200 baseString = [baseString stringByAppendingFormat: @": %@", dateString];
202 baseString = [baseString stringByAppendingFormat: @": %@ - %@", errorString, dateString];
205 baseString = [NSLocalizedString(@"Last Scrape", "Tracker last scrape") stringByAppendingFormat: @": %@", dateString];