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

📄 downloadmanagerimpl.java

📁 Azureus is a powerful, full-featured, cross-platform java BitTorrent client
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
	informPositionChanged(int iOldPosition)
	{
		listeners.dispatch( LDT_POSITIONCHANGED, new Integer(iOldPosition));
	}

  public void
  addPeerListener(
	  DownloadManagerPeerListener	listener )
  {
  	try{
  		peer_listeners_mon.enter();
  		
  		peer_listeners.addListener( listener );
  		
		for (int i=0;i<current_peers.size();i++){
  			
			peer_listeners.dispatch( listener, LDT_PE_PEER_ADDED, current_peers.get(i));
		}
		
		for (int i=0;i<current_pieces.size();i++){
  			
			peer_listeners.dispatch( listener, LDT_PE_PIECE_ADDED, current_pieces.get(i));
		}
		
		PEPeerManager	temp = peerManager;
		
		if ( temp != null ){
	
			peer_listeners.dispatch( listener, LDT_PE_PM_ADDED, temp );
		}
  	}finally{
  		
  		peer_listeners_mon.exit();
  	}
  }
		
  public void
  removePeerListener(
	  DownloadManagerPeerListener	listener )
  {
  	peer_listeners.removeListener( listener );
  }
 

  public void
  addPeer(
	  PEPeer 		peer )
  {
  	try{
  		peer_listeners_mon.enter();
 	
  		current_peers.add( peer );
  		
  		peer_listeners.dispatch( LDT_PE_PEER_ADDED, peer );
  		
	}finally{
		
		peer_listeners_mon.exit();
	}
  }
		
  public void
  removePeer(
	  PEPeer		peer )
  {
    try{
    	peer_listeners_mon.enter();
    	
    	current_peers.remove( peer );
    	
    	peer_listeners.dispatch( LDT_PE_PEER_REMOVED, peer );
    	
    }finally{
    	
    	peer_listeners_mon.exit();
    }
 }
		
  public void
  addPiece(
	  PEPiece 	piece )
  {
  	try{
  		peer_listeners_mon.enter();
  		
  		current_pieces.add( piece );
  		
  		peer_listeners.dispatch( LDT_PE_PIECE_ADDED, piece );
  		
  	}finally{
  		
  		peer_listeners_mon.exit();
  	}
 }
		
  public void
  removePiece(
	  PEPiece		piece )
  {
  	try{
  		peer_listeners_mon.enter();
  		
  		current_pieces.remove( piece );
  		
  		peer_listeners.dispatch( LDT_PE_PIECE_REMOVED, piece );
  		
  	}finally{
  		
  		peer_listeners_mon.exit();
  	}
 }

	public DownloadManagerStats
	getStats()
	{
		return( stats );
	}

  public boolean isForceStart() {
    return forceStarted;
  }

  public void setForceStart(boolean forceStart) {
    if (forceStarted != forceStart) {
      forceStarted = forceStart;
      if (forceStarted && 
          (getState() == STATE_STOPPED || getState() == STATE_QUEUED)) {
        // Start it!  (Which will cause a stateChanged to trigger)
        setState(STATE_WAITING);
      } else {
        informStateChanged(getState());
      }
    }
  }

  /**
   * Is called when a download is finished.
   * Activates alerts for the user.
   *
   * @author Rene Leonhardt
   */
  public void 
  downloadEnded()
  {
    if (isForceStart()){
    	
      setForceStart(false);
    }

    setOnlySeeding(true);
	
    informDownloadEnded();
  }

  public DiskManager 
  initializeDiskManager() 
  {
  	DiskManager	res = diskManager;
  	
  	if( res == null) {

  		res = diskManager = DiskManagerFactory.create( torrent, this);
      
  		disk_manager_listener = 
  			new DiskManagerListener()
  			{
  				public void
  				stateChanged(
  					int 	oldDMState,
  					int		newDMState )
  				{
  					if ( newDMState == DiskManager.FAULTY ){
  						
  						setFailed( diskManager.getErrorMessage());						
   					}
  					
  					if (oldDMState == DiskManager.CHECKING) {
  						
  						stats.setDownloadCompleted(stats.getDownloadCompleted(true));
  						
  						DownloadManagerImpl.this.setOnlySeeding(diskManager.getRemaining() == 0);
  					}
  					  
  					if ( newDMState == DiskManager.READY ){
  						
  							// make up some sensible "downloaded" figure for torrents that have been re-added to Azureus
  							// and resumed 
  					
  						if ( 	stats.getDownloaded() == 0 &&
  								stats.getUploaded() == 0 &&
  								stats.getSecondsDownloading() == 0 ){
  						
  							int	completed = stats.getDownloadCompleted(false);
  							
  								// for seeds leave things as they are as they may never have been downloaded in the
  								// first place...
  							
  							if ( completed < 1000 ){
 
  									// assume downloaded = uploaded, optimistic but at least results in
  									// future share ratios relevant to amount up/down from now on
  									// see bug 1077060 
  								
  								long	amount_downloaded = (completed*diskManager.getTotalLength())/1000;
  								
 								stats.setSavedDownloadedUploaded( amount_downloaded,amount_downloaded );
   							}
  						}
  					}
  					
  					int	dl_state = getState();
  					
  					if ( dl_state != state ){
  						
  						informStateChanged( dl_state );
  					}
  				}
  			};
  		
  		diskManager.addListener( disk_manager_listener );
  	}
  	
  	return( res );
  }
  
  public boolean 
  canForceRecheck() 
  {
  	if ( torrent == null ){
  			// broken torrent, can't force recheck
  		
  		return( false );
  	}
  	
    return (state == STATE_STOPPED) ||
           (state == STATE_QUEUED) ||
           (state == STATE_ERROR && diskManager == null);
  }

  public void 
  forceRecheck() 
  {
  	if ( diskManager != null ) {
  		LGLogger.log(0, 0, LGLogger.ERROR, "Trying to force recheck while diskmanager active");
  		return;
  	}
  
  	if ( torrent == null ){
 		LGLogger.log(0, 0, LGLogger.ERROR, "Trying to force recheck with broken torrent");
  		return;
 		
  	}
    Thread recheck = 
    	new AEThread("forceRecheck") 
		{
			public void runSupport() {
				int start_state = DownloadManagerImpl.this.getState();
				
				setState(STATE_CHECKING);
				
					// remove resume data
				
				download_manager_state.clearResumeData();
				
				// For extra protection from a plugin stopping a checking torrent,
				// fake a forced start. 
				
				boolean wasForceStarted = forceStarted;
				
				forceStarted = true;
				
					// if a file has been deleted we want this recheck to recreate the file and mark
					// it as 0%, not fail the recheck. Otherwise the only way of recovering is to remove and
					// re-add the torrent
				
				setDataAlreadyAllocated( false );
				
				DiskManager recheck_disk_manager = initializeDiskManager();
				
				while ( recheck_disk_manager.getState() != DiskManager.FAULTY &&
						recheck_disk_manager.getState() != DiskManager.READY){
					
					try {
						
						Thread.sleep(100);
						
					} catch (Exception e) {
						
						Debug.printStackTrace( e );
					}
				}
				
				forceStarted = wasForceStarted;
				
				stats.setDownloadCompleted(stats.getDownloadCompleted(true));
				
				if ( recheck_disk_manager.getState() == DiskManager.READY ){
					
				  	try{
				  		recheck_disk_manager.dumpResumeDataToDisk(true, false);
				  		
						recheck_disk_manager.stop();
						
						setOnlySeeding(recheck_disk_manager.getRemaining() == 0);
						
						diskManager = null;
						
						if (start_state == STATE_ERROR){
							
							setState( STATE_STOPPED );
							
						}else{
							
							setState(start_state);
						}
				  	}catch( Exception e ){
				  		
						setFailed( errorDetail = "Resume data save fails: " + Debug.getNestedExceptionMessage(e));
				  	}
				  	
				  }else{ // Faulty
				  						
				  	recheck_disk_manager.stop();
					
				  	setOnlySeeding(false);
					
				  	diskManager = null;
					
					setFailed( recheck_disk_manager.getErrorMessage());	 
				  }
				}
			};
		
		recheck.setPriority(Thread.MIN_PRIORITY);
		recheck.start();
  }
  
  
  public int getHealthStatus() {
    if(peerManager != null && (state == STATE_DOWNLOADING || state == STATE_SEEDING)) {
      int nbSeeds = getNbSeeds();
      int nbPeers = getNbPeers();
      int nbRemotes = peerManager.getNbRemoteConnections();
      int trackerStatus = tracker_client.getLastResponse().getStatus();
      boolean isSeed = (state == STATE_SEEDING);
      
      if( (nbSeeds + nbPeers) == 0) {
        if(isSeed)
          return WEALTH_NO_TRACKER;        
        return WEALTH_KO;        
      }
      if( trackerStatus == TRTrackerResponse.ST_OFFLINE || trackerStatus == TRTrackerResponse.ST_REPORTED_ERROR)
        return WEALTH_NO_TRACKER;
      if( nbRemotes == 0 )
        return WEALTH_NO_REMOTE;
      return WEALTH_OK;
    } else {
      return WEALTH_STOPPED;
    }
  }
  
  public int getPosition() {
  	return position;
  }

  public void setPosition(int newPosition) {
    if (newPosition != position) {
//  	  LGLogger.log(getName() + "] setPosition from "+position+" to "+newPosition);
//    	Debug.outStackTrace();
      int oldPosition = position;
    	position = newPosition;
    	informPositionChanged(oldPosition);
    }
  }

  public void
  addTrackerListener(
  	DownloadManagerTrackerListener	listener )
  {  		
  	tracker_listeners.addListener( listener );
  }
  
  public void
  removeTrackerListener(
  	DownloadManagerTrackerListener	listener )
  {
  		tracker_listeners.removeListener( listener );
  }
  
  private void 
  deleteDataFiles() 
  {
  	DiskManagerFactory.deleteDataFiles(torrent, torrent_save_dir, torrent_save_file );
  }
  
  private void 
  deleteTorrentFile() 
  {
  	if ( torrentFileName != null ){
  		
        TorrentUtils.delete( new File(torrentFileName));
    }
  }
  
  public DownloadManagerState 
  getDownloadState()
  {
  	return( download_manager_state );
  }
  
  
  /** To retreive arbitrary objects against a download. */
  public Object getData (String key) {
  	if (data == null) return null;
    return data.get(key);
  }

  /** To store arbitrary objects against a download. */
  public void setData (String key, Object value) {
  	try{
  		peer_listeners_mon.enter();
  	
	  	if (data == null) {
	  	  data = new HashMap();
	  	}
	    if (value == null) {
	      if (data.containsKey(key))
	        data.remove(key);
	    } else {
	      data.put(key, value);
	    }
  	}finally{
  		
  		peer_listeners_mon.exit();
  	}
  }
  
  
  public boolean 
  isDataAlreadyAllocated() 
  {  
  	return data_already_allocated;  
  }
  
  public void 
  setDataAlreadyAllocated( 
  	boolean already_allocated ) 
  {
    data_already_allocated = already_allocated;
  }
    
  public long
  getCreationTime()
  {
  	return( creation_time );
  }

  public void
  setCreationTime(
  	long		t )
  {
  	creation_time	= t;
  }
}

⌨️ 快捷键说明

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