package io.myweb;
import android.net.LocalServerSocket;
import android.net.LocalSocket;
import android.util.Log;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
public class LocalServer implements Runnable {
public static final String LOG_TAG = LocalServer.class.getName();
private final WebContext context;
private final ExecutorService executor;
private LocalServerSocket serverSocket;
private volatile boolean closed;
public LocalServer(WebContext context, ExecutorService executor) {
this.context = context;
this.executor = executor;
}
public boolean isClosed() {
return closed;
}
@Override
public void run() {
closed = false;
mainLoop();
Log.i(LOG_TAG, "Server socket has been shutdown. Exiting normally.");
}
private void openLocalServerSocket(String packageName) {
try {
if (serverSocket == null || serverSocket.getFileDescriptor() == null) {
String socketName = "/tmp/" + packageName;
Log.d(LOG_TAG, "opening local socket server: " + socketName);
serverSocket = new LocalServerSocket("/tmp/" + packageName);
}
Log.d(LOG_TAG, "Binding localServerSocket " + serverSocket);
} catch (IOException e) {
Log.e(LOG_TAG, "Error in local socket server", e);
}
}
private void mainLoop() {
openLocalServerSocket(context.getContext().getPackageName());
while (!closed) {
try {
LocalSocket ls = serverSocket.accept();
// Log.d(LOG_TAG, "new connection on local socket");
RequestTask worker = new RequestTask(ls, context.getRequestProcessor());
executor.execute(worker);
} catch (IOException e) {
Log.e(LOG_TAG, "Error while handling request by App: " + e, e);
}
}
Log.d(LOG_TAG, "shutting down server socket");
shutdown();
}
public void shutdown() {
if (serverSocket != null) {
try {
serverSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
serverSocket = null;
}
closed = true;
}
}