📄 diskmanagerimpl.java
字号:
// 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 + -