Esempio n. 1
0
        void ParseResponse2(TestScriptValue result, ProtoSpecSubset format, TreeNodeCollection nodes)
        {
            foreach (ProtoSpecColumn column in format.Columns)
            {
                string columnName = column.Name + " : " + ColumnTypeToString(column.ColumnType) + " = ";

                switch (column.ColumnType)
                {
                case ProtoSpecColumnType.Byte:
                case ProtoSpecColumnType.Short:
                case ProtoSpecColumnType.Int:
                case ProtoSpecColumnType.Long:
                    columnName += result.GetProperty(column.Name).Value;
                    break;

                case ProtoSpecColumnType.Enum:
                    columnName += result.GetProperty(column.Name).EnumName;
                    break;

                case ProtoSpecColumnType.String:
                    columnName += "\"" + result.GetProperty(column.Name).Value + "\"";
                    break;

                case ProtoSpecColumnType.List:
                {
                    TestScriptValueList list = (TestScriptValueList)result.GetProperty(column.Name).Value;

                    columnName += list.Count;

                    TreeNode node = nodes.Add(columnName);

                    for (int i = 0; i < list.Count; i++)
                    {
                        TreeNode subnode = node.Nodes.Add("[" + i + "]");

                        ParseResponse2(list[i], column.Format, subnode.Nodes);
                    }
                }
                break;
                }

                if (column.ColumnType != ProtoSpecColumnType.List)
                {
                    nodes.Add(columnName);
                }
            }
        }
Esempio n. 2
0
        private void ParseData(byte[] data, ref int parseOffset, ProtoSpecSubset format, TreeNodeCollection nodes)
        {
            foreach (ProtoSpecColumn column in format.Columns)
            {
                string columnName = column.Name + " : " + ColumnTypeToString(column) + " = ";

                switch (column.ColumnType)
                {
                case ProtoSpecColumnType.Byte:
                    columnName += data[parseOffset++].ToString();
                    break;

                case ProtoSpecColumnType.Short:
                {
                    byte[] bytes = new byte[2];

                    bytes[1] = data[parseOffset++];
                    bytes[0] = data[parseOffset++];

                    columnName += BitConverter.ToInt16(bytes, 0).ToString();
                }
                break;

                case ProtoSpecColumnType.Int:
                {
                    byte[] bytes = new byte[4];

                    bytes[3] = data[parseOffset++];
                    bytes[2] = data[parseOffset++];
                    bytes[1] = data[parseOffset++];
                    bytes[0] = data[parseOffset++];

                    columnName += BitConverter.ToInt32(bytes, 0).ToString();
                }
                break;

                case ProtoSpecColumnType.Long:
                {
                    byte[] bytes = new byte[8];

                    bytes[7] = data[parseOffset++];
                    bytes[6] = data[parseOffset++];
                    bytes[5] = data[parseOffset++];
                    bytes[4] = data[parseOffset++];
                    bytes[3] = data[parseOffset++];
                    bytes[2] = data[parseOffset++];
                    bytes[1] = data[parseOffset++];
                    bytes[0] = data[parseOffset++];

                    columnName += BitConverter.ToInt64(bytes, 0).ToString();
                }
                break;

                case ProtoSpecColumnType.String:
                {
                    byte[] packhead = new byte[2];

                    packhead[1] = data[parseOffset++];
                    packhead[0] = data[parseOffset++];

                    short len = BitConverter.ToInt16(packhead, 0);

                    string text = Encoding.UTF8.GetString(data, parseOffset, len);

                    parseOffset += len;

                    columnName += "\"" + text + "\"";
                }
                break;

                case ProtoSpecColumnType.Enum:
                {
                    byte value = data[parseOffset++];

                    columnName += column.Values.GetNameByValue(value);
                }
                break;

                case ProtoSpecColumnType.List:
                {
                    byte[] packhead = new byte[2];

                    packhead[1] = data[parseOffset++];
                    packhead[0] = data[parseOffset++];

                    short len = BitConverter.ToInt16(packhead, 0);

                    columnName += len.ToString();

                    TreeNode node = nodes.Add(columnName);

                    for (int i = 0; i < len; i++)
                    {
                        TreeNode subnode = node.Nodes.Add("[" + i + "]");

                        ParseData(data, ref parseOffset, column.Format, subnode.Nodes);
                    }
                }
                break;

                case ProtoSpecColumnType.TypeOf:
                {
                    TreeNode node = nodes.Add(columnName);

                    ParseData(data, ref parseOffset, column.Format, node.Nodes);
                }
                break;
                }

                if (column.ColumnType != ProtoSpecColumnType.List)
                {
                    nodes.Add(columnName);
                }
            }
        }
Esempio n. 3
0
        private static string GenerateErlangFunction2(string moduleID, string actionID, string name, ProtoSpecSubset format, ref int autoFunCount, ref List <string> autoFunList, ref int level, bool islist, bool developMode)
        {
            string[] columnBinDecl = new string[format.Columns.Count];
            string[] columnBinCode = new string[format.Columns.Count];

            StringBuilder code = new StringBuilder();

            code.Append(name).AppendLine(" ({");

            for (int i = 0; i < format.Columns.Count; i++)
            {
                ProtoSpecColumn column = format.Columns[i];

                string paramName = FormatName(column.Name);

                code.Append("    ").Append(paramName);

                if (i < format.Columns.Count - 1)
                {
                    code.AppendLine(",");
                }
                else
                {
                    code.AppendLine();
                }

                GenerateErlangVarBin2(paramName, column, ref columnBinDecl[i], ref columnBinCode[i], ref autoFunCount, ref autoFunList, ref level, developMode);
            }

            code.AppendLine("}) ->");

            for (int i = 0; i < columnBinDecl.Length; i++)
            {
                if (columnBinDecl[i] == null)
                {
                    continue;
                }

                code.AppendLine(columnBinDecl[i]);

                code.AppendLine();
            }

            if (moduleID != null)
            {
                if (moduleID != null && moduleID != AdminModuleId && !developMode)
                {
                    code.AppendLine("    OutBin = <<");
                }
                else
                {
                    code.AppendLine("    <<");
                }

                code.Append("        ").Append(moduleID).AppendLine(":8/unsigned,");
                code.Append("        ").Append(actionID).AppendLine(":8/unsigned,");
            }
            else
            {
                code.AppendLine("    <<");
            }

            for (int i = 0; i < columnBinCode.Length; i++)
            {
                code.Append("        ").Append(columnBinCode[i]);

                if (i < columnBinCode.Length - 1)
                {
                    code.AppendLine(",");
                }
                else
                {
                    code.AppendLine();
                }
            }

            if (moduleID != null && moduleID != AdminModuleId && !developMode)
            {
                code.Append("    >>,").AppendLine();
                code.Append("    OutBinSize = size(OutBin),").AppendLine();
                code.Append("    if OutBinSize >= 64 -> zlib:compress(OutBin); true -> OutBin end");
            }
            else
            {
                code.Append("    >>");
            }

            code.AppendLine(".");

            return(code.ToString());
        }
Esempio n. 4
0
        void ProtoSpecSubsetTree(ProtoSpecModule module, ProtoSpecAction action, TreeNode parent, ProtoSpecSubset subset)
        {
            foreach (ProtoSpecColumn column in subset.Columns)
            {
                string columnType = ColumnTypeToString(column.ColumnType);

                string className = "";

                if (column.ClassName != null)
                {
                    if (column.ClassModule != null)
                    {
                        className = "<" + column.ClassModule + "." + column.ClassName + ">";
                    }
                    else
                    {
                        className = "<" + column.ClassName + ">";
                    }
                }

                TreeNode columnNode = parent.Nodes.Add(column.Name + " : " + columnType + className);

                if (column.Format != null)
                {
                    ProtoSpecSubsetTree(module, action, columnNode, column.Format);
                }
                else if (column.Values != null)
                {
                    foreach (ProtoSpecEnumValue value in column.Values)
                    {
                        columnNode.Nodes.Add(value.Name + " = " + value.Value);
                    }
                }
            }
        }
Esempio n. 5
0
        private static int GenerateTypeParser(ref int listParserCount, ref int typeParserCount, List <string> listParsers, List <string> typeParsers, ProtoSpecSubset format)
        {
            int id = typeParserCount++;

            StringBuilder router = new StringBuilder();

            router.Append("type_parser_").Append(id).Append("(_Args0) ->").AppendLine();

            int n2        = 0;
            int argsCount = 0;
            int lenCount  = 1;
            int sizeCount = 1;

ParseInput:

            router.Append("    <<");

            bool inList = false;
            bool inType = false;

            ProtoSpecColumn listColumn = null;
            ProtoSpecColumn typeColumn = null;

            for (int j = n2; j < format.Columns.Count; j++)
            {
                ProtoSpecColumn column = format.Columns[j];

                switch (column.ColumnType)
                {
                case ProtoSpecColumnType.Byte:
                    router.Append(FormatName(column.Name)).Append(":8/signed");
                    break;

                case ProtoSpecColumnType.Enum:
                    router.Append(FormatName(column.Name)).Append(":8/unsigned");
                    break;

                case ProtoSpecColumnType.Short:
                    router.Append(FormatName(column.Name)).Append(":16/signed");
                    break;

                case ProtoSpecColumnType.Int:
                    router.Append(FormatName(column.Name)).Append(":32/signed");
                    break;

                case ProtoSpecColumnType.Long:
                    router.Append(FormatName(column.Name)).Append(":64/signed");
                    break;

                case ProtoSpecColumnType.String:
                    router.Append("Len").Append(lenCount).Append(":16/unsigned, ").Append(FormatName(column.Name)).Append(":Len").Append(lenCount).Append("/binary");
                    lenCount += 1;
                    break;

                case ProtoSpecColumnType.List:
                    router.Append("Size").Append(sizeCount).Append(":16/unsigned, ").Append(FormatName(column.Name)).Append("Bin/binary");
                    sizeCount += 1;
                    inList     = true;
                    listColumn = column;
                    break;

                case ProtoSpecColumnType.TypeOf:
                    router.Append(FormatName(column.Name)).Append("Bin/binary");
                    sizeCount += 1;
                    inType     = true;
                    typeColumn = column;
                    break;
                }

                n2 += 1;

                if (inList)
                {
                    break;
                }

                router.Append(", ");
            }

            argsCount += 1;

            if (inList)
            {
                router.Append(">> = _Args").Append(argsCount - 1).Append(",").AppendLine();

                int newParserId = GenerateListParser(ref listParserCount, ref typeParserCount, listParsers, typeParsers, listColumn.Format);

                router.Append("    {").Append(FormatName(listColumn.Name)).Append(", _Args").Append(argsCount).Append("}").Append(" = list_parser_").Append(newParserId).Append("(").Append("Size").Append(sizeCount - 1).Append(", ").Append(FormatName(listColumn.Name)).Append("Bin, []),").AppendLine();

                if (n2 < format.Columns.Count)
                {
                    goto ParseInput;
                }
            }
            else if (inType)
            {
                argsCount += 1;

                int newParserId = GenerateTypeParser(ref listParserCount, ref typeParserCount, listParsers, typeParsers, typeColumn.Format);

                router.Append("            {").Append(FormatName(typeColumn.Name)).Append(", _Args").Append(argsCount).Append("}").Append(" = type_parser_").Append(newParserId).Append("(").Append(FormatName(typeColumn.Name)).Append("Bin),").AppendLine();

                if (n2 < format.Columns.Count)
                {
                    goto ParseInput;
                }
            }
            else
            {
                router.Append("_Args").Append(argsCount).Append("/binary>> = _Args").Append(argsCount - 1).Append(",").AppendLine();
            }

            router.Append("    _NewItem = {");

            n2 = 0;

            foreach (ProtoSpecColumn column in format.Columns)
            {
                if (column.ColumnType == ProtoSpecColumnType.String)
                {
                    router.Append("binary_to_list(").Append(FormatName(column.Name)).Append(")");
                }
                else
                {
                    router.Append(FormatName(column.Name));
                }

                if (n2 < format.Columns.Count - 1)
                {
                    router.Append(", ");
                }

                n2 += 1;
            }

            router.Append("},").AppendLine();
            router.Append("    {_NewItem, _Args").Append(argsCount).Append("}.").AppendLine();

            typeParsers.Add(router.ToString());

            return(id);
        }