📄 dhttrackerplugin.java
字号:
delay = 0;
}else{
delay = plugin_interface.getUtilities().getCurrentSystemTime() +
INTERESTING_INIT_MIN_OURS +
random.nextInt( INTERESTING_INIT_RAND_OURS );
}
}else{
delay = plugin_interface.getUtilities().getCurrentSystemTime() +
INTERESTING_INIT_MIN_OTHERS +
random.nextInt( INTERESTING_INIT_RAND_OTHERS );
}
try{
this_mon.enter();
interesting_downloads.put( download, new Long( delay ));
}finally{
this_mon.exit();
}
}
}
download.addPropertyListener( DHTTrackerPlugin.this );
download.addTrackerListener( DHTTrackerPlugin.this );
download.addListener( DHTTrackerPlugin.this );
checkDownloadForRegistration( download, true );
}
public void
downloadRemoved(
Download download )
{
download.removePropertyListener( DHTTrackerPlugin.this );
download.removeTrackerListener( DHTTrackerPlugin.this );
download.removeListener( DHTTrackerPlugin.this );
try{
this_mon.enter();
interesting_downloads.remove( download );
running_downloads.remove( download );
}finally{
this_mon.exit();
}
}
});
plugin_interface.getUtilities().createTimer("DHT Tracker", true ).addPeriodicEvent(
15000,
new UTTimerEventPerformer()
{
private int ticks;
public void
perform(
UTTimerEvent event)
{
ticks++;
processRegistrations();
if ( ticks == 2 || ticks%4==0 ){
processNonRegistrations();
}
}
});
}
public void
propertyChanged(
Download download,
DownloadPropertyEvent event )
{
if ( event.getType() == DownloadPropertyEvent.PT_TORRENT_ATTRIBUTE_WRITTEN ){
if ( event.getData() == ta_networks ||
event.getData() == ta_peer_sources ){
checkDownloadForRegistration( download, false );
}
}
}
public void
scrapeResult(
DownloadScrapeResult result )
{
checkDownloadForRegistration( result.getDownload(), false );
}
public void
announceResult(
DownloadAnnounceResult result )
{
checkDownloadForRegistration( result.getDownload(), false );
}
protected void
checkDownloadForRegistration(
Download download,
boolean first_time )
{
int state = download.getState();
boolean register_it = false;
String register_reason;
if ( state == Download.ST_DOWNLOADING ||
state == Download.ST_SEEDING ||
state == Download.ST_QUEUED ||
download.isPaused()){ // pause is a transitory state, don't dereg
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 ||
download.isPaused()){
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 );
// add back to interesting downloads for monitoring
interesting_downloads.put(
download,
new Long( plugin_interface.getUtilities().getCurrentSystemTime() +
INTERESTING_INIT_MIN_OTHERS ));
}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();
String port_details = TRTrackerUtils.getPortsForURL();
while( it.hasNext()){
final Download dl = (Download)it.next();
RegistrationDetails existing_reg = (RegistrationDetails)registered_downloads.get( dl );
byte new_flags = dl.isComplete()?DHTPlugin.FLAG_SEEDING:DHTPlugin.FLAG_DOWNLOADING;
if ( existing_reg == null ||
existing_reg.getFlags() != new_flags ||
!existing_reg.getPortDetails().equals( port_details )){
log.log((existing_reg==null?"Registering":"Re-registering") + " download '" + dl.getName() + "' as " + (new_flags == DHTPlugin.FLAG_SEEDING?"Seeding":"Downloading"));
final long start = SystemTime.getCurrentTime();
RegistrationDetails new_reg = new RegistrationDetails( port_details, new_flags );
registered_downloads.put( dl, new_reg );
try{
this_mon.enter();
query_map.put( dl, new Long( now ));
}finally{
this_mon.exit();
}
int tcp_port = plugin_interface.getPluginconfig().getIntParameter( "TCP.Listen.Port" );
String port_override = COConfigurationManager.getStringParameter("TCP.Announce.Port","");
if( !port_override.equals("")){
try{
tcp_port = Integer.parseInt( port_override );
}catch( Throwable e ){
}
}
if ( tcp_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:]tcp_port[;C][;udp_port]
String value_to_put = override_ip==null?"":(override_ip+":");
value_to_put += tcp_port;
if ( NetworkManager.REQUIRE_CRYPTO_HANDSHAKE ){
value_to_put += ";C";
}
int udp_port = plugin_interface.getPluginconfig().getIntParameter( "UDP.Listen.Port" );
int dht_port = dht.getLocalAddress().getAddress().getPort();
if ( udp_port != dht_port ){
value_to_put += ";" + udp_port;
}
// 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
diversified()
{
}
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{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -