📄 downloadimpl.java
字号:
/*
* File : DownloadImpl.java
* Created : 06-Jan-2004
* By : parg
*
* Azureus - a Java Bittorrent client
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.gudy.azureus2.pluginsimpl.local.download;
/**
* @author parg
*
*/
import java.io.File;
import java.util.*;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.core3.category.*;
import org.gudy.azureus2.core3.global.*;
import org.gudy.azureus2.core3.download.*;
import org.gudy.azureus2.core3.peer.*;
import org.gudy.azureus2.core3.torrent.*;
import org.gudy.azureus2.core3.tracker.client.*;
import org.gudy.azureus2.plugins.torrent.Torrent;
import org.gudy.azureus2.plugins.torrent.TorrentAttribute;
import org.gudy.azureus2.plugins.peers.*;
import org.gudy.azureus2.pluginsimpl.local.disk.DiskManagerFileInfoImpl;
import org.gudy.azureus2.pluginsimpl.local.peers.*;
import org.gudy.azureus2.pluginsimpl.local.torrent.TorrentImpl;
import org.gudy.azureus2.pluginsimpl.local.torrent.TorrentManagerImpl;
import org.gudy.azureus2.plugins.disk.DiskManager;
import org.gudy.azureus2.plugins.disk.DiskManagerFileInfo;
import org.gudy.azureus2.plugins.download.Download;
import org.gudy.azureus2.plugins.download.DownloadActivationEvent;
import org.gudy.azureus2.plugins.download.DownloadActivationListener;
import org.gudy.azureus2.plugins.download.DownloadListener;
import org.gudy.azureus2.plugins.download.DownloadPeerListener;
import org.gudy.azureus2.plugins.download.DownloadPropertyListener;
import org.gudy.azureus2.plugins.download.DownloadPropertyEvent;
import org.gudy.azureus2.plugins.download.DownloadTrackerListener;
import org.gudy.azureus2.plugins.download.DownloadAnnounceResult;
import org.gudy.azureus2.plugins.download.DownloadScrapeResult;
import org.gudy.azureus2.plugins.download.DownloadStats;
import org.gudy.azureus2.plugins.download.DownloadException;
import org.gudy.azureus2.plugins.download.DownloadRemovalVetoException;
import org.gudy.azureus2.plugins.download.DownloadWillBeRemovedListener;
import org.gudy.azureus2.plugins.download.session.SessionAuthenticator;
import org.gudy.azureus2.core3.internat.MessageText;
import org.gudy.azureus2.core3.logging.LogRelation;
import com.aelitis.azureus.core.util.CopyOnWriteList;
public class
DownloadImpl
extends LogRelation
implements Download, DownloadManagerListener,
DownloadManagerTrackerListener, DownloadManagerPeerListener,
DownloadManagerStateListener, DownloadManagerActivationListener
{
private DownloadManager download_manager;
private DownloadStatsImpl download_stats;
private int latest_state = ST_STOPPED;
private boolean latest_forcedStart;
private DownloadAnnounceResultImpl last_announce_result = new DownloadAnnounceResultImpl(this,null);
private DownloadScrapeResultImpl last_scrape_result = new DownloadScrapeResultImpl( this, null );
private TorrentImpl torrent = null;
private List listeners = new ArrayList();
private AEMonitor listeners_mon = new AEMonitor( "Download:L");
private List property_listeners = new ArrayList();
private List tracker_listeners = new ArrayList();
private AEMonitor tracker_listeners_mon = new AEMonitor( "Download:TL");
private List removal_listeners = new ArrayList();
private AEMonitor removal_listeners_mon = new AEMonitor( "Download:RL");
private List peer_listeners = new ArrayList();
private AEMonitor peer_listeners_mon = new AEMonitor( "Download:PL");
private CopyOnWriteList activation_listeners = new CopyOnWriteList();
private DownloadActivationEvent activation_state;
protected
DownloadImpl(
DownloadManager _dm )
{
download_manager = _dm;
download_stats = new DownloadStatsImpl( download_manager );
activation_state =
new DownloadActivationEvent()
{
public Download
getDownload()
{
return( DownloadImpl.this );
}
public int
getActivationCount()
{
return( download_manager.getActivationCount());
}
};
download_manager.addListener( this );
latest_forcedStart = download_manager.isForceStart();
}
// Not available to plugins
public DownloadManager
getDownload()
{
return( download_manager );
}
public int
getState()
{
return( convertState( download_manager.getState()) );
}
public int
getSubState()
{
int state = getState();
if ( state == ST_STOPPING ){
int substate = download_manager.getSubState();
if ( substate == DownloadManager.STATE_QUEUED ){
return( ST_QUEUED );
}else if ( substate == DownloadManager.STATE_STOPPED ){
return( ST_STOPPED );
}else if ( substate == DownloadManager.STATE_ERROR ){
return( ST_ERROR );
}
}
return( state );
}
protected int
convertState(
int dm_state )
{
// dm states: waiting -> initialising -> initialized ->
// disk states: allocating -> checking -> ready ->
// dm states: downloading -> finishing -> seeding -> stopping -> stopped
// "initialize" call takes from waiting -> initialising -> waiting (no port) or initialized (ok)
// if initialized then disk manager runs through to ready
// "startdownload" takes ready -> dl etc.
// "stopIt" takes to stopped which is equiv to ready
int our_state;
switch( dm_state ){
case DownloadManager.STATE_WAITING:
{
our_state = ST_WAITING;
break;
}
case DownloadManager.STATE_INITIALIZING:
case DownloadManager.STATE_INITIALIZED:
case DownloadManager.STATE_ALLOCATING:
case DownloadManager.STATE_CHECKING:
{
our_state = ST_PREPARING;
break;
}
case DownloadManager.STATE_READY:
{
our_state = ST_READY;
break;
}
case DownloadManager.STATE_DOWNLOADING:
case DownloadManager.STATE_FINISHING: // finishing download - transit to seeding
{
our_state = ST_DOWNLOADING;
break;
}
case DownloadManager.STATE_SEEDING:
{
our_state = ST_SEEDING;
break;
}
case DownloadManager.STATE_STOPPING:
{
our_state = ST_STOPPING;
break;
}
case DownloadManager.STATE_STOPPED:
{
our_state = ST_STOPPED;
break;
}
case DownloadManager.STATE_QUEUED:
{
our_state = ST_QUEUED;
break;
}
case DownloadManager.STATE_ERROR:
{
our_state = ST_ERROR;
break;
}
default:
{
our_state = ST_ERROR;
}
}
return( our_state );
}
public String
getErrorStateDetails()
{
return( download_manager.getErrorDetails());
}
public boolean
getFlag(
long flag )
{
return( download_manager.getDownloadState().getFlag( flag ));
}
public void setFlag(long flag, boolean set) {
download_manager.getDownloadState().setFlag(flag, set);
}
public int
getIndex()
{
GlobalManager globalManager = download_manager.getGlobalManager();
return globalManager.getIndexOf(download_manager);
}
public Torrent
getTorrent()
{
if (this.torrent != null) {return this.torrent;}
TOTorrent torrent = download_manager.getTorrent();
if (torrent == null) {return null;}
this.torrent = new TorrentImpl(torrent);
return this.torrent;
}
public void
initialize()
throws DownloadException
{
int state = download_manager.getState();
if ( state == DownloadManager.STATE_WAITING ){
download_manager.initialize();
}else{
throw( new DownloadException( "Download::initialize: download not waiting (state=" + state + ")" ));
}
}
public void
start()
throws DownloadException
{
int state = download_manager.getState();
if ( state == DownloadManager.STATE_READY ){
download_manager.startDownload();
}else{
throw( new DownloadException( "Download::start: download not ready (state=" + state + ")" ));
}
}
public void
restart()
throws DownloadException
{
int state = download_manager.getState();
if ( state == DownloadManager.STATE_STOPPED ||
state == DownloadManager.STATE_QUEUED ){
download_manager.setStateWaiting();
}else{
throw( new DownloadException( "Download::restart: download already running (state=" + state + ")" ));
}
}
public void
stop()
throws DownloadException
{
if ( download_manager.getState() != DownloadManager.STATE_STOPPED){
download_manager.stopIt( DownloadManager.STATE_STOPPED, false, false );
}else{
throw( new DownloadException( "Download::stop: download already stopped" ));
}
}
public void
stopAndQueue()
throws DownloadException
{
if ( download_manager.getState() != DownloadManager.STATE_QUEUED){
download_manager.stopIt( DownloadManager.STATE_QUEUED, false, false );
}else{
throw( new DownloadException( "Download::stopAndQueue: download already queued" ));
}
}
public void
recheckData()
throws DownloadException
{
if ( !download_manager.canForceRecheck()){
throw( new DownloadException( "Download::recheckData: download must be stopped, quued or in error state" ));
}
download_manager.forceRecheck();
}
public boolean
isStartStopLocked()
{
return( download_manager.getState() == DownloadManager.STATE_STOPPED );
}
public boolean
isForceStart()
{
return download_manager.isForceStart();
}
public void
setForceStart(boolean forceStart)
{
download_manager.setForceStart(forceStart);
}
public boolean
isPaused()
{
return( download_manager.isPaused());
}
public void
pause()
{
download_manager.pause();
}
public void
resume()
{
download_manager.resume();
}
public int
getPosition()
{
return download_manager.getPosition();
}
public long
getCreationTime()
{
return( download_manager.getCreationTime());
}
public void
setPosition(int newPosition)
{
download_manager.setPosition(newPosition);
}
public void
moveUp()
{
download_manager.getGlobalManager().moveUp(download_manager);
}
public void
moveDown()
{
download_manager.getGlobalManager().moveDown(download_manager);
}
public void
moveTo(
int pos )
{
download_manager.getGlobalManager().moveTo( download_manager, pos );
}
public String
getName()
{
return download_manager.getDisplayName();
}
public String getTorrentFileName() {
return download_manager.getTorrentFileName();
}
public String getCategoryName() {
Category category = download_manager.getDownloadState().getCategory();
if (category == null)
category = CategoryManager.getCategory(Category.TYPE_UNCATEGORIZED);
if (category == null)
return null;
return category.getName();
}
public String
getAttribute(
TorrentAttribute attribute )
{
String name = convertAttribute( attribute );
if ( name != null ){
return( download_manager.getDownloadState().getAttribute( name ));
}
return( null );
}
public String[]
getListAttribute(
TorrentAttribute attribute )
{
String name = convertAttribute( attribute );
if ( name != null ){
return( download_manager.getDownloadState().getListAttribute( name ));
}
return( null );
}
public void setListAttribute(TorrentAttribute attribute, String[] value) {
String name = convertAttribute(attribute);
if (name != null) {
download_manager.getDownloadState().setListAttribute(name, value);
}
}
public void
setMapAttribute(
TorrentAttribute attribute,
Map value )
{
String name = convertAttribute( attribute );
if ( name != null ){
download_manager.getDownloadState().setMapAttribute( name, value );
}
}
public Map
getMapAttribute(
TorrentAttribute attribute )
{
String name = convertAttribute( attribute );
if ( name != null ){
return( download_manager.getDownloadState().getMapAttribute( name ));
}
return( null );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -