📄 downloadmanagerimpl.java
字号:
}
}
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 PEPiece[]
getCurrentPieces()
{
try{
peer_listeners_mon.enter();
return (PEPiece[])current_pieces.toArray(new PEPiece[current_pieces.size()]);
}finally{
peer_listeners_mon.exit();
}
}
protected void
informStarted(
PEPeerManager pm )
{
try{
peer_listeners_mon.enter();
peer_listeners.dispatch( LDT_PE_PM_ADDED, pm );
}finally{
peer_listeners_mon.exit();
}
TRTrackerAnnouncer tc = getTrackerClient();
if ( tc != null ){
tc.update( true );
}
}
protected void
informStopped(
PEPeerManager pm ) // can be null if controller was already stopped....
{
if ( pm != null ){
try{
peer_listeners_mon.enter();
peer_listeners.dispatch( LDT_PE_PM_REMOVED, pm );
}finally{
peer_listeners_mon.exit();
}
}
try{
this_mon.enter();
if ( tracker_client != null ){
tracker_client.addListener( stopping_tracker_client_listener );
tracker_client.removeListener( tracker_client_listener );
download_manager_state.setTrackerResponseCache( tracker_client.getTrackerResponseCache());
tracker_client.stop();
tracker_client.destroy();
tracker_client = null;
}
}finally{
this_mon.exit();
}
}
public DownloadManagerStats
getStats()
{
return( stats );
}
public boolean
isForceStart()
{
return( controller.isForceStart());
}
public void
setForceStart(
boolean forceStart)
{
controller.setForceStart( forceStart );
}
/**
* Is called when a download is finished.
* Activates alerts for the user.
*
* @author Rene Leonhardt
*/
protected void
downloadEnded(
boolean never_downloaded )
{
if ( !never_downloaded ){
if (isForceStart()){
setForceStart(false);
}
setOnlySeeding(true);
informDownloadEnded();
}
TRTrackerAnnouncer tc = tracker_client;
if ( tc != null ){
tc.complete( never_downloaded );
}
}
public void
addDiskListener(
DownloadManagerDiskListener listener )
{
controller.addDiskListener( listener );
}
public void
removeDiskListener(
DownloadManagerDiskListener listener )
{
controller.removeDiskListener( listener );
}
public int
getHealthStatus()
{
int state = getState();
PEPeerManager peerManager = controller.getPeerManager();
TRTrackerAnnouncer tc = getTrackerClient();
if( tc != null && peerManager != null && (state == STATE_DOWNLOADING || state == STATE_SEEDING)) {
int nbSeeds = getNbSeeds();
int nbPeers = getNbPeers();
int nbRemotes = peerManager.getNbRemoteConnections();
TRTrackerAnnouncerResponse announce_response = tc.getLastResponse();
int trackerStatus = announce_response.getStatus();
boolean isSeed = (state == STATE_SEEDING);
if( (nbSeeds + nbPeers) == 0) {
if( isSeed ){
return WEALTH_NO_TRACKER; // not connected to any peer and seeding
}
return WEALTH_KO; // not connected to any peer and downloading
}
// read the spec for this!!!!
// no_tracker =
// 1) if downloading -> no tracker
// 2) if seeding -> no connections (dealt with above)
if ( !isSeed ){
if( trackerStatus == TRTrackerAnnouncerResponse.ST_OFFLINE ||
trackerStatus == TRTrackerAnnouncerResponse.ST_REPORTED_ERROR){
return WEALTH_NO_TRACKER;
}
}
if( nbRemotes == 0 ){
TRTrackerScraperResponse scrape_response = getTrackerScrapeResponse();
if ( scrape_response != null && scrape_response.isValid()){
// if we're connected to everyone then report OK as we can't get
// any incoming connections!
if ( nbSeeds == scrape_response.getSeeds() &&
nbPeers == scrape_response.getPeers()){
return WEALTH_OK;
}
}
return WEALTH_NO_REMOTE;
}
return WEALTH_OK;
} else if (state == STATE_ERROR) {
return WEALTH_ERROR;
}else{
return WEALTH_STOPPED;
}
}
public int
getNATStatus()
{
int state = getState();
PEPeerManager peerManager = controller.getPeerManager();
TRTrackerAnnouncer tc = getTrackerClient();
if ( tc != null && peerManager != null && (state == STATE_DOWNLOADING || state == STATE_SEEDING)) {
if ( peerManager.getNbRemoteConnections() > 0 ){
return( ConnectionManager.NAT_OK );
}
long last_good_time = peerManager.getLastRemoteConnectionTime();
if ( last_good_time > 0 ){
// half an hour's grace
if ( SystemTime.getCurrentTime() - last_good_time < 30*60*1000 ){
return( ConnectionManager.NAT_OK );
}else{
return( ConnectionManager.NAT_PROBABLY_OK );
}
}
TRTrackerAnnouncerResponse announce_response = tc.getLastResponse();
int trackerStatus = announce_response.getStatus();
if( trackerStatus == TRTrackerAnnouncerResponse.ST_OFFLINE ||
trackerStatus == TRTrackerAnnouncerResponse.ST_REPORTED_ERROR){
return ConnectionManager.NAT_UNKNOWN;
}
// tracker's ok but no remotes - give it some time
if ( SystemTime.getCurrentTime() - peerManager.getTimeStarted() < 3*60*1000 ){
return ConnectionManager.NAT_UNKNOWN;
}
TRTrackerScraperResponse scrape_response = getTrackerScrapeResponse();
if ( scrape_response != null && scrape_response.isValid()){
// if we're connected to everyone then report OK as we can't get
// any incoming connections!
if ( peerManager.getNbSeeds() == scrape_response.getSeeds() &&
peerManager.getNbPeers() == scrape_response.getPeers()){
return ConnectionManager.NAT_UNKNOWN;
}
}
return ConnectionManager.NAT_BAD;
}else{
return ConnectionManager.NAT_UNKNOWN;
}
}
public int
getPosition()
{
return position;
}
public void
setPosition(
int new_position )
{
informPositionChanged( new_position );
}
public void
addTrackerListener(
DownloadManagerTrackerListener listener )
{
tracker_listeners.addListener( listener );
}
public void
removeTrackerListener(
DownloadManagerTrackerListener listener )
{
tracker_listeners.removeListener( listener );
}
protected void
deleteDataFiles()
{
DiskManagerFactory.deleteDataFiles(torrent, torrent_save_location.getParent(), torrent_save_location.getName());
}
protected 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 void setSeedingRank(int rank) {
iSeedingRank = rank;
}
public int getSeedingRank() {
return iSeedingRank;
}
public long
getCreationTime()
{
return( creation_time );
}
public void
setCreationTime(
long t )
{
creation_time = t;
}
public boolean isAZMessagingEnabled() { return az_messaging_enabled; }
public void
setAZMessagingEnabled(
boolean enable )
{
az_messaging_enabled = enable;
}
public void
moveDataFiles(
File new_parent_dir )
throws DownloadManagerException
{
if ( !isPersistent()){
throw( new DownloadManagerException( "Download is not persistent" ));
}
// old file will be a "file" for simple torrents, a dir for non-simple
File old_file = getSaveLocation();
try{
old_file = old_file.getCanonicalFile();
new_parent_dir = new_parent_dir.getCanonicalFile();
}catch( Throwable e ){
Debug.printStackTrace(e);
throw( new DownloadManagerException( "Failed to get canonical paths", e ));
}
if ( new_parent_dir.equals( old_file.getParentFile())){
// null operation
return;
}
DiskManager dm = getDiskManager();
if ( dm == null ){
if ( !old_file.exists()){
// files not created yet
new_parent_dir.mkdirs();
setTorrentSaveDir( new_parent_dir.toString());
return;
}
File new_file = new File( new_parent_dir, old_file.getName());
if ( FileUtil.renameFile( old_file, new_file )){
setTorrentSaveDir( new_parent_dir.toString());
}else{
throw( new DownloadManagerException( "rename operation failed" ));
}
}else{
dm.moveDataFiles( new_parent_dir );
}
}
public void
moveTorrentFile(
File new_parent_dir )
throws DownloadManagerException
{
if ( !isPersistent()){
throw( new DownloadManagerException( "Download is not persistent" ));
}
int state = getState();
if ( state == DownloadManager.STATE_STOPPED ||
state == DownloadManager.STATE_ERROR ){
File old_file = new File( getTorrentFileName() );
if ( !old_file.exists()){
Debug.out( "torrent file doesn't exist!" );
return;
}
File new_file = new File( new_parent_dir, old_file.getName());
try{
old_file = old_file.getCanonicalFile();
new_parent_dir = new_parent_dir.getCanonicalFile();
}catch( Throwable e ){
Debug.printStackTrace(e);
throw( new DownloadManagerException( "Failed to get canonical paths", e ));
}
if ( new_parent_dir.equals( old_file.getParentFile())){
// null op
return;
}
if ( TorrentUtils.move( old_file, new_file )){
setTorrentFileName( new_file.toString());
}else{
throw( new DownloadManagerException( "rename operation failed" ));
}
}else{
throw( new DownloadManagerException( "download not stopped or in error state" ));
}
}
private byte[]
getIdentity()
{
return( dl_identity );
}
/** @retun true, if the other DownloadManager has the same hash
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object obj)
{
// check for object equivalence first!
if ( this == obj ){
return( true );
}
if( obj instanceof DownloadManagerImpl ) {
DownloadManagerImpl other = (DownloadManagerImpl) obj;
byte[] id1 = getIdentity();
byte[] id2 = other.getIdentity();
if ( id1 == null || id2 == null ){
return( false ); // broken torrents - treat as different so shown
// as broken
}
return( Arrays.equals( id1, id2 ));
}
return false;
}
public int
hashCode()
{
return dl_identity_hashcode;
}
/* (non-Javadoc)
* @see org.gudy.azureus2.core3.logging.LogRelation#getLogRelationText()
*/
public String getRelationText() {
return "TorrentDLM: '" + getDisplayName() + "'";
}
/* (non-Javadoc)
* @see org.gudy.azureus2.core3.logging.LogRelation#queryForClass(java.lang.Class)
*/
public Object[] getQueryableInterfaces() {
return new Object[] { tracker_client };
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -