private void cbMessages_SelectedIndexChanged(object sender, EventArgs e) { SbeMessage message = SbeLoader.LoadMessageByName(cbMessages.Text); if (message != null) { tree.BeginUpdate(); lblDescription.Text = "Description: " + message.Description; lblId.Text = "ID: " + message.Id; _Message.Clear(); _Message.Add(message); if (checkBox1.Checked) { CreateHeader(); } tree.Roots = _Message; tree.ExpandAll(); tree.AutoResizeColumns(ColumnHeaderAutoResizeStyle.ColumnContent); colValue.Width = 100; tree.EndUpdate(); } else { lblDescription.Text = "Description:"; lblId.Text = "ID:"; tree.Clear(); } }
private void MainForm_Load(object sender, EventArgs e) { txtFileName.Text = @"C:\Users\Akio\source\repos\POC_SBE\packages\sbe-tool.1.17.0\tools\fixp-entrypoint-messages-1.2.xml"; SbeLoader.Load(txtFileName.Text); if (SbeLoader._Messages.Count > 0) { cbMessages.Enabled = true; SbeLoader._Messages.ForEach(x => cbMessages.Items.Add(x)); } }
private void btnLoadFile_Click(object sender, EventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.Title = "Selecione o dicionário SBE"; ofd.InitialDirectory = Application.ExecutablePath; ofd.Filter = "Arquivo XML|*.xml"; ofd.CheckFileExists = true; if (ofd.ShowDialog() == DialogResult.OK) { txtFileName.Text = ofd.FileName; SbeLoader.Load(txtFileName.Text); if (SbeLoader._Messages.Count > 0) { cbMessages.Enabled = true; SbeLoader._Messages.ForEach(x => cbMessages.Items.Add(x)); } } }
public String DecodeSBEMessageQATEngine(byte[] MessageBytes) { StringBuilder sb = new StringBuilder(); var directBuffer = new DirectBuffer(MessageBytes); int bufferOffset = 0; ushort blockLength = directBuffer.Uint16GetLittleEndian(bufferOffset); bufferOffset += 2; sb.AppendLine(CrackHelper.CreateLine("Header", "BlockLength", blockLength.ToString())); ushort templateId = directBuffer.Uint16GetLittleEndian(bufferOffset); bufferOffset += 2; sb.AppendLine(CrackHelper.CreateLine("Header", "TemplateId", templateId.ToString())); ushort schemaId = directBuffer.Uint16GetLittleEndian(bufferOffset); bufferOffset += 2; sb.AppendLine(CrackHelper.CreateLine("Header", "SchemaId", schemaId.ToString())); ushort version = directBuffer.Uint16GetLittleEndian(bufferOffset); bufferOffset += 2; sb.AppendLine(CrackHelper.CreateLine("Header", "Version", version.ToString())); SbeMessage Message = SbeLoader.LoadMessageById(templateId.ToString()); if (Message == null) { throw new Exception("Message not recognized! TemplateId = " + templateId.ToString()); } foreach (SbeField field in Message.Fields) { FillValue(directBuffer, field, ref bufferOffset); } sb.Append(Message.Crack()); return(sb.ToString()); }
public static SbeField GetField(Assembly assembly, SbeField field, String MessageName, object MessageBody) { if (SbeLoader._Enums.Find(x => x.Name == field.Type) != null) { #region Enumeration GetEnumerationField(assembly, field, MessageBody, MessageName); #endregion } else if (SbeLoader._SimpleTypes.Find(x => x.Name == field.Type) != null) { #region Simple Type if (field.Presence.Contains("constant")) { return(field); } //SimpleType SbeType simple = SbeLoader._SimpleTypes.Find(x => x.Name == field.Type); if (simple.PrimitiveType.ToLower().Equals("char")) { FieldInfo l = ReflectionHelper.GetFieldByName(assembly, MessageName, field.Name + "Length"); int length = (int)l.GetValue(MessageBody); var fieldByte = new byte[length]; MethodInfo mi = ReflectionHelper.GetMethodByName(assembly, MessageName, "Get" + field.Name, "byte[]"); mi.Invoke(MessageBody, new object[] { fieldByte, 0 }).ToString(); FieldInfo fi = ReflectionHelper.GetFieldByName(assembly, MessageName, field.Name + "CharacterEncoding"); string enc = fi.GetValue(MessageBody).ToString(); field.Value = Encoding.GetEncoding(enc).GetString(fieldByte, 0, length); } else { PropertyInfo pi = ReflectionHelper.GetPropertyByName(assembly, MessageName, field.Name); field.Value = Convert.ChangeType(pi.GetValue(MessageBody), pi.PropertyType).ToString(); } #endregion } else if (SbeLoader._CompositeTypes.Find(x => x.Name == field.Type) != null) { #region Composite if (field.Type.ToLower().Equals("groupsizeencoding")) { #region groupsizeencoding //var fuelFiguresGroup = car.FuelFigures; //while (fuelFiguresGroup.HasNext) //{ //var fuelFigures = fuelFiguresGroup.Next(); //sb.Append("\ncar.fuelFigures.speed=").Append(fuelFigures.Speed); //sb.Append("\ncar.fuelFigures.mpg=").Append(fuelFigures.Mpg); //} PropertyInfo no = ReflectionHelper.GetPropertyByName(assembly, MessageName, field.Name); var repeat = no.GetValue(MessageBody); PropertyInfo hasNext = ReflectionHelper.GetPropertyByName(assembly, field.Name, "HasNext"); bool nextValue = (bool)hasNext.GetValue(repeat); SbeMessage _Original = SbeLoader.LoadMessageByName(MessageName); SbeField _OriginalField = _Original.Fields.Find(x => x.Name == field.Name).Clone(); field.Fields.Clear(); MethodInfo next = ReflectionHelper.GetNestedMethodByName(assembly, MessageName, field.Name + "Group", "next"); int size = 0; while (nextValue) { size++; next.Invoke(repeat, null); foreach (SbeField child in _OriginalField.Fields) { if (!child.Presence.Contains("constant")) { if (SbeLoader._Enums.Find(x => x.Name == child.Type) != null) { Type _enumType = ReflectionHelper.GetType(assembly, child.Type); if (_enumType.IsEnum) { SbeEnum _enum = SbeLoader._Enums.Find(x => x.Name == child.Type); PropertyInfo pi = ReflectionHelper.GetPropertyByName(assembly, field.Name + "Group", child.Name); child.ValueRef = Convert.ChangeType(pi.GetValue(repeat), pi.PropertyType).ToString(); SbeEnumValidValue valid = _enum.ValidValues.Find(x => x.Name == child.ValueRef); if (valid != null) { child.Value = valid.Value; } } } else { PropertyInfo pi = ReflectionHelper.GetNestedPropertyByName(assembly, MessageName, field.Name + "Group", child.Name); child.Value = pi.GetValue(repeat).ToString(); } } field.Fields.Add(child.Clone()); } nextValue = (bool)hasNext.GetValue(repeat); } field.Value = size.ToString(); #endregion } else { PropertyInfo pi = ReflectionHelper.GetPropertyByName(assembly, MessageName, field.Type); if (pi != null) { object parent = pi.GetValue(MessageBody); foreach (SbeField child in field.Fields) { if (child.Presence.Contains("constant")) { continue; } PropertyInfo pi2 = ReflectionHelper.GetPropertyByName(assembly, field.Type, child.Name); child.Value = pi2.GetValue(parent).ToString(); } } else { // length = car.GetManufacturer(buffer, 0, buffer.Length); //sb.Append("\ncar.manufacturer=").Append(Encoding.GetEncoding(Car.ManufacturerCharacterEncoding).GetString(buffer, 0, length)); // length = car.GetModel(buffer, 0, buffer.Length); //sb.Append("\ncar.model=").Append(Encoding.GetEncoding(Car.ModelCharacterEncoding).GetString(buffer, 0, length)); FieldInfo fi = ReflectionHelper.GetFieldByName(assembly, MessageName, field.Name + "CharacterEncoding"); var buffer = new byte[128]; MethodInfo mi = ReflectionHelper.GetMethodByName(assembly, MessageName, "Get" + field.Name, "byte[]"); int len = (int)(mi.Invoke(MessageBody, new object[] { buffer, 0, buffer.Length })); field.Value = Encoding.GetEncoding(fi.GetValue(MessageBody).ToString()).GetString(buffer, 0, len); } } #endregion } return(field); }
public static void SetField(Assembly assembly, SbeField field, String MessageName, object MessageBody) { if (SbeLoader._Enums.Find(x => x.Name == field.Type) != null) { #region Enumeration SetEnumerationField(assembly, field, MessageBody, MessageName); #endregion } else if (SbeLoader._SimpleTypes.Find(x => x.Name == field.Type) != null) { #region Simple Type if (field.Presence.Contains("constant") || String.IsNullOrEmpty(field.Value)) { return; } //SimpleType SbeType simple = SbeLoader._SimpleTypes.Find(x => x.Name == field.Type); if (simple.PrimitiveType.ToLower().Equals("char")) { FieldInfo fi = ReflectionHelper.GetFieldByName(assembly, MessageName, field.Name + "CharacterEncoding"); byte[] fieldByte = System.Text.Encoding.GetEncoding(fi.GetValue(MessageBody).ToString()).GetBytes(field.Value); MethodInfo mi = ReflectionHelper.GetMethodByName(assembly, MessageName, "Set" + field.Name, "byte[]"); mi.Invoke(MessageBody, new object[] { fieldByte, 0 }); } else { PropertyInfo pi = ReflectionHelper.GetPropertyByName(assembly, MessageName, field.Name); pi.SetValue(MessageBody, Convert.ChangeType(field.Value, pi.PropertyType)); } #endregion } else if (SbeLoader._CompositeTypes.Find(x => x.Name == field.Type) != null) { #region Composite if (field.Type.ToLower().Equals("groupsizeencoding")) { #region groupsizeencoding //var sides = cross.NoSidesCount(2); //sides.Next(); //sides.Side = Side.BUY; //sides.Account = 111; //sides.ClOrdID = 12345; //sides.Next(); //sides.Side = Side.SELL; //sides.Account = 222; //sides.ClOrdID = 67890; MethodInfo mi = ReflectionHelper.GetMethodByName(assembly, MessageName, field.Name + "Count"); var repeatGroup = mi.Invoke(MessageBody, new object[] { int.Parse(field.Value) }); MethodInfo next = ReflectionHelper.GetNestedMethodByName(assembly, MessageName, field.Name + "Group", "next"); SbeMessage _Original = SbeLoader.LoadMessageByName(MessageName); SbeField _OriginalField = _Original.Fields.Find(x => x.Name == field.Name).Clone(); foreach (SbeField child in field.Fields) { if (child.Name == _OriginalField.Fields[0].Name) { next.Invoke(repeatGroup, null); } if (!String.IsNullOrEmpty(child.Value)) { if (SbeLoader._Enums.Find(x => x.Name == child.Type) != null) { if (child.Presence.Contains("constant") || String.IsNullOrEmpty(child.Value)) { continue; } Type _enumType = ReflectionHelper.GetType(assembly, child.Type); if (_enumType.IsEnum) { SbeEnum _enum = SbeLoader._Enums.Find(x => x.Name == child.Type); SbeEnumValidValue valid = _enum.ValidValues.Find(x => x.Value == child.Value); PropertyInfo pi = ReflectionHelper.GetNestedPropertyByName(assembly, MessageName, field.Name + "Group", child.Name); pi.SetValue(repeatGroup, Enum.Parse(_enumType, valid.Name)); } } else { PropertyInfo pi = ReflectionHelper.GetNestedPropertyByName(assembly, MessageName, field.Name + "Group", child.Name); pi.SetValue(repeatGroup, Convert.ChangeType(child.Value, pi.PropertyType)); } } } #endregion } else { PropertyInfo pi = ReflectionHelper.GetPropertyByName(assembly, MessageName, field.Type); if (pi != null) { object parent = pi.GetValue(MessageBody); foreach (SbeField child in field.Fields) { if (child.Presence.Contains("constant") || String.IsNullOrEmpty(child.Value)) { continue; } PropertyInfo pi2 = ReflectionHelper.GetPropertyByName(assembly, field.Type, child.Name); pi2.SetValue(parent, Convert.ChangeType(child.Value, pi2.PropertyType)); } } else { // Manufacturer = Encoding.GetEncoding(Car.ManufacturerCharacterEncoding).GetBytes("Honda"); // car.SetManufacturer(Manufacturer, srcOffset, Manufacturer.Length); FieldInfo fi = ReflectionHelper.GetFieldByName(assembly, MessageName, field.Name + "CharacterEncoding"); byte[] fieldByte = System.Text.Encoding.GetEncoding(fi.GetValue(MessageBody).ToString()) .GetBytes(field.Value); MethodInfo mi = ReflectionHelper.GetMethodByName(assembly, MessageName, "Set" + field.Name, "byte[]"); mi.Invoke(MessageBody, new object[] { fieldByte, 0, fieldByte.Length }); //mi.Invoke(MessageBody, new object[] { fieldByte, 0 }); } } #endregion } }
private void tree_CellEditFinishing(object sender, BrightIdeasSoftware.CellEditEventArgs e) { if (e.Cancel) { return; } SbeField field = (SbeField)e.RowObject; if (e.Control is ComboBox) { if (e.Column.Text == "PrimitiveType") { field.PrimitiveType = e.Control.Text.Trim(); switch (field.PrimitiveType) { case "uint8": case "int8": field.Length = 1; break; case "uint16": case "int16": field.Length = 2; break; case "uint32": case "int32": field.Length = 4; break; case "uint64": case "int64": field.Length = 8; break; case "char": field.Length = 10; break; } } else if (e.Column.Text == "Value") { if (e.Control.Text.Contains("|")) { field.Value = e.Control.Text.Split('|')[0].Trim(); } else { field.Value = e.Control.Text.Trim(); } } } else if (e.Control is TextBox) { if (e.Column.Text == "Value") { field.Value = e.Control.Text.Trim(); } else if (e.Column.Text == "Length") { field.Length = int.Parse(e.Control.Text.Trim()); } } if (field.Type.ToLower().Equals("groupsizeencoding")) { try { int repeating = int.Parse(field.Value); int repeatingGroupAtual = field.Fields.FindAll(x => x.Name == field.Fields[0].Name).Count; SbeMessage _Original = null; if (checkBox1.Checked) { _Original = SbeLoader.LoadMessageByName(_Message[1].Name); } else { _Original = SbeLoader.LoadMessageByName(_Message[0].Name); } SbeField _OriginalField = _Original.Fields.Find(x => x.Name == field.Name).Clone(); if (repeating > repeatingGroupAtual) { while (repeating > repeatingGroupAtual) { SbeField _FieldOriginal = _OriginalField.Clone(); field.Fields.AddRange(_FieldOriginal.Fields); repeatingGroupAtual = field.Fields.FindAll(x => x.Name == field.Fields[0].Name).Count; } } else if (repeating < repeatingGroupAtual) { while (repeating < repeatingGroupAtual) { foreach (SbeField _ChildField in _OriginalField.Fields) { SbeField toRemove = field.Fields.FindLast(x => x.Name == _ChildField.Name); field.Fields.Remove(toRemove); } repeatingGroupAtual = field.Fields.FindAll(x => x.Name == field.Fields[0].Name).Count; } } tree.Roots = _Message; tree.ExpandAll(); } catch { } } tree.RefreshItem(e.ListViewItem); e.Cancel = true; }
public String DecodeSBEMessage(byte[] MessageBytes) { if (_Assembly == null) { throw new Exception("To use SBE Engine, please init SbeReflectionWrapper passing the sbe file dll as parameter"); } StringBuilder sb = new StringBuilder(); var directBuffer = new DirectBuffer(MessageBytes); int bufferOffset = 0; const short SchemaVersion = 0; Type MessageHeaderType = ReflectionHelper.GetType(_Assembly, _Header); var MessageHeaderObj = ReflectionHelper.GetObjectByType(_Assembly, _Header); //WRAP MessageHeaderType.InvokeMember("Wrap", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, MessageHeaderObj, new object[] { directBuffer, bufferOffset, SchemaVersion }); PropertyInfo pi = ReflectionHelper.GetPropertyByName(_Assembly, _Header, "TemplateId"); string templateId = pi.GetValue(MessageHeaderObj).ToString().Trim(); Type MessageBodyType = ReflectionHelper.GetMessageTypeByTemplateId(_Assembly, templateId); if (MessageBodyType == null) { throw new Exception(String.Format("TemplateID = {0} not found in the binary!", templateId)); } SbeMessage Message = SbeLoader.LoadMessageById(templateId); if (Message == null) { throw new Exception(String.Format("TemplateID = {0} not found in the protocol!", templateId)); } PropertyInfo blockLength = ReflectionHelper.GetPropertyByName(_Assembly, _Header, "blockLength"); PropertyInfo schemaId = ReflectionHelper.GetPropertyByName(_Assembly, _Header, "schemaId"); PropertyInfo version = ReflectionHelper.GetPropertyByName(_Assembly, _Header, "version"); sb.AppendLine(CrackHelper.CreateLine("Header", "BlockLength", blockLength.GetValue(MessageHeaderObj).ToString().Trim())); sb.AppendLine(CrackHelper.CreateLine("Header", "TemplateID", String.Format("{0} ({1})", templateId, Message.Name))); sb.AppendLine(CrackHelper.CreateLine("Header", "SchemaId", schemaId.GetValue(MessageHeaderObj).ToString().Trim())); sb.AppendLine(CrackHelper.CreateLine("Header", "Version", version.GetValue(MessageHeaderObj).ToString().Trim())); var MessageBodyObj = ReflectionHelper.GetObjectByType(_Assembly, MessageBodyType.FullName); FieldInfo size = ReflectionHelper.GetFieldByName(_Assembly, _Header, "Size"); bufferOffset += int.Parse(size.GetValue(MessageHeaderObj).ToString()); FieldInfo actingBlockLength = ReflectionHelper.GetFieldByName(_Assembly, MessageBodyType.Name, "BlockLength"); FieldInfo actingVersion = ReflectionHelper.GetFieldByName(_Assembly, MessageBodyType.Name, "Version"); MessageBodyType.InvokeMember("WrapForDecode", BindingFlags.InvokeMethod | BindingFlags.Instance | BindingFlags.Public, null, MessageBodyObj, new object[] { directBuffer, bufferOffset, int.Parse(actingBlockLength.GetValue(MessageHeaderObj).ToString()), int.Parse(actingVersion.GetValue(MessageHeaderObj).ToString()) }); Message.FillFields(_Assembly, MessageBodyObj); sb.Append(Message.Crack()); return(sb.ToString()); }
static void Main(string[] args) { TcpListener server = null; try { // Set the TcpListener on port 13000. Int32 port = 13000; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); // TcpListener server = new TcpListener(port); server = new TcpListener(localAddr, port); // Start listening for client requests. server.Start(); // Buffer for reading data Byte[] bytes = new Byte[256]; // Enter the listening loop. while (true) { Console.Write("Waiting for a connection... "); // Perform a blocking call to accept requests. // You could also user server.AcceptSocket() here. TcpClient client = server.AcceptTcpClient(); Console.WriteLine("Connected!"); // Get a stream object for reading and writing NetworkStream stream = client.GetStream(); int i; // Loop to receive all the data sent by the client. while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { var byteBuffer = new byte[4096]; // You need to "wrap" the array with a DirectBuffer, this class is used by the generated code to read and write efficiently to the underlying byte array var directBuffer = new DirectBuffer(bytes); int bufferOffset = 0; const short SchemaVersion = 0; string type = "qatsbeengine"; switch (type) { #region car case "car": var MessageHeader = new Sbe.MessageHeader(); var Car = new Sbe.Car(); // position the MessageHeader object at the beginning of the array MessageHeader.Wrap(directBuffer, bufferOffset, SchemaVersion); Console.WriteLine("MessageHeader.BlockLength=" + MessageHeader.BlockLength); Console.WriteLine("MessageHeader.TemplateId=" + MessageHeader.TemplateId); Console.WriteLine("MessageHeader.SchemaId=" + MessageHeader.SchemaId); Console.WriteLine("MessageHeader.Version=" + MessageHeader.Version); // Extract info from the header // In a real app you would use that to lookup the applicable flyweight to decode this type of message based on templateId and version. int actingBlockLength = MessageHeader.BlockLength; int actingVersion = MessageHeader.Version; bufferOffset += Sbe.MessageHeader.Size; // now we decode the message CarExample.Decode(Car, directBuffer, bufferOffset, actingBlockLength, actingVersion); break; #endregion case "fix": var MessageHeaderFix = new SbeFIX.MessageHeader(); var sno = new NegotiateResponse(); // position the MessageHeader object at the beginning of the array MessageHeaderFix.Wrap(directBuffer, bufferOffset, SchemaVersion); Console.WriteLine("MessageHeader.BlockLength=" + MessageHeaderFix.BlockLength); Console.WriteLine("MessageHeader.TemplateId=" + MessageHeaderFix.TemplateId); Console.WriteLine("MessageHeader.SchemaId=" + MessageHeaderFix.SchemaId); Console.WriteLine("MessageHeader.Version=" + MessageHeaderFix.Version); // Extract info from the header // In a real app you would use that to lookup the applicable flyweight to decode this type of message based on templateId and version. int actingBlockLengthFix = MessageHeaderFix.BlockLength; int actingVersionFix = MessageHeaderFix.Version; bufferOffset += SbeFIX.MessageHeader.Size; // now we decode the message NewOrderSingleExample.Decode(sno, directBuffer, bufferOffset, actingBlockLengthFix, actingVersionFix); break; case "qatsbeengine": try { SbeReflectionWrapper _Wrapper = new SBEReflection.SbeReflectionWrapper(); SbeLoader.Load(@"C:\Users\Akio\source\repos\POC_SBE\packages\sbe-tool.1.17.0\tools\fixp-entrypoint-messages-1.2.xml"); Console.WriteLine(_Wrapper.DecodeSBEMessageQATEngine(bytes)); } catch (Exception ex) { Console.WriteLine(ex.Message); } break; case "reflection": try { SbeReflectionWrapper _Wrapper = new SBEReflection.SbeReflectionWrapper(@"C:\Users\Akio\source\repos\POC_SBE\fixp-entrypoint-messages-1.2\bin\Debug\fixp-entrypoint-messages-1.2.dll"); SbeLoader.Load(@"C:\Users\Akio\source\repos\POC_SBE\packages\sbe-tool.1.17.0\tools\fixp-entrypoint-messages-1.2.xml"); Console.WriteLine(_Wrapper.DecodeSBEMessage(bytes)); } catch (Exception ex) { Console.WriteLine(ex.Message); } break; } } // Shutdown and end connection client.Close(); } } catch (SocketException e) { Console.WriteLine("SocketException: {0}", e); } finally { // Stop listening for new clients. server.Stop(); } Console.WriteLine("\nHit enter to continue..."); Console.Read(); }