import net.pterodactylus.xdcc.core.Core;
+import com.google.common.eventbus.EventBus;
import com.google.common.util.concurrent.AbstractExecutionThreadService;
+import com.google.common.util.concurrent.MoreExecutors;
/**
* Listens on a TCP port and feeds input and output to a {@link CommandReader}.
*/
public class NetworkAdapter extends AbstractExecutionThreadService {
- /** The core being controlled. */
- private final Core core;
+ /** The event bus. */
+ private final EventBus eventBus;
+
+ private final CommandReaderFactory commandReaderFactory;
+ private final int port;
/**
* Creates a new network acceptor.
*
- * @param core
- * The core being controlled
+ * @param eventBus
+ * @param commandReaderFactory
*/
- public NetworkAdapter(Core core) {
- this.core = core;
+ public NetworkAdapter(EventBus eventBus, CommandReaderFactory commandReaderFactory, int port) {
+ this.eventBus = eventBus;
+ this.commandReaderFactory = commandReaderFactory;
+ this.port = port;
}
@Override
protected void run() throws Exception {
- ServerSocket serverSocket = new ServerSocket(45678);
+ ServerSocket serverSocket = new ServerSocket(port);
serverSocket.setSoTimeout((int) TimeUnit.SECONDS.toMillis(1));
while (isRunning()) {
try {
OutputStream socketOutputStream = clientSocket.getOutputStream();
final InputStreamReader socketInputStreamReader = new InputStreamReader(socketInputStream, "UTF-8");
final OutputStreamWriter socketOutputStreamWriter = new OutputStreamWriter(socketOutputStream, "UTF-8");
- new CommandReader(core, socketInputStreamReader, socketOutputStreamWriter).start();
+ final CommandReader commandReader = commandReaderFactory.create(socketInputStreamReader, socketOutputStreamWriter);
+ eventBus.register(commandReader);
+ commandReader.addListener(new Listener() {
+
+ @Override
+ public void starting() {
+ }
+
+ @Override
+ public void running() {
+ }
+
+ @Override
+ public void stopping(State from) {
+ }
+
+ @Override
+ public void terminated(State from) {
+ eventBus.unregister(commandReader);
+ }
+
+ @Override
+ public void failed(State from, Throwable failure) {
+ eventBus.unregister(commandReader);
+ }
+ }, MoreExecutors.sameThreadExecutor());
+ commandReader.start();
} catch (SocketTimeoutException ste1) {
/* ignore, loop. */
}