📄 downloadmanagercontroller.java
字号:
peer_manager_registration.unregister();
peer_manager_registration = null;
}
destroyFileInfo();
}
// secrets for inbound connections, support all
public byte[][]
getSecrets()
{
TOTorrent torrent = download_manager.getTorrent();
try{
byte[] secret1 = torrent.getHash();
try{
byte[] secret2 = getSecret2( torrent );
return( new byte[][]{ secret1, secret2 });
}catch( Throwable e ){
Debug.printStackTrace( e );
return( new byte[][]{ secret1 } );
}
}catch( Throwable e ){
Debug.printStackTrace( e );
return( new byte[0][] );
}
}
// secrets for outbound connections, based on level of target
public byte[][]
getSecrets(
int crypto_level )
{
TOTorrent torrent = download_manager.getTorrent();
try{
byte[] secret;
if ( crypto_level == PeerItemFactory.CRYPTO_LEVEL_1 ){
secret = torrent.getHash();
}else{
secret = getSecret2( torrent );
}
return( new byte[][]{ secret });
}catch( Throwable e ){
Debug.printStackTrace( e );
return( new byte[0][] );
}
}
protected byte[]
getSecret2(
TOTorrent torrent )
throws TOTorrentException
{
Map secrets_map = download_manager.getDownloadState().getMapAttribute( DownloadManagerState.AT_SECRETS );
if ( secrets_map == null ){
secrets_map = new HashMap();
}
if ( secrets_map.size() == 0 ){
secrets_map.put( "p1", torrent.getPieces()[0] );
download_manager.getDownloadState().setMapAttribute( DownloadManagerState.AT_SECRETS, secrets_map );
}
return((byte[])secrets_map.get( "p1" ));
}
public boolean
activateRequest(
InetSocketAddress address )
{
if ( getState() == DownloadManager.STATE_QUEUED ){
BloomFilter bloom = activation_bloom;
if ( bloom == null ){
activation_bloom = bloom = BloomFilterFactory.createAddRemove4Bit( BLOOM_SIZE );
}
byte[] address_bytes = address.getAddress().getAddress();
int hit_count = bloom.add( address_bytes );
if ( hit_count > 5 ){
Logger.log(
new LogEvent(
this,
LogIDs.CORE,
LogEvent.LT_WARNING,
"Activate request for " + getDisplayName() + " from " + address + " denied as too many recently received" ));
return( false );
}
Logger.log(new LogEvent(this, LogIDs.CORE, "Activate request for " + getDisplayName() + " from " + address ));
long now = SystemTime.getCurrentTime();
// we don't really care about the bloom filter filling up and giving false positives
// as activation events should be fairly rare
if ( now < activation_bloom_create_time || now - activation_bloom_create_time > ACTIVATION_REBUILD_TIME ){
activation_bloom = BloomFilterFactory.createAddRemove4Bit( BLOOM_SIZE );
activation_bloom_create_time = now;
}
activation_count = bloom.getEntryCount();
activation_count_time = now;
return( download_manager.activateRequest( activation_count ));
}
return( false );
}
public void
deactivateRequest(
InetSocketAddress address )
{
BloomFilter bloom = activation_bloom;
if ( bloom != null ){
byte[] address_bytes = address.getAddress().getAddress();
int count = bloom.count( address_bytes);
for (int i=0;i<count;i++){
bloom.remove( address_bytes );
}
activation_count = bloom.getEntryCount();
}
}
public int
getActivationCount()
{
// in the absence of any new activations we persist the last count for the activation rebuild
// period
long now = SystemTime.getCurrentTime();
if ( now < activation_count_time ){
activation_count_time = now;
}else if ( now - activation_count_time > ACTIVATION_REBUILD_TIME ){
activation_count = 0;
}
return( activation_count );
}
public PeerManagerRegistration
getPeerManagerRegistration()
{
return( peer_manager_registration );
}
public boolean
isForceStart()
{
return( force_start );
}
public void
setForceStart(
boolean _force_start)
{
try{
state_mon.enter();
if ( force_start != _force_start ){
force_start = _force_start;
int state = getState();
if ( force_start &&
( state == DownloadManager.STATE_STOPPED ||
state == DownloadManager.STATE_QUEUED )) {
// Start it! (Which will cause a stateChanged to trigger)
setState(DownloadManager.STATE_WAITING, false );
}
}
}finally{
state_mon.exit();
}
// "state" includes the force-start setting
download_manager.informStateChanged();
}
protected void
setFailed(
String reason )
{
if ( reason != null ){
errorDetail = reason;
}
stopIt( DownloadManager.STATE_ERROR, false, false );
}
public boolean
filesExist()
{
DiskManager dm = getDiskManager();
if (dm != null) {
return dm.filesExist();
}
makeSureFilesFacadeFilled(false);
for (int i = 0; i < files_facade.length; i++) {
fileInfoFacade fileInfo = files_facade[i];
if (!fileInfo.isSkipped()) {
File file = fileInfo.getFile(true);
try {
if (!file.exists()) {
setFailed(MessageText.getString("DownloadManager.error.datamissing")
+ " " + file);
return false;
} else if (fileInfo.getLength() < file.length()) {
// file may be incremental creation - don't complain if too small
// don't bitch if the user is happy with this
if ( !COConfigurationManager.getBooleanParameter("File.truncate.if.too.large")){
setFailed(MessageText.getString("DownloadManager.error.badsize")
+ " " + file + "(" + fileInfo.getLength() + "/" + file.length() + ")");
return false;
}
}
} catch (Exception e) {
setFailed(e.getMessage());
return false;
}
}
}
return true;
}
private void makeSureFilesFacadeFilled(boolean refresh) {
if (!bInitialized) {
// too early
return;
}
if (files_facade.length == 0) {
fileInfoFacade[] new_files_facade = new fileInfoFacade[download_manager.getTorrent() == null
? 0 : download_manager.getTorrent().getFiles().length];
for (int i = 0; i < new_files_facade.length; i++) {
new_files_facade[i] = new fileInfoFacade();
}
// no need to set files_facade, it gets set to new_files_facade in
// fixup
fixupFileInfo(new_files_facade);
} else if (refresh) {
fixupFileInfo(files_facade);
}
}
public DiskManagerFileInfo[]
getDiskManagerFileInfo()
{
makeSureFilesFacadeFilled(false);
return( files_facade );
}
protected void
fileInfoChanged()
{
makeSureFilesFacadeFilled(true);
}
protected void
filePriorityChanged(DiskManagerFileInfo file)
{
if (!cached_values_set) {
makeSureFilesFacadeFilled(false);
}
// no need to calculate completeness if there are no DND files and the
// file being changed is not DND
if (!cached_has_dnd_files && !file.isSkipped()){
return;
}
makeSureFilesFacadeFilled(false);
calculateCompleteness( files_facade );
}
protected void
calculateCompleteness(
DiskManagerFileInfo[] active )
{
boolean complete_excluding_dnd = true;
boolean has_dnd_files = false;
for (int i = 0; i < active.length; i++) {
DiskManagerFileInfo file = active[i];
if ( file.isSkipped()){
has_dnd_files = true;
}else if (file.getDownloaded() != file.getLength()) {
complete_excluding_dnd = false;
if ( has_dnd_files ){
// we can bail out early
break;
}
}
}
cached_complete_excluding_dnd = complete_excluding_dnd;
cached_has_dnd_files = has_dnd_files;
cached_values_set = true;
DownloadManagerState state = download_manager.getDownloadState();
long flags = (cached_complete_excluding_dnd ? STATE_FLAG_COMPLETE_NO_DND : 0) |
(cached_has_dnd_files ? STATE_FLAG_HASDND : 0);
state.setLongParameter(DownloadManagerState.PARAM_DND_FLAGS, flags);
}
/**
* Determine if the download is complete, excluding DND files. This
* function is mostly cached when there is a DiskManager.
*
* @return completion state
*/
protected boolean isDownloadComplete(boolean bIncludeDND) {
if (!cached_values_set) {
makeSureFilesFacadeFilled(false);
}
// The calculate from stats doesn't take into consideration DND
// So, if we have no DND files, use calculation from stats, which
// remembers things like whether the file was once complete
if (!cached_has_dnd_files) {
return stats.getDownloadCompleted(false) == 1000;
}
// We have DND files. If we have an existing diskmanager, then it
// will have better information than the stats object.
DiskManager dm = getDiskManager();
if (dm != null) {
int dm_state = dm.getState();
if (dm_state == DiskManager.CHECKING || dm_state == DiskManager.READY) {
long remaining = bIncludeDND ? dm.getRemaining()
: dm.getRemainingExcludingDND();
return remaining == 0;
}
}
// No DiskManager or it's in a bad state for us.
// Assumed: We have DND files
if (bIncludeDND) {
// Want to include DND files in calculation, which there some, which
// means completion MUST be false
return false;
}
// Have DND files, bad DiskManager, and we don't want to include DND files
return cached_complete_excluding_dnd;
}
protected PEPeerManager
getPeerManager()
{
return( peer_manager );
}
protected DiskManager
getDiskManager()
{
return( disk_manager_use_accessors );
}
protected String
getErrorDetail()
{
return( errorDetail );
}
protected void
setDiskManager(
DiskManager new_disk_manager,
DiskManagerListener new_disk_manager_listener )
{
try{
disk_listeners_mon.enter();
DiskManager old_disk_manager = disk_manager_use_accessors;
// remove any old listeners in case the diskmanager is still running async
if ( old_disk_manager != null && disk_manager_listener_use_accessors != null ){
old_disk_manager.removeListener( disk_manager_listener_use_accessors );
}
disk_manager_use_accessors = new_disk_manager;
disk_manager_listener_use_accessors = new_disk_manager_listener;
if ( new_disk_manager != null ){
new_disk_manager.addListener( new_disk_manager_listener );
}
// whether going from none->active or the other way, indicate that the file info
// has changed
fileInfoChanged();
if ( new_disk_manager == null && old_disk_manager != null ){
disk_listeners.dispatch( LDT_DL_REMOVED, old_disk_manager );
}else if ( new_disk_manager != null && old_disk_manager == null ){
disk_listeners.dispatch( LDT_DL_ADDED, new_disk_manager );
}else{
Debug.out( "inconsistent DiskManager state - " + new_disk_manager + "/" + old_disk_manager );
}
}finally{
disk_listeners_mon.exit();
}
}
public void
addDiskListener(
DownloadManagerDiskListener listener )
{
try{
disk_listeners_mon.enter();
disk_listeners.addListener( listener );
DiskManager dm = getDiskManager();
if ( dm != null ){
disk_listeners.dispatch( listener, LDT_DL_ADDED, dm );
}
}finally{
disk_listeners_mon.exit();
}
}
public void
removeDiskListener(
DownloadManagerDiskListener listener )
{
try{
disk_listeners_mon.enter();
disk_listeners.removeListener( listener );
}finally{
disk_listeners_mon.exit();
}
}
public long getDiskListenerCount() {
return disk_listeners.size();
}
public String
getDisplayName()
{
return( download_manager.getDisplayName());
}
public int
getUploadRateLimitBytesPerSecond()
{
return( download_manager.getEffectiveUploadRateLimitBytesPerSecond());
}
public int
getDownloadRateLimitBytesPerSecond()
{
return( stats.getDownloadRateLimitBytesPerSecond());
}
public int
getMaxUploads()
{
return( download_manager.getEffectiveMaxUploads());
}
public int
getMaxConnections()
{
int result;
if ( download_manager.isMaxConnectionsWhenSeedingEnabled() && isStateSeeding()){
result = download_manager.getMaxConnectionsWhenSeeding();
}else{
result = download_manager.getMaxConnections();
}
return( result );
}
public int
getMaxSeedConnections()
{
return( download_manager.getMaxSeedConnections());
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -