⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diskmanagerimpl.java

📁 java 文件下载器。可自定义
💻 JAVA
📖 第 1 页 / 共 5 页
字号:
// Decompiled by Jad v1.5.8e2. Copyright 2001 Pavel Kouznetsov.
// Jad home page: http://kpdus.tripod.com/jad.html
// Decompiler options: packimports(3) fieldsfirst ansi space 
// Source File Name:   DiskManagerImpl.java

package org.gudy.azureus2.core3.disk.impl;

import com.aelitis.azureus.core.diskmanager.access.DiskAccessController;
import com.aelitis.azureus.core.diskmanager.access.DiskAccessControllerFactory;
import com.aelitis.azureus.core.diskmanager.cache.*;
import com.aelitis.azureus.core.diskmanager.file.FMFileManager;
import com.aelitis.azureus.core.diskmanager.file.FMFileManagerFactory;
import com.aelitis.azureus.core.util.CaseSensitiveFileMap;
import java.io.*;
import java.lang.ref.WeakReference;
import java.util.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.disk.*;
import org.gudy.azureus2.core3.disk.impl.access.DMAccessFactory;
import org.gudy.azureus2.core3.disk.impl.access.DMChecker;
import org.gudy.azureus2.core3.disk.impl.access.DMReader;
import org.gudy.azureus2.core3.disk.impl.access.DMWriter;
import org.gudy.azureus2.core3.disk.impl.piecemapper.DMPieceList;
import org.gudy.azureus2.core3.disk.impl.piecemapper.DMPieceMap;
import org.gudy.azureus2.core3.disk.impl.piecemapper.DMPieceMapEntry;
import org.gudy.azureus2.core3.disk.impl.piecemapper.DMPieceMapper;
import org.gudy.azureus2.core3.disk.impl.piecemapper.DMPieceMapperFactory;
import org.gudy.azureus2.core3.disk.impl.piecemapper.DMPieceMapperFile;
import org.gudy.azureus2.core3.disk.impl.resume.RDResumeHandler;
import org.gudy.azureus2.core3.download.*;
import org.gudy.azureus2.core3.download.impl.DownloadManagerMoveHandler;
import org.gudy.azureus2.core3.internat.*;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.torrent.*;
import org.gudy.azureus2.core3.util.*;
import org.gudy.azureus2.platform.*;
import org.gudy.azureus2.plugins.download.savelocation.SaveLocationChange;
import org.gudy.azureus2.plugins.platform.PlatformManagerException;

// Referenced classes of package org.gudy.azureus2.core3.disk.impl:
//			DiskManagerAllocationScheduler, DiskManagerFileInfoHelper, DiskManagerFileInfoImpl, DiskManagerFileInfoSetImpl, 
//			DiskManagerHelper, DiskManagerPieceImpl, DiskManagerRecheckScheduler, DiskManagerUtil

public class DiskManagerImpl extends LogRelation
	implements DiskManagerHelper
{
	static abstract class FileSkeleton
		implements DiskManagerFileInfoHelper
	{

		protected boolean priority;
		protected boolean skipped;
		protected long downloaded;

		FileSkeleton()
		{
		}
	}


	private static final int DM_FREE_PIECELIST_TIMEOUT = 0x1d4c0;
	private static final LogIDs LOGID;
	private static DiskAccessController disk_access_controller;
	private static DiskManagerRecheckScheduler recheck_scheduler = new DiskManagerRecheckScheduler();
	private static DiskManagerAllocationScheduler allocation_scheduler = new DiskManagerAllocationScheduler();
	private static ThreadPool start_pool;
	private static AEMonitor cache_read_mon = new AEMonitor("DiskManager:cacheRead");
	private boolean used;
	private boolean started;
	private AESemaphore started_sem;
	private boolean starting;
	private boolean stopping;
	private int state_set_via_method;
	protected String errorMessage;
	private int pieceLength;
	private int lastPieceLength;
	private int nbPieces;
	private long totalLength;
	private int percentDone;
	private long allocated;
	private long remaining;
	private TOTorrent torrent;
	private DMReader reader;
	private DMChecker checker;
	private DMWriter writer;
	private RDResumeHandler resume_handler;
	private DMPieceMapper piece_mapper;
	private DiskManagerPieceImpl pieces[];
	private DMPieceMap piece_map_use_accessor;
	private long piece_map_use_accessor_time;
	private DiskManagerFileInfoImpl files[];
	private DiskManagerFileInfoSet fileset;
	protected DownloadManager download_manager;
	private boolean alreadyMoved;
	private boolean skipped_file_set_changed;
	private long skipped_file_set_size;
	private long skipped_but_downloaded;
	private boolean checking_enabled;
	private static final int LDT_STATECHANGED = 1;
	private static final int LDT_PRIOCHANGED = 2;
	private static final int LDT_PIECE_DONE_CHANGED = 3;
	private static final int LDT_ACCESS_MODE_CHANGED = 4;
	protected static ListenerManager listeners_aggregator = ListenerManager.createAsyncManager("DiskM:ListenAggregatorDispatcher", new ListenerManagerDispatcher() {

		public void dispatch(Object _listener, int type, Object value)
		{
			DiskManagerListener listener = (DiskManagerListener)_listener;
			if (type == 1)
			{
				int params[] = (int[])(int[])value;
				listener.stateChanged(params[0], params[1]);
			} else
			if (type == 2)
				listener.filePriorityChanged((DiskManagerFileInfo)value);
			else
			if (type == 3)
				listener.pieceDoneChanged((DiskManagerPiece)value);
			else
			if (type == 4)
			{
				Object o[] = (Object[])(Object[])value;
				listener.fileAccessModeChanged((DiskManagerFileInfo)o[0], ((Integer)o[1]).intValue(), ((Integer)o[2]).intValue());
			}
		}

	});
	private ListenerManager listeners;
	private AEMonitor start_stop_mon;
	private AEMonitor file_piece_mon;

	public static DiskAccessController getDefaultDiskAccessController()
	{
		return disk_access_controller;
	}

	public DiskManagerImpl(TOTorrent _torrent, DownloadManager _dmanager)
	{
		used = false;
		started = false;
		started_sem = new AESemaphore("DiskManager::started");
		errorMessage = "";
		alreadyMoved = false;
		skipped_file_set_changed = true;
		checking_enabled = true;
		listeners = ListenerManager.createManager("DiskM:ListenDispatcher", new ListenerManagerDispatcher() {

			final DiskManagerImpl this$0;

			public void dispatch(Object listener, int type, Object value)
			{
				DiskManagerImpl.listeners_aggregator.dispatch(listener, type, value);
			}

			
			{
				this$0 = DiskManagerImpl.this;
				super();
			}
		});
		start_stop_mon = new AEMonitor("DiskManager:startStop");
		file_piece_mon = new AEMonitor("DiskManager:filePiece");
		torrent = _torrent;
		download_manager = _dmanager;
		pieces = new DiskManagerPieceImpl[0];
		setState(1);
		percentDone = 0;
		if (torrent == null)
		{
			errorMessage = "Torrent not available";
			setState(10);
			return;
		}
		LocaleUtilDecoder locale_decoder = null;
		try
		{
			locale_decoder = LocaleTorrentUtil.getTorrentEncoding(torrent);
		}
		catch (TOTorrentException e)
		{
			Debug.printStackTrace(e);
			errorMessage = TorrentUtils.exceptionToText(e);
			setState(10);
			return;
		}
		catch (Throwable e)
		{
			Debug.printStackTrace(e);
			errorMessage = (new StringBuilder()).append("Initialisation failed - ").append(Debug.getNestedExceptionMessage(e)).toString();
			setState(10);
			return;
		}
		piece_mapper = DMPieceMapperFactory.create(torrent);
		try
		{
			piece_mapper.construct(locale_decoder, download_manager.getAbsoluteSaveLocation().getName());
		}
		catch (Throwable e)
		{
			Debug.printStackTrace(e);
			errorMessage = (new StringBuilder()).append("Failed to build piece map - ").append(Debug.getNestedExceptionMessage(e)).toString();
			setState(10);
			return;
		}
		totalLength = piece_mapper.getTotalLength();
		remaining = totalLength;
		nbPieces = torrent.getNumberOfPieces();
		pieceLength = (int)torrent.getPieceLength();
		lastPieceLength = piece_mapper.getLastPieceLength();
		pieces = new DiskManagerPieceImpl[nbPieces];
		for (int i = 0; i < nbPieces; i++)
			pieces[i] = new DiskManagerPieceImpl(this, i, i != nbPieces - 1 ? pieceLength : lastPieceLength);

		reader = DMAccessFactory.createReader(this);
		checker = DMAccessFactory.createChecker(this);
		writer = DMAccessFactory.createWriter(this);
		resume_handler = new RDResumeHandler(this, checker);
	}

	public void start()
	{
		start_stop_mon.enter();
		if (used)
			Debug.out("DiskManager reuse not supported!!!!");
		used = true;
		if (getState() != 10)
			break MISSING_BLOCK_LABEL_46;
		Debug.out("starting a faulty disk manager");
		start_stop_mon.exit();
		return;
		started = true;
		starting = true;
		start_pool.run(new AERunnable() {

			final DiskManagerImpl this$0;

			public void runSupport()
			{
				start_stop_mon.enter();
				if (stopping)
					throw new Exception("Stopped during startup");
				start_stop_mon.exit();
				break MISSING_BLOCK_LABEL_56;
				Throwable e;
				e;
				start_stop_mon.exit();
				throw e;
				startSupport();
				started_sem.release();
				break MISSING_BLOCK_LABEL_145;
				e;
				errorMessage = (new StringBuilder()).append(Debug.getNestedExceptionMessage(e)).append(" (start)").toString();
				Debug.printStackTrace(e);
				setState(10);
				started_sem.release();
				break MISSING_BLOCK_LABEL_145;
				Exception exception1;
				exception1;
				started_sem.release();
				throw exception1;
				boolean stop_required;
				start_stop_mon.enter();
				stop_required = getState() == 10 || stopping;
				starting = false;
				start_stop_mon.exit();
				break MISSING_BLOCK_LABEL_218;
				Exception exception2;
				exception2;
				start_stop_mon.exit();
				throw exception2;
				if (stop_required)
					stop(false);
				return;
			}

			
			{
				this$0 = DiskManagerImpl.this;
				super();
			}
		});
		start_stop_mon.exit();
		break MISSING_BLOCK_LABEL_91;
		Exception exception;
		exception;
		start_stop_mon.exit();
		throw exception;
	}

	private void startSupport()
	{
		boolean files_exist = false;
		if (download_manager.isPersistent())
		{
			File move_to_dirs[] = DownloadManagerMoveHandler.getRelatedDirs(download_manager);
			int i = 0;
			do
			{
				if (i >= move_to_dirs.length)
					break;
				String move_to_dir = move_to_dirs[i].getAbsolutePath();
				if (filesExist(move_to_dir))
				{
					alreadyMoved = files_exist = true;
					download_manager.setTorrentSaveDir(move_to_dir);
					break;
				}
				i++;
			} while (true);
		}
		reader.start();
		checker.start();
		writer.start();
		if (!alreadyMoved && !download_manager.isDataAlreadyAllocated())
		{
			if (!files_exist)
				files_exist = filesExist();
			if (!files_exist)
			{
				SaveLocationChange transfer = DownloadManagerMoveHandler.onInitialisation(download_manager);
				if (transfer != null)
				{
					if (transfer.download_location != null || transfer.download_name != null)
					{
						File dl_location = transfer.download_location;
						if (dl_location == null)
							dl_location = download_manager.getAbsoluteSaveLocation().getParentFile();
						if (transfer.download_name == null)
							download_manager.setTorrentSaveDir(dl_location.getAbsolutePath());
						else
							download_manager.setTorrentSaveDir(dl_location.getAbsolutePath(), transfer.download_name);
					}
					if (transfer.torrent_location != null || transfer.torrent_name != null)
						try
						{
							download_manager.setTorrentFile(transfer.torrent_location, transfer.torrent_name);
						}
						catch (DownloadManagerException e)
						{
							Debug.printStackTrace(e);
						}
				}
			}
		}
		int newFiles = allocateFiles();
		if (getState() == 10)
			return;
		if (getState() == 10)
			return;
		setState(3);
		resume_handler.start();
		if (checking_enabled)
			if (newFiles == 0)
			{
				resume_handler.checkAllPieces(false);
				if (getRemainingExcludingDND() == 0L)
					checkFreePieceList(true);
			} else
			if (newFiles != files.length)
				resume_handler.checkAllPieces(true);
		if (getState() == 10)
		{
			return;
		} else
		{
			setState(4);
			return;
		}
	}

	public void stop(boolean closing)
	{
		start_stop_mon.enter();
		if (!started)
		{
			start_stop_mon.exit();
			return;
		}
		if (!starting)
			break MISSING_BLOCK_LABEL_82;
		stopping = true;
		checker.stop();
		writer.stop();
		reader.stop();
		resume_handler.stop(closing);
		saveState(false);
		start_stop_mon.exit();
		return;
		started = false;
		stopping = false;
		start_stop_mon.exit();
		break MISSING_BLOCK_LABEL_112;
		Exception exception;
		exception;
		start_stop_mon.exit();
		throw exception;
		started_sem.reserve();
		checker.stop();
		writer.stop();
		reader.stop();
		resume_handler.stop(closing);
		if (files != null)
		{
			for (int i = 0; i < files.length; i++)
				try
				{
					if (files[i] != null)
						files[i].getCacheFile().close();
				}
				catch (Throwable e)
				{
					setFailed((new StringBuilder()).append("File close fails: ").append(Debug.getNestedExceptionMessage(e)).toString());
				}

		}
		if (getState() == 4)
			try
			{
				saveResumeData(false);
			}
			catch (Exception e)
			{
				setFailed((new StringBuilder()).append("Resume data save fails: ").append(Debug.getNestedExceptionMessage(e)).toString());
			}
		saveState();
		listeners.clear();
		return;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -