| 218 | public Manager open(final OpenCallback fn) { |
| 219 | EventThread.exec(new Runnable() { |
| 220 | @Override |
| 221 | public void run() { |
| 222 | if (logger.isLoggable(Level.FINE)) { |
| 223 | logger.fine(String.format("readyState %s", Manager.this.readyState)); |
| 224 | } |
| 225 | if (Manager.this.readyState == ReadyState.OPEN || Manager.this.readyState == ReadyState.OPENING) return; |
| 226 | |
| 227 | if (logger.isLoggable(Level.FINE)) { |
| 228 | logger.fine(String.format("opening %s", Manager.this.uri)); |
| 229 | } |
| 230 | Manager.this.engine = new Engine(Manager.this.uri, Manager.this.opts); |
| 231 | final io.socket.engineio.client.Socket socket = Manager.this.engine; |
| 232 | final Manager self = Manager.this; |
| 233 | Manager.this.readyState = ReadyState.OPENING; |
| 234 | Manager.this.skipReconnect = false; |
| 235 | |
| 236 | // propagate transport event. |
| 237 | socket.on(Engine.EVENT_TRANSPORT, new Listener() { |
| 238 | @Override |
| 239 | public void call(Object... args) { |
| 240 | self.emit(Manager.EVENT_TRANSPORT, args); |
| 241 | } |
| 242 | }); |
| 243 | |
| 244 | final On.Handle openSub = On.on(socket, Engine.EVENT_OPEN, new Listener() { |
| 245 | @Override |
| 246 | public void call(Object... objects) { |
| 247 | self.onopen(); |
| 248 | if (fn != null) fn.call(null); |
| 249 | } |
| 250 | }); |
| 251 | |
| 252 | On.Handle errorSub = On.on(socket, Engine.EVENT_ERROR, new Listener() { |
| 253 | @Override |
| 254 | public void call(Object... objects) { |
| 255 | Object data = objects.length > 0 ? objects[0] : null; |
| 256 | logger.fine("connect_error"); |
| 257 | self.cleanup(); |
| 258 | self.readyState = ReadyState.CLOSED; |
| 259 | self.emit(EVENT_ERROR, data); |
| 260 | if (fn != null) { |
| 261 | Exception err = new SocketIOException("Connection error", |
| 262 | data instanceof Exception ? (Exception) data : null); |
| 263 | fn.call(err); |
| 264 | } else { |
| 265 | // Only do this if there is no fn to handle the error |
| 266 | self.maybeReconnectOnOpen(); |
| 267 | } |
| 268 | } |
| 269 | }); |
| 270 | |
| 271 | final long timeout = Manager.this._timeout; |
| 272 | final Runnable onTimeout = new Runnable() { |
| 273 | @Override |
| 274 | public void run() { |
| 275 | logger.fine(String.format("connect attempt timed out after %d", timeout)); |
| 276 | openSub.destroy(); |
| 277 | socket.close(); |