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

📄 dhttrackerplugin.java

📁 基于JXTA开发平台的下载软件开发源代码
💻 JAVA
📖 第 1 页 / 共 3 页
字号:
		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 + -