Esempio n. 1
0
 private static bool WriteField(ScorpioWriter write, string type, object value)
 {
     if (type == BoolType)
     {
         write.WriteBool((bool)value);
     }
     else if (type == Int8Type)
     {
         write.WriteInt8(ScorpioUtil.ToInt8(value));
     }
     else if (type == Int16Type)
     {
         write.WriteInt16(ScorpioUtil.ToInt16(value));
     }
     else if (type == Int32Type || type == IntType)
     {
         write.WriteInt32(ScorpioUtil.ToInt32(value));
     }
     else if (type == Int64Type)
     {
         write.WriteInt64(ScorpioUtil.ToInt64(value));
     }
     else if (type == FloatType)
     {
         write.WriteFloat(ScorpioUtil.ToFloat(value));
     }
     else if (type == DoubleType)
     {
         write.WriteDouble(ScorpioUtil.ToDouble(value));
     }
     else if (type == StringType)
     {
         write.WriteString((string)value);
     }
     else if (type == BytesType)
     {
         write.WriteBytes((byte[])value);
     }
     else
     {
         return(false);
     }
     return(true);
 }
Esempio n. 2
0
        public static ScriptTable Read(Script script, ScorpioReader reader, string tableName, bool hasSign)
        {
            ScriptTable table     = script.CreateTable();
            ScriptArray layout    = (ScriptArray)script.GetValue(tableName);
            bool        isInvalid = true;
            int         sign      = hasSign ? reader.ReadInt32() : 0;

            for (int i = 0; i < layout.Count(); ++i)
            {
                ScriptObject config = layout.GetValue(i);
                if (!hasSign || ScorpioUtil.HasSign(sign, ScorpioUtil.ToInt32(config.GetValue(Index).ObjectValue)))
                {
                    string  name    = (string)config.GetValue(Name).ObjectValue;
                    string  type    = (string)config.GetValue(Type).ObjectValue;
                    bool    array   = (bool)config.GetValue(Array).ObjectValue;
                    Invalid invalid = new Invalid();
                    if (array)
                    {
                        int         count = reader.ReadInt32();
                        ScriptArray value = script.CreateArray();
                        for (int j = 0; j < count; ++j)
                        {
                            value.Add(ReadObject(script, reader, type, hasSign, invalid));
                        }
                        table.SetValue(name, value);
                        if (count > 0)
                        {
                            isInvalid = false;
                        }
                    }
                    else
                    {
                        table.SetValue(name, ReadObject(script, reader, type, hasSign, invalid));
                        if (!invalid.value)
                        {
                            isInvalid = false;
                        }
                    }
                }
            }
            table.SetValue("IsInvalid", script.CreateBool(isInvalid));
            return(table);
        }
Esempio n. 3
0
        private static void Write(Script script, ScorpioWriter writer, ScriptTable table, string tableName)
        {
            ScriptArray layout = (ScriptArray)script.GetValue(tableName);
            int         sign   = 0;

            for (int i = 0; i < layout.Count(); ++i)
            {
                ScriptObject config = layout.GetValue(i);
                if (table != null && table.HasValue(config.GetValue(Name).ObjectValue))
                {
                    sign = ScorpioUtil.AddSign(sign, ScorpioUtil.ToInt32(config.GetValue(Index).ObjectValue));
                }
            }
            writer.WriteInt32(sign);
            for (int i = 0; i < layout.Count(); ++i)
            {
                ScriptObject config = layout.GetValue(i);
                string       name   = (string)config.GetValue(Name).ObjectValue;
                if (table != null && table.HasValue(name))
                {
                    string type  = (string)config.GetValue(Type).ObjectValue;
                    bool   array = (bool)config.GetValue(Array).ObjectValue;
                    if (array)
                    {
                        ScriptArray arr = table.GetValue(name) as ScriptArray;
                        writer.WriteInt32(arr.Count());
                        for (int j = 0; j < arr.Count(); ++j)
                        {
                            WriteObject(script, writer, type, arr.GetValue(j));
                        }
                    }
                    else
                    {
                        WriteObject(script, writer, type, table.GetValue(name));
                    }
                }
            }
        }
Esempio n. 4
0
        /// <summary>
        /// 读取一个网络协议或者一行table数据
        /// </summary>
        /// <param name="script">脚本引擎对象</param>
        /// <param name="reader">读取类</param>
        /// <param name="tableManager">tableManager类</param>
        /// <param name="fileName">table用文件名字</param>
        /// <param name="layoutTableName">结构名字</param>
        /// <param name="message">是否是网络协议</param>
        private static ScriptTable Read(Script script, ScorpioReader reader, ScriptTable tableManager, string fileName, string layoutTableName, bool message)
        {
            ScriptTable table     = script.CreateTable();
            ScriptArray layout    = (ScriptArray)script.GetValue(layoutTableName);
            int         sign      = message ? reader.ReadInt32() : 0;
            bool        isInvalid = true;
            string      id        = null;

            for (int i = 0; i < layout.Count(); ++i)
            {
                ScriptObject config = layout.GetValue(i);
                if (message && !ScorpioUtil.HasSign(sign, ScorpioUtil.ToInt32(config.GetValue(Index).ObjectValue)))
                {
                    continue;
                }
                string  name    = config.GetValue(Name).ToString();         //字段名字
                string  type    = config.GetValue(Type).ToString();         //字段类型
                bool    array   = config.GetValue(Array).LogicOperation();  //是否是数组
                Invalid invalid = new Invalid();                            //本行是否是无效行
                if (array)
                {
                    int         count = reader.ReadInt32();     //读取元素个数
                    ScriptArray value = script.CreateArray();
                    for (int j = 0; j < count; ++j)
                    {
                        value.Add(ReadObject(script, reader, tableManager, fileName, type, message, invalid));
                    }
                    table.SetValue(name, value);
                    if (count > 0)
                    {
                        isInvalid = false;
                    }
                }
                else
                {
                    if (message)
                    {
                        table.SetValue(name, ReadObject(script, reader, tableManager, fileName, type, message, invalid));
                    }
                    else
                    {
                        ScriptTable attribute = config.GetValue(Attribute) as ScriptTable;
                        if (attribute.Count() == 0)
                        {
                            var obj = ReadObject(script, reader, tableManager, fileName, type, message, invalid);
                            table.SetValue(name, obj);
                            if (!invalid.value)
                            {
                                isInvalid = false;
                            }
                            if (string.IsNullOrEmpty(id))
                            {
                                id = ScorpioUtil.ToInt32(obj.ObjectValue).ToString();
                            }
                        }
                        else
                        {
                            ReadObject(script, reader, tableManager, fileName, type, message, invalid);     //先读取一个值  如果是多国语言 生成数据的时候会写入一个空字符串
                            table.SetValue(name, script.CreateObject(tableManager.GetValue("getValue").call(attribute, fileName, name, id)));
                        }
                    }
                }
            }
            if (!message)
            {
                table.SetValue("IsInvalid", script.CreateBool(isInvalid));
            }
            return(table);
        }