📄 trackerchecker.java
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space
// Source File Name: TrackerChecker.java
package org.gudy.azureus2.core3.tracker.client.impl.bt;
import java.net.URL;
import java.util.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.torrent.*;
import org.gudy.azureus2.core3.tracker.client.TRTrackerAnnouncer;
import org.gudy.azureus2.core3.tracker.client.impl.TRTrackerScraperResponseImpl;
import org.gudy.azureus2.core3.util.*;
// Referenced classes of package org.gudy.azureus2.core3.tracker.client.impl.bt:
// TRTrackerBTScraperImpl, TRTrackerBTScraperResponseImpl, TrackerStatus
public class TrackerChecker
implements AEDiagnosticsEvidenceGenerator, org.gudy.azureus2.core3.util.SystemTime.ChangeListener
{
private static final LogIDs LOGID;
private HashMap trackers;
private AEMonitor trackers_mon;
private TRTrackerBTScraperImpl scraper;
private long nextScrapeCheckOn;
protected TrackerChecker(TRTrackerBTScraperImpl _scraper)
{
trackers_mon = new AEMonitor("TrackerChecker:trackers");
scraper = _scraper;
trackers = new HashMap();
if (!COConfigurationManager.getBooleanParameter("Tracker Client Scrape Total Disable"))
{
Thread t = new AEThread("Tracker Scrape") {
final TrackerChecker this$0;
public void runSupport()
{
runScrapes();
}
{
this$0 = TrackerChecker.this;
super(x0);
}
};
t.setDaemon(true);
t.setPriority(1);
t.start();
}
AEDiagnostics.addEvidenceGenerator(this);
SystemTime.registerClockChangeListener(this);
}
protected TRTrackerScraperResponseImpl getHashData(TRTrackerAnnouncer tracker_client)
{
return getHashData(tracker_client.getTrackerUrl(), tracker_client.getTorrent().getHashWrapper());
TOTorrentException e;
e;
Debug.printStackTrace(e);
return null;
}
protected TRTrackerScraperResponseImpl getHashData(TOTorrent torrent, URL target_url)
{
return getHashData(target_url != null ? target_url : torrent.getAnnounceURL(), torrent.getHashWrapper());
TOTorrentException e;
e;
Debug.printStackTrace(e);
return null;
}
protected TRTrackerScraperResponseImpl getHashData(URL trackerUrl, HashWrapper hash)
{
TRTrackerScraperResponseImpl data;
String url_str;
TrackerStatus ts;
if (trackerUrl == null)
return null;
data = null;
url_str = trackerUrl.toString();
ts = null;
trackers_mon.enter();
ts = (TrackerStatus)trackers.get(url_str);
if (ts != null)
{
data = ts.getHashData(hash);
} else
{
ts = new TrackerStatus(this, scraper.getScraper(), trackerUrl);
trackers.put(url_str, ts);
if (!ts.isTrackerScrapeUrlValid() && Logger.isEnabled())
Logger.log(new LogEvent(TorrentUtils.getDownloadManager(hash), LOGID, 3, (new StringBuilder()).append("Can't scrape using url '").append(trackerUrl).append("' as it doesn't end in ").append("'/announce', skipping.").toString()));
}
trackers_mon.exit();
break MISSING_BLOCK_LABEL_166;
Exception exception;
exception;
trackers_mon.exit();
throw exception;
if (data == null)
data = ts.addHash(hash);
return data;
}
protected void removeHash(TOTorrent torrent)
{
try
{
removeHash(torrent.getAnnounceURL().toString(), torrent.getHashWrapper());
TOTorrentAnnounceURLSet sets[] = torrent.getAnnounceURLGroup().getAnnounceURLSets();
for (int i = 0; i < sets.length; i++)
{
URL urls[] = sets[i].getAnnounceURLs();
for (int j = 0; j < urls.length; j++)
removeHash(urls[j].toString(), torrent.getHashWrapper());
}
}
catch (TOTorrentException e)
{
Debug.printStackTrace(e);
}
}
protected void removeHash(String trackerUrl, HashWrapper hash)
{
TrackerStatus ts = (TrackerStatus)trackers.get(trackerUrl);
if (ts != null)
ts.removeHash(hash);
}
protected void syncUpdate(TOTorrent torrent, URL target_url)
{
if (torrent == null)
return;
HashWrapper hash;
TrackerStatus matched_ts;
hash = torrent.getHashWrapper();
matched_ts = null;
Iterator iter;
trackers_mon.enter();
iter = trackers.values().iterator();
_L2:
TrackerStatus ts;
Map hashmap;
if (!iter.hasNext())
break; /* Loop/switch isn't completed */
ts = (TrackerStatus)iter.next();
if (target_url != null && !target_url.toString().equals(ts.getTrackerURL().toString()))
continue; /* Loop/switch isn't completed */
hashmap = ts.getHashes();
ts.getHashesMonitor().enter();
if (hashmap.get(hash) == null)
break MISSING_BLOCK_LABEL_121;
matched_ts = ts;
ts.getHashesMonitor().exit();
break; /* Loop/switch isn't completed */
ts.getHashesMonitor().exit();
if (true) goto _L2; else goto _L1
Exception exception;
exception;
ts.getHashesMonitor().exit();
throw exception;
_L1:
trackers_mon.exit();
break MISSING_BLOCK_LABEL_170;
Exception exception1;
exception1;
trackers_mon.exit();
throw exception1;
if (matched_ts != null)
matched_ts.updateSingleHash(hash, true, false);
break MISSING_BLOCK_LABEL_193;
Throwable e;
e;
Debug.out("scrape syncUpdate() exception", e);
}
private void runScrapes()
{
TRTrackerBTScraperResponseImpl nextResponseScraping = null;
do
{
TRTrackerBTScraperResponseImpl oldResponse;
do
{
long delay;
if (nextResponseScraping == null)
{
delay = 60000L;
} else
{
long scrape_time = nextResponseScraping.getNextScrapeStartTime();
long time_to_scrape = (scrape_time - SystemTime.getCurrentTime()) + 25L;
if (time_to_scrape <= 0L)
{
if (nextResponseScraping.getTrackerStatus().getNumActiveScrapes() > 0)
delay = 2000L;
else
try
{
nextResponseScraping.getTrackerStatus().updateSingleHash(nextResponseScraping.getHash(), false);
delay = 0L;
}
catch (Throwable e)
{
Debug.printStackTrace(e);
delay = 30000L;
}
} else
{
delay = time_to_scrape;
if (delay > 30000L)
delay = 30000L;
}
}
try
{
nextScrapeCheckOn = SystemTime.getCurrentTime() + delay;
Thread.sleep(delay);
}
catch (Exception e) { }
oldResponse = nextResponseScraping;
nextResponseScraping = checkForNextScrape();
} while (!Logger.isEnabled() || nextResponseScraping == oldResponse || nextResponseScraping == null);
Logger.log(new LogEvent(TorrentUtils.getDownloadManager(nextResponseScraping.getHash()), LOGID, 0, (new StringBuilder()).append("Next scrape will be ").append(nextResponseScraping.getURL()).append(" in ").append((nextResponseScraping.getNextScrapeStartTime() - SystemTime.getCurrentTime()) / 1000L).append(" sec,type=").append(nextResponseScraping.getTrackerStatus().getSupportsMultipeHashScrapes() ? "multi" : "single").append(",active=").append(nextResponseScraping.getTrackerStatus().getNumActiveScrapes()).toString()));
} while (true);
}
private TRTrackerBTScraperResponseImpl checkForNextScrape()
{
long earliestBlocked;
TRTrackerBTScraperResponseImpl earliestBlockedResponse;
long earliestNonBlocked;
TRTrackerBTScraperResponseImpl earliestNonBlockedResponse;
earliestBlocked = 0x7fffffffffffffffL;
earliestBlockedResponse = null;
earliestNonBlocked = 0x7fffffffffffffffL;
earliestNonBlockedResponse = null;
Iterator iter;
trackers_mon.enter();
iter = trackers.values().iterator();
_L2:
TrackerStatus ts;
boolean hasActiveScrapes;
Map hashmap;
do
{
if (!iter.hasNext())
break MISSING_BLOCK_LABEL_217;
ts = (TrackerStatus)iter.next();
} while (!ts.isTrackerScrapeUrlValid());
hasActiveScrapes = ts.getNumActiveScrapes() > 0;
hashmap = ts.getHashes();
ts.getHashesMonitor().enter();
Iterator iterHashes = hashmap.values().iterator();
do
{
if (!iterHashes.hasNext())
break;
TRTrackerBTScraperResponseImpl response = (TRTrackerBTScraperResponseImpl)iterHashes.next();
if (response.getStatus() != 3)
{
long nextScrapeStartTime = response.getNextScrapeStartTime();
if (hasActiveScrapes)
{
if (nextScrapeStartTime < earliestBlocked)
{
earliestBlocked = nextScrapeStartTime;
earliestBlockedResponse = response;
}
} else
if (nextScrapeStartTime < earliestNonBlocked)
{
earliestNonBlocked = nextScrapeStartTime;
earliestNonBlockedResponse = response;
}
}
} while (true);
ts.getHashesMonitor().exit();
if (true) goto _L2; else goto _L1
_L1:
Exception exception;
exception;
ts.getHashesMonitor().exit();
throw exception;
trackers_mon.exit();
break MISSING_BLOCK_LABEL_239;
Exception exception1;
exception1;
trackers_mon.exit();
throw exception1;
boolean hasEarlierBlockedScrape = earliestBlocked != 0x7fffffffffffffffL && earliestBlocked < earliestNonBlocked;
if (hasEarlierBlockedScrape && earliestNonBlocked - SystemTime.getCurrentTime() > 2000L)
return earliestBlockedResponse;
else
return earliestNonBlockedResponse;
}
public void clockChanged(long current_time, long offset)
{
if (Math.abs(offset) < 60000L)
return;
Iterator iter;
trackers_mon.enter();
iter = trackers.values().iterator();
_L2:
TrackerStatus ts;
Map hashmap;
if (!iter.hasNext())
break; /* Loop/switch isn't completed */
ts = (TrackerStatus)iter.next();
hashmap = ts.getHashes();
ts.getHashesMonitor().enter();
Iterator iterHashes = hashmap.values().iterator();
do
{
if (!iterHashes.hasNext())
break;
TRTrackerBTScraperResponseImpl response = (TRTrackerBTScraperResponseImpl)iterHashes.next();
long time = response.getNextScrapeStartTime();
if (time > 0L)
response.setNextScrapeStartTime(time + offset);
} while (true);
ts.getHashesMonitor().exit();
if (true) goto _L2; else goto _L1
Exception exception;
exception;
ts.getHashesMonitor().exit();
throw exception;
_L1:
trackers_mon.exit();
break MISSING_BLOCK_LABEL_181;
Exception exception1;
exception1;
trackers_mon.exit();
throw exception1;
}
public void generate(IndentWriter writer)
{
writer.println((new StringBuilder()).append("BTScraper - now = ").append(SystemTime.getCurrentTime()).toString());
writer.indent();
Iterator iter;
trackers_mon.enter();
iter = trackers.entrySet().iterator();
_L2:
TrackerStatus ts;
if (!iter.hasNext())
break; /* Loop/switch isn't completed */
java.util.Map.Entry entry = (java.util.Map.Entry)iter.next();
ts = (TrackerStatus)entry.getValue();
writer.println((new StringBuilder()).append("Tracker: ").append(ts.getString()).toString());
writer.indent();
ts.getHashesMonitor().enter();
Map hashmap = ts.getHashes();
TRTrackerBTScraperResponseImpl response;
for (Iterator iter_hashes = hashmap.entrySet().iterator(); iter_hashes.hasNext(); writer.println(response.getString()))
{
java.util.Map.Entry hash_entry = (java.util.Map.Entry)iter_hashes.next();
response = (TRTrackerBTScraperResponseImpl)hash_entry.getValue();
}
ts.getHashesMonitor().exit();
writer.exdent();
if (true) goto _L2; else goto _L1
Exception exception;
exception;
ts.getHashesMonitor().exit();
writer.exdent();
throw exception;
_L1:
trackers_mon.exit();
break MISSING_BLOCK_LABEL_242;
Exception exception1;
exception1;
trackers_mon.exit();
throw exception1;
writer.exdent();
break MISSING_BLOCK_LABEL_258;
Exception exception2;
exception2;
writer.exdent();
throw exception2;
}
public long getNextScrapeCheckOn()
{
return nextScrapeCheckOn;
}
static
{
LOGID = LogIDs.TRACKER;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -