package the8472.utils.io;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.nio.channels.SelectableChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.function.Predicate;
import lbms.plugins.mldht.kad.DHT;
import lbms.plugins.mldht.kad.DHT.LogLevel;
import lbms.plugins.mldht.kad.utils.AddressUtils;
import lbms.plugins.mldht.utils.NIOConnectionManager;
import lbms.plugins.mldht.utils.Selectable;
public class ConnectionAcceptor implements Selectable {
NIOConnectionManager conHandler;
ServerSocketChannel channel;
InetAddress addr;
int port = 0;
final Predicate<SocketChannel> acceptor;
public ConnectionAcceptor(Predicate<SocketChannel> acc) {
acceptor = acc;
try
{
channel = ServerSocketChannel.open();
channel.configureBlocking(false);
} catch (IOException e)
{
DHT.log(e, LogLevel.Error);
}
}
public void setAddressType(Class<? extends InetAddress> addressType) {
addr = AddressUtils.getDefaultRoute(addressType);
}
public void setPort(int port) {
this.port = port;
}
public int getPort() {
return port;
}
public SelectableChannel getChannel() {
return channel;
}
public void registrationEvent(NIOConnectionManager manager, SelectionKey key) throws IOException {
conHandler = manager;
channel.socket().bind(new InetSocketAddress(addr, port), 100);
port = channel.socket().getLocalPort();
conHandler.interestOpsChanged(this);
}
public void selectionEvent(SelectionKey key) throws IOException {
if(key.isAcceptable())
{
while(true)
{
SocketChannel chan = channel.accept();
if(chan == null)
break;
if(!acceptor.test(chan))
{
chan.close();
continue;
}
}
}
}
public void doStateChecks(long now) throws IOException {
// TODO Auto-generated method stub
}
@Override
public int calcInterestOps() {
return SelectionKey.OP_ACCEPT;
}
}