⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 trackerchecker.java

📁 java 文件下载器。可自定义
💻 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 + -