📄 pepieceimpl.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 + -