private async void UnpackMRNBtn_OnClick(object sender, RoutedEventArgs e) { try { // Find fragment index from row that we click in Datagrid if (string.IsNullOrEmpty(_fragmentCollection[_selectedIndex].GUID.Trim())) { return; } var xmlGridData = (XMLFragmentsData)XmlFragmentGrid1.SelectedItem; Title = $"{_defaultTitle}::Searching XML Fragment contains GUID {xmlGridData.GUID}"; // Use fragment index to get Guid value and get most of XML Fragments which contains the same guid, // we need some calculation to calculate start index from _messageList data structure. The position of Index user are selecting could be part of fragments. // The row that we choose in Datagrid may not be the first one which provide total size. // Please note that there could be multiple fragments which use the same GUID so we need more complex logic to handle of this issue. var mrnMsgs = _messageList.GetMrnByGuid(xmlGridData.GUID); var startIndex = 0; if (xmlGridData.MrnFragmentNumber <= 1) { startIndex = xmlGridData.Index; } else { // Find the index from mrnMsgs which contains the same GUID and it must has MrnFragmentNumber equals to 1; var currentIndex = mrnMsgs.FindIndex(x => x.FragmentNumber == (_selectedIndex + 1)); // Calculate the startIndex from the currentIndex. startIndex = (int)mrnMsgs?.ElementAt <MrnMsg>(currentIndex - (xmlGridData.MrnFragmentNumber - 1)) .FragmentNumber; } var newIndex = mrnMsgs.FindIndex(x => x.FragmentNumber == startIndex); // Create New list which contains only all fragments for specific guid so we need to remove the duplicated ones. var newList = new List <MrnMsg>(); var currentMrnFragment = 1; newList.Add(mrnMsgs.ElementAt(newIndex)); while (++newIndex < mrnMsgs.Count) { if (mrnMsgs.ElementAt(newIndex).GetFieldList().ContainsKey(32479)) { if (!string.IsNullOrEmpty(mrnMsgs.ElementAt(newIndex).GetFieldList()[32479].Trim())) { currentMrnFragment = HexStringToInt(mrnMsgs.ElementAt(newIndex).GetFieldList()[32479].Trim()) ?? 0; } if (currentMrnFragment == 1) { break; } newList.Add(mrnMsgs.ElementAt(newIndex)); } } Title = $"{_defaultTitle}::Unpacking XML messages containing GUID {xmlGridData.GUID}"; //Pass the list to MrnFragmentDecoder class and call method UnpackMrnData to unpack it. var result = await MrnFragmentDecoder.UnpackMrnDataAsync(newList); if (!result.Item1) { MessageBox.Show($"Unpack Failed {result.Item3}"); return; } //After passing the steps we expected to receive Json data. Reformat the string and then shows it in Display Windows. //We will keep the raw Json data in JsonUnpackToken property so we can save the raw json data to file later. var displayWindows = new DisplayMRNData(); displayWindows.JsonUnpackToken = JToken.Parse(result.Item2); displayWindows.RawData = $"{displayWindows.JsonUnpackToken.ToString(Formatting.Indented)}"; displayWindows.RawData = displayWindows.RawData.Replace("\\n", "\r\n"); displayWindows.RawData = displayWindows.RawData.Replace("\\t", "\t"); displayWindows.RawHeaderText = $" Found {newList.Count} XML Fragments for GUID {xmlGridData.GUID} "; displayWindows.XmlRawTreeView.Items.Clear(); foreach (var fragment in newList) { var settings = new XmlReaderSettings { ConformanceLevel = ConformanceLevel.Fragment, Async = true, IgnoreWhitespace = true }; using (var reader = XmlReader.Create( new StringReader($"{XmlFragments.Get(fragment.FragmentNumber).RawXmlData}"), settings)) { var tree = new TreeViewItem { Header = $"{XmlFragments.Get(fragment.FragmentNumber).TimeRawXmlData} {XmlFragments.Get(fragment.FragmentNumber).MsgTypeRawXmlData}", IsExpanded = true }; displayWindows.XmlRawTreeView.Items.Add(tree); await BuildTreeAsync(reader, tree); } } displayWindows.Title = $"DisplayMRNData:: GUID::{xmlGridData.GUID}"; displayWindows.Show(); Title = _defaultTitle; } catch (Exception ex) { MessageBox.Show( $"Unpack compressed data to Json failed: {ex.Message}\r\nData might be corrupted or contains incomplete data"); } }
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); }