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); } } }
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); } } }
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()); }
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); } } } }
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); }