package com.netifera.platform.internal.channel.tcpconnect;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import com.netifera.platform.api.channels.IChannelConnectProgress;
import com.netifera.platform.api.dispatcher.IClientDispatcher;
import com.netifera.platform.api.dispatcher.IMessenger;
import com.netifera.platform.api.log.ILogger;
import com.netifera.platform.channel.socket.TCPSocketTransport;
import com.netifera.platform.channel.tcpconnect.ITCPConnectConnecter;
public class TCPConnectConnecter implements ITCPConnectConnecter {
private final IClientDispatcher dispatcher;
private final ILogger logger;
private final Thread acceptThread;
private volatile IChannelConnectProgress progress;
private ServerSocket listenSocket;
private int listenPort;
public TCPConnectConnecter(IClientDispatcher dispatcher, ILogger logger) {
this.dispatcher = dispatcher;
this.logger = logger;
acceptThread = new Thread(createAcceptRunnable());
}
public void setConnectbackPort(int port) {
listenPort = port;
}
public void abortConnect() {
acceptThread.interrupt();
}
public void connect(IChannelConnectProgress progress) {
this.progress = progress;
try {
startListening();
acceptThread.start();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void startListening() throws IOException {
listenSocket = new ServerSocket();
listenSocket.setReuseAddress(true);
listenSocket.bind(new InetSocketAddress(listenPort));
}
private Runnable createAcceptRunnable() {
return new Runnable() {
public void run() {
try {
runAccept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
private void runAccept() throws IOException {
final Socket newSocket = listenSocket.accept();
listenSocket.close();
logger.info("Connection from " + newSocket.getInetAddress().getHostAddress());
final IMessenger messenger = dispatcher.createMessenger(TCPSocketTransport.create(newSocket));
if(progress == null) {
}
progress.connectCompleted(messenger);
}
}