Beispiel #1
0
        public override int ProcessDispatch(Dispatch p)
        {
            try
            {
                var factoryHandle = Game.App.Instance.Server.FindProtocolFactoryHandle(p.Argument.ProtocolType);
                if (null == factoryHandle)
                {
                    SendKick(p.Sender, p.Argument.LinkSid, BKick.ErrorProtocolUnkown, "unknown protocol");
                    return(Procedure.LogicError);
                }
                var p2 = factoryHandle.Factory();
                p2.Decode(Zeze.Serialize.ByteBuffer.Wrap(p.Argument.ProtocolData));
                p2.Sender = p.Sender;

                var session = new Game.Login.Session(
                    p.Argument.UserId,
                    p.Argument.States,
                    p.Sender,
                    p.Argument.LinkSid);

                p2.UserState = session;
                if (Transaction.Current != null)
                {
                    // 已经在事务中,嵌入执行。此时忽略p2的NoProcedure配置。
                    Transaction.Current.TopProcedure.ActionName = p2.GetType().FullName;
                    Transaction.Current.TopProcedure.UserState  = p2.UserState;
                    return(Zeze.Util.Task.Call(
                               () => factoryHandle.Handle(p2),
                               p2,
                               (p, code) => { p.ResultCode = code; session.SendResponse(p); }));
                }

                if (p2.Sender.Service.Zeze == null || factoryHandle.NoProcedure)
                {
                    // 应用框架不支持事务或者协议配置了“不需要事务”
                    return(Zeze.Util.Task.Call(
                               () => factoryHandle.Handle(p2),
                               p2,
                               (p, code) => { p.ResultCode = code; session.SendResponse(p); }));
                }

                // 创建存储过程并且在当前线程中调用。
                return(Zeze.Util.Task.Call(
                           p2.Sender.Service.Zeze.NewProcedure(
                               () => factoryHandle.Handle(p2),
                               p2.GetType().FullName,
                               p2.UserState),
                           p2,
                           (p, code) => { p.ResultCode = code; session.SendResponse(p); }
                           ));
            }
            catch (Exception ex)
            {
                SendKick(p.Sender, p.Argument.LinkSid, BKick.ErrorProtocolException, ex.ToString());
                throw;
            }
        }
Beispiel #2
0
        public override int ProcessCEnterWorld(CEnterWorld protocol)
        {
            Game.Login.Session session = Game.Login.Session.Get(protocol);
            if (null == session.RoleId)
            {
                return(Procedure.LogicError);
            }

            // TODO map
            return(Zeze.Transaction.Procedure.NotImplement);
        }