📄 dhttrackerplugin.java
字号:
String register_reason;
if ( state == Download.ST_DOWNLOADING ||
state == Download.ST_SEEDING ||
state == Download.ST_QUEUED ){
String[] networks = download.getListAttribute( ta_networks );
Torrent torrent = download.getTorrent();
if ( torrent != null && networks != null ){
boolean public_net = false;
for (int i=0;i<networks.length;i++){
if ( networks[i].equalsIgnoreCase( "Public" )){
public_net = true;
break;
}
}
if ( public_net && !torrent.isPrivate()){
if ( torrent.isDecentralised()){
// peer source not relevant for decentralised torrents
register_it = true;
register_reason = "decentralised";
}else{
if ( torrent.isDecentralisedBackupEnabled()){
String[] sources = download.getListAttribute( ta_peer_sources );
boolean ok = false;
for (int i=0;i<sources.length;i++){
if ( sources[i].equalsIgnoreCase( "DHT")){
ok = true;
break;
}
}
if ( !ok ){
register_reason = "decentralised peer source disabled";
}else{
if( torrent.isDecentralisedBackupRequested()){
register_it = true;
register_reason = "torrent requests decentralised tracking";
}else if ( track_normal_when_offline.getValue()){
// only track if torrent's tracker is not available
if ( state == Download.ST_DOWNLOADING ||
state == Download.ST_SEEDING ){
DownloadAnnounceResult result = download.getLastAnnounceResult();
if ( result == null ||
result.getResponseType() == DownloadAnnounceResult.RT_ERROR ||
TorrentUtils.isDecentralised(result.getURL())){
register_it = true;
register_reason = "tracker unavailable (announce)";
}else{
register_reason = "tracker available (announce: " + result.getURL() + ")";
}
}else{
DownloadScrapeResult result = download.getLastScrapeResult();
if ( result == null ||
result.getResponseType() == DownloadScrapeResult.RT_ERROR ||
TorrentUtils.isDecentralised(result.getURL())){
register_it = true;
register_reason = "tracker unavailable (scrape)";
}else{
register_reason = "tracker available (scrape: " + result.getURL() + ")";
}
}
}else{
register_it = true;
register_reason = "peer source enabled";
}
}
}else{
register_reason = "decentralised backup disabled for the torrent";
}
}
}else{
register_reason = "not public";
}
}else{
register_reason = "torrent is broken";
}
}else if ( state == Download.ST_STOPPED ||
state == Download.ST_ERROR ){
register_reason = "not running";
}else{
register_reason = "";
}
if ( register_reason.length() > 0 ){
try{
this_mon.enter();
if ( register_it ){
if ( !running_downloads.contains( download )){
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION,
"Monitoring '" + download.getName() + "': " + register_reason);
running_downloads.add( download );
}
}else{
if ( running_downloads.contains( download )){
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION,
"Not monitoring '" + download.getName() + "': "
+ register_reason);
running_downloads.remove( download );
}else{
if ( first_time ){
log.log(download.getTorrent(), LoggerChannel.LT_INFORMATION,
"Not monitoring '" + download.getName() + "': "
+ register_reason);
}
}
}
}finally{
this_mon.exit();
}
}
}
protected void
processRegistrations()
{
ArrayList rds;
try{
this_mon.enter();
rds = new ArrayList(running_downloads);
}finally{
this_mon.exit();
}
long now = SystemTime.getCurrentTime();
Iterator it = rds.iterator();
while( it.hasNext()){
final Download dl = (Download)it.next();
Byte existing_flags = (Byte)registered_downloads.get( dl );
byte new_flags = dl.isComplete()?DHTPlugin.FLAG_SEEDING:DHTPlugin.FLAG_DOWNLOADING;
if ( existing_flags == null || existing_flags.byteValue() != new_flags ){
log.log( "Registering download '" + dl.getName() + "' as " + (new_flags == DHTPlugin.FLAG_SEEDING?"Seeding":"Downloading"));
final long start = SystemTime.getCurrentTime();
registered_downloads.put( dl, new Byte( new_flags ));
try{
this_mon.enter();
query_map.put( dl, new Long( now ));
}finally{
this_mon.exit();
}
int port = plugin_interface.getPluginconfig().getIntParameter( "TCP.Listen.Port" );
String port_override = COConfigurationManager.getStringParameter("TCP.Announce.Port","");
if( !port_override.equals("")){
try{
port = Integer.parseInt( port_override );
}catch( Throwable e ){
}
}
if ( port == 0 ){
log.log( " port = 0, registration not performed" );
}else{
String override_ips = COConfigurationManager.getStringParameter( "Override Ip", "" );
String override_ip = null;
if ( override_ips.length() > 0 ){
// gotta select an appropriate override based on network type
StringTokenizer tok = new StringTokenizer( override_ips, ";" );
while( tok.hasMoreTokens()){
String this_address = (String)tok.nextToken().trim();
if ( this_address.length() > 0 ){
String cat = AENetworkClassifier.categoriseAddress( this_address );
if ( cat == AENetworkClassifier.AT_PUBLIC ){
override_ip = this_address;
break;
}
}
}
}
if ( override_ip != null ){
try{
override_ip = PRHelpers.DNSToIPAddress( override_ip );
}catch( UnknownHostException e){
log.log( " Can't resolve IP override '" + override_ip + "'" );
override_ip = null;
}
}
// format is [ip_override:]port[;C]
String value_to_put = override_ip==null?"":(override_ip+":");
value_to_put += port;
if ( NetworkManager.REQUIRE_CRYPTO_HANDSHAKE ){
value_to_put += ";C";
}
// don't let a put block an announce as we don't want to be waiting for
// this at start of day to get a torrent running
// increaseActive( dl );
dht.put(
dl.getTorrent().getHash(),
"Tracker registration of '" + dl.getName() + "' -> " + value_to_put,
value_to_put.getBytes(),
new_flags,
new DHTPluginOperationListener()
{
public void
valueRead(
DHTPluginContact originator,
DHTPluginValue value )
{
}
public void
valueWritten(
DHTPluginContact target,
DHTPluginValue value )
{
}
public void
complete(
boolean timeout_occurred )
{
log.log(dl.getTorrent(), LoggerChannel.LT_INFORMATION,
"Registration of '" + dl.getName()
+ "' completed (elapsed="
+ (SystemTime.getCurrentTime() - start) + ")");
// decreaseActive( dl );
}
});
}
}
}
it = registered_downloads.keySet().iterator();
while( it.hasNext()){
final Download dl = (Download)it.next();
boolean unregister;
try{
this_mon.enter();
unregister = !running_downloads.contains( dl );
}finally{
this_mon.exit();
}
if ( unregister ){
log.log(dl.getTorrent(), LoggerChannel.LT_INFORMATION,
"Unregistering download '" + dl.getName() + "'");
final long start = SystemTime.getCurrentTime();
it.remove();
try{
this_mon.enter();
query_map.remove( dl );
}finally{
this_mon.exit();
}
increaseActive( dl );
dht.remove(
dl.getTorrent().getHash(),
"Tracker deregistration of '" + dl.getName() + "'",
new DHTPluginOperationListener()
{
public void
valueRead(
DHTPluginContact originator,
DHTPluginValue value )
{
}
public void
valueWritten(
DHTPluginContact target,
DHTPluginValue value )
{
}
public void
complete(
boolean timeout_occurred )
{
log.log(dl.getTorrent(), LoggerChannel.LT_INFORMATION,
"Unregistration of '" + dl.getName() + "' completed (elapsed="
+ (SystemTime.getCurrentTime() - start) + ")");
decreaseActive( dl );
}
});
}
}
it = rds.iterator();
while( it.hasNext()){
final Download dl = (Download)it.next();
Long next_time;
try{
this_mon.enter();
next_time = (Long)query_map.get( dl );
}finally{
this_mon.exit();
}
if ( next_time != null && now >= next_time.longValue()){
try{
this_mon.enter();
query_map.remove( dl );
}finally{
this_mon.exit();
}
final long start = SystemTime.getCurrentTime();
// if we're already connected to > NUM_WANT peers then don't bother announcing
PeerManager pm = dl.getPeerManager();
// don't query if this download already has an active DHT operation
boolean skip = isActive( dl );
if ( skip ){
log.log(dl.getTorrent(), LoggerChannel.LT_INFORMATION,
"Deferring announce for '" + dl.getName()
+ "' as activity outstanding");
}
if ( pm != null && !skip ){
int con = pm.getStats().getConnectedLeechers() + pm.getStats().getConnectedSeeds();
skip = con >= NUM_WANT;
}
if ( skip ){
try{
this_mon.enter();
if ( running_downloads.contains( dl )){
// use "min" here as we're just deferring it
query_map.put( dl, new Long( start + ANNOUNCE_MIN_DEFAULT ));
}
}finally{
this_mon.exit();
}
}else{
final Torrent torrent = dl.getTorrent();
final URL url_to_report = torrent.isDecentralised()?torrent.getAnnounceURL():DEFAULT_URL;
increaseActive( dl );
dht.get(dl.getTorrent().getHash(),
"Tracker announce for '" + dl.getName() + "'",
dl.isComplete()?DHTPlugin.FLAG_SEEDING:DHTPlugin.FLAG_DOWNLOADING,
NUM_WANT,
ANNOUNCE_TIMEOUT,
false,
new DHTPluginOperationListener()
{
List addresses = new ArrayList();
List ports = new ArrayList();
List flags = new ArrayList();
int seed_count;
int leecher_count;
public void
valueRead(
DHTPluginContact originator,
DHTPluginValue value )
{
String str_val = new String(value.getValue());
int sep = str_val.indexOf(';');
String flag = null;
if ( sep != -1 ){
flag = str_val.substring( sep+1 );
str_val = str_val.substring(0,sep);
// for future hacks we trim anything after a ';'
sep = flag.indexOf( ';' );
if ( sep != -1 ){
flag = flag.substring(0,sep);
}
}
flags.add( flag );
try{
sep = str_val.indexOf(':');
String ip_str = null;
String port_str;
if ( sep == -1 ){
port_str = str_val;
}else{
ip_str = str_val.substring( 0, sep );
port_str = str_val.substring( sep+1 );
}
int port = Integer.parseInt( port_str );
addresses.add(
ip_str==null?originator.getAddress().getAddress().getHostAddress():ip_str);
ports.add(new Integer(port));
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -