package org.limewire.nio.channel;
import java.io.IOException;
import java.nio.ByteBuffer;
import org.limewire.util.BufferUtils;
/**
* Handles allocating a <code>ByteBuffer</code> of a given size, allows chained
* readers to read from this, deals with propagating interest to a
* source channel, propagates <code>close</code> and <code>isOpen</code>,
* implements a stubbed-out <code>handleIOException</code>, and marks when
* the channel has been shutdown.
* <p>
* Subclasses only need to implement <code>handleRead</code> to move data from
* the source channel into the buffer and react to what was read.
*/
public abstract class AbstractChannelInterestReader implements ChannelReadObserver, InterestScatteringByteChannel {
/**
* Implementors should write to <code>buffer</code>.
*/
protected ByteBuffer buffer;
protected InterestReadableByteChannel source;
protected boolean shutdown;
public AbstractChannelInterestReader(int bufferSize) {
buffer = ByteBuffer.allocate(bufferSize);
}
public int read(ByteBuffer dst) {
return BufferUtils.transfer(buffer, dst);
}
public long read(ByteBuffer [] dst) {
return read(dst, 0, dst.length);
}
public long read(ByteBuffer [] dst, int offset, int length) {
return BufferUtils.transfer(buffer, dst, offset, length, true);
}
public void shutdown() {
shutdown = true;
}
public InterestReadableByteChannel getReadChannel() {
return source;
}
public void setReadChannel(InterestReadableByteChannel newChannel) {
this.source = newChannel;
}
public void interestRead(boolean status) {
source.interestRead(status);
}
public void close() throws IOException {
source.close();
}
public boolean isOpen() {
return source.isOpen();
}
public void handleIOException(IOException iox) {}
}