/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package neembuu.vuze;
import java.nio.ByteBuffer;
import jpfm.DirectoryStream;
import jpfm.JPfmError;
import jpfm.operations.readwrite.ReadRequest;
import jpfm.util.ReadUtils;
import jpfm.volume.BasicCascadableAbstractFile;
import org.gudy.azureus2.plugins.disk.DiskManagerChannel;
import org.gudy.azureus2.plugins.disk.DiskManagerEvent;
import org.gudy.azureus2.plugins.disk.DiskManagerFileInfo;
import org.gudy.azureus2.plugins.disk.DiskManagerListener;
import org.gudy.azureus2.plugins.disk.DiskManagerRequest;
import org.gudy.azureus2.plugins.download.Download;
import org.gudy.azureus2.plugins.download.DownloadException;
/**
*
* @author Shashank Tulsyan
*/
public class DownloadWrapSFC extends BasicCascadableAbstractFile{
private final Download d;
private final DiskManagerFileInfo dmfi;
private DiskManagerChannel dmc ;
private Exception lastException;
public DownloadWrapSFC(Download d, int i) {
super(null,0,null);
this.d = d;
dmfi = d.getDiskManagerFileInfo(i);
super.name = dmfi.getFile().getName();
super.fileSize = dmfi.getLength();
}
@Override public void open() {
if(dmc!=null){
dmc.destroy();
}
try{
dmc = dmfi.createChannel();
}catch(DownloadException de){
lastException = de;
de.printStackTrace();
dmc = null;
}
}
public void setParent(DirectoryStream parent) {
this.parent = parent;
}
@Override public void close() {
if(dmc!=null){
dmc.destroy();
}
}
@Override public void read(final ReadRequest rq) throws Exception {
if(dmc == null) {
hasFailed(lastException, rq);
return;
}
final DiskManagerRequest dmr = dmc.createRequest();
dmr.setType(DiskManagerRequest.REQUEST_READ);
dmr.setOffset(rq.getFileOffset());
dmr.setLength(rq.getByteBuffer().capacity());
dmr.addListener(new DiskManagerListener() {
@Override public void eventOccurred(DiskManagerEvent event) {
if(hasNotSucceeded(event, rq)){
return;
}
ByteBuffer dwnl = event.getBuffer().toByteBuffer();
//if(dwnl.)
dwnl.rewind();//copy from the beginning
rq.getByteBuffer().put(dwnl);
dwnl.rewind();
//rq.getByteBuffer().flip();
if(rq.getByteBuffer().remaining()>0){
System.out.println("remaing="+rq.getByteBuffer().remaining());
}else {
rq.complete(JPfmError.SUCCESS);
}
//System.out.println(new String(rq.getByteBuffer().array()));
}
});
new Thread(){
public void run(){
dmr.run();
}
}.start();
}
private boolean hasNotSucceeded(DiskManagerEvent event, ReadRequest rq){
boolean failed = hasFailed(event.getFailure(), rq);
if(failed)return true;
if(event.getType()==DiskManagerEvent.EVENT_TYPE_FAILED){
return true;
}else if(event.getType()==DiskManagerEvent.EVENT_TYPE_BLOCKED){
return true;
}
if(event.getBuffer()==null)return true;
return false;
}
private boolean hasFailed(Throwable f, ReadRequest rq){
if(f!=null){
ReadUtils.handleUnexpectedCompletion(rq, lastException);
lastException = null;
return true;
}return false;
}
}