📄 pepieceimpl.java
字号:
public int getNbUnrequested()
{
int result =0;
final boolean[] written =dmPiece.getWritten();
for (int i =0; i <nbBlocks; i++ )
{
if (!downloaded[i] &&requested[i] ==null &&(written ==null ||!written[i]))
result++;
}
return result;
}
/**
* Assumption - single threaded with getAndMarkBlock
*/
public boolean setRequested(PEPeer peer, int blockNumber)
{
if (!downloaded[blockNumber])
{
requested[blockNumber] =peer.getIp();
return true;
}
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 % DiskManager.BLOCK_SIZE) != 0){
return( length % DiskManager.BLOCK_SIZE );
}
}
return DiskManager.BLOCK_SIZE;
}
public int getBlockNumber(int offset)
{
return offset /DiskManager.BLOCK_SIZE;
}
public int getNbBlocks()
{
return nbBlocks;
}
public List getPieceWrites()
{
List result;
try{
class_mon.enter();
result = new ArrayList(writes);
}finally{
class_mon.exit();
}
return result;
}
public List getPieceWrites(int blockNumber) {
final List result;
try{
class_mon.enter();
result = new ArrayList(writes);
}finally{
class_mon.exit();
}
final Iterator iter = result.iterator();
while(iter.hasNext()) {
final PEPieceWriteImpl write = (PEPieceWriteImpl) iter.next();
if(write.getBlockNumber() != blockNumber)
iter.remove();
}
return result;
}
public List getPieceWrites(PEPeer peer) {
final List result;
try{
class_mon.enter();
result = new ArrayList(writes);
}finally{
class_mon.exit();
}
final Iterator iter = result.iterator();
while(iter.hasNext()) {
PEPieceWriteImpl write = (PEPieceWriteImpl) iter.next();
if(peer == null || ! peer.getIp().equals(write.getSender()))
iter.remove();
}
return result;
}
public List
getPieceWrites(
String ip )
{
final List result;
try{
class_mon.enter();
result = new ArrayList(writes);
}finally{
class_mon.exit();
}
final Iterator iter = result.iterator();
while(iter.hasNext()) {
final PEPieceWriteImpl write = (PEPieceWriteImpl) iter.next();
if ( !write.getSender().equals( ip )){
iter.remove();
}
}
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 = 0;
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) {
try{
class_mon.enter();
writes.add(write);
}finally{
class_mon.exit();
}
}
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 )
{
// Up the speed on this piece?
if (peerSpeed > speed ){
speed++;
}
}
/**
* @return Returns the manager.
*/
public PEPeerManager getManager()
{
return manager;
}
public void setReservedBy(String peer)
{
reservedBy =peer;
}
public String getReservedBy()
{
return reservedBy;
}
/** for a block that's already downloadedt, mark up the piece
* so that the block will get downloaded again. This is used
* when the piece fails hash-checking.
*/
public void reDownloadBlock(int blockNumber)
{
downloaded[blockNumber] =false;
requested[blockNumber] =null;
fully_downloaded = false;
writers[blockNumber] = null;
dmPiece.reDownloadBlock(blockNumber);
}
/** finds all blocks downloaded by the given address
* and marks them up for re-downloading
* @param address String
*/
public void reDownloadBlocks(String address)
{
for (int i =0; i <writers.length; i++ )
{
final String writer =writers[i];
if (writer !=null &&writer.equals(address))
reDownloadBlock(i);
}
}
public void setResumePriority(int p)
{
resumePriority =p;
}
public int getResumePriority()
{
return resumePriority;
}
/**
* @return int of availability in the swarm for this piece
* @see org.gudy.azureus2.core3.peer.PEPeerManager.getAvailability(int pieceNumber)
*/
public int getAvailability()
{
return manager.getAvailability(dmPiece.getPieceNumber());
}
/** This support method returns how many blocks have already been
* written from the dmPiece
* @return int from dmPiece.getNbWritten()
* @see org.gudy.azureus2.core3.disk.DiskManagerPiece.getNbWritten()
*/
public int getNbWritten()
{
return dmPiece.getNbWritten();
}
/** This support method returns the dmPiece's written array
* @return boolean[] from the dmPiece
* @see org.gudy.azureus2.core3.disk.DiskManagerPiece.getWritten()
*/
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 boolean isChecking()
{
return dmPiece.isChecking();
}
public String
getString()
{
String text = "";
text += ( isRequestable()?"reqable,":"" );
text += "req=" + getNbRequests() + ",";
text += ( isRequested()?"reqstd,":"" );
text += ( isDownloaded()?"downed,":"" );
text += ( getReservedBy()!=null?"resrv,":"" );
text += "speed=" + getSpeed() + ",";
text += "pri=" + getResumePriority();
if ( text.endsWith(",")){
text = text.substring(0,text.length()-1);
}
return( text );
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -