📄 downloadmanagerimpl.java
字号:
return( controller.getPeerManager());
}
public boolean isDownloadComplete(boolean bIncludeDND) {
if (!bIncludeDND) {
return assumedComplete;
}
return controller.isDownloadComplete(bIncludeDND);
}
public void
addListener(
DownloadManagerListener listener )
{
try{
listeners_mon.enter();
listeners.addListener(listener);
listener.stateChanged( this, getState());
// we DON'T dispatch a downloadComplete event here as this event is used to mark the
// transition between downloading and seeding, NOT purely to inform of seeding status
}finally{
listeners_mon.exit();
}
}
public void
removeListener(
DownloadManagerListener listener )
{
try{
listeners_mon.enter();
listeners.removeListener(listener);
}finally{
listeners_mon.exit();
}
}
protected void
informStateChanged()
{
// whenever the state changes we'll get called
try{
listeners_mon.enter();
int new_state = controller.getState();
boolean new_force_start = controller.isForceStart();
if ( new_state != last_informed_state ||
new_force_start != latest_informed_force_start ){
last_informed_state = new_state;
latest_informed_force_start = new_force_start;
listeners.dispatch( LDT_STATECHANGED, new Object[]{ this, new Integer( new_state )});
}
}finally{
listeners_mon.exit();
}
}
protected void
informDownloadEnded()
{
try{
listeners_mon.enter();
listeners.dispatch( LDT_DOWNLOADCOMPLETE, new Object[]{ this });
}finally{
listeners_mon.exit();
}
}
protected void
informPriorityChange(
DiskManagerFileInfo file )
{
controller.filePriorityChanged(file);
try{
listeners_mon.enter();
listeners.dispatch( LDT_FILEPRIORITYCHANGED, new Object[]{ this, file });
}finally{
listeners_mon.exit();
}
requestAssumedCompleteMode();
}
protected void
informPositionChanged(
int new_position )
{
try{
listeners_mon.enter();
int old_position = position;
if ( new_position != old_position ){
position = new_position;
listeners.dispatch(
LDT_POSITIONCHANGED,
new Object[]{ this, new Integer( old_position ), new Integer( new_position )});
}
}finally{
listeners_mon.exit();
}
}
public void
addPeerListener(
DownloadManagerPeerListener listener )
{
addPeerListener(listener, true);
}
public void
addPeerListener(
DownloadManagerPeerListener listener,
boolean bDispatchForExisting )
{
try{
peer_listeners_mon.enter();
peer_listeners.addListener( listener );
if (!bDispatchForExisting)
return; // finally will call
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 = controller.getPeerManager();
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();
}
// if we're a seed and they're a seed then no point in keeping in the announce cache
// if it happens to be there - avoid seed-seed connections in the future
if ( peer.isSeed() && isDownloadComplete( false )){
TRTrackerAnnouncer announcer = tracker_client;
if ( announcer != null ){
announcer.removeFromTrackerResponseCache( peer.getIp(), peer.getTCPListenPort());
}
}
}
public PEPeer[]
getCurrentPeers()
{
try{
peer_listeners_mon.enter();
return (PEPeer[])current_peers.toArray(new PEPeer[current_peers.size()]);
}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 PEPiece[]
getCurrentPieces()
{
try{
peer_listeners_mon.enter();
return (PEPiece[])current_pieces.toArray(new PEPiece[current_pieces.size()]);
}finally{
peer_listeners_mon.exit();
}
}
protected void
informStarted(
PEPeerManager pm )
{
try{
peer_listeners_mon.enter();
peer_listeners.dispatch( LDT_PE_PM_ADDED, pm );
}finally{
peer_listeners_mon.exit();
}
TRTrackerAnnouncer tc = getTrackerClient();
if ( tc != null ){
tc.update( true );
}
}
protected void
informStopped(
PEPeerManager pm,
boolean for_queue ) // can be null if controller was already stopped....
{
if ( pm != null ){
try{
peer_listeners_mon.enter();
peer_listeners.dispatch( LDT_PE_PM_REMOVED, pm );
}finally{
peer_listeners_mon.exit();
}
}
try{
this_mon.enter();
if ( tracker_client != null ){
tracker_client.addListener( stopping_tracker_client_listener );
tracker_client.removeListener( tracker_client_listener );
download_manager_state.setTrackerResponseCache( tracker_client.getTrackerResponseCache());
// currently only report this for complete downloads...
tracker_client.stop( for_queue && isDownloadComplete( false ));
tracker_client.destroy();
tracker_client = null;
}
}finally{
this_mon.exit();
}
}
public DownloadManagerStats
getStats()
{
return( stats );
}
public boolean
isForceStart()
{
return( controller.isForceStart());
}
public void
setForceStart(
boolean forceStart)
{
controller.setForceStart( forceStart );
}
/**
* Is called when a download is finished.
* Activates alerts for the user.
*
* @author Rene Leonhardt
*/
protected void
downloadEnded(
boolean never_downloaded )
{
if ( !never_downloaded ){
if (isForceStart()){
setForceStart(false);
}
setAssumedComplete(true);
informDownloadEnded();
}
TRTrackerAnnouncer tc = tracker_client;
if ( tc != null ){
DiskManager dm = getDiskManager();
// only report "complete" if we really are complete, not a dnd completion event
if ( dm != null && dm.getRemaining() == 0 ){
tc.complete( never_downloaded );
}
}
}
public void
addDiskListener(
DownloadManagerDiskListener listener )
{
controller.addDiskListener( listener );
}
public void
removeDiskListener(
DownloadManagerDiskListener listener )
{
controller.removeDiskListener( listener );
}
public void
addActivationListener(
DownloadManagerActivationListener listener )
{
activation_listeners.add( listener );
}
public void
removeActivationListener(
DownloadManagerActivationListener listener )
{
activation_listeners.remove( listener );
}
public int
getHealthStatus()
{
int state = getState();
PEPeerManager peerManager = controller.getPeerManager();
TRTrackerAnnouncer tc = getTrackerClient();
if( tc != null && peerManager != null && (state == STATE_DOWNLOADING || state == STATE_SEEDING)) {
int nbSeeds = getNbSeeds();
int nbPeers = getNbPeers();
int nbRemotes = peerManager.getNbRemoteConnections();
TRTrackerAnnouncerResponse announce_response = tc.getLastResponse();
int trackerStatus = announce_response.getStatus();
boolean isSeed = (state == STATE_SEEDING);
if( (nbSeeds + nbPeers) == 0) {
if( isSeed ){
return WEALTH_NO_TRACKER; // not connected to any peer and seeding
}
return WEALTH_KO; // not connected to any peer and downloading
}
// read the spec for this!!!!
// no_tracker =
// 1) if downloading -> no tracker
// 2) if seeding -> no connections (dealt with above)
if ( !isSeed ){
if( trackerStatus == TRTrackerAnnouncerResponse.ST_OFFLINE ||
trackerStatus == TRTrackerAnnouncerResponse.ST_REPORTED_ERROR){
return WEALTH_NO_TRACKER;
}
}
if( nbRemotes == 0 ){
TRTrackerScraperResponse scrape_response = getTrackerScrapeResponse();
if ( scrape_response != null && scrape_response.isValid()){
// if we're connected to everyone then report OK as we can't get
// any incoming connections!
if ( nbSeeds == scrape_response.getSeeds() &&
nbPeers == scrape_response.getPeers()){
return WEALTH_OK;
}
}
return WEALTH_NO_REMOTE;
}
return WEALTH_OK;
} else if (state == STATE_ERROR) {
return WEALTH_ERROR;
}else{
return WEALTH_STOPPED;
}
}
public int
getNATStatus()
{
int state = getState();
PEPeerManager peerManager = controller.getPeerManager();
TRTrackerAnnouncer tc = getTrackerClient();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -