string GetParamString(List <StructNode> structs, string structName, bool bNoType = false, string prefix = "") { StructNode sn = structs.Find(obj => obj.name == structName); if (sn == null) { return(""); } string code = ""; for (int i = 0; i < sn.paramList.Count; ++i) { ParamNode param = sn.paramList[i]; if (i > 0) { code += ", "; } if (bNoType) { code += string.Format("{0}{1}", prefix, param.name); continue; } string type = param.bBaseType ? param.type : param.type; if (string.IsNullOrEmpty(param.lenParam)) { code += string.Format("{0} {1}", type, param.name); } else { code += string.Format("List<{0}> {1}", type, param.name); } } return(code); }
void GenerateClasses(List <StructNode> structs, List <ClassNode> classes) { foreach (var cla in classes) { Write("// This file is Auto Generated by IDLAnalyzer"); Write("// Please don't edit manually"); Write("using System;"); Write("using System.Collections.Generic;"); Write(""); Write("namespace FlowInLib"); Write("{"); IncTab(); { Write(string.Format("public class {0} : TcpSession", cla.name)); Write("{"); IncTab(); { Write("public enum EMsgType"); Write("{"); IncTab(); { foreach (var func in cla.funcs) { Write(func.name + ","); } Write("MaxNum"); } DecTab(); Write("}"); Write(""); Write(string.Format("public {0}()", cla.name)); Write("{"); IncTab(); { Write("_rpcCallbackNum = (int)EMsgType.MaxNum;"); Write("_rpcCallbackArray = new RpcCallback[_rpcCallbackNum];"); foreach (var func in cla.funcs) { Write(string.Format("_rpcCallbackArray[(int)EMsgType.{0}] = {0}Stub;", func.name)); } } DecTab(); Write("}"); foreach (var func in cla.funcs) { Write(""); Write(string.Format("public virtual void {0} (TcpSession session{1}{2}) {{}}", func.name, string.IsNullOrEmpty(func.structName) ? "" : ", ", GetParamString(structs, func.structName))); Write(string.Format("public void {0} ({1})", func.name, GetParamString(structs, func.structName))); Write("{"); IncTab(); { if (string.IsNullOrEmpty(func.structName)) { Write(string.Format("PushSendData((ushort)EMsgType.{0}, null);", func.name)); } else { StructNode sn = structs.Find(obj => obj.name == func.structName); if (sn == null) { continue; } Write(string.Format("{0} msgData = new {0}();", func.structName)); foreach (var param in sn.paramList) { if (string.IsNullOrEmpty(param.lenParam)) { Write(string.Format("msgData.{0} = {0};", param.name)); } else { Write(string.Format("msgData.{0}.AddRange({0});", param.name)); } } Write(string.Format("PushSendData((ushort)EMsgType.{0}, msgData);", func.name)); } Write("SendBytes();"); } DecTab(); Write("}"); } Write(""); foreach (var func in cla.funcs) { Write(string.Format("protected bool {0}Stub(byte[] buff, uint offset, uint buffLen)", func.name)); Write("{"); IncTab(); { if (string.IsNullOrEmpty(func.structName)) { Write(string.Format("{0}();", func.name)); Write("return true;"); } else { Write(string.Format("{0} msgData = new {0}();", func.structName)); Write("uint readLen = msgData.Unserialize(buff, offset, buffLen);"); Write("if (readLen <= 0) { msgData.Clear(); return false; }"); Write(string.Format("{0} (this, {1});", func.name, GetParamString(structs, func.structName, true, "msgData."))); Write("msgData.Clear();"); Write("return true;"); } } DecTab(); Write("}"); } } DecTab(); Write("}"); } DecTab(); Write("}"); OutputToFile(string.Format("{0}.cs", cla.name)); } }
bool ParseStruct(string name, string[] strList) { if (strList.Length <= 0) { return(false); } StructNode structNode = new StructNode(); structNode.name = name; structNode.paramList.Clear(); string[] keyValue = null; string[] typeAndLen = null; string[] lenAndSize = null; for (int index = 0; index < strList.Length; ++index) { keyValue = strList[index].Split(new char[] { ' ', '\t', '\n', ';' }, StringSplitOptions.RemoveEmptyEntries); if (keyValue.Length != 2) { Debug.Log(string.Format("ParseStruct Error: {0}", strList[index])); return(false); } ParamNode paramNode = new ParamNode(); paramNode.name = keyValue[1]; if (keyValue[0].Contains("[")) { typeAndLen = keyValue[0].Split(new char[] { '[', ']' }, StringSplitOptions.RemoveEmptyEntries); if (typeAndLen.Length != 2) { Debug.Log(string.Format("ParseStruct Error: {0}", strList[index])); return(false); } paramNode.type = ToCSType(typeAndLen[0]); lenAndSize = typeAndLen[1].Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (lenAndSize.Length == 1) { paramNode.lenParam = typeAndLen[1]; paramNode.lenMax = MAX_ARRAY_SIZE.ToString(); } else { paramNode.lenParam = lenAndSize[0]; paramNode.lenMax = lenAndSize[1]; } } else { paramNode.type = ToCSType(keyValue[0]); paramNode.lenParam = ""; paramNode.lenMax = ""; } paramNode.bBaseType = IsBaseType(paramNode.type); structNode.paramList.Add(paramNode); } foreach (var param in structNode.paramList) { if (!param.bBaseType) { bool validType = _arrStructs.Find(obj => obj.name == param.type) != null; if (!validType) { Debug.Log(string.Format("ParseStruct Error: Invalid type [{0}]", param.type)); return(false); } } } _arrStructs.Add(structNode); return(true); }