/*
* File : DiskManagerImpl.java
* Created : 22-Mar-2004
* By : parg
*
* Azureus - a Java Bittorrent client
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.gudy.azureus2.pluginsimpl.local.disk;
/**
* @author parg
*
*/
import org.gudy.azureus2.core3.disk.DiskManagerPiece;
import org.gudy.azureus2.core3.util.DirectByteBuffer;
import org.gudy.azureus2.plugins.disk.*;
import org.gudy.azureus2.plugins.utils.PooledByteBuffer;
import org.gudy.azureus2.pluginsimpl.local.utils.PooledByteBufferImpl;
public class
DiskManagerImpl
implements DiskManager
{
private org.gudy.azureus2.core3.disk.DiskManager disk_manager;
public
DiskManagerImpl(
org.gudy.azureus2.core3.disk.DiskManager _disk_manager )
{
disk_manager = _disk_manager;
}
public org.gudy.azureus2.core3.disk.DiskManager
getDiskmanager()
{
return( disk_manager );
}
public DiskManagerReadRequest
read(
int piece_number,
int offset,
int length,
final DiskManagerReadRequestListener listener )
throws DiskManagerException
{
if ( !disk_manager.checkBlockConsistencyForRead( "plugin", false, piece_number, offset, length )){
throw( new DiskManagerException( "read invalid - parameters incorrect or piece incomplete" ));
}
final DMRR request = new DMRR( disk_manager.createReadRequest( piece_number, offset, length ));
disk_manager.enqueueReadRequest(
request.getDelegate(),
new org.gudy.azureus2.core3.disk.DiskManagerReadRequestListener()
{
public void
readCompleted(
org.gudy.azureus2.core3.disk.DiskManagerReadRequest _request,
DirectByteBuffer _data )
{
listener.complete( request, new PooledByteBufferImpl( _data ));
}
public void
readFailed(
org.gudy.azureus2.core3.disk.DiskManagerReadRequest _request,
Throwable _cause )
{
listener.failed( request, new DiskManagerException( "read failed", _cause ));
}
public int
getPriority()
{
return( 0 );
}
public void
requestExecuted(
long bytes )
{
}
});
return( request );
}
public DiskManagerWriteRequest
write(
final int piece_number,
final int offset,
PooledByteBuffer data,
final DiskManagerWriteRequestListener listener )
throws DiskManagerException
{
DirectByteBuffer buffer = ((PooledByteBufferImpl)data).getBuffer();
if ( !disk_manager.checkBlockConsistencyForWrite( "plugin", piece_number, offset, buffer )){
throw( new DiskManagerException( "write invalid - parameters incorrect" ));
}
final int length = buffer.remaining( DirectByteBuffer.SS_EXTERNAL );
final DMWR request = new DMWR( disk_manager.createWriteRequest( piece_number, offset, buffer, null ),length );
disk_manager.enqueueWriteRequest(
request.getDelegate(),
new org.gudy.azureus2.core3.disk.DiskManagerWriteRequestListener()
{
public void
writeCompleted(
org.gudy.azureus2.core3.disk.DiskManagerWriteRequest _request )
{
DiskManagerPiece[] dm_pieces = disk_manager.getPieces();
DiskManagerPiece dm_piece = dm_pieces[piece_number];
if (!dm_piece.isDone()){
int current_offset = offset;
for ( int i=0;i<length;i+=DiskManager.BLOCK_SIZE ){
dm_piece.setWritten( current_offset / DiskManager.BLOCK_SIZE );
current_offset += DiskManager.BLOCK_SIZE;
}
}
listener.complete( request );
}
public void
writeFailed(
org.gudy.azureus2.core3.disk.DiskManagerWriteRequest _request,
Throwable _cause )
{
listener.failed( request, new DiskManagerException( "read failed", _cause ));
}
});
return( request );
}
private class
DMRR
implements org.gudy.azureus2.plugins.disk.DiskManagerReadRequest
{
private org.gudy.azureus2.core3.disk.DiskManagerReadRequest request;
private
DMRR(
org.gudy.azureus2.core3.disk.DiskManagerReadRequest _request )
{
request = _request;
}
private org.gudy.azureus2.core3.disk.DiskManagerReadRequest
getDelegate()
{
return( request );
}
public int
getPieceNumber()
{
return( request.getPieceNumber());
}
public int
getOffset()
{
return( request.getOffset());
}
public int
getLength()
{
return( request.getLength());
}
}
private class
DMWR
implements org.gudy.azureus2.plugins.disk.DiskManagerWriteRequest
{
private org.gudy.azureus2.core3.disk.DiskManagerWriteRequest request;
private int length;
private
DMWR(
org.gudy.azureus2.core3.disk.DiskManagerWriteRequest _request,
int _length )
{
request = _request;
}
private org.gudy.azureus2.core3.disk.DiskManagerWriteRequest
getDelegate()
{
return( request );
}
public int
getPieceNumber()
{
return( request.getPieceNumber());
}
public int
getOffset()
{
return( request.getOffset());
}
public int
getLength()
{
return( length );
}
}
}