📄 downloadmanagerimpl.java
字号:
if ( DiskManagerFactory.isTorrentResumeDataComplete( this )) {
download_manager_state.clearTrackerResponseCache();
stats.setDownloadCompleted(1000);
setOnlySeeding(true);
}else{
setOnlySeeding(false);
}
}catch( TOTorrentException e ){
Debug.printStackTrace( e );
setFailed( TorrentUtils.exceptionToText( e ));
}catch( UnsupportedEncodingException e ){
Debug.printStackTrace( e );
setFailed( MessageText.getString("DownloadManager.error.unsupportedencoding"));
}catch( Throwable e ){
Debug.printStackTrace( e );
setFailed( e );
}finally{
dl_identity_obtained = true;
}
if ( download_manager_state == null ){
read_torrent_state =
new Object[]{
torrent_save_dir, torrent_save_file, torrent_hash,
new Boolean(new_torrent), new Boolean( open_for_seeding ), new Boolean( has_ever_been_started ),
new Integer( initial_state )
};
// torrent's stuffed - create a dummy "null object" to simplify use
// by other code
download_manager_state = DownloadManagerStateImpl.getDownloadState( this );
// make up something vaguely sensible for save location
if ( torrent_save_file == null ){
torrent_save_location = new File( torrent_save_dir );
}else{
torrent_save_location = new File( torrent_save_dir, torrent_save_file );
}
}else{
// make sure we know what networks to use for this download
if ( download_manager_state.getNetworks().length == 0 ){
String[] networks = AENetworkClassifier.getNetworks( torrent, display_name );
download_manager_state.setNetworks( networks );
}
if ( download_manager_state.getPeerSources().length == 0 ){
String[] ps = PEPeerSource.getPeerSources();
download_manager_state.setPeerSources( ps );
}
}
}finally{
if ( torrent_save_location != null ){
try{
torrent_save_location = torrent_save_location.getCanonicalFile();
}catch( Throwable e ){
torrent_save_location = torrent_save_location.getAbsoluteFile();
}
}
// must be after torrent read, so that any listeners have a TOTorrent
// not that if things have failed above this method won't override a failed
// state with the initial one
controller.setInitialState( initial_state );
}
}
protected void
readTorrent()
{
if ( read_torrent_state == null ){
return;
}
readTorrent(
(String)read_torrent_state[0],
(String)read_torrent_state[1],
(byte[])read_torrent_state[2],
((Boolean)read_torrent_state[3]).booleanValue(),
((Boolean)read_torrent_state[4]).booleanValue(),
((Boolean)read_torrent_state[5]).booleanValue(),
((Integer)read_torrent_state[6]).intValue());
}
protected void
readParameters()
{
max_connections = getDownloadState().getIntParameter( DownloadManagerState.PARAM_MAX_PEERS );
max_uploads_when_seeding_enabled = getDownloadState().getBooleanParameter( DownloadManagerState.PARAM_MAX_UPLOADS_WHEN_SEEDING_ENABLED );
max_uploads_when_seeding = getDownloadState().getIntParameter( DownloadManagerState.PARAM_MAX_UPLOADS_WHEN_SEEDING );
}
protected int
getMaxConnections()
{
return( max_connections );
}
protected boolean
isMaxUploadsWhenSeedingEnabled()
{
return( max_uploads_when_seeding_enabled );
}
protected int
getMaxUploadsWhenSeeding()
{
return( max_uploads_when_seeding );
}
protected void
setFileLinks()
{
// invalidate the cache info in case its now wrong
cached_save_location = null;
DiskManagerFactory.setFileLinks( this, download_manager_state.getFileLinks());
controller.fileInfoChanged();
}
protected void
clearFileLinks()
{
download_manager_state.clearFileLinks();
}
protected void
updateFileLinks(
String _old_dir,
String _new_dir,
File _old_save_dir )
{
try{
String old_dir = new File( _old_dir ).getCanonicalPath();
String new_dir = new File( _new_dir ).getCanonicalPath();
String old_save_dir = _old_save_dir.getCanonicalPath();
Map links = download_manager_state.getFileLinks();
Iterator it = links.keySet().iterator();
while( it.hasNext()){
File from = (File)it.next();
File to = (File)links.get(from);
if ( to == null ){
continue;
}
String from_str = from.getCanonicalPath();
if ( from_str.startsWith( old_save_dir )){
String new_from_str;
String from_suffix = from_str.substring( old_dir.length());
if ( from_suffix.startsWith( File.separator )){
new_from_str = new_dir + from_suffix;
}else{
new_from_str = new_dir + File.separator + from_suffix;
}
String to_str = to.getCanonicalPath();
if ( to_str.startsWith( old_save_dir )){
String new_to_str;
String to_suffix = to_str.substring( old_dir.length());
if ( to_suffix.startsWith( File.separator )){
new_to_str = new_dir + to_suffix;
}else{
new_to_str = new_dir + File.separator + to_suffix;
}
to = new File( new_to_str );
}
// System.out.println( "Updating file link:" + from + "->" + to + ":" + new_from_str );
download_manager_state.setFileLink( from, null );
download_manager_state.setFileLink( new File( new_from_str), to );
}
}
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
public void
destroy()
{
clearFileLinks();
}
public boolean
filesExist()
{
return( controller.filesExist());
}
public boolean
isPersistent()
{
return( persistent );
}
public String
getDisplayName()
{
return( display_name );
}
public String
getInternalName()
{
return( internal_name );
}
public String
getErrorDetails()
{
return( controller.getErrorDetail());
}
public long
getSize()
{
if( torrent != null){
return torrent.getSize();
}
return 0;
}
protected void
setFailed()
{
setFailed((String)null );
}
protected void
setFailed(
Throwable e )
{
setFailed( Debug.getNestedExceptionMessage(e));
}
protected void
setFailed(
String str )
{
controller.setFailed( str );
}
public void
saveResumeData()
{
if ( getState() == STATE_DOWNLOADING) {
try{
getDiskManager().dumpResumeDataToDisk(false, false);
}catch( Exception e ){
setFailed( "Resume data save fails: " + Debug.getNestedExceptionMessage(e));
}
}
// we don't want to update the torrent if we're seeding
if ( !onlySeeding ){
download_manager_state.save();
}
}
public void
saveDownload()
{
DiskManager disk_manager = controller.getDiskManager();
if ( disk_manager != null ){
disk_manager.saveState();
}
download_manager_state.save();
}
public void
initialize()
{
// entry: valid if waiting, stopped or queued
// exit: error, ready or on the way to error
if ( torrent == null ) {
// have a go at re-reading the torrent in case its been recovered
readTorrent();
}
if ( torrent == null ) {
setFailed();
return;
}
// If we only want to seed, do a quick check first (before we create the diskManager, which allocates diskspace)
if ( onlySeeding && !filesExist()) {
// If the user wants to re-download the missing files, they must
// do a re-check, which will reset the onlySeeding flag.
return;
}
try{
try{
this_mon.enter();
if ( tracker_client != null ){
Debug.out( "DownloadManager: initialize called with tracker client still available" );
tracker_client.destroy();
}
tracker_client = TRTrackerAnnouncerFactory.create( torrent, download_manager_state.getNetworks());
tracker_client.setTrackerResponseCache( download_manager_state.getTrackerResponseCache());
tracker_client.addListener( tracker_client_listener );
}finally{
this_mon.exit();
}
// we need to set the state to "initialized" before kicking off the disk manager
// initialisation as it should only report its status while in the "initialized"
// state (see getState for how this works...)
controller.initializeDiskManager( DownloadManager.STATE_INITIALIZED );
}catch( TRTrackerAnnouncerException e ){
setFailed( e );
}
}
public void
setStateWaiting()
{
controller.setStateWaiting();
}
public void
setStateFinishing()
{
controller.setStateFinishing();
}
public void
setStateQueued()
{
controller.setStateQueued();
}
public int
getState()
{
return( controller.getState());
}
public int
getSubState()
{
return( controller.getSubState());
}
public boolean
canForceRecheck()
{
if ( getTorrent() == null ){
// broken torrent, can't force recheck
return( false );
}
return( controller.canForceRecheck());
}
public void
forceRecheck()
{
controller.forceRecheck();
}
public void
resetFile(
DiskManagerFileInfo file )
{
int state = getState();
if ( state == DownloadManager.STATE_STOPPED ||
state == DownloadManager.STATE_ERROR ){
DiskManagerFactory.clearResumeData( this, file );
}else{
Debug.out( "Download not stopped" );
}
}
public void
recheckFile(
DiskManagerFileInfo file )
{
int state = getState();
if ( state == DownloadManager.STATE_STOPPED ||
state == DownloadManager.STATE_ERROR ){
DiskManagerFactory.recheckFile( this, file );
}else{
Debug.out( "Download not stopped" );
}
}
public void
restartDownload(
boolean use_resume )
{
controller.restartDownload( use_resume );
}
public void
startDownload()
{
TRTrackerAnnouncer tc = getTrackerClient();
if ( tc == null ){
Debug.out( "DownloadManager:startDownload called with no tracker client" );
}else{
controller.startDownload( tc );
}
}
public void
startDownloadInitialized(
boolean initialise_stopped_downloads )
{
int state = getState();
if ( state == DownloadManager.STATE_WAITING ||
( initialise_stopped_downloads && state == DownloadManager.STATE_STOPPED )){
initialize();
}
state = getState();
if ( state == DownloadManager.STATE_READY ){
startDownload();
}
}
public void
stopIt(
int state_after_stopping,
boolean remove_torrent,
boolean remove_data )
{
controller.stopIt( state_after_stopping, remove_torrent, remove_data );
}
public boolean
pause()
{
return( globalManager.pauseDownload( this ));
}
public boolean
isPaused()
{
return( globalManager.isPaused( this ));
}
public void
resume()
{
globalManager.resumeDownload( this );
}
public boolean
getOnlySeeding()
{
return onlySeeding;
}
public void
setOnlySeeding(
boolean _onlySeeding)
{
//LGLogger.log(getName()+"] setOnlySeeding("+onlySeeding+") was " + onlySeeding);
if ( onlySeeding != _onlySeeding ){
onlySeeding = _onlySeeding;
if (_onlySeeding && filesExist()) {
// make sure stats always knows we are completed
stats.setDownloadCompleted(1000);
}
// we are in a new list, move to the top of the list so that we continue seeding
// -1 position means it hasn't been added to the global list. We shouldn't
// touch it, since it'll get a position once it's adding is complete
if ( position != -1) {
DownloadManager[] dms = { DownloadManagerImpl.this };
// pretend we are at the bottom of the new list
// so that move top will shift everything down one
position = globalManager.getDownloadManagers().size() + 1;
if ( COConfigurationManager.getBooleanParameter("Newly Seeding Torrents Get First Priority" )){
globalManager.moveTop(dms);
}else{
globalManager.moveEnd(dms);
}
// we left a gap in incomplete list, fixup
globalManager.fixUpDownloadManagerPositions();
}
listeners.dispatch( LDT_COMPLETIONCHANGED, new Object[]{ this, new Boolean( _onlySeeding )});
}
}
public int
getNbSeeds()
{
PEPeerManager peerManager = controller.getPeerManager();
if (peerManager != null){
return peerManager.getNbSeeds();
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -