Ejemplo n.º 1
0
        /// <summary>
        /// 初始化LuaValue对象
        /// </summary>
        /// <param name="decoder">对象解码器</param>
        public LuaValue(LuaObjectDecoder decoder)
            : base(decoder)
        {
            int contextId = decoder.readInt32();

            _context = LuaContext.getContext(contextId);
            _tableId = decoder.readString();
            _type    = (LuaValueType)decoder.readInt16();
            _value   = null;

            switch (_type)
            {
            case LuaValueType.Integer:
                _value = decoder.readInt32();
                break;

            case LuaValueType.Boolean:
                _value = decoder.readByte();
                break;

            case LuaValueType.Number:
                _value = decoder.readDouble();
                break;

            case LuaValueType.Data:
                _value = decoder.readBytes();
                break;

            case LuaValueType.String:
                _value = decoder.readString();
                break;

            case LuaValueType.Array:
                _value = readArrayList(decoder);
                break;

            case LuaValueType.Map:
                _value = readHashtable(decoder);
                break;

            case LuaValueType.Function:
                _value = decoder.readObject() as LuaFunction;
                break;

            case LuaValueType.Ptr:
                _value = decoder.readObject() as LuaPointer;
                break;

            case LuaValueType.Tuple:
                _value = decoder.readObject() as LuaTuple;
                break;

            case LuaValueType.Object:
                _value = decoder.readObject();
                break;
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="decoder">对象解码器</param>
        public LuaFunction(LuaObjectDecoder decoder)
            : base(decoder)
        {
            int contextId = decoder.readInt32();

            _context    = LuaContext.getContext(contextId);
            luaObjectId = decoder.readString();
        }
Ejemplo n.º 3
0
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="decoder">对象解码器</param>
        public LuaObjectDescriptor(LuaObjectDecoder decoder)
            : base(decoder)
        {
            Int64 objRefId = decoder.readInt64();

            _objRef = LuaObjectReference.findObject(objRefId);

            luaObjectId = decoder.readString();

            _nativeTypeId = decoder.readInt32();
        }
Ejemplo n.º 4
0
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="decoder">对象解码器</param>
        public LuaObjectDescriptor(LuaObjectDecoder decoder)
            : base(decoder)
        {
            Int64 objRefId = decoder.readInt64();

            _objRef = LuaObjectReference.findObject(objRefId);

            luaObjectId = decoder.readString();

            //原生类型标识读取
            decoder.readInt32();

            //读取自定义数据
            int userdataSize = decoder.readInt32();

            for (int i = 0; i < userdataSize; i++)
            {
                decoder.readString();
                decoder.readString();
            }
        }
Ejemplo n.º 5
0
        /// <summary>
        /// 初始化
        /// </summary>
        /// <param name="decoder">对象解码器</param>
        public LuaTuple(LuaObjectDecoder decoder)
            : base(decoder)
        {
            int size = decoder.readInt32();

            if (size > 0)
            {
                for (int i = 0; i < size; i++)
                {
                    LuaValue item = decoder.readObject() as LuaValue;
                    if (item != null)
                    {
                        _returnValues.Add(item);
                    }
                }
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// 初始化LuaValue对象
        /// </summary>
        /// <param name="decoder">对象解码器</param>
        public LuaValue(LuaObjectDecoder decoder)
        {
            _type  = (LuaValueType)decoder.readInt16();
            _value = null;

            switch (_type)
            {
            case LuaValueType.Integer:
                _value = decoder.readInt32();
                break;

            case LuaValueType.Boolean:
                _value = decoder.readByte();
                break;

            case LuaValueType.Number:
                _value = decoder.readDouble();
                break;

            case LuaValueType.Data:
                _value = decoder.readBytes();
                break;

            case LuaValueType.String:
                _value = decoder.readString();
                break;

            case LuaValueType.Array:
                _value = readArrayList(decoder);
                break;

            case LuaValueType.Map:
                _value = readHashtable(decoder);
                break;

            case LuaValueType.Object:
            {
                _value = decoder.readObject();
                break;
            }
            }
        }
Ejemplo n.º 7
0
        /// <summary>
        /// 从原生编码对象中获取参数列表
        /// </summary>
        /// <returns>参数列表.</returns>
        /// <param name="context">上下文</param>
        /// <param name="arguments">参数缓存.</param>
        /// <param name="size">缓存长度.</param>
        protected static List <LuaValue> getArgumentList(LuaContext context, IntPtr arguments, int size)
        {
            List <LuaValue> argumentsList = null;

            if (arguments != IntPtr.Zero)
            {
                //反序列化参数列表
                LuaObjectDecoder decoder = new LuaObjectDecoder(arguments, size, context);
                int argSize = decoder.readInt32();

                argumentsList = new List <LuaValue> ();
                for (int i = 0; i < argSize; i++)
                {
                    LuaValue value = decoder.readObject() as LuaValue;
                    argumentsList.Add(value);
                }
            }

            return(argumentsList);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// 解析方法的参数列表
        /// </summary>
        /// <returns>参数列表</returns>
        /// <param name="context">上下文对象</param>
        /// <param name="m">方法信息</param>
        /// <param name="arguments">参数列表数据</param>
        /// <param name="size">参数列表数据长度</param>
        protected static ArrayList parseMethodParameters(LuaContext context, MethodInfo m, IntPtr arguments, int size)
        {
            List <LuaValue> argumentsList = null;

            if (arguments != IntPtr.Zero)
            {
                //反序列化参数列表
                LuaObjectDecoder decoder = new LuaObjectDecoder(arguments, size, context);
                int argSize = decoder.readInt32();

                argumentsList = new List <LuaValue> ();
                for (int i = 0; i < argSize; i++)
                {
                    LuaValue value = decoder.readObject() as LuaValue;
                    argumentsList.Add(value);
                }
            }

            ArrayList argsArr = null;

            ParameterInfo[] parameters = m.GetParameters();
            if (parameters.Length > 0 && argumentsList != null)
            {
                int i = 0;
                argsArr = new ArrayList();
                foreach (ParameterInfo p in parameters)
                {
                    if (i >= argumentsList.Count)
                    {
                        break;
                    }

                    object value = getNativeValueForLuaValue(p.ParameterType, argumentsList[i]);
                    argsArr.Add(value);

                    i++;
                }
            }

            return(argsArr);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// 读取一个数组列表
        /// </summary>
        /// <returns>数组列表</returns>
        /// <param name="decoder">对象解码器</param>
        private List <LuaValue> readArrayList(LuaObjectDecoder decoder)
        {
            int size = decoder.readInt32();

            if (size > 0)
            {
                List <LuaValue> list = new List <LuaValue> ();
                for (int i = 0; i < size; i++)
                {
                    LuaValue item = decoder.readObject() as LuaValue;
                    if (item != null)
                    {
                        list.Add(item);
                    }
                }

                return(list);
            }

            return(null);
        }
Ejemplo n.º 10
0
        /// <summary>
        /// 读取一个字典
        /// </summary>
        /// <returns>字典对象</returns>
        /// <param name="decoder">对象解码器</param>
        private Dictionary <string, LuaValue> readHashtable(LuaObjectDecoder decoder)
        {
            int size = decoder.readInt32();

            if (size > 0)
            {
                Dictionary <string, LuaValue> table = new Dictionary <string, LuaValue> ();
                for (int i = 0; i < size; i++)
                {
                    string   key  = decoder.readString();
                    LuaValue item = decoder.readObject() as LuaValue;
                    if (key != null && item != null)
                    {
                        table.Add(key, item);
                    }
                }

                return(table);
            }

            return(null);
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Lua方法处理器
        /// </summary>
        /// <returns>返回值</returns>
        /// <param name="methodName">方法名称</param>
        /// <param name="arguments">参数列表</param>
        private IntPtr luaMethodHandler(string methodName, IntPtr args, int size)
        {
            if (_methodHandlers.ContainsKey(methodName))
            {
                //反序列化参数列表
                LuaObjectDecoder decoder = new LuaObjectDecoder(args, size);
                int argSize = decoder.readInt32();

                List <LuaValue> argumentsList = new List <LuaValue> ();
                for (int i = 0; i < argSize; i++)
                {
                    LuaValue value = decoder.readObject() as LuaValue;
                    argumentsList.Add(value);
                }

                LuaMethodHandler handler  = _methodHandlers [methodName];
                LuaValue         retValue = handler(argumentsList);

                if (retValue == null)
                {
                    retValue = new LuaValue();
                }

                LuaObjectEncoder encoder = new LuaObjectEncoder();
                encoder.writeObject(retValue);

                byte[] bytes = encoder.bytes;
                IntPtr retPtr;
                retPtr = Marshal.AllocHGlobal(bytes.Length);
                Marshal.Copy(bytes, 0, retPtr, bytes.Length);

                return(retPtr);
            }

            return(IntPtr.Zero);
        }
Ejemplo n.º 12
0
 /// <summary>
 /// 初始化LuaBaseObject
 /// </summary>
 /// <param name="decoder">对象解码器</param>
 public LuaBaseObject(LuaObjectDecoder decoder)
 {
     _nativeObjectId = decoder.readInt32();
 }