package com.koushikdutta.async.http.socketio; import java.util.Arrays; import android.os.Handler; import android.os.Looper; import android.text.TextUtils; import com.koushikdutta.async.AsyncServer; import com.koushikdutta.async.callback.CompletedCallback; import com.koushikdutta.async.future.Future; import com.koushikdutta.async.future.SimpleFuture; import com.koushikdutta.async.http.AsyncHttpClient; import com.koushikdutta.async.http.WebSocket; import org.json.JSONArray; import org.json.JSONObject; public class SocketIOClient extends EventEmitter { boolean connected; boolean disconnected; private static void reportError(SimpleFuture<SocketIOClient> future, Handler handler, final ConnectCallback callback, final Exception e) { if (!future.setComplete(e)) return; if (handler != null) { AsyncServer.post(handler, new Runnable() { @Override public void run() { callback.onConnectCompleted(e, null); } }); } else { callback.onConnectCompleted(e, null); } } private void emitRaw(int type, String message, Acknowledge acknowledge) { connection.emitRaw(type, this, message, acknowledge); } public void emit(String name, JSONArray args) { emit(name, args, null); } public void emitJsonObj(String name, Object... args) { emit(name, new JSONArray(Arrays.asList(args)), null); } public void emit(final String message) { emit(message, (Acknowledge)null); } public void emit(final JSONObject jsonMessage) { emit(jsonMessage, null); } public void emit(String name, JSONArray args, Acknowledge acknowledge) { final JSONObject event = new JSONObject(); try { event.put("name", name); event.put("args", args); emitRaw(5, event.toString(), acknowledge); } catch (Exception e) { } } public void emit(final String message, Acknowledge acknowledge) { emitRaw(3, message, acknowledge); } public void emit(final JSONObject jsonMessage, Acknowledge acknowledge) { emitRaw(4, jsonMessage.toString(), acknowledge); } public static Future<SocketIOClient> connect(final AsyncHttpClient client, String uri, final ConnectCallback callback) { return connect(client, new SocketIORequest(uri), callback); } ConnectCallback connectCallback; private static SocketIOConnection mConnection; public static Future<SocketIOClient> connect(final AsyncHttpClient client, final SocketIORequest request, final ConnectCallback callback) { final Handler handler = Looper.myLooper() == null ? null : request.getHandler(); final SimpleFuture<SocketIOClient> ret = new SimpleFuture<SocketIOClient>(); // final SocketIOConnection connection = new SocketIOConnection(handler, client, request); if(mConnection ==null) { mConnection= new SocketIOConnection(handler, client, request); } else mConnection.setRequest(request); final ConnectCallback wrappedCallback = new ConnectCallback() { @Override public void onConnectCompleted(Exception ex, SocketIOClient client) { if (ex != null || TextUtils.isEmpty(request.getEndpoint())) { if (callback != null) callback.onConnectCompleted(ex, client); ret.setComplete(ex, client); return; } // remove the root client since that's not actually being used. mConnection.clients.remove(client); // connect to the endpoint we want client.of(request.getEndpoint(), new ConnectCallback() { @Override public void onConnectCompleted(Exception ex, SocketIOClient client) { if (callback != null) callback.onConnectCompleted(ex, client); ret.setComplete(ex, client); } }); } }; mConnection.clients.add(new SocketIOClient(mConnection, "", wrappedCallback)); mConnection.reconnect(ret); return ret; } ExceptionCallback exceptionCallback; public void setExceptionCallback(ExceptionCallback exceptionCallback) { this.exceptionCallback = exceptionCallback; } public ExceptionCallback getExceptionCallback() { return exceptionCallback; } ErrorCallback errorCallback; public ErrorCallback getErrorCallback() { return errorCallback; } public void setErrorCallback(ErrorCallback callback) { errorCallback = callback; } DisconnectCallback disconnectCallback; public DisconnectCallback getDisconnectCallback() { return disconnectCallback; } public void setDisconnectCallback(DisconnectCallback callback) { disconnectCallback = callback; } ReconnectCallback reconnectCallback; public ReconnectCallback getReconnectCallback() { return reconnectCallback; } public void setReconnectCallback(ReconnectCallback callback) { reconnectCallback = callback; } JSONCallback jsonCallback; public JSONCallback getJSONCallback() { return jsonCallback; } public void setJSONCallback(JSONCallback callback) { jsonCallback = callback; } StringCallback stringCallback; public StringCallback getStringCallback() { return stringCallback; } public void setStringCallback(StringCallback callback) { stringCallback = callback; } SocketIOConnection connection; String endpoint; private SocketIOClient(SocketIOConnection connection, String endpoint, ConnectCallback callback) { this.endpoint = endpoint; this.connection = connection; this.connectCallback = callback; } public boolean isConnected() { return connected && !disconnected && connection.isConnected(); } public void disconnect() { connection.disconnect(this); DisconnectCallback disconnectCallback = this.disconnectCallback; if (disconnectCallback != null) { disconnectCallback.onDisconnect(null); } } public void disconnectByMan() { connection.disconnect(this); } public void of(String endpoint, ConnectCallback connectCallback) { connection.connect(new SocketIOClient(connection, endpoint, connectCallback)); } public void reconnect() { connection.reconnect(null); } public WebSocket getWebSocket() { return connection.webSocket; } }