public static bool DecodeMrnData(XmlFragmentList fragmentList, out MrnMsgList mrnList, out string errorMsg) { var result = Task.Run(() => DecodeMrnDataAsync(fragmentList)).Result; mrnList = result.Item2; errorMsg = result.Item3; return(result.Item1); }
private async void LoadXmlBtn_OnClick(object sender, RoutedEventArgs e) { UnpackMrnBtn.IsEnabled = false; XmlTreeView.Items.Clear(); var openFileDialog = new OpenFileDialog(); if (openFileDialog.ShowDialog() != true) { return; } FileLocationTxt1.Text = openFileDialog.FileName; if (FileLocationTxt1.Text.Trim() == string.Empty) { return; } Title = $"{_defaultTitle}::Loading XML file from \"{FileLocationTxt1.Text}\""; LoadXmlBtn.IsEnabled = false; _fragmentCollection.Clear(); XmlFragments = await BuildXMLFragments(FileLocationTxt1.Text, _useRdmStrictMode) .ConfigureAwait(false); if (XmlFragments == null) { Title = $"{_defaultTitle}"; LoadXmlBtn.IsEnabled = true; return; } //try { _messageList = await DecodeMrn(XmlFragments); } //catch (Exception ex) // { // MessageBox.Show(ex.Message); // } Application.Current.Dispatcher.Invoke(() => { XmlFragmentGrid1.ItemsSource = _fragmentCollection; Title = $"{_defaultTitle} Found {_fragmentCollection.Count} XML Fragments"; LoadXmlBtn.IsEnabled = true; UpdateDataGridFilterComboboxItems(); }); }
public static async Task <Tuple <bool, MrnMsgList, string> > DecodeMrnDataAsync(XmlFragmentList fragmentList) { var mrnList = new MrnMsgList(); var errorMsg = string.Empty; await Task.Run(() => { try { List <XElement> elements; foreach (var fragment in fragmentList.Fragments) { //process Attribues if (string.IsNullOrEmpty(fragment.RawXmlData)) { continue; } var list = XmlHelper.GetElement(fragment.RawXmlData, fragment.RdmMessageType); elements = list.ToList(); if (!elements.Any()) { continue; } var mrndata = new MrnMsg(StringtoType(fragment.RdmMessageType)); if (elements.First().HasAttributes) { var elementAttribs = new Dictionary <string, string>(); foreach (var attrib in elements.First().Attributes()) { elementAttribs.Add(attrib.Name.LocalName, attrib.Value); } // The following check is for EMA Java as it use domainType News_TEXT_ANALYTICS rather than RSSL_DMT_NEWS_TEXT_ANALYTICS as C++ and .NET mrndata.DomainType = elementAttribs["domainType"] == "NEWS_TEXT_ANALYTICS" ? "RSSL_DMT_NEWS_TEXT_ANALYTICS" : elementAttribs["domainType"]; mrndata.SetFragmentAttribs(elementAttribs); } //process Key var keys = XmlHelper.GetElement(fragment.RawXmlData, "key"); var enumerable = keys.ToList(); if (enumerable.Any()) { mrndata.ContainsKey = true; var keysAttrib = new Dictionary <string, string>(); foreach (var key in enumerable.First().Attributes()) { if (key.Name == "name") { mrndata.RequestKeyName = key.Value; } keysAttrib.Add(key.Name.LocalName, key.Value); } mrndata.SetKeyAtrribs(keysAttrib); } if (mrndata.DomainType == "RSSL_DMT_NEWS_TEXT_ANALYTICS" || mrndata.DomainType == "RSSL_DMT_MARKET_PRICE") { //process fieldList var fields = XmlHelper.GetElement(fragment.RawXmlData, "fieldEntry"); var xElements = fields.ToList(); if (xElements.Any()) { mrndata.ContainsFieldList = true; var fieldEntrys = new Dictionary <int, string>(); foreach (var elem in xElements) { var fid = from id in elem.Attributes() where id.Name == "fieldId" select id.Value; var fidId = int.Parse(fid.First().Trim()); var fValue = from fieldvalue in elem.Attributes() where fieldvalue.Name == "data" select fieldvalue.Value; var pBuffer = new string(fValue.First().ToCharArray() .Where(c => !char.IsWhiteSpace(c)) .ToArray()); //4271 is GUID. fieldEntrys.Add(fidId, fidId == 4271 ? Encoding.UTF8.GetString( RdmDataConverter.StringToByteArray(pBuffer.Trim())) : pBuffer); } mrndata.SetFieldList(fieldEntrys); } } mrndata.FragmentNumber = fragment.FragmentNumber; mrnList.Add(fragment.FragmentNumber, mrndata); } } catch (Exception ex) { errorMsg = $"DecodeMrnData error {ex.Message}\r\n{ex.StackTrace}"; return(new Tuple <bool, MrnMsgList, string>(false, mrnList, errorMsg)); } return(new Tuple <bool, MrnMsgList, string>(true, mrnList, errorMsg)); }); return(new Tuple <bool, MrnMsgList, string>(true, mrnList, errorMsg)); }
private async Task <MrnMsgList> DecodeMrn(XmlFragmentList xmlFragments) { var messageList = new MrnMsgList(); await Task.Run(async() => { var decodeMrnResult = await MrnFragmentDecoder.DecodeMrnDataAsync(xmlFragments) .ConfigureAwait(false); if (!decodeMrnResult.Item1) { MessageBox.Show(decodeMrnResult.Item3); return(null); } messageList = decodeMrnResult.Item2; foreach (var data in xmlFragments.Fragments) { var xmlFragment = new XMLFragmentsData { Index = data.FragmentNumber, RdmMessageType = data.RdmMessageType, TimeStamp = data.TimeStamp, DomainType = messageList.Get(data.FragmentNumber).DomainType, MsgDirection = data.MsgTypeRawXmlData != string.Empty ? data.IsIncomingMsg ? "Incoming" : "Outgoing" : string.Empty, XmlRawData = data.RawXmlData, GUID = string.Empty, RequestKeyName = messageList.Get(data.FragmentNumber).RequestKeyName ?? string.Empty, StreamId = int.Parse(messageList.Get(data.FragmentNumber).GetFragmentAttribs()["streamId"]) }; if (messageList.Get(data.FragmentNumber).ContainsFieldList) { if (messageList.Get(data.FragmentNumber).GetFieldList().ContainsKey(4271)) { if (!string.IsNullOrEmpty(messageList.Get(data.FragmentNumber).GetFieldList()[4271].Trim())) { var pBuffer = TraceStringToString( messageList.Get(data.FragmentNumber).GetFieldList()[4271].Trim()); xmlFragment.GUID = pBuffer; } } if (messageList.Get(data.FragmentNumber).GetFieldList().ContainsKey(32479)) { if (!string.IsNullOrEmpty(messageList.Get(data.FragmentNumber).GetFieldList()[32479].Trim()) ) { var mrnFragmentNumber = HexStringToInt(messageList.Get(data.FragmentNumber).GetFieldList()[32479].Trim()) ?? 0; xmlFragment.MrnFragmentNumber = mrnFragmentNumber; } } } Dispatcher.Invoke(() => { _fragmentCollection.Add(xmlFragment); }); } return(messageList); }); return(messageList); }