📄 globalmanagerimpl.java
字号:
dmMap.put( "allocated", new Long( dm.isDataAlreadyAllocated() == true ? 1 : 0 ) );
list.add(dmMap);
}
map.put("downloads", list);
//save pause/resume state
try { paused_list_mon.enter();
if( !paused_list.isEmpty() ) {
ArrayList pause_data = new ArrayList();
for( int i=0; i < paused_list.size(); i++ ) {
Object[] data = (Object[])paused_list.get(i);
HashWrapper hash = (HashWrapper)data[0];
Boolean force = (Boolean)data[1];
Map m = new HashMap();
m.put( "hash", hash.getHash());
m.put( "force", new Long(force.booleanValue()?1:0));
pause_data.add( m );
}
map.put( "pause_data", pause_data );
}
}
finally { paused_list_mon.exit(); }
FileUtil.writeResilientConfigFile("downloads.config", map );
}finally{
managers_mon.exit();
}
}
/**
* @return
*/
public TRTrackerScraper getTrackerScraper() {
return trackerScraper;
}
public GlobalManagerStats
getStats()
{
return( stats );
}
public int getIndexOf(DownloadManager manager) {
if (managers_cow != null && manager != null)
return managers_cow.indexOf(manager);
return -1;
}
public boolean isMoveableUp(DownloadManager manager) {
if ((manager.isDownloadComplete(false)) &&
(COConfigurationManager.getIntParameter("StartStopManager_iRankType") != 0) &&
(COConfigurationManager.getBooleanParameter("StartStopManager_bAutoReposition")))
return false;
return manager.getPosition() > 1;
}
public int downloadManagerCount(boolean bCompleted) {
int numInGroup = 0;
for (Iterator it = managers_cow.iterator();it.hasNext();) {
DownloadManager dm = (DownloadManager)it.next();
if (dm.isDownloadComplete(false) == bCompleted)
numInGroup++;
}
return numInGroup;
}
public boolean isMoveableDown(DownloadManager manager) {
boolean isCompleted = manager.isDownloadComplete(false);
if (isCompleted &&
(COConfigurationManager.getIntParameter("StartStopManager_iRankType") != 0) &&
(COConfigurationManager.getBooleanParameter("StartStopManager_bAutoReposition")))
return false;
return manager.getPosition() < downloadManagerCount(isCompleted);
}
public void moveUp(DownloadManager manager) {
moveTo(manager, manager.getPosition() - 1);
}
public void moveDown(DownloadManager manager) {
moveTo(manager, manager.getPosition() + 1);
}
public void moveTop(DownloadManager[] manager) {
try{
managers_mon.enter();
int newPosition = 1;
for (int i = 0; i < manager.length; i++)
moveTo(manager[i], newPosition++);
}finally{
managers_mon.exit();
}
}
public void moveEnd(DownloadManager[] manager) {
try{
managers_mon.enter();
int endPosComplete = 0;
int endPosIncomplete = 0;
for (int j = 0; j < managers_cow.size(); j++) {
DownloadManager dm = (DownloadManager) managers_cow.get(j);
if (dm.isDownloadComplete(false))
endPosComplete++;
else
endPosIncomplete++;
}
for (int i = manager.length - 1; i >= 0; i--) {
if (manager[i].isDownloadComplete(false) && endPosComplete > 0) {
moveTo(manager[i], endPosComplete--);
} else if (endPosIncomplete > 0) {
moveTo(manager[i], endPosIncomplete--);
}
}
}finally{
managers_mon.exit();
}
}
public void moveTo(DownloadManager manager, int newPosition) {
boolean curCompleted = manager.isDownloadComplete(false);
if (newPosition < 1 || newPosition > downloadManagerCount(curCompleted))
return;
try{
managers_mon.enter();
int curPosition = manager.getPosition();
if (newPosition > curPosition) {
// move [manager] down
// move everything between [curPosition+1] and [newPosition] up(-) 1
int numToMove = newPosition - curPosition;
for (int i = 0; i < managers_cow.size(); i++) {
DownloadManager dm = (DownloadManager) managers_cow.get(i);
boolean dmCompleted = (dm.isDownloadComplete(false));
if (dmCompleted == curCompleted) {
int dmPosition = dm.getPosition();
if ((dmPosition > curPosition) && (dmPosition <= newPosition)) {
dm.setPosition(dmPosition - 1);
numToMove--;
if (numToMove <= 0)
break;
}
}
}
manager.setPosition(newPosition);
}
else if (newPosition < curPosition && curPosition > 1) {
// move [manager] up
// move everything between [newPosition] and [curPosition-1] down(+) 1
int numToMove = curPosition - newPosition;
for (int i = 0; i < managers_cow.size(); i++) {
DownloadManager dm = (DownloadManager) managers_cow.get(i);
boolean dmCompleted = (dm.isDownloadComplete(false));
int dmPosition = dm.getPosition();
if ((dmCompleted == curCompleted) &&
(dmPosition >= newPosition) &&
(dmPosition < curPosition)
) {
dm.setPosition(dmPosition + 1);
numToMove--;
if (numToMove <= 0)
break;
}
}
manager.setPosition(newPosition);
}
}finally{
managers_mon.exit();
}
}
public void fixUpDownloadManagerPositions() {
try{
managers_mon.enter();
int posComplete = 1;
int posIncomplete = 1;
Collections.sort(managers_cow, new Comparator () {
public final int compare (Object a, Object b) {
int i = ((DownloadManager)a).getPosition() - ((DownloadManager)b).getPosition();
if (i != 0) {
return i;
}
// non persistent before persistent
if (((DownloadManager)a).isPersistent()) {
return 1;
} else if (((DownloadManager)b).isPersistent()) {
return -1;
}
return 0;
}
} );
for (int i = 0; i < managers_cow.size(); i++) {
DownloadManager dm = (DownloadManager) managers_cow.get(i);
if (dm.isDownloadComplete(false))
dm.setPosition(posComplete++);
else
dm.setPosition(posIncomplete++);
}
}finally{
managers_mon.exit();
}
}
protected void informDestroyed() {
if ( destroyed )
{
return;
}
destroyed = true;
/*
Thread t = new Thread("Azureus: destroy checker")
{
public void
run()
{
long start = SystemTime.getCurrentTime();
while(true){
try{
Thread.sleep(2500);
}catch( Throwable e ){
e.printStackTrace();
}
if ( SystemTime.getCurrentTime() - start > 10000 ){
// java web start problem here...
// Debug.dumpThreads("Azureus: slow stop - thread dump");
// Debug.killAWTThreads(); doesn't work
}
}
}
};
t.setDaemon(true);
t.start();
*/
listeners.dispatch( LDT_DESTROYED, null, true );
}
public void
informDestroyInitiated()
{
listeners.dispatch( LDT_DESTROY_INITIATED, null, true );
}
public void
addListener(
GlobalManagerListener listener )
{
addListener(listener, true);
}
public void
addListener(
GlobalManagerListener listener,
boolean trigger )
{
if ( isStopping ){
listener.destroyed();
}else{
listeners.addListener(listener);
if (!trigger) {
return;
}
// Don't use Dispatch.. async is bad (esp for plugin initialization)
try{
managers_mon.enter();
List managers = managers_cow;
for (int i=0;i<managers.size();i++){
listener.downloadManagerAdded((DownloadManager)managers.get(i));
}
}finally{
managers_mon.exit();
}
}
}
public void
removeListener(
GlobalManagerListener listener )
{
listeners.removeListener(listener);
}
public void
addDownloadWillBeRemovedListener(
GlobalManagerDownloadWillBeRemovedListener l )
{
removal_listeners.addListener( l );
}
public void
removeDownloadWillBeRemovedListener(
GlobalManagerDownloadWillBeRemovedListener l )
{
removal_listeners.removeListener( l );
}
// DownloadManagerListener
public void
stateChanged(
DownloadManager manager,
int new_state )
{
needsSaving = true; //make sure we update 'downloads.config' on state changes
//run seeding-only-mode check
PEPeerManager pm_manager = manager.getPeerManager();
if ( new_state == DownloadManager.STATE_DOWNLOADING &&
pm_manager != null &&
pm_manager.hasDownloadablePiece()){
//the new state is downloading, so can skip the full check
setSeedingOnlyState( false );
}else{
checkSeedingOnlyState();
}
}
protected void
checkSeedingOnlyState()
{
check_seeding_only_state_dispatcher.dispatch();
}
protected void
checkSeedingOnlyStateSupport()
{
boolean seeding = false;
List managers = managers_cow;
for( int i=0; i < managers.size(); i++ ) {
DownloadManager dm = (DownloadManager)managers.get( i );
PEPeerManager pm = dm.getPeerManager();
if ( dm.getDiskManager() == null || pm == null ){
// download not running, not interesting
continue;
}
int state = dm.getState();
if ( state == DownloadManager.STATE_DOWNLOADING ){
if (!pm.hasDownloadablePiece()){
// complete DND file
seeding = true;
}else{
seeding = false;
break;
}
}else if ( state == DownloadManager.STATE_SEEDING ){
seeding = true;
}
}
setSeedingOnlyState( seeding );
}
protected void
setSeedingOnlyState(
boolean seeding )
{
if( seeding != seeding_only_mode ) {
seeding_only_mode = seeding;
listeners.dispatch( LDT_SEEDING_ONLY, new Boolean( seeding_only_mode ) );
}
}
public boolean
isSeedingOnly()
{
return( seeding_only_mode );
}
public long
getTotalSwarmsPeerRate(
boolean downloading,
boolean seeding )
{
long now = SystemTime.getCurrentTime();
if ( now < last_swarm_stats_calc_time ||
now - last_swarm_stats_calc_time >= 1000 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -