Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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));
            }
        }
Esempio n. 3
0
        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);
        }