globalmanagerimpl.java
来自「Azureus is a powerful, full-featured, cr」· Java 代码 · 共 1,528 行 · 第 1/4 页
JAVA
1,528 行
}
}
/* Puts GlobalManager in a stopped state.
* Used when closing down Azureus.
*/
public void
stopAll() {
try{
managers_mon.enter();
if ( isStopping ){
return;
}
isStopping = true;
}finally{
managers_mon.exit();
}
informDestroyInitiated();
if ( host_support != null ){
host_support.destroy();
}
torrent_folder_watcher.destroy();
// kick off a non-daemon task. This will ensure that we hang around
// for at least LINGER_PERIOD to run other non-daemon tasks such as writing
// torrent resume data...
try{
NonDaemonTaskRunner.run(
new NonDaemonTask()
{
public Object
run()
{
return( null );
}
});
}catch( Throwable e ){
Debug.printStackTrace( e );
}
checker.stopIt();
saveDownloads();
stopAllDownloads();
if ( stats_writer != null ){
stats_writer.destroy();
}
managers_cow = new ArrayList();
manager_map.clear();
informDestroyed();
}
/**
* Stops all downloads without removing them
*
* @author Rene Leonhardt
*/
public void stopAllDownloads() {
stopAllDownloads(DownloadManager.STATE_STOPPED);
}
public void stopAllDownloads(int stateAfterStopping) {
for (Iterator iter = managers_cow.iterator(); iter.hasNext();) {
DownloadManager manager = (DownloadManager) iter.next();
int state = manager.getState();
if( state != DownloadManager.STATE_STOPPED &&
state != DownloadManager.STATE_STOPPING ) {
manager.stopIt( stateAfterStopping, false, false );
}
}
}
/**
* Starts all downloads
*/
public void startAllDownloads() {
for (Iterator iter = managers_cow.iterator(); iter.hasNext();) {
DownloadManager manager = (DownloadManager) iter.next();
if( manager.getState() == DownloadManager.STATE_STOPPED ) {
manager.startDownloadInitialized(true);
}
}
}
public void pauseDownloads() {
for( Iterator i = managers_cow.iterator(); i.hasNext(); ) {
DownloadManager manager = (DownloadManager)i.next();
if ( manager.getTorrent() == null ) {
continue;
}
int state = manager.getState();
if( state != DownloadManager.STATE_STOPPED &&
state != DownloadManager.STATE_ERROR &&
state != DownloadManager.STATE_STOPPING ) {
try {
manager.stopIt( DownloadManager.STATE_STOPPED, false, false );
try { paused_list_mon.enter();
paused_list.add( manager.getTorrent().getHashWrapper() );
}
finally { paused_list_mon.exit(); }
}
catch( TOTorrentException e ) { Debug.printStackTrace( e ); }
}
}
}
public boolean canPauseDownloads() {
for( Iterator i = managers_cow.iterator(); i.hasNext(); ) {
DownloadManager manager = (DownloadManager)i.next();
if( manager.getTorrent() == null ) {
continue;
}
int state = manager.getState();
if( state != DownloadManager.STATE_STOPPED &&
state != DownloadManager.STATE_ERROR &&
state != DownloadManager.STATE_STOPPING ) {
return true;
}
}
return false;
}
public void resumeDownloads() {
try { paused_list_mon.enter();
for( int i=0; i < paused_list.size(); i++ ) {
HashWrapper hash = (HashWrapper)paused_list.get( i );
DownloadManager manager = getDownloadManager( hash.getHash() );
if( manager != null && manager.getState() == DownloadManager.STATE_STOPPED ) {
manager.startDownloadInitialized( true );
}
}
paused_list.clear();
}
finally { paused_list_mon.exit(); }
}
public boolean canResumeDownloads() {
try { paused_list_mon.enter();
for( int i=0; i < paused_list.size(); i++ ) {
HashWrapper hash = (HashWrapper)paused_list.get( i );
DownloadManager manager = getDownloadManager( hash.getHash() );
if( manager != null && manager.getState() == DownloadManager.STATE_STOPPED ) {
return true;
}
}
}
finally { paused_list_mon.exit(); }
return false;
}
private void loadDownloads(AzureusCoreListener listener)
{
try{
Map map = FileUtil.readResilientConfigFile("downloads.config");
boolean debug = Boolean.getBoolean("debug");
Iterator iter = null;
//v2.0.3.0+ vs older mode
List downloads = (List) map.get("downloads");
int nbDownloads;
if (downloads == null) {
//No downloads entry, then use the old way
iter = map.values().iterator();
nbDownloads = map.size();
}
else {
//New way, downloads stored in a list
iter = downloads.iterator();
nbDownloads = downloads.size();
}
int currentDownload = 0;
while (iter.hasNext()) {
currentDownload++;
Map mDownload = (Map) iter.next();
try {
byte[] torrent_hash = (byte[])mDownload.get( "torrent_hash" );
Long lPersistent = (Long)mDownload.get( "persistent" );
boolean persistent = lPersistent==null || lPersistent.longValue()==1;
String fileName = new String((byte[]) mDownload.get("torrent"), Constants.DEFAULT_ENCODING);
if( listener != null && nbDownloads > 0 ){
listener.reportPercent(100 * currentDownload / nbDownloads);
}
if(listener != null) {
listener.reportCurrentTask(MessageText.getString("splash.loadingTorrent")
+ " " + currentDownload + " "
+ MessageText.getString("splash.of") + " " + nbDownloads
+ " : " + fileName );
}
//migration from using a single savePath to a separate dir and file entry
String torrent_save_dir;
String torrent_save_file;
byte[] torrent_save_dir_bytes = (byte[]) mDownload.get("save_dir");
if ( torrent_save_dir_bytes != null ){
byte[] torrent_save_file_bytes = (byte[]) mDownload.get("save_file");
torrent_save_dir = new String(torrent_save_dir_bytes, Constants.DEFAULT_ENCODING);
if ( torrent_save_file_bytes != null ){
torrent_save_file = new String(torrent_save_file_bytes, Constants.DEFAULT_ENCODING);
}else{
torrent_save_file = null;
}
}else{
byte[] savePathBytes = (byte[]) mDownload.get("path");
torrent_save_dir = new String(savePathBytes, Constants.DEFAULT_ENCODING);
torrent_save_file = null;
}
int state = DownloadManager.STATE_WAITING;
if (debug){
state = DownloadManager.STATE_STOPPED;
}else {
if (mDownload.containsKey("state")) {
state = ((Long) mDownload.get("state")).intValue();
if (state != DownloadManager.STATE_STOPPED &&
state != DownloadManager.STATE_QUEUED &&
state != DownloadManager.STATE_WAITING)
state = DownloadManager.STATE_QUEUED;
}else{
int stopped = ((Long) mDownload.get("stopped")).intValue();
if (stopped == 1){
state = DownloadManager.STATE_STOPPED;
}
}
}
saved_download_manager_state.put( fileName, mDownload );
// for non-persistent downloads the state will be picked up if the download is re-added
// it won't get saved unless it is picked up, hence dead data is dropped as required
if ( persistent ){
DownloadManager dm = DownloadManagerFactory.create(this, torrent_hash, fileName, torrent_save_dir, torrent_save_file, state, true, true );
addDownloadManager(dm, false);
}
}
catch (UnsupportedEncodingException e1) {
//Do nothing and process next.
}
catch (Throwable e) {
LGLogger.log("Error while loading downloads. One download may not have been added to the list.");
Debug.printStackTrace( e );
}
}
//load pause/resume state
ArrayList pause_data = (ArrayList)map.get( "pause_data" );
if( pause_data != null ) {
try { paused_list_mon.enter();
for( int i=0; i < pause_data.size(); i++ ) {
byte[] key = (byte[])pause_data.get( i );
paused_list.add( new HashWrapper( key ) );
}
}
finally { paused_list_mon.exit(); }
}
// Someone could have mucked with the config file and set weird positions,
// so fix them up.
fixUpDownloadManagerPositions();
LGLogger.log("Loaded " + managers_cow.size() + " torrents");
}catch( Throwable e ){
// there's been problems with corrupted download files stopping AZ from starting
// added this to try and prevent such foolishness
Debug.printStackTrace( e );
}
}
private void saveDownloads()
{
// if(Boolean.getBoolean("debug")) return;
try{
managers_mon.enter();
LGLogger.log("Saving Download List (" + managers_cow.size() + " items)");
Map map = new HashMap();
List list = new ArrayList(managers_cow.size());
for (int i = 0; i < managers_cow.size(); i++) {
DownloadManager dm = (DownloadManager) managers_cow.get(i);
DownloadManagerStats dm_stats = dm.getStats();
Map dmMap = new HashMap();
TOTorrent torrent = dm.getTorrent();
if ( torrent != null ){
try{
dmMap.put( "torrent_hash", torrent.getHash());
}catch( TOTorrentException e ){
Debug.printStackTrace(e);
}
}
dmMap.put("persistent", new Long(dm.isPersistent()?1:0));
dmMap.put("torrent", dm.getTorrentFileName());
dmMap.put("save_dir", dm.getTorrentSaveDir());
dmMap.put("save_file", dm.getTorrentSaveFile());
//TODO: remove after later release...it makes sure older versions can load this version's downloads.config
if ( dm.getTorrentSaveFile() == null ){
dmMap.put("path", new File( dm.getTorrentSaveDir()).getAbsolutePath() );
}else{
dmMap.put("path", new File( dm.getTorrentSaveDir(), dm.getTorrentSaveFile() ).getAbsolutePath() );
}
dmMap.put("uploads", new Long(dm_stats.getMaxUploads()));
dmMap.put("maxdl", new Long(dm_stats.getMaxDownloadKBSpeed()));
dmMap.put("maxul", new Long(dm_stats.getUploadRateLimitBytesPerSecond()));
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?