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

📄 pepieceimpl.java

📁 java 文件下载器。可自定义
💻 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:   PEPieceImpl.java

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

import com.aelitis.azureus.core.peermanager.piecepicker.PiecePicker;
import java.util.*;
import org.gudy.azureus2.core3.disk.DiskManager;
import org.gudy.azureus2.core3.disk.DiskManagerPiece;
import org.gudy.azureus2.core3.logging.*;
import org.gudy.azureus2.core3.peer.*;
import org.gudy.azureus2.core3.util.AEMonitor;
import org.gudy.azureus2.core3.util.SystemTime;

// Referenced classes of package org.gudy.azureus2.core3.peer.impl:
//			PEPieceWriteImpl

public class PEPieceImpl
	implements PEPiece
{

	private static final LogIDs LOGID;
	private final DiskManagerPiece dmPiece;
	private final PEPeerManager manager;
	private final int nbBlocks;
	private long creationTime;
	private final String requested[];
	private boolean fully_requested;
	private final boolean downloaded[];
	private boolean fully_downloaded;
	private long time_last_download;
	private final String writers[];
	private List writes;
	private String reservedBy;
	private int speed;
	private int resumePriority;
	private Object real_time_data;
	protected static final AEMonitor class_mon = new AEMonitor("PEPiece:class");

	public PEPieceImpl(PEPeerManager _manager, DiskManagerPiece _dm_piece, int _pieceSpeed)
	{
		creationTime = SystemTime.getCurrentTime();
		manager = _manager;
		dmPiece = _dm_piece;
		speed = _pieceSpeed;
		nbBlocks = dmPiece.getNbBlocks();
		requested = new String[nbBlocks];
		boolean written[] = dmPiece.getWritten();
		if (written == null)
			downloaded = new boolean[nbBlocks];
		else
			downloaded = (boolean[])(boolean[])written.clone();
		writers = new String[nbBlocks];
		writes = new ArrayList(0);
	}

	public DiskManagerPiece getDMPiece()
	{
		return dmPiece;
	}

	public long getCreationTime()
	{
		long now = SystemTime.getCurrentTime();
		if (now >= creationTime && creationTime > 0L)
		{
			return creationTime;
		} else
		{
			creationTime = now;
			return now;
		}
	}

	public long getTimeSinceLastActivity()
	{
		long now = SystemTime.getCurrentTime();
		long lastWriteTime = getLastDownloadTime(now);
		if (time_last_download > 0L && now >= time_last_download)
			return now - time_last_download;
		if (creationTime > 0L && now >= creationTime)
		{
			return now - creationTime;
		} else
		{
			creationTime = now;
			return 0L;
		}
	}

	public long getLastDownloadTime(long now)
	{
		if (time_last_download <= now)
			return time_last_download;
		else
			return time_last_download = now;
	}

	public boolean isRequested(int blockNumber)
	{
		return requested[blockNumber] != null;
	}

	public boolean isDownloaded(int blockNumber)
	{
		return downloaded[blockNumber];
	}

	public void setDownloaded(int offset)
	{
		time_last_download = SystemTime.getCurrentTime();
		downloaded[offset / 16384] = true;
		for (int i = 0; i < nbBlocks; i++)
			if (!downloaded[i])
				return;

		fully_downloaded = true;
		fully_requested = false;
	}

	public void clearDownloaded(int offset)
	{
		downloaded[offset / 16384] = false;
		fully_downloaded = false;
	}

	public boolean isDownloaded()
	{
		return fully_downloaded;
	}

	public boolean[] getDownloaded()
	{
		return downloaded;
	}

	public boolean hasUndownloadedBlock()
	{
		for (int i = 0; i < nbBlocks; i++)
			if (!downloaded[i])
				return true;

		return false;
	}

	public void setWritten(PEPeer peer, int blockNumber)
	{
		writers[blockNumber] = peer.getIp();
		dmPiece.setWritten(blockNumber);
	}

	public void clearRequested(int blockNumber)
	{
		requested[blockNumber] = downloaded[blockNumber] ? writers[blockNumber] : null;
		fully_requested = false;
	}

	public boolean isRequested()
	{
		return fully_requested;
	}

	public void setRequested()
	{
		fully_requested = true;
	}

	public void checkRequests()
	{
		if (getTimeSinceLastActivity() < 30000L)
			return;
		int cleared = 0;
		for (int i = 0; i < nbBlocks; i++)
		{
			if (downloaded[i] || dmPiece.isWritten(i))
				continue;
			String requester = requested[i];
			if (requester != null && !manager.requestExists(requester, getPieceNumber(), i * 16384, getBlockSize(i)))
			{
				clearRequested(i);
				cleared++;
			}
		}

		if (cleared > 0)
		{
			if (Logger.isEnabled())
				Logger.log(new LogEvent(dmPiece.getManager().getTorrent(), LOGID, 1, (new StringBuilder()).append("checkRequests(): piece #").append(getPieceNumber()).append(" cleared ").append(cleared).append(" requests").toString()));
		} else
		if (fully_requested && getNbUnrequested() > 0)
		{
			if (Logger.isEnabled())
				Logger.log(new LogEvent(dmPiece.getManager().getTorrent(), LOGID, 1, (new StringBuilder()).append("checkRequests(): piece #").append(getPieceNumber()).append(" reset fully requested").toString()));
			fully_requested = false;
		}
	}

	public boolean hasUnrequestedBlock()
	{
		boolean written[] = dmPiece.getWritten();
		for (int i = 0; i < nbBlocks; i++)
			if (!downloaded[i] && requested[i] == null && (written == null || !written[i]))
				return true;

		return false;
	}

	public int[] getAndMarkBlocks(PEPeer peer, int nbWanted, boolean enable_request_hints)
	{
		String ip = peer.getIp();
		boolean written[] = dmPiece.getWritten();
		int blocksFound = 0;
		if (enable_request_hints)
		{
			int request_hint[] = peer.getRequestHint();
			if (request_hint != null && request_hint[0] == dmPiece.getPieceNumber())
			{
				int hint_block_start = request_hint[1] / 16384;
				int hint_block_count = ((request_hint[2] + 16384) - 1) / 16384;
				for (int i = hint_block_start; i < nbBlocks && i < hint_block_start + hint_block_count; i++)
				{
					for (; blocksFound < nbWanted && i + blocksFound < nbBlocks && !downloaded[i + blocksFound] && requested[i + blocksFound] == null && (written == null || !written[i]); blocksFound++)
						requested[i + blocksFound] = ip;

					if (blocksFound > 0)
						return (new int[] {
							i, blocksFound
						});
				}

			}
		}
		for (int i = 0; i < nbBlocks; i++)
		{
			for (; blocksFound < nbWanted && i + blocksFound < nbBlocks && !downloaded[i + blocksFound] && requested[i + blocksFound] == null && (written == null || !written[i]); blocksFound++)
				requested[i + blocksFound] = ip;

			if (blocksFound > 0)
				return (new int[] {
					i, blocksFound
				});
		}

		return (new int[] {
			-1, 0
		});
	}

	public void getAndMarkBlock(PEPeer peer, int index)
	{
		requested[index] = peer.getIp();
		if (getNbUnrequested() <= 0)
			setRequested();
	}

	public int getNbRequests()
	{
		int result = 0;
		for (int i = 0; i < nbBlocks; i++)
			if (!downloaded[i] && requested[i] != null)
				result++;

		return result;
	}

	public int getNbUnrequested()
	{
		int result = 0;
		boolean written[] = dmPiece.getWritten();
		for (int i = 0; i < nbBlocks; i++)
			if (!downloaded[i] && requested[i] == null && (written == null || !written[i]))
				result++;

		return result;
	}

	public boolean setRequested(PEPeer peer, int blockNumber)
	{
		if (!downloaded[blockNumber])
		{
			requested[blockNumber] = peer.getIp();
			return true;
		} else
		{
			return false;
		}
	}

	public boolean isRequestable()
	{
		return dmPiece.isDownloadable() && !fully_downloaded && !fully_requested;
	}

	public int getBlockSize(int blockNumber)
	{
		if (blockNumber == nbBlocks - 1)
		{
			int length = dmPiece.getLength();
			if (length % 16384 != 0)
				return length % 16384;
		}
		return 16384;
	}

	public int getBlockNumber(int offset)
	{
		return offset / 16384;
	}

	public int getNbBlocks()
	{
		return nbBlocks;
	}

	public List getPieceWrites()
	{
		List result;
		class_mon.enter();
		result = new ArrayList(writes);
		class_mon.exit();
		break MISSING_BLOCK_LABEL_36;
		Exception exception;
		exception;
		class_mon.exit();
		throw exception;
		return result;
	}

	public List getPieceWrites(int blockNumber)
	{
		List result;
		class_mon.enter();
		result = new ArrayList(writes);
		class_mon.exit();
		break MISSING_BLOCK_LABEL_36;
		Exception exception;
		exception;
		class_mon.exit();
		throw exception;
		Iterator iter = result.iterator();
		do
		{
			if (!iter.hasNext())
				break;
			PEPieceWriteImpl write = (PEPieceWriteImpl)iter.next();
			if (write.getBlockNumber() != blockNumber)
				iter.remove();
		} while (true);
		return result;
	}

	public List getPieceWrites(PEPeer peer)
	{
		List result;
		class_mon.enter();
		result = new ArrayList(writes);
		class_mon.exit();
		break MISSING_BLOCK_LABEL_36;
		Exception exception;
		exception;
		class_mon.exit();
		throw exception;
		Iterator iter = result.iterator();
		do
		{
			if (!iter.hasNext())
				break;
			PEPieceWriteImpl write = (PEPieceWriteImpl)iter.next();
			if (peer == null || !peer.getIp().equals(write.getSender()))
				iter.remove();
		} while (true);
		return result;
	}

	public List getPieceWrites(String ip)
	{
		List result;
		class_mon.enter();
		result = new ArrayList(writes);
		class_mon.exit();
		break MISSING_BLOCK_LABEL_36;
		Exception exception;
		exception;
		class_mon.exit();
		throw exception;
		Iterator iter = result.iterator();
		do
		{
			if (!iter.hasNext())
				break;
			PEPieceWriteImpl write = (PEPieceWriteImpl)iter.next();
			if (!write.getSender().equals(ip))
				iter.remove();
		} while (true);
		return result;
	}

	public void reset()
	{
		dmPiece.reset();
		for (int i = 0; i < nbBlocks; i++)
		{
			requested[i] = null;
			downloaded[i] = false;
			writers[i] = null;
		}

		fully_downloaded = false;
		time_last_download = 0L;
		reservedBy = null;
		real_time_data = null;
	}

	public Object getRealTimeData()
	{
		return real_time_data;
	}

	public void setRealTimeData(Object o)
	{
		real_time_data = o;
	}

	protected void addWrite(PEPieceWriteImpl write)
	{
		class_mon.enter();
		writes.add(write);
		class_mon.exit();
		break MISSING_BLOCK_LABEL_35;
		Exception exception;
		exception;
		class_mon.exit();
		throw exception;
	}

	public void addWrite(int blockNumber, String sender, byte hash[], boolean correct)
	{
		addWrite(new PEPieceWriteImpl(blockNumber, sender, hash, correct));
	}

	public String[] getWriters()
	{
		return writers;
	}

	public int getSpeed()
	{
		return speed;
	}

	public void setSpeed(int newSpeed)
	{
		speed = newSpeed;
	}

	public void setLastRequestedPeerSpeed(int peerSpeed)
	{
		if (peerSpeed > speed)
			speed++;
	}

	public PEPeerManager getManager()
	{
		return manager;
	}

	public void setReservedBy(String peer)
	{
		reservedBy = peer;
	}

	public String getReservedBy()
	{
		return reservedBy;
	}

	public void reDownloadBlock(int blockNumber)
	{
		downloaded[blockNumber] = false;
		requested[blockNumber] = null;
		fully_downloaded = false;
		writers[blockNumber] = null;
		dmPiece.reDownloadBlock(blockNumber);
	}

	public void reDownloadBlocks(String address)
	{
		for (int i = 0; i < writers.length; i++)
		{
			String writer = writers[i];
			if (writer != null && writer.equals(address))
				reDownloadBlock(i);
		}

	}

	public void setResumePriority(int p)
	{
		resumePriority = p;
	}

	public int getResumePriority()
	{
		return resumePriority;
	}

	public int getAvailability()
	{
		return manager.getAvailability(dmPiece.getPieceNumber());
	}

	public int getNbWritten()
	{
		return dmPiece.getNbWritten();
	}

	public boolean[] getWritten()
	{
		return dmPiece.getWritten();
	}

	public boolean isWritten()
	{
		return dmPiece.isWritten();
	}

	public boolean isWritten(int block)
	{
		return dmPiece.isWritten(block);
	}

	public int getPieceNumber()
	{
		return dmPiece.getPieceNumber();
	}

	public int getLength()
	{
		return dmPiece.getLength();
	}

	public void setRequestable()
	{
		fully_downloaded = false;
		fully_requested = false;
		dmPiece.setDownloadable();
	}

	public String getString()
	{
		String text = "";
		PiecePicker pp = manager.getPiecePicker();
		text = (new StringBuilder()).append(text).append(isRequestable() ? "reqable," : "").toString();
		text = (new StringBuilder()).append(text).append("req=").append(getNbRequests()).append(",").toString();
		text = (new StringBuilder()).append(text).append(isRequested() ? "reqstd," : "").toString();
		text = (new StringBuilder()).append(text).append(isDownloaded() ? "downed," : "").toString();
		text = (new StringBuilder()).append(text).append(getReservedBy() == null ? "" : "resrv,").toString();
		text = (new StringBuilder()).append(text).append("speed=").append(getSpeed()).append(",").toString();
		text = (new StringBuilder()).append(text).append(pp != null ? pp.getPieceString(dmPiece.getPieceNumber()) : (new StringBuilder()).append("pri=").append(getResumePriority()).toString()).toString();
		if (text.endsWith(","))
			text = text.substring(0, text.length() - 1);
		return text;
	}

	static 
	{
		LOGID = LogIDs.PIECES;
	}
}

⌨️ 快捷键说明

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