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

📄 localtrackerplugin.java

📁 JAVA多torrent下载程序P2P源码 This is a stripped down version of Manfred Duchrows Programmer s Freind class
💻 JAVA
📖 第 1 页 / 共 2 页
字号:

							}finally{
								
								mon.exit();
							}
							
							for (int i=0;i<todo.size();i++){
							
								track((Download)todo.get(i));
							}
							
						}catch( Throwable e ){
							
							log.log(e);
						}
						
					}
		
				});
		
	}
	
	
	
	protected void
	track(
		Download	download )
	{
		long	now = plugin_interface.getUtilities().getCurrentSystemTime();

		boolean	ok = false;
		
		try{
			mon.enter();
			
			Long		l_last_track	= (Long)downloads.get( download );
			
			if ( l_last_track == null ){
				
				return;
			}
			
			long	last_track = l_last_track.longValue();
			
			if ( last_track > now || now - last_track > RE_ANNOUNCE_PERIOD ){
					
				ok	= true;
	
				downloads.put( download, new Long( now ));
			}
			
		}finally{
			
			mon.exit();
		}
		
		if ( ok ){
			
			trackSupport( download );
		}
	}
	
	protected void
	trackSupport(
		Download	download )
	{
		if ( !enabled.getValue()){
			
			return;
		}
		
		int	state = download.getState();
		
		if ( state == Download.ST_ERROR || state == Download.ST_STOPPED ){
			
			return;
		}
		
		AZInstanceTracked[]	peers = instance_manager.track( download );
		
		for (int i=0;i<peers.length;i++){
			
			handleTrackResult( peers[i] );
		}
	}
	
	protected void
	forceTrack(
		Download	download )
	{
		try{
			mon.enter();

			downloads.put( download, new Long(0));
			
			String	dl_key = plugin_interface.getUtilities().getFormatters().encodeBytesToString(download.getTorrent().getHash());

			Iterator	it = track_times.values().iterator();
			
			while( it.hasNext()){
				
				((Map)it.next()).remove( dl_key );
			}
		}finally{
			
			mon.exit();
		}
		
		track( download );
	}
	
	protected void
	handleTrackResult(
		AZInstanceTracked		tracked_inst )
	{
		AZInstance	inst	= tracked_inst.getInstance();
		
		Download	download = tracked_inst.getDownload();
				
		boolean	is_seed = tracked_inst.isSeed();
		
		long	now		= plugin_interface.getUtilities().getCurrentSystemTime();
		
		boolean	skip 	= false;
		
			// this code is here to deal with multiple interface machines that receive the result multiple times
		
		try{
			mon.enter();
			
			Map	map = (Map)track_times.get( inst.getID() );
			
			if ( map == null ){
				
				map	= new HashMap();
				
				track_times.put( inst.getID(), map );
			}
			
			String	dl_key = plugin_interface.getUtilities().getFormatters().encodeBytesToString(download.getTorrent().getHash());
			
			Long	last_track = (Long)map.get( dl_key );
			
			if ( last_track != null ){
				
				long	lt = last_track.longValue();
				
				if ( now - lt < 30*1000 ){
					
					skip	= true;
				}
			}
			
			map.put( dl_key, new Long(now));
			
		}finally{
			
			mon.exit();
		}
		
		if ( skip ){
		
			return;
		}
		
		log.log( "Tracked: " + inst.getString() + ": " + download.getName() + ", seed = " + is_seed );

		if ( download.isComplete() && is_seed ){
			
			return;
		}
		
		PeerManager	peer_manager = download.getPeerManager();
		
		if ( peer_manager != null ){	
			
			String	peer_ip			= inst.getInternalAddress().getHostAddress();
			int		peer_tcp_port	= inst.getTCPListenPort();
			int		peer_udp_port	= inst.getUDPListenPort();
			
			log.log( "    " + download.getName() + ": Injecting peer " + peer_ip + ":" + peer_tcp_port + "/" + peer_udp_port);
			
			peer_manager.addPeer( peer_ip, peer_tcp_port, peer_udp_port, false );
		}
	}
	
	public void
	downloadAdded(
		Download	download )
	{
		try{
			mon.enter();
		
			Torrent	torrent = download.getTorrent();
			
			if ( torrent == null ){
				
				return;
			}
			
			if ( torrent.isPrivate()){
				
				log.log( "Not tracking " + download.getName() + ": torrent is private" );

				return;
			}
		
			String[]	networks = download.getListAttribute( ta_networks );
			
			boolean	public_net = false;
			
			for (int i=0;i<networks.length;i++){
				
				if ( networks[i].equalsIgnoreCase( "Public" )){
						
					public_net	= true;
					
					break;
				}
			}
			
			if ( !public_net ){
				
				log.log( "Not tracking " + download.getName() + ": torrent has no public network" );

				return;
			}

			if ( enabled.getValue()){
				log.log( "Tracking " + download.getName());
			}

			downloads.put( download, new Long(0));
			
			download.addListener( this );
			
		}finally{
			
			mon.exit();
		}
	}
	
	public void
	downloadRemoved(
		Download	download )
	{
		try{
			mon.enter();
		
			downloads.remove( download );
			
			download.removeListener( this );
			
		}finally{
			
			mon.exit();
		}
	}
	
	public void
	stateChanged(
		Download		download,
		int				old_state,
		int				new_state )
	{
		if ( 	new_state == Download.ST_DOWNLOADING ||
				new_state == Download.ST_SEEDING ){
			
			forceTrack( download );
		}
	}
	
	public void
	positionChanged(
		Download	download, 
		int oldPosition,
		int newPosition )
	{
	}
	
	protected void
	processSubNets(
		String	subnets,
		boolean	include_well_known )
	{
		if ( include_well_known != instance_manager.getIncludeWellKnownLANs()){
		
			instance_manager.setIncludeWellKnownLANs( include_well_known );
			
			log.log( "Include well known local networks set to " + include_well_known );
		}
		
		if ( subnets.equals( last_subnets )){
			
			return;
		}
		
		last_subnets = subnets;
		
		StringTokenizer	tok = new StringTokenizer( subnets, ";");
				
		while( tok.hasMoreTokens()){
			
			String	net = tok.nextToken().trim();
				
			try{
				
				if ( instance_manager.addLANSubnet( net )){
				
					log.log( "Added network '" + net + "'" );
				}
								
			}catch( Throwable e ){
				
				log.log( "Failed to add network '" + net + "'", e );
			}
		}
	}
	
	protected void
	processAutoAdd(
		String	autoadd )
	{
		if ( autoadd.equals( last_autoadd )){
			
			return;
		}
		
		last_autoadd = autoadd;
		
		StringTokenizer	tok = new StringTokenizer( autoadd, ";");
					
		while( tok.hasMoreTokens()){
			
			String	peer = tok.nextToken();
				
			try{
				
				InetAddress p = InetAddress.getByName( peer.trim());
				
				if ( instance_manager.addInstance( p )){
				
					log.log( "Added peer '" + peer + "'" );
				}
			}catch( Throwable e ){
				
				log.log( "Failed to decode peer '" + peer + "'", e );
			}
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -