📄 downloadmanagerimpl.java
字号:
if (peerManager != null){
return peerManager.getNbSeeds();
}
return 0;
}
public int
getNbPeers()
{
PEPeerManager peerManager = controller.getPeerManager();
if (peerManager != null){
return peerManager.getNbPeers();
}
return 0;
}
public String
getTrackerStatus()
{
TRTrackerAnnouncer tc = getTrackerClient();
if (tc != null){
return tc.getStatusString();
}
// no tracker, return scrape
if (torrent != null ) {
TRTrackerScraperResponse response = getTrackerScrapeResponse();
if (response != null) {
return response.getStatusString();
}
}
return "";
}
public TRTrackerAnnouncer
getTrackerClient()
{
return( tracker_client );
}
public void
setAnnounceResult(
DownloadAnnounceResult result )
{
TRTrackerAnnouncer cl = getTrackerClient();
if ( cl == null ){
Debug.out( "setAnnounceResult called when download not running" );
return;
}
cl.setAnnounceResult( result );
}
public void
setScrapeResult(
DownloadScrapeResult result )
{
if ( torrent != null && result != null ){
TRTrackerScraper scraper = globalManager.getTrackerScraper();
TRTrackerScraperResponse current_resp = getTrackerScrapeResponse();
URL target_url;
if ( current_resp != null ){
target_url = current_resp.getURL();
}else{
target_url = torrent.getAnnounceURL();
}
scraper.setScrape( torrent, target_url, result );
}
}
public int
getNbPieces()
{
if ( torrent == null ){
return(0);
}
return( torrent.getNumberOfPieces());
}
public int
getTrackerTime()
{
TRTrackerAnnouncer tc = getTrackerClient();
if ( tc != null){
return( tc.getTimeUntilNextUpdate());
}
// no tracker, return scrape
if ( torrent != null ) {
TRTrackerScraperResponse response = getTrackerScrapeResponse();
if (response != null) {
if (response.getStatus() == TRTrackerScraperResponse.ST_SCRAPING){
return( -1 );
}
return (int)((response.getNextScrapeStartTime() - SystemTime.getCurrentTime()) / 1000);
}
}
return( TRTrackerAnnouncer.REFRESH_MINIMUM_SECS );
}
public TOTorrent
getTorrent()
{
return( torrent );
}
private File cached_save_location;
private File cached_save_location_result;
public File
getSaveLocation()
{
// this can be called quite often - cache results for perf reasons
File save_location = torrent_save_location;
if ( save_location == cached_save_location ){
return( cached_save_location_result );
}
File res = download_manager_state.getFileLink( save_location );
if ( res == null ){
res = save_location;
}else{
try{
res = res.getCanonicalFile();
}catch( Throwable e ){
res = res.getAbsoluteFile();
}
}
cached_save_location = save_location;
cached_save_location_result = res;
return( res );
}
public File
getAbsoluteSaveLocation()
{
return( torrent_save_location );
}
public void
setTorrentSaveDir(
String new_dir )
{
String dl_name = this.temporary_new_save_path_name;
if (dl_name == null) {dl_name = this.getAbsoluteSaveLocation().getName();}
File old_location = torrent_save_location;
File new_location = new File(new_dir, dl_name);
if (new_location.equals(old_location)){
return;
}
// assumption here is that the caller really knows what they are doing. You can't
// just change this willy nilly, it must be synchronised with reality. For example,
// the disk-manager calls it after moving files on completing
// The UI can call it as long as the torrent is stopped.
// Calling it while a download is active will in general result in unpredictable behaviour!
updateFileLinks( old_location, new_location);
torrent_save_location = new_location;
try{
torrent_save_location = torrent_save_location.getCanonicalFile();
}catch( Throwable e ){
torrent_save_location = torrent_save_location.getAbsoluteFile();
}
Logger.log(new LogEvent(this, LogIDs.CORE, "Torrent save directory changing from \"" + old_location.getPath() + "\" to \"" + new_location.getPath()));
// Trying to fix a problem where downloads are being moved into the program
// directory on my machine, and I don't know why...
//Debug.out("Torrent save directory changing from \"" + old_location.getPath() + "\" to \"" + new_location.getPath());
controller.fileInfoChanged();
}
public String
getPieceLength()
{
if ( torrent != null ){
return( DisplayFormatters.formatByteCountToKiBEtc(torrent.getPieceLength()));
}
return( "" );
}
public String
getTorrentFileName()
{
return torrentFileName;
}
public void
setTorrentFileName(
String string)
{
torrentFileName = string;
}
// this is called asynchronously when a response is received
public void
setTrackerScrapeResponse(
TRTrackerScraperResponse response )
{
// this is a reasonable place to pick up the change in active url caused by this scrape
// response and update the torrent's url accordingly
Object[] res = getActiveScrapeResponse();
URL active_url = (URL)res[1];
if ( active_url != null && torrent != null ){
torrent.setAnnounceURL( active_url );
}
if (response != null) {
if (response.isValid()) {
int state = getState();
if (state == STATE_ERROR || state == STATE_STOPPED) {
long minNextScrape = SystemTime.getCurrentTime()
+ (state == STATE_ERROR ? SCRAPE_DELAY_ERROR_TORRENTS
: SCRAPE_DELAY_STOPPED_TORRENTS);
if (response.getNextScrapeStartTime() < minNextScrape) {
response.setNextScrapeStartTime(minNextScrape);
}
}
}
// Need to notify listeners, even if scrape result is not valid, in
// case they parse invalid scrapes
tracker_listeners.dispatch(LDT_TL_SCRAPERESULT, response);
}
}
public TRTrackerScraperResponse
getTrackerScrapeResponse()
{
Object[] res = getActiveScrapeResponse();
return((TRTrackerScraperResponse)res[0]);
}
/**
* Returns the "first" online scrape response found, and its active URL, otherwise one of the failing
* scrapes
* @return
*/
protected Object[]
getActiveScrapeResponse()
{
TRTrackerScraperResponse response = null;
URL active_url = null;
TRTrackerScraper scraper = globalManager.getTrackerScraper();
TRTrackerAnnouncer tc = getTrackerClient();
if ( tc != null ){
response = scraper.scrape( tc );
}
if ( response == null && torrent != null){
// torrent not running. For multi-tracker torrents we need to behave sensibly
// here
TRTrackerScraperResponse non_null_response = null;
TOTorrentAnnounceURLSet[] sets;
try {
sets = torrent.getAnnounceURLGroup().getAnnounceURLSets();
} catch (Exception e) {
return( new Object[]{ scraper.scrape(torrent), active_url } );
}
if ( sets.length == 0 ){
response = scraper.scrape(torrent);
}else{
// we use a fixed seed so that subsequent scrapes will randomise
// in the same order, as required by the spec. Note that if the
// torrent's announce sets are edited this all works fine (if we
// cached the randomised URL set this wouldn't work)
Random scrape_random = new Random(scrape_random_seed);
for (int i=0;response==null && i<sets.length;i++){
TOTorrentAnnounceURLSet set = sets[i];
URL[] urls = set.getAnnounceURLs();
List rand_urls = new ArrayList();
for (int j=0;j<urls.length;j++ ){
URL url = urls[j];
int pos = (int)(scrape_random.nextDouble() * (rand_urls.size()+1));
rand_urls.add(pos,url);
}
for (int j=0;response==null && j<rand_urls.size();j++){
URL url = (URL)rand_urls.get(j);
response = scraper.scrape(torrent, url);
if ( response!= null ){
int status = response.getStatus();
// Exit if online
if (status == TRTrackerScraperResponse.ST_ONLINE) {
active_url = url;
break;
}
// Scrape 1 at a time to save on outgoing connections
if ( status == TRTrackerScraperResponse.ST_INITIALIZING ||
status == TRTrackerScraperResponse.ST_SCRAPING) {
break;
}
// treat bad scrapes as missing so we go on to
// the next tracker
if ( (!response.isValid()) || status == TRTrackerScraperResponse.ST_ERROR ){
if ( non_null_response == null ){
non_null_response = response;
}
response = null;
}
}
}
}
if ( response == null ){
response = non_null_response;
}
}
}
return( new Object[]{ response, active_url } );
}
public void
requestTrackerAnnounce(
boolean force )
{
TRTrackerAnnouncer tc = getTrackerClient();
if ( tc != null)
tc.update( force );
}
public void
requestTrackerScrape(
boolean force )
{
if ( torrent != null ){
TRTrackerScraper scraper = globalManager.getTrackerScraper();
scraper.scrape( torrent, force );
}
}
protected void
setTrackerRefreshDelayOverrides(
int percent )
{
TRTrackerAnnouncer tc = getTrackerClient();
if ( tc != null ){
tc.setRefreshDelayOverrides( percent );
}
}
protected boolean
activateRequest(
int count )
{
// activation request for a queued torrent
for (Iterator it = activation_listeners.iterator();it.hasNext();){
DownloadManagerActivationListener listener = (DownloadManagerActivationListener)it.next();
try{
if ( listener.activateRequest( count )){
return( true );
}
}catch( Throwable e ){
Debug.printStackTrace(e);
}
}
return( false );
}
public int
getActivationCount()
{
return( controller.getActivationCount());
}
public String
getTorrentComment()
{
return torrent_comment;
}
public String
getTorrentCreatedBy()
{
return torrent_created_by;
}
public long
getTorrentCreationDate()
{
if (torrent==null){
return(0);
}
return( torrent.getCreationDate());
}
public GlobalManager
getGlobalManager()
{
return( globalManager );
}
public DiskManager
getDiskManager()
{
return( controller.getDiskManager());
}
public DiskManagerFileInfo[]
getDiskManagerFileInfo()
{
return( controller.getDiskManagerFileInfo());
}
public PEPeerManager
getPeerManager()
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -