Example #1
0
            void IListener.Call(params object[] args)
            {
                object err = args[0];
                SocketEngineException error;

                if (err is Exception)
                {
                    error = new SocketEngineException("probe error", (Exception)err);
                }
                else if (err is string)
                {
                    error = new SocketEngineException("probe error: " + (string)err);
                }
                else
                {
                    error = new SocketEngineException("probe error");
                }
                error.Transport = _transport[0].Name;

                _freezeTransport.Call();

                var log = LogManager.GetLogger(GlobalHelper.CallerName());

                log.Info(string.Format("probe transport \"{0}\" failed because of error: {1}", error.Transport, err));
                _socket.Emit(EVENT_UPGRADE_ERROR, error);
            }
        private Manager Open(IOpenCallback fn)
        {
            var log = LogManager.GetLogger(GlobalHelper.CallerName());

            log.Info(string.Format("Manager readyState {0}", ReadyState));

            if (ReadyState == ReadyStateEnum.OPEN)
            {
                return(this); // allready open
            }

            log.Info(string.Format("Manager opening {0}", Uri));
            EngineSocket = new Engine(Uri, Options);
            SocketEngine socket = EngineSocket;

            ReadyState = ReadyStateEnum.OPENING;

            var openSub = SOCKETNET35.On.Create(socket, EVENT_OPEN, new ListenerImpl(() =>
            {
                OnOpen();
                if (fn != null)
                {
                    fn.Call(null);
                }
            }));

            var errorSub = SOCKETNET35.On.Create(socket, EVENT_ERROR, new ListenerImpl((data) =>
            {
                log.Info("connect_error");
                Cleanup();
                ReadyState = ReadyStateEnum.CLOSED;
                EmitAll(EVENT_CONNECT_ERROR, data);

                if (fn != null)
                {
                    var err = new SocketException("Connection error", data is Exception ? (Exception)data : null);
                    fn.Call(err);
                }
                MaybeReconnectOnOpen();
            }));

            if (_timeout >= 0)
            {
                var timeout = (int)_timeout;
                log.Info(string.Format("connection attempt will timeout after {0}", timeout));
                var timer = EasyTimer.SetTimeout(() =>
                {
                    var log2 = LogManager.GetLogger(GlobalHelper.CallerName());
                    log2.Info("Manager Open start");

                    log2.Info(string.Format("connect attempt timed out after {0}", timeout));
                    openSub.Destroy();
                    socket.Close();
                    socket.Emit(EVENT_ERROR, new SocketException("timeout"));
                    EmitAll(EVENT_CONNECT_TIMEOUT, timeout);
                    log2.Info("Manager Open finish");
                }, timeout);

                //var taskWorker = new TaskWorker(this);
                //taskWorker.QueueWorkerWithDelay(
                //    TasksQueue,
                //    null,
                //    (x, e) =>
                //    {
                //        var log2 = LogManager.GetLogger(GlobalHelper.CallerName());
                //        log2.Info("Manager Open start");
                //        log2.Info(string.Format("connect attempt timed out after {0}", timeout));
                //        openSub.Destroy();
                //        socket.Close();
                //        socket.Emit(EVENT_ERROR, new SocketException("timeout"));
                //        EmitAll(EVENT_CONNECT_TIMEOUT, timeout);
                //        log2.Info("Manager Open finish");
                //    },
                //    (x, e) =>
                //    {
                //        //action complete
                //    },
                //    (e) =>
                //    {
                //        //display error
                //    },
                //    (x, e) =>
                //    {
                //        // progress change
                //    },
                //    timeout);

                lock (Subs)
                {
                    Subs.Enqueue(new On.TimeoutActionHandle(timer.Stop));
                    //Subs.Enqueue(new On.ActionHandleImpl(taskWorker.Stop));
                }
            }

            lock (Subs)
            {
                Subs.Enqueue(openSub);
                Subs.Enqueue(errorSub);
            }

            EngineSocket.Open();

            return(this);
        }