package com.limegroup.gnutella.http;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.WritableByteChannel;
import org.limewire.nio.statemachine.WriteState;
public abstract class WriteHeadersIOState extends WriteState {
/** The outgoing buffer, if we've made it. (Null if we haven't.) */
private ByteBuffer outgoing;
/** The amount total that was written. */
private long amountWritten;
/**
* Writes output to the channel. This farms out the creation of the output
* to the abstract method createOutgoingData(). That method will only be called once
* to get the initial outgoing data. Once all data has been written, the abstract
* processWrittenHeaders() method will be called, so that subclasses can act upon
* what they've just written.
* <p>
* This will return true if it needs to be called again to continue writing.
* If it returns false, all data has been written and you can proceed to the next state.
*/
@Override
protected boolean processWrite(WritableByteChannel channel, ByteBuffer buffer) throws IOException {
if(outgoing == null) {
outgoing = createOutgoingData();
}
int written = channel.write(outgoing);
amountWritten += written;
if(!outgoing.hasRemaining()) {
processWrittenHeaders();
return false;
} else {
return true;
}
}
public final long getAmountProcessed() {
return amountWritten;
}
/** Returns a ByteBuffer of data to write. */
protected abstract ByteBuffer createOutgoingData() throws IOException;
/** Processes the headers we wrote, after writing them. May throw IOException if we need to disco. */
protected abstract void processWrittenHeaders() throws IOException;
}