public ISession newSession(IAssociateSession s)
        {
            // create session
            AESession ses = null;

            lock (_sessionsLock)
            {
                ulong sid = ++_sessionIDSeed;
                ses = new AESession(s, sid);

                _sessionsByID[sid] = ses;
            }

            // add to listener
            _listeners[(int)s.type].addSession(ses);

            return(ses);
        }
        public int addSession(ISession s)
        {
            IAssociateSession ases = s.getAssociateSession(this.type);

            if (ases == null)
            {
                Debug.logger.log(LogType.LOG_ERR, "AEServer AEListener addSession session[" + AESession.dumpSessionInfo(s) + "] without associate session type[" + this.type + "]");
                return(0);
            }

            int ret = 0;

            lock (_sessionsLock)
            {
                _sessionsByOrgID[(OrgSessionIDType)ases.orgSessionID] = s;
                ret = _sessionsByOrgID.Count;
            }

            return(ret);
        }
        protected ITask _queueSessionTask(ISession session, ITask t)
        {
            IService svr = _getSessionService(session);

            if (svr == null)
            {
                session.lastErrorCode = AEErrorCode.ERR_SERVICE_NOT_FOUND;
                session.lastErrorMsg  = "AEServer session manager queueSessionTask session[" + AESession.dumpSessionInfo(session) + "] without service";
                Debug.logger.log(LogType.LOG_ERR, session.lastErrorMsg);
                return(null);
            }

            return(svr.queueTask(session, t));
        }
        // return : =0 if failed, otherwise return service queued task count
        public ITask queueSessionTask(ISession session, ITask t)
        {
            if (session.isClosed || session.isClosing)
            {
                // session is closing or closed, discard message
                session.lastErrorCode = AEErrorCode.ERR_SESSION_QUEUE_TASK_ERROR;
                session.lastErrorMsg  = "AEServer session manager queueSessionTask session[" + AESession.dumpSessionInfo(session) + "] is closing or closed";
                Debug.logger.log(LogType.LOG_ERR, session.lastErrorMsg);
                return(null);
            }

            if (session.isChangingService && !(t is AESessionAddTask))
            {
                session.lastErrorCode = AEErrorCode.ERR_SESSION_QUEUE_TASK_ERROR;
                session.lastErrorMsg  = "AEServer session manager queueSessionTask session[" + AESession.dumpSessionInfo(session) + "] is changing service";
                Debug.logger.log(LogType.LOG_WARNNING, session.lastErrorMsg);
                // when session is changing service, only session add task is accept, any other task will be discard
                return(null);
            }

            return(_queueSessionTask(session, t));
        }