package org.limewire.nio.statemachine;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.Channel;
/** Defines the interface for all the states of asynchronous input/output. */
public interface IOState {
/** Determines if this state is for writing. */
boolean isWriting();
/** Determines if this state is for reading. */
boolean isReading();
/**
* Processes this state. If this returns <code>true</code>, the state requires
* further processing. This should be called repeatedly until it returns
* <code>false</code>, at which point the next state should be used.
* <p>
* The given <code>Channel</code> must be a <code>ReadableByteChannel</code>
* if it is for reading or a <code>WritableByteChannel</code> if it is for
* writing.
* <p>
* The given <code>ByteBuffer</code> should be used as scratch space for reading.
*/
boolean process(Channel channel, ByteBuffer buffer) throws IOException;
/**
* Returns the amount of data that has been processed by this <code>IOState</code>.
* This operation is optional; it should return -1 if unsupported.
*/
long getAmountProcessed();
}