📄 downloadmanagerimpl.java
字号:
cached_save_location = null;
DiskManagerFactory.setFileLinks( this, download_manager_state.getFileLinks());
controller.fileInfoChanged();
}
protected void
clearFileLinks()
{
download_manager_state.clearFileLinks();
}
protected void updateFileLinks(File old_save_path, File new_save_path) {
try {old_save_path = old_save_path.getCanonicalFile();}
catch (IOException ioe) {old_save_path = old_save_path.getAbsoluteFile();}
try {new_save_path = new_save_path.getCanonicalFile();}
catch (IOException ioe) {new_save_path = new_save_path.getAbsoluteFile();}
String old_path = old_save_path.getPath();
String new_path = new_save_path.getPath();
CaseSensitiveFileMap links = download_manager_state.getFileLinks();
Iterator it = links.keySetIterator();
while(it.hasNext()){
File from = (File)it.next();
File to = (File)links.get(from);
String from_s = (from == null) ? null : from.getAbsolutePath();
String to_s = (to == null) ? null : to.getAbsolutePath();
try {
updateFileLink(old_path, new_path, from_s, to_s);
}
catch (Exception e) {
Debug.printStackTrace(e);
}
}
}
// old_path -> Full location of old torrent (inclusive of save name)
// from_loc -> Old unmodified location of file within torrent.
// to_loc -> Old modified location of file (where the link points to).
//
// We have to update from_loc and to_loc.
// We should always be modifying from_loc. Only modify to_loc if it sits within
// the old path.
protected void updateFileLink(String old_path, String new_path, String from_loc, String to_loc) {
if (to_loc == null) return;
if (this.torrent.isSimpleTorrent()) {
if (!old_path.equals(from_loc)) {throw new RuntimeException("assert failure: old_path=" + old_path + ", from_loc=" + from_loc);}
download_manager_state.setFileLink(new File(old_path), null );
download_manager_state.setFileLink(new File(new_path), new File(new_path)); // Or should the second bit be null?
return;
}
String from_loc_to_use = FileUtil.translateMoveFilePath(old_path, new_path, from_loc);
if (from_loc_to_use == null) return;
String to_loc_to_use = FileUtil.translateMoveFilePath(old_path, new_path, to_loc);
if (to_loc_to_use == null) {to_loc_to_use = to_loc;}
download_manager_state.setFileLink(new File(from_loc), null);
download_manager_state.setFileLink(new File(from_loc_to_use), new File(to_loc_to_use));
}
// Superceded by updateFileLinks(String, String).
/*
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();
CaseSensitiveFileMap links = download_manager_state.getFileLinks();
Iterator it = links.keySetIterator();
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 boolean
filesExist()
{
return( controller.filesExist());
}
public boolean
isPersistent()
{
return( persistent );
}
public String
getDisplayName()
{
DownloadManagerState dms = this.getDownloadState();
if (dms != null) {
String result = dms.getDisplayName();
if (result != null) {return result;}
}
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 );
}
protected void
setTorrentInvalid(
String str )
{
setFailed( str );
torrent = null;
}
public void
saveResumeData()
{
if ( getState() == STATE_DOWNLOADING) {
try{
getDiskManager().saveResumeData( true );
}catch( Exception e ){
setFailed( "Resume data save fails: " + Debug.getNestedExceptionMessage(e));
}
}
// we don't want to update the torrent if we're seeding
if ( !assumedComplete ){
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 a torrent that is assumed complete, verify that it actually has the
// files, before we create the diskManager, which will try to allocate
// disk space.
if (assumedComplete && !filesExist()) {
// filesExist() has set state to error for us
// If the user wants to re-download the missing files, they must
// do a re-check, which will reset the 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...)
try{
controller.initializeDiskManager( open_for_seeding );
}finally{
// only supply this the very first time the torrent starts so the controller can check
// that things are ok. Subsequent restarts are under user control
open_for_seeding = false;
}
}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()
{
controller.restartDownload();
}
public void
startDownload()
{
controller.startDownload( getTrackerClient() );
}
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 getAssumedComplete() {
return assumedComplete;
}
public boolean requestAssumedCompleteMode() {
boolean bCompleteNoDND = controller.isDownloadComplete(false);
setAssumedComplete(bCompleteNoDND);
return bCompleteNoDND;
}
// Protected: Use requestAssumedCompleteMode outside of scope
protected void setAssumedComplete(boolean _assumedComplete) {
if (assumedComplete == _assumedComplete) {
return;
}
//Logger.log(new LogEvent(this, LogIDs.CORE, "setAssumedComplete("
// + _assumedComplete + ") was " + assumedComplete));
assumedComplete = _assumedComplete;
if (!assumedComplete) {
controller.setStateDownloading();
}
// NOTE: We don't set "stats.setDownloadCompleted(1000)" anymore because
// we can be in seeding mode with an unfinished torrent
if (position != -1) {
// 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
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(CFG_MOVE_COMPLETED_TOP)) {
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(_assumedComplete) });
}
public int
getNbSeeds()
{
PEPeerManager peerManager = controller.getPeerManager();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -