📄 trtrackerannouncerimpl.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: TRTrackerAnnouncerImpl.java
package org.gudy.azureus2.core3.tracker.client.impl;
import java.io.UnsupportedEncodingException;
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.TOTorrent;
import org.gudy.azureus2.core3.tracker.client.*;
import org.gudy.azureus2.core3.util.*;
// Referenced classes of package org.gudy.azureus2.core3.tracker.client.impl:
// TRTrackerAnnouncerResponsePeerImpl
public abstract class TRTrackerAnnouncerImpl
implements TRTrackerAnnouncer
{
public static final LogIDs LOGID;
protected static final int LDT_TRACKER_RESPONSE = 1;
protected static final int LDT_URL_CHANGED = 2;
protected static final int LDT_URL_REFRESH = 3;
protected ListenerManager listeners;
private Map tracker_peer_cache;
private AEMonitor tracker_peer_cache_mon;
private TOTorrent torrent;
protected TRTrackerAnnouncerImpl(TOTorrent _torrent)
{
listeners = ListenerManager.createManager("TrackerClient:ListenDispatcher", new ListenerManagerDispatcher() {
final TRTrackerAnnouncerImpl this$0;
public void dispatch(Object _listener, int type, Object value)
{
TRTrackerAnnouncerListener listener = (TRTrackerAnnouncerListener)_listener;
if (type == 1)
listener.receivedTrackerResponse((TRTrackerAnnouncerResponse)value);
else
if (type == 2)
{
Object x[] = (Object[])(Object[])value;
URL old_url = (URL)x[0];
URL new_url = (URL)x[1];
boolean explicit = ((Boolean)x[2]).booleanValue();
listener.urlChanged(TRTrackerAnnouncerImpl.this, old_url, new_url, explicit);
} else
{
listener.urlRefresh();
}
}
{
this$0 = TRTrackerAnnouncerImpl.this;
super();
}
});
tracker_peer_cache = new LinkedHashMap();
tracker_peer_cache_mon = new AEMonitor("TRTrackerClientClassic:PC");
torrent = _torrent;
}
public Map getTrackerResponseCache()
{
return exportTrackerCache();
}
public void setTrackerResponseCache(Map map)
{
int num = importTrackerCache(map);
if (Logger.isEnabled())
Logger.log(new LogEvent(getTorrent(), LOGID, (new StringBuilder()).append("TRTrackerClient: imported ").append(num).append(" cached peers").toString()));
}
protected Map exportTrackerCache()
{
Map res;
List peers;
res = new LightHashMap(1);
peers = new ArrayList();
res.put("tracker_peers", peers);
tracker_peer_cache_mon.enter();
LightHashMap entry;
for (Iterator it = tracker_peer_cache.values().iterator(); it.hasNext(); peers.add(entry))
{
TRTrackerAnnouncerResponsePeer peer = (TRTrackerAnnouncerResponsePeer)it.next();
entry = new LightHashMap();
entry.put("ip", peer.getAddress().getBytes());
entry.put("src", peer.getSource().getBytes());
entry.put("port", new Long(peer.getPort()));
int udp_port = peer.getUDPPort();
if (udp_port != 0)
entry.put("udpport", new Long(udp_port));
int http_port = peer.getHTTPPort();
if (http_port != 0)
entry.put("httpport", new Long(http_port));
entry.put("prot", new Long(peer.getProtocol()));
byte az_ver = peer.getAZVersion();
if (az_ver != 1)
entry.put("azver", new Long(az_ver));
entry.compactify(0.9F);
}
if (Logger.isEnabled())
Logger.log(new LogEvent(getTorrent(), LOGID, (new StringBuilder()).append("TRTrackerClient: exported ").append(tracker_peer_cache.size()).append(" cached peers").toString()));
tracker_peer_cache_mon.exit();
break MISSING_BLOCK_LABEL_353;
Exception exception;
exception;
tracker_peer_cache_mon.exit();
throw exception;
return res;
}
protected byte[] getAnonymousPeerId(String my_ip, int my_port)
{
byte anon_peer_id[] = new byte[20];
anon_peer_id[0] = 91;
anon_peer_id[1] = 93;
try
{
byte ip_bytes[] = my_ip.getBytes("UTF8");
int ip_len = ip_bytes.length;
if (ip_len > 18)
ip_len = 18;
System.arraycopy(ip_bytes, 0, anon_peer_id, 2, ip_len);
int port_copy = my_port;
for (int j = 2 + ip_len; j < 20; j++)
{
anon_peer_id[j] = (byte)(port_copy & 0xff);
port_copy >>= 8;
}
}
catch (UnsupportedEncodingException e)
{
Debug.printStackTrace(e);
}
return anon_peer_id;
}
protected int importTrackerCache(Map map)
{
if (!COConfigurationManager.getBooleanParameter("File.save.peers.enable"))
return 0;
if (map == null)
return 0;
List peers = (List)map.get("tracker_peers");
if (peers == null)
return 0;
int j;
tracker_peer_cache_mon.enter();
for (int i = 0; i < peers.size(); i++)
{
Map peer = (Map)peers.get(i);
byte src_bytes[] = (byte[])(byte[])peer.get("src");
String peer_source = src_bytes != null ? new String(src_bytes) : "Tracker";
String peer_ip_address = new String((byte[])(byte[])peer.get("ip"));
int peer_tcp_port = ((Long)peer.get("port")).intValue();
byte peer_peer_id[] = getAnonymousPeerId(peer_ip_address, peer_tcp_port);
Long l_protocol = (Long)peer.get("prot");
short protocol = l_protocol != null ? l_protocol.shortValue() : 1;
Long l_udp_port = (Long)peer.get("udpport");
int peer_udp_port = l_udp_port != null ? l_udp_port.intValue() : 0;
Long l_http_port = (Long)peer.get("httpport");
int peer_http_port = l_http_port != null ? l_http_port.intValue() : 0;
Long l_az_ver = (Long)peer.get("azver");
byte az_ver = l_az_ver != null ? l_az_ver.byteValue() : 1;
TRTrackerAnnouncerResponsePeerImpl entry = new TRTrackerAnnouncerResponsePeerImpl(peer_source, peer_peer_id, peer_ip_address, peer_tcp_port, peer_udp_port, peer_http_port, protocol, az_ver, 0);
tracker_peer_cache.put(entry.getKey(), entry);
}
j = tracker_peer_cache.size();
tracker_peer_cache_mon.exit();
return j;
Exception exception;
exception;
tracker_peer_cache_mon.exit();
throw exception;
Throwable e;
e;
Debug.printStackTrace(e);
return tracker_peer_cache.size();
}
protected void addToTrackerCache(TRTrackerAnnouncerResponsePeerImpl peers[])
{
int max;
if (!COConfigurationManager.getBooleanParameter("File.save.peers.enable"))
return;
max = COConfigurationManager.getIntParameter("File.save.peers.max", 512);
tracker_peer_cache_mon.enter();
for (int i = 0; i < peers.length; i++)
{
TRTrackerAnnouncerResponsePeerImpl peer = peers[i];
tracker_peer_cache.remove(peer.getKey());
tracker_peer_cache.put(peer.getKey(), peer);
}
Iterator it = tracker_peer_cache.keySet().iterator();
if (max > 0)
for (; tracker_peer_cache.size() > max; it.remove())
it.next();
tracker_peer_cache_mon.exit();
break MISSING_BLOCK_LABEL_146;
Exception exception;
exception;
tracker_peer_cache_mon.exit();
throw exception;
}
public void removeFromTrackerResponseCache(String ip, int tcp_port)
{
tracker_peer_cache_mon.enter();
TRTrackerAnnouncerResponsePeerImpl peer = new TRTrackerAnnouncerResponsePeerImpl("", new byte[0], ip, tcp_port, 0, 0, (short)0, (byte)0, 0);
if (tracker_peer_cache.remove(peer.getKey()) != null && Logger.isEnabled())
Logger.log(new LogEvent(getTorrent(), LOGID, (new StringBuilder()).append("Explicit removal of peer cache for ").append(ip).append(":").append(tcp_port).toString()));
tracker_peer_cache_mon.exit();
break MISSING_BLOCK_LABEL_116;
Exception exception;
exception;
tracker_peer_cache_mon.exit();
throw exception;
}
public static Map mergeResponseCache(Map map1, Map map2)
{
if (map1 == null && map2 == null)
return new HashMap();
if (map1 == null)
return map2;
if (map2 == null)
return map1;
Map res = new HashMap();
List peers = (List)map1.get("tracker_peers");
if (peers == null)
peers = new ArrayList();
List p2 = (List)map2.get("tracker_peers");
if (p2 != null)
{
if (Logger.isEnabled())
Logger.log(new LogEvent(LOGID, (new StringBuilder()).append("TRTrackerClient: merged peer sets: p1 = ").append(peers.size()).append(", p2 = ").append(p2.size()).toString()));
for (int i = 0; i < p2.size(); i++)
peers.add(p2.get(i));
}
res.put("tracker_peers", peers);
return res;
}
protected TRTrackerAnnouncerResponsePeer[] getPeersFromCache(int num_want)
{
TRTrackerAnnouncerResponsePeerImpl atrtrackerannouncerresponsepeerimpl[];
tracker_peer_cache_mon.enter();
TRTrackerAnnouncerResponsePeerImpl res[];
if (tracker_peer_cache.size() <= num_want)
{
res = new TRTrackerAnnouncerResponsePeerImpl[tracker_peer_cache.size()];
tracker_peer_cache.values().toArray(res);
} else
{
res = new TRTrackerAnnouncerResponsePeerImpl[num_want];
Iterator it = tracker_peer_cache.keySet().iterator();
for (int i = 0; i < num_want; i++)
{
String key = (String)it.next();
res[i] = (TRTrackerAnnouncerResponsePeerImpl)tracker_peer_cache.get(key);
it.remove();
}
for (int i = 0; i < num_want; i++)
tracker_peer_cache.put(res[i].getKey(), res[i]);
}
if (Logger.isEnabled())
{
for (int i = 0; i < res.length; i++)
Logger.log(new LogEvent(getTorrent(), LOGID, (new StringBuilder()).append("CACHED PEER: ").append(res[i].getString()).toString()));
Logger.log(new LogEvent(getTorrent(), LOGID, (new StringBuilder()).append("TRTrackerClient: returned ").append(res.length).append(" cached peers").toString()));
}
atrtrackerannouncerresponsepeerimpl = res;
tracker_peer_cache_mon.exit();
return atrtrackerannouncerresponsepeerimpl;
Exception exception;
exception;
tracker_peer_cache_mon.exit();
throw exception;
}
public void addListener(TRTrackerAnnouncerListener l)
{
listeners.addListener(l);
}
public void removeListener(TRTrackerAnnouncerListener l)
{
listeners.removeListener(l);
}
static
{
LOGID = LogIDs.TRACKER;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -