/// <summary> /// 创建实例 /// </summary> /// <param name="param"></param> /// <returns></returns> public static object createTypeInstance(object param) { luaMessage other = luaMessageCache.get(param); if (other == null) { return(null); } var newMsg = new luaMessage(param); var otherFieldsInfo = (Dictionary <int, fieldDataInfo>)other.valueL; otherFieldsInfo.Keys.CopyTo(_auxiliary, 0); int count = otherFieldsInfo.Count; int key = 0; fieldDataInfo info = null; for (int i = 0; i < count; i++) { //创建field key = _auxiliary[i]; info = otherFieldsInfo[key]; var descriptor = info.descriptor; // fieldDescriptor.copyCreateDescriptor(info.descriptor); if (descriptor != null) { var fieldData = fieldDataInfo.createFieldData(key, descriptor); if (fieldData != null) { newMsg.addField(key, fieldData); } } } return(newMsg); }
/// <summary> /// 根据message生成table /// </summary> internal static void createLuaTable(LuaState state, luaMessage msg) { //压入消息表 LuaDLL.lua_newtable(state.L); fieldDataInfo field = null; for (int idx = 1; idx <= msg.fieldsCount(); idx++) { field = (fieldDataInfo)msg[idx]; if (field.Value == null) { continue; } string key = field.descriptor.name; ProtoTypeCode typeCode = field.descriptor.typeCode; if (field.descriptor.isRepeated()) { LuaDLL.lua_pushstring(state.L, key); LuaDLL.lua_newtable(state.L); for (int j = 0; j < field.Value.count(); j++) { if (field.descriptor.haveNestedType()) { createLuaTable(state, (luaMessage)field.Value[j]); } else { object luaValue = field.Value[j]; pushLuaValue(typeCode, state, luaValue); } LuaDLL.lua_rawseti(state.L, -2, j + 1); } LuaDLL.lua_settable(state.L, -3); } else { LuaDLL.lua_pushstring(state.L, key); if (field.descriptor.haveNestedType()) { createLuaTable(state, (luaMessage)field.Value.valueL); } else { object luaValue = field.Value.valueL; pushLuaValue(typeCode, state, luaValue); } LuaDLL.lua_settable(state.L, -3); } } }
//////////////////////////////////////////////////////// /// <summary> /// 添加字段 /// </summary> /// <param name="number">字段索引</param> /// <param name="field">字段信息</param> public void addField(int number, fieldDataInfo field) { if (field == null) { return; } if (_fields.ContainsKey(number)) { return; } _fields.Add(number, field); }
/////////////////////////////////////////////////////////////////////////// /// <summary> /// 从流中读取lua消息 /// </summary> /// <param name="idMsg">配置表中的消息索引</param> /// <returns></returns> public luaMessage readLuaMessage(object idMsg) { luaMessage msg = (luaMessage)luaMessageCache.createTypeInstance(idMsg); if (msg == null) { return(null); } int fieldCount = msg.fieldsCount(); fieldDataInfo fieldData = null; for (int idx = 1; idx <= fieldCount; idx++) { fieldData = (fieldDataInfo)msg[idx]; if (fieldData == null) { continue; } WireType wireType = fieldData.descriptor.wireType; ProtoTypeCode typeCode = fieldData.descriptor.typeCode; string nestedTypeName = fieldData.descriptor.nestedTypeName; if (tryReadFieldHeader(idx, wireType)) { //创建值字段 if (!fieldData.appendValue()) { continue; } if (fieldData.descriptor.isRepeated()) { do { var obj = readLuaObject(typeCode, wireType, nestedTypeName); fieldData.Value.addChild(obj); } while (tryReadFieldHeader(idx, wireType)); } else { fieldData.Value.valueL = readLuaObject(typeCode, wireType, nestedTypeName); } } } return(msg); }
/// <summary> /// 索引器,获取字段信息 /// </summary> /// <param name="number">字段索引</param> /// <returns></returns> public object this[int idx] { get { if (idx <= 0) { return(null); } fieldDataInfo fld = null; if (_fields.TryGetValue(idx, out fld)) { return(fld); } return(null); } }
/// <summary> /// 读取lua消息 /// </summary> internal static luaMessage readLuaMessage(object idMsg, LuaTable luaMsgTbl) { if (luaMsgTbl == null) { return(null); } luaMessage msg = (luaMessage)luaMessageCache.createTypeInstance(idMsg); if (msg == null) { return(null); } //按照索引顺序读取lua表中对应字段的值 int count = msg.fieldsCount(); fieldDataInfo fieldData = null; for (int i = 1; i <= count; i++) { fieldData = (fieldDataInfo)msg[i]; if (fieldData == null) { continue; } //检查lua表中对应字段的值 string name = fieldData.descriptor.name; if (luaMsgTbl[name] == null) { continue; } //创建值字段 if (!fieldData.appendValue()) { continue; } fieldDescriptor des = fieldData.descriptor; if (des.isRepeated()) { LuaTable repeatedTbl = (LuaTable)luaMsgTbl[name]; for (int j = 1; j <= repeatedTbl.length(); j++) { object subValue = luaType2CType(des.typeCode, repeatedTbl[j]); if (subValue == null) { continue; } //嵌入类型 if (des.haveNestedType()) { object subMsg = readLuaMessage(des.nestedTypeName, (LuaTable)subValue); if (subMsg != null) { fieldData.Value.addChild(subMsg); } } else { fieldData.Value.addChild(subValue); } } } else { object value = luaType2CType(des.typeCode, luaMsgTbl[name]); if (value == null) { continue; } //嵌入类型 if (des.haveNestedType()) { fieldData.Value.valueL = readLuaMessage(des.nestedTypeName, (LuaTable)value); } else { fieldData.Value.valueL = value; } } } return(msg); }