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

📄 rdresumehandler.java

📁 java 文件下载器。可自定义
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
// 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:   RDResumeHandler.java

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

import com.aelitis.azureus.core.diskmanager.cache.CacheFile;
import com.aelitis.azureus.core.diskmanager.cache.CacheFileManagerException;
import java.util.*;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.disk.*;
import org.gudy.azureus2.core3.disk.impl.*;
import org.gudy.azureus2.core3.disk.impl.access.DMChecker;
import org.gudy.azureus2.core3.disk.impl.piecemapper.DMPieceList;
import org.gudy.azureus2.core3.disk.impl.piecemapper.DMPieceMapEntry;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.download.DownloadManagerState;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.torrent.TOTorrent;
import org.gudy.azureus2.core3.util.AESemaphore;
import org.gudy.azureus2.core3.util.Debug;

public class RDResumeHandler
{

	private static final LogIDs LOGID;
	private static final byte PIECE_NOT_DONE = 0;
	private static final byte PIECE_DONE = 1;
	private static final byte PIECE_RECHECK_REQUIRED = 2;
	private static final byte PIECE_STARTED = 3;
	private static boolean use_fast_resume;
	private static boolean use_fast_resume_recheck_all;
	private DiskManagerImpl disk_manager;
	private DMChecker checker;
	private volatile boolean started;
	private volatile boolean stopped;
	private volatile boolean stopped_for_close;
	private volatile boolean check_in_progress;
	private volatile boolean check_resume_was_valid;
	private volatile boolean check_is_full_check;
	private volatile boolean check_interrupted;
	private volatile int check_position;

	public RDResumeHandler(DiskManagerImpl _disk_manager, DMChecker _writer_and_checker)
	{
		disk_manager = _disk_manager;
		checker = _writer_and_checker;
	}

	public void start()
	{
		if (started)
			Debug.out("RDResumeHandler: reuse not supported");
		started = true;
	}

	public void stop(boolean closing)
	{
		stopped_for_close = stopped_for_close | closing;
		if (check_in_progress)
			check_interrupted = true;
		stopped = true;
	}

	public void checkAllPieces(boolean newfiles)
	{
		DiskManagerRecheckInstance recheck_inst;
		final AESemaphore run_sem;
		recheck_inst = disk_manager.getRecheckScheduler().register(disk_manager, false);
		run_sem = new AESemaphore("RDResumeHandler::checkAllPieces:runsem", 2);
		boolean resume_data_complete = false;
		check_in_progress = true;
		boolean resumeEnabled = use_fast_resume;
		if (newfiles)
			resumeEnabled = false;
		final AESemaphore pending_checks_sem = new AESemaphore("RD:PendingChecks");
		int pending_check_num = 0;
		DiskManagerPiece pieces[] = disk_manager.getPieces();
		DiskManagerFileInfo files[] = disk_manager.getFiles();
		Map file_sizes = new HashMap();
		for (int i = 0; i < files.length; i++)
			try
			{
				Long len = new Long(((DiskManagerFileInfoImpl)files[i]).getCacheFile().getLength());
				file_sizes.put(files[i], len);
			}
			catch (CacheFileManagerException e)
			{
				Debug.printStackTrace(e);
			}

		if (resumeEnabled)
		{
			boolean resumeValid = false;
			byte resume_pieces[] = null;
			Map partialPieces = null;
			Map resume_data = getResumeData();
			if (resume_data != null)
				try
				{
					resume_pieces = (byte[])(byte[])resume_data.get("resume data");
					if (resume_pieces != null && resume_pieces.length != pieces.length)
					{
						Debug.out((new StringBuilder()).append("Resume data array length mismatch: ").append(resume_pieces.length).append("/").append(pieces.length).toString());
						resume_pieces = null;
					}
					partialPieces = (Map)resume_data.get("blocks");
					resumeValid = ((Long)resume_data.get("valid")).intValue() == 1;
					if (isTorrentResumeDataComplete(disk_manager.getDownloadManager().getDownloadState(), resume_data))
					{
						resume_data_complete = true;
					} else
					{
						resume_data.put("valid", new Long(0L));
						saveResumeData(resume_data);
					}
				}
				catch (Exception ignore) { }
			if (resume_pieces == null)
			{
				check_is_full_check = true;
				resumeValid = false;
				resume_pieces = new byte[pieces.length];
				Arrays.fill(resume_pieces, (byte)2);
			}
			check_resume_was_valid = resumeValid;
			boolean recheck_all = use_fast_resume_recheck_all;
			if (!recheck_all)
			{
				long total_not_done = 0L;
				int piece_size = disk_manager.getPieceLength();
				for (int i = 0; i < pieces.length; i++)
					if (resume_pieces[i] != 1)
						total_not_done += piece_size;

				if (total_not_done < 0x4000000L)
					recheck_all = true;
			}
			if (Logger.isEnabled())
			{
				int total_not_done = 0;
				int total_done = 0;
				int total_started = 0;
				int total_recheck = 0;
				for (int i = 0; i < pieces.length; i++)
				{
					byte piece_state = resume_pieces[i];
					if (piece_state == 0)
					{
						total_not_done++;
						continue;
					}
					if (piece_state == 1)
					{
						total_done++;
						continue;
					}
					if (piece_state == 3)
						total_started++;
					else
						total_recheck++;
				}

				String str = (new StringBuilder()).append("valid=").append(resumeValid).append(",not done=").append(total_not_done).append(",done=").append(total_done).append(",started=").append(total_started).append(",recheck=").append(total_recheck).append(",rc all=").append(recheck_all).append(",full=").append(check_is_full_check).toString();
				Logger.log(new LogEvent(disk_manager, LOGID, str));
			}
			for (int i = 0; i < pieces.length; i++)
			{
				check_position = i;
				DiskManagerPiece dm_piece = pieces[i];
				disk_manager.setPercentDone(((i + 1) * 1000) / disk_manager.getNbPieces());
				boolean pieceCannotExist = false;
				byte piece_state = resume_pieces[i];
				if (piece_state == 1 || !resumeValid || recheck_all)
				{
					DMPieceList list = disk_manager.getPieceList(i);
					int j = 0;
					do
					{
						if (j >= list.size())
							break;
						DMPieceMapEntry entry = list.get(j);
						Long file_size = (Long)file_sizes.get(entry.getFile());
						if (file_size == null)
						{
							piece_state = 0;
							pieceCannotExist = true;
							if (Logger.isEnabled())
								Logger.log(new LogEvent(disk_manager, LOGID, 1, (new StringBuilder()).append("Piece #").append(i).append(": file is missing, ").append("fails re-check.").toString()));
							break;
						}
						long expected_size = entry.getOffset() + (long)entry.getLength();
						if (file_size.longValue() < expected_size)
						{
							piece_state = 0;
							pieceCannotExist = true;
							if (Logger.isEnabled())
								Logger.log(new LogEvent(disk_manager, LOGID, 1, (new StringBuilder()).append("Piece #").append(i).append(": file is too small, fails re-check. File size = ").append(file_size).append(", piece needs ").append(expected_size).toString()));
							break;
						}
						j++;
					} while (true);
				}
				if (piece_state == 1)
				{
					dm_piece.setDone(true);
					continue;
				}
				if (piece_state == 0 && !recheck_all)
					continue;
				if (pieceCannotExist)
				{
					dm_piece.setDone(false);
					continue;
				}
				if (piece_state != 2 && resumeValid)
					continue;
				run_sem.reserve();
				while (!stopped && !recheck_inst.getPermission()) ;
				if (stopped)
					break;
				try
				{
					DiskManagerCheckRequest request = disk_manager.createCheckRequest(i, null);
					request.setLowPriority(true);
					checker.enqueueCheckRequest(request, new DiskManagerCheckRequestListener() {

						final AESemaphore val$run_sem;
						final AESemaphore val$pending_checks_sem;
						final RDResumeHandler this$0;

						public void checkCompleted(DiskManagerCheckRequest request, boolean passed)
						{
							complete();
						}

						public void checkCancelled(DiskManagerCheckRequest request)
						{
							complete();
						}

						public void checkFailed(DiskManagerCheckRequest request, Throwable cause)
						{
							complete();
						}

						protected void complete()
						{
							run_sem.release();
							pending_checks_sem.release();
						}

			
			{
				this$0 = RDResumeHandler.this;
				run_sem = aesemaphore;
				pending_checks_sem = aesemaphore1;
				super();
			}
					});
					pending_check_num++;
				}
				catch (Throwable e)
				{
					Debug.printStackTrace(e);
				}
			}

			for (; pending_check_num > 0; pending_check_num--)
				pending_checks_sem.reserve();

			if (partialPieces != null)
			{
				Iterator iter = partialPieces.entrySet().iterator();
				do
				{
					if (!iter.hasNext())
						break;
					java.util.Map.Entry key = (java.util.Map.Entry)iter.next();
					int pieceNumber = Integer.parseInt((String)key.getKey());
					DiskManagerPiece dm_piece = pieces[pieceNumber];
					if (!dm_piece.isDone())
					{
						List blocks = (List)partialPieces.get(key.getKey());
						Iterator iterBlock = blocks.iterator();
						while (iterBlock.hasNext()) 
							dm_piece.setWritten(((Long)iterBlock.next()).intValue());
					}
				} while (true);
			}
		} else
		{
			for (int i = 0; i < pieces.length; i++)
			{
				check_position = i;
				disk_manager.setPercentDone(((i + 1) * 1000) / disk_manager.getNbPieces());
				boolean pieceCannotExist = false;
				DMPieceList list = disk_manager.getPieceList(i);
				int j = 0;
				do
				{
					if (j >= list.size())
						break;
					DMPieceMapEntry entry = list.get(j);
					Long file_size = (Long)file_sizes.get(entry.getFile());
					if (file_size == null)
					{
						pieceCannotExist = true;
						break;
					}
					long expected_size = entry.getOffset() + (long)entry.getLength();
					if (file_size.longValue() < expected_size)
					{
						pieceCannotExist = true;
						break;
					}
					j++;
				} while (true);
				if (pieceCannotExist)
				{
					disk_manager.getPiece(i).setDone(false);
					continue;
				}
				run_sem.reserve();
				while (!stopped && !recheck_inst.getPermission()) ;
				if (stopped)
					break;
				try
				{
					DiskManagerCheckRequest request = disk_manager.createCheckRequest(i, null);
					request.setLowPriority(true);
					checker.enqueueCheckRequest(request, new DiskManagerCheckRequestListener() {

						final AESemaphore val$run_sem;
						final AESemaphore val$pending_checks_sem;
						final RDResumeHandler this$0;

						public void checkCompleted(DiskManagerCheckRequest request, boolean passed)
						{
							complete();
						}

						public void checkCancelled(DiskManagerCheckRequest request)
						{
							complete();
						}

						public void checkFailed(DiskManagerCheckRequest request, Throwable cause)
						{
							complete();
						}

						protected void complete()
						{
							run_sem.release();
							pending_checks_sem.release();
						}

			
			{
				this$0 = RDResumeHandler.this;
				run_sem = aesemaphore;
				pending_checks_sem = aesemaphore1;
				super();
			}
					});
					pending_check_num++;
				}
				catch (Throwable e)
				{
					Debug.printStackTrace(e);
				}
			}

			for (; pending_check_num > 0; pending_check_num--)
				pending_checks_sem.reserve();

		}

⌨️ 快捷键说明

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