package org.xnio;
import java.io.
IOException;
import java.net.
SocketAddress;
import org.xnio.channels.
BoundChannel;
import org.xnio.channels.
StreamChannel;
import org.xnio.channels.
StreamSinkChannel;
import org.xnio.channels.
StreamSourceChannel;
/**
* An XNIO I/O factory which can be used to create channels.
*
* @author <a href="mailto:david.lloyd@redhat.com">David M. Lloyd</a>
*/
public interface
XnioIoFactory {
/**
* Connect to a remote stream server. The protocol family is determined by the type of the socket address given.
* If an open listener is used, the channel should not be accessed via the returned
* {@code IoFuture}, and vice-versa.
*
* @param destination the destination address
* @param openListener the listener which will be notified when the channel is open, or {@code null} for none
* @param optionMap the option map
* @return the future result of this operation
*/
IoFuture<
StreamConnection>
openStreamConnection(
SocketAddress destination,
ChannelListener<? super
StreamConnection>
openListener,
OptionMap optionMap);
/**
* Connect to a remote stream server. The protocol family is determined by the type of the socket address given.
* If an open listener is used, the channel should not be accessed via the returned
* {@code IoFuture}, and vice-versa.
*
* @param destination the destination address
* @param openListener the listener which will be notified when the channel is open, or {@code null} for none
* @param bindListener the listener which will be notified when the channel is bound, or {@code null} for none
* @param optionMap the option map
* @return the future result of this operation
*/
IoFuture<
StreamConnection>
openStreamConnection(
SocketAddress destination,
ChannelListener<? super
StreamConnection>
openListener,
ChannelListener<? super
BoundChannel>
bindListener,
OptionMap optionMap);
/**
* Connect to a remote stream server. The protocol family is determined by the type of the socket addresses given
* (which must match). If an open listener is used, the channel should not be accessed via the returned
* {@code IoFuture}, and vice-versa.
*
* @param bindAddress the local address to bind to
* @param destination the destination address
* @param openListener the listener which will be notified when the channel is open, or {@code null} for none
* @param bindListener the listener which will be notified when the channel is bound, or {@code null} for none
* @param optionMap the option map
* @return the future result of this operation
*/
IoFuture<
StreamConnection>
openStreamConnection(
SocketAddress bindAddress,
SocketAddress destination,
ChannelListener<? super
StreamConnection>
openListener,
ChannelListener<? super
BoundChannel>
bindListener,
OptionMap optionMap);
/**
* Accept a stream connection at a destination address. If a wildcard address is specified, then a destination address
* is chosen in a manner specific to the OS and/or channel type.
*
* @param destination the destination (bind) address
* @param openListener the listener which will be notified when the channel is open, or {@code null} for none
* @param bindListener the listener which will be notified when the acceptor is bound, or {@code null} for none
* @param optionMap the option map
* @return the future connection
*/
IoFuture<
StreamConnection>
acceptStreamConnection(
SocketAddress destination,
ChannelListener<? super
StreamConnection>
openListener,
ChannelListener<? super
BoundChannel>
bindListener,
OptionMap optionMap);
/**
* Connect to a remote message server. The protocol family is determined by the type of the socket address given.
* If an open listener is used, the channel should not be accessed via the returned
* {@code IoFuture}, and vice-versa.
*
* @param destination the destination address
* @param openListener the listener which will be notified when the channel is open, or {@code null} for none
* @param optionMap the option map
* @return the future result of this operation
*/
IoFuture<
MessageConnection>
openMessageConnection(
SocketAddress destination,
ChannelListener<? super
MessageConnection>
openListener,
OptionMap optionMap);
/**
* Accept a message connection at a destination address. If a wildcard address is specified, then a destination address
* is chosen in a manner specific to the OS and/or channel type. If an open listener is used, the channel should
* not be accessed via the returned {@code IoFuture}, and vice-versa.
*
* @param destination the destination (bind) address
* @param openListener the listener which will be notified when the channel is open, or {@code null} for none
* @param bindListener the listener which will be notified when the acceptor is bound, or {@code null} for none
* @param optionMap the option map
* @return the future connection
*/
IoFuture<
MessageConnection>
acceptMessageConnection(
SocketAddress destination,
ChannelListener<? super
MessageConnection>
openListener,
ChannelListener<? super
BoundChannel>
bindListener,
OptionMap optionMap);
/**
* Create a two-way stream pipe.
*
* @return the created pipe
* @throws java.io.IOException if the pipe could not be created
*/
ChannelPipe<
StreamChannel,
StreamChannel>
createFullDuplexPipe() throws
IOException;
/**
* Create a two-way stream pipe.
*
* @return the created pipe
* @throws java.io.IOException if the pipe could not be created
*/
ChannelPipe<
StreamConnection,
StreamConnection>
createFullDuplexPipeConnection() throws
IOException;
/**
* Create a one-way stream pipe.
*
* @return the created pipe
* @throws java.io.IOException if the pipe could not be created
*/
ChannelPipe<
StreamSourceChannel,
StreamSinkChannel>
createHalfDuplexPipe() throws
IOException;
/**
* Create a two-way stream pipe. The left side will be associated with this factory, and the right
* side will be associated with the given peer.
*
* @param peer the peer to use for controlling the remote (right) side
* @return the created pipe
* @throws java.io.IOException if the pipe could not be created
*/
ChannelPipe<
StreamConnection,
StreamConnection>
createFullDuplexPipeConnection(
XnioIoFactory peer) throws
IOException;
/**
* Create a one-way stream pipe. The left (source) side will be associated with this factory, and the right
* (sink) side will be associated with the given peer.
*
* @param peer the peer to use for the sink (right) side
* @return the created pipe
* @throws java.io.IOException if the pipe could not be created
*/
ChannelPipe<
StreamSourceChannel,
StreamSinkChannel>
createHalfDuplexPipe(
XnioIoFactory peer) throws
IOException;
}