package de.tudarmstadt.informatik.hostage; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.Iterator; import android.content.Context; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.widget.Toast; import de.tudarmstadt.informatik.hostage.handler.AbstractHandler; import de.tudarmstadt.informatik.hostage.handler.ByteArrayHandlerImpl; import de.tudarmstadt.informatik.hostage.handler.StringHandlerImpl; import de.tudarmstadt.informatik.hostage.net.MyServerSocketFactory; import de.tudarmstadt.informatik.hostage.protocol.Protocol; import de.tudarmstadt.informatik.hostage.ui.MainActivity; import de.tudarmstadt.informatik.hostage.wrapper.ByteArray; public class HoneyListener implements Runnable { private ArrayList handlers = new ArrayList(); public int getHandlerCount() { return handlers.size(); } private Protocol protocol; private ServerSocket server; private Thread thread; private HoneyService service; // Shared Preferences private SharedPreferences pref; // Editor for Shared preferences private Editor editor; private boolean running = false; public boolean isRunning() { return running; } public HoneyListener(HoneyService service, Protocol protocol) { this.service = service; this.protocol = protocol; pref = service.getApplicationContext().getSharedPreferences(MainActivity.PREF_NAME, Context.MODE_PRIVATE); editor = pref.edit(); } @Override public void run() { while (!thread.isInterrupted()) { addHandler(); } for (AbstractHandler handler : handlers) { handler.kill(); } } public void start() { try { server = new MyServerSocketFactory().createServerSocket(protocol .getPort()); (this.thread = new Thread(this)).start(); running = true; editor.putBoolean(protocol + MainActivity.LISTENER, true); editor.commit(); service.notifyUI(MainActivity.LISTENER); } catch (Exception e) { e.printStackTrace(); } } public void stop() { try { thread.interrupt(); server.close(); running = false; editor.putBoolean(protocol + MainActivity.LISTENER, false); editor.commit(); service.notifyUI(MainActivity.LISTENER); } catch (Exception e) { e.printStackTrace(); } } public String getProtocolName() { return protocol.toString(); } public void refreshHandlers() { for (Iterator iterator = handlers.iterator(); iterator.hasNext(); ) { AbstractHandler handler = iterator.next(); if (handler.isTerminated()) { iterator.remove(); } } } private void addHandler() { try { Socket client = server.accept(); handlers.add(newInstance(service, this, protocol.getClass() .newInstance(), client)); int handlerCount = pref.getInt(protocol + MainActivity.HANDLER_COUNT, 0); editor.putInt(protocol + MainActivity.HANDLER_COUNT, handlerCount + 1); editor.commit(); service.notifyUI(MainActivity.HANDLER_COUNT); } catch (Exception e) { e.printStackTrace(); } } private AbstractHandler newInstance(HoneyService service, HoneyListener listener, Protocol protocol, Socket client) { if (protocol.getType().equals(String.class)) { return new StringHandlerImpl(service, listener, protocol, client); } else if (protocol.getType().equals(ByteArray.class)) { return new ByteArrayHandlerImpl(service, listener, protocol, client); } else { return null; } } }