📄 downloadmanagerimpl.java
字号:
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 + -