📄 diskmanagerimpl.java
字号:
return;
}
pieceMap = piece_mapper.getPieceMap();
constructFilesPieces();
if ( getState() == FAULTY ){
// bail out if broken in the meantime
return;
}
setState( DiskManager.CHECKING );
resume_handler.start();
if ( newFiles == 0 ){
resume_handler.checkAllPieces(false);
}else if ( newFiles != files.length ){
// if not a fresh torrent, check pieces ignoring fast resume data
resume_handler.checkAllPieces(true);
}
if ( getState() == FAULTY ){
return;
}
// in all the above cases we want to continue to here if we have been "stopped" as
// other components require that we end up either FAULTY or READY
//3.Change State
setState( READY );
}
public void
stop(
boolean closing )
{
try{
start_stop_mon.enter();
if ( !started ){
return;
}
// we need to be careful if we're still starting up as this may be
// a re-entrant "stop" caused by a faulty state being reported during
// startup. Defer the actual stop until starting is complete
if ( starting ){
stopping = true;
// we can however safely stop things at this point - this is important
// to interrupt an alloc/recheck process that might be holding up the start
// operation
checker.stop();
writer.stop();
reader.stop();
resume_handler.stop( closing );
// at least save the current stats to download state - they'll be persisted later
// when the "real" stop gets through
saveState( false );
return;
}
started = false;
stopping = false;
}finally{
start_stop_mon.exit();
}
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( "File close fails: " + Debug.getNestedExceptionMessage(e));
}
}
}
if ( getState() == DiskManager.READY ){
try{
saveResumeData( false );
}catch( Exception e ){
setFailed( "Resume data save fails: " + Debug.getNestedExceptionMessage(e));
}
}
saveState();
// can't be used after a stop so we might as well clear down the listeners
listeners.clear();
}
public boolean
filesExist()
{
return( filesExist( download_manager.getAbsoluteSaveLocation().getParent()));
}
protected boolean
filesExist(
String root_dir )
{
if ( !torrent.isSimpleTorrent()){
root_dir += File.separator + download_manager.getAbsoluteSaveLocation().getName();
}
if ( !root_dir.endsWith( File.separator )){
root_dir += File.separator;
}
// System.out.println( "root dir = " + root_dir_file );
DMPieceMapperFile[] pm_files = piece_mapper.getFiles();
String[] storage_types = getStorageTypes();
for (int i = 0; i < pm_files.length; i++) {
DMPieceMapperFile pm_info = pm_files[i];
File relative_file = pm_info.getDataFile();
long target_length = pm_info.getLength();
// use the cache file to ascertain length in case the caching/writing algorithm
// fiddles with the real length
// Unfortunately we may be called here BEFORE the disk manager has been
// started and hence BEFORE the file info has been setup...
// Maybe one day we could allocate the file info earlier. However, if we do
// this then we'll need to handle the "already moved" stuff too...
DiskManagerFileInfoImpl file_info = pm_info.getFileInfo();
boolean close_it = false;
try{
if ( file_info == null ){
boolean linear = storage_types[i].equals("L");
file_info = new DiskManagerFileInfoImpl(
this,
new File( root_dir + relative_file.toString()),
i,
pm_info.getTorrentFile(),
linear );
close_it = true;
}
try{
CacheFile cache_file = file_info.getCacheFile();
File data_file = file_info.getFile(true);
if ( !cache_file.exists()){
// look for something sensible to report
File current = data_file;
while( !current.exists()){
File parent = current.getParentFile();
if ( parent == null ){
break;
}else if ( !parent.exists()){
current = parent;
}else{
if ( parent.isDirectory()){
errorMessage = current.toString() + " not found.";
}else{
errorMessage = parent.toString() + " is not a directory.";
}
return( false );
}
}
errorMessage = data_file.toString() + " not found.";
return false;
}
// only test for too big as if incremental creation selected
// then too small is OK
long existing_length = file_info.getCacheFile().getLength();
if ( existing_length > target_length ){
if ( COConfigurationManager.getBooleanParameter("File.truncate.if.too.large")){
file_info.setAccessMode( DiskManagerFileInfo.WRITE );
file_info.getCacheFile().setLength( target_length );
Debug.out( "Existing data file length too large [" +existing_length+ ">" +target_length+ "]: " + data_file.getAbsolutePath() + ", truncating" );
}else{
errorMessage = "Existing data file length too large [" +existing_length+ ">" +target_length+ "]: " + data_file.getAbsolutePath();
return false;
}
}
}finally{
if ( close_it ){
file_info.getCacheFile().close();
}
}
}catch( Throwable e ){
errorMessage = Debug.getNestedExceptionMessage(e) + " (filesExist:" + relative_file.toString() + ")";
return( false );
}
}
return true;
}
private int
allocateFiles()
{
Set file_set = new HashSet();
DMPieceMapperFile[] pm_files = piece_mapper.getFiles();
DiskManagerFileInfoImpl[] allocated_files = new DiskManagerFileInfoImpl[pm_files.length];
try{
allocation_scheduler.register( this );
setState( ALLOCATING );
allocated = 0;
int numNewFiles = 0;
String root_dir = download_manager.getAbsoluteSaveLocation().getParent();
if ( !torrent.isSimpleTorrent()){
root_dir += File.separator + download_manager.getAbsoluteSaveLocation().getName();
}
root_dir += File.separator;
String[] storage_types = getStorageTypes();
for ( int i=0;i<pm_files.length;i++ ){
final DMPieceMapperFile pm_info = pm_files[i];
final long target_length = pm_info.getLength();
File relative_data_file = pm_info.getDataFile();
DiskManagerFileInfoImpl fileInfo;
try{
boolean linear = storage_types[i].equals("L");
fileInfo = new DiskManagerFileInfoImpl(
this,
new File( root_dir + relative_data_file.toString()),
i,
pm_info.getTorrentFile(),
linear );
allocated_files[i] = fileInfo;
pm_info.setFileInfo( fileInfo );
}catch ( CacheFileManagerException e ){
this.errorMessage = Debug.getNestedExceptionMessage(e) + " (allocateFiles:" + relative_data_file.toString() + ")";
setState( FAULTY );
return( -1 );
}
CacheFile cache_file = fileInfo.getCacheFile();
File data_file = fileInfo.getFile(true);
String data_file_name = data_file.getName();
String file_key = data_file.getAbsolutePath();
if ( Constants.isWindows ){
file_key = file_key.toLowerCase();
}
if ( file_set.contains( file_key )){
this.errorMessage = "File occurs more than once in download: " + data_file.toString();
setState( FAULTY );
return( -1 );
}
file_set.add( file_key );
int separator = data_file_name.lastIndexOf(".");
if ( separator == -1 ){
separator = 0;
}
fileInfo.setExtension(data_file_name.substring(separator));
//Added for Feature Request
//[ 807483 ] Prioritize .nfo files in new torrents
//Implemented a more general way of dealing with it.
String extensions = COConfigurationManager.getStringParameter("priorityExtensions","");
if(!extensions.equals("")) {
boolean bIgnoreCase = COConfigurationManager.getBooleanParameter("priorityExtensionsIgnoreCase");
StringTokenizer st = new StringTokenizer(extensions,";");
while(st.hasMoreTokens()) {
String extension = st.nextToken();
extension = extension.trim();
if(!extension.startsWith("."))
extension = "." + extension;
boolean bHighPriority = (bIgnoreCase) ?
fileInfo.getExtension().equalsIgnoreCase(extension) :
fileInfo.getExtension().equals(extension);
if (bHighPriority)
fileInfo.setPriority(true);
}
}
fileInfo.setDownloaded(0);
if ( cache_file.exists() ){
try {
//make sure the existing file length isn't too large
long existing_length = fileInfo.getCacheFile().getLength();
if( existing_length > target_length ){
if ( COConfigurationManager.getBooleanParameter("File.truncate.if.too.large")){
fileInfo.setAccessMode( DiskManagerFileInfo.WRITE );
cache_file.setLength( target_length );
Debug.out( "Existing data file length too large [" +existing_length+ ">" +target_length+ "]: " +data_file.getAbsolutePath() + ", truncating" );
}else{
this.errorMessage = "Existing data file length too large [" +existing_length+ ">" +target_length+ "]: " + data_file.getAbsolutePath();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -