/**
*
*/
package com.limegroup.gnutella.uploader;
import java.io.IOException;
import org.apache.http.nio.ContentEncoder;
import org.apache.http.nio.ContentEncoderChannel;
import org.apache.http.nio.IOControl;
import org.limewire.core.settings.UploadSettings;
import org.limewire.http.entity.AbstractProducingNHttpEntity;
import org.limewire.nio.NBThrottle;
import com.limegroup.gnutella.tigertree.HashTreeWriteHandler;
import com.limegroup.gnutella.tigertree.ThexWriter;
/**
* Sends a THEX tree as an HTTP message.
*
* The tree is in compliance with the THEX protocol at
* http://open-content.net/specs/draft-jchapweske-thex-02.html
*/
public class THEXResponseEntity extends AbstractProducingNHttpEntity {
/**
* Throttle for the speed of THEX uploads, allow up to 0.5K/s
*/
private static final NBThrottle THROTTLE =
new NBThrottle(true, UploadSettings.THEX_UPLOAD_SPEED.getValue());
private HTTPUploader uploader;
private final HashTreeWriteHandler tigerWriteHandler;
private ThexWriter writer;
private long size;
public THEXResponseEntity(HTTPUploader uploader, HashTreeWriteHandler tigerWriteHandler, long size) {
this.uploader = uploader;
this.tigerWriteHandler = tigerWriteHandler;
this.size = size;
setContentType(tigerWriteHandler.getOutputType());
}
@Override
public long getContentLength() {
return size;
}
@Override
public void initialize(ContentEncoder contentEncoder, IOControl ioctrl) throws IOException {
this.writer = tigerWriteHandler.createAsyncWriter();
THROTTLE.setRate(UploadSettings.THEX_UPLOAD_SPEED.getValue());
uploader.getSession().getIOSession().setThrottle(THROTTLE);
}
@Override
public boolean writeContent(ContentEncoder contentEncoder, IOControl ioctrl) throws IOException {
boolean more = writer.process(new ContentEncoderChannel(contentEncoder), null);
uploader.setAmountUploaded(writer.getAmountProcessed());
activateTimeout();
return more;
}
public void finish() {
deactivateTimeout();
this.writer = null;
}
@Override
public void timeout() {
uploader.stop();
}
}