package org.schmivits.airball.dataproxy.data; import java.io.IOException; import java.util.HashMap; import java.util.Map; import android.bluetooth.BluetoothServerSocket; import android.content.Context; public abstract class AirballServer extends RpcStates { private int mServantCount = 0; private final DataSourceStream mSource; private BluetoothServerSocket mTargetServerSocket; protected AirballServer(Context context, AbstractProcess parent, String title) { super(context, parent, title, "WaitingForListener"); addChild(mSource = makeDataSourceStream()); } @Override protected Map<String, ThreadState> buildStates() { Map<String, ThreadState> s = new HashMap<String, ThreadState>(); s.put("WaitingForListener", new ThreadState() { @Override public void onEnter() throws Exception { mTargetServerSocket = findBluetoothAdapter() .listenUsingRfcommWithServiceRecord("Airball Data", Constants.AIRBALL_UUID); while (isRunning()) { enter("CreatingServant"); } } @Override public void onCleanup() { if (mTargetServerSocket != null) { try { mTargetServerSocket.close(); } catch (IOException ignored) {} mTargetServerSocket = null; } } }); s.put("CreatingServant", new ThreadState() { @Override public void onEnter() throws Exception { addChild(new DataServant( getContext(), AirballServer.this, "" + mServantCount++, mTargetServerSocket.accept(), mSource)); } @Override public void onCleanup() { } }); return s; } protected abstract DataSourceStream makeDataSourceStream(); }