Example #1
0
        public void SetObject(CapturePacket originalpacket)
        {
            uint ticker = 0;

            textBoxComid.Text = string.Empty;
            textBoxRAW.Text   = string.Empty;
            textBoxSize.Text  = string.Empty;
            textBoxType.Text  = string.Empty;

            var dataLines = new List <DataLine>();

            try
            {
                var extensiveData = CapturePacket.ExtractParsedData(originalpacket, out var displayfields, true);


                if (originalpacket.IPTWPPacket != null)
                {
                    var udp        = (UdpPacket)originalpacket.Packet.PayloadPacket.PayloadPacket;
                    var iptPayload = IPTWPPacket.GetIPTPayload(udp, originalpacket.IPTWPPacket);
                    var iptHeader  = IPTWPPacket.ExtractHeader(udp.PayloadData);

                    textBoxComid.Text = originalpacket.IPTWPPacket.Comid.ToString();

                    textBoxSize.Text = originalpacket.IPTWPPacket.IPTWPSize.ToString();
                    textBoxType.Text = originalpacket.IPTWPPacket.IPTWPType.ToString();

                    if (originalpacket.IPTWPPacket.IPTWPType == IPTTypes.MA)
                    {
                        dataLines.Add(new DataLine(ticker++)
                        {
                            IsCategory = true, Name = "IPTCom Message Acknowledgement"
                        });

                        var ackCode = BitConverter.ToUInt16(new[] { iptPayload[1], iptPayload[0] }, 0);
                        var ackSeq  = BitConverter.ToUInt16(new[] { iptPayload[3], iptPayload[2] }, 0);


                        switch (ackCode)
                        {
                        case 0:
                            dataLines.Add(new DataLine(ticker++)
                            {
                                Name = "Ack Code", Value = "OK"
                            });
                            break;

                        case 1:
                            dataLines.Add(new DataLine(ticker++)
                            {
                                Name = "Ack Code", Value = "NACK, wrong frame check sequence in data part"
                            });
                            break;

                        case 2:
                            dataLines.Add(new DataLine(ticker++)
                            {
                                Name = "Ack Code", Value = "NACK, destination unknown / not listening"
                            });
                            break;

                        case 3:
                            dataLines.Add(new DataLine(ticker++)
                            {
                                Name = "Ack Code", Value = "NACK, wrong data / configuration mismatch"
                            });
                            break;

                        case 4:
                            dataLines.Add(new DataLine(ticker++)
                            {
                                Name = "Ack Code", Value = "NACK, buffer not available"
                            });
                            break;

                        default:
                            dataLines.Add(new DataLine(ticker++)
                            {
                                Name = "Ack Code", Value = "Invalid code: " + ackCode
                            });
                            break;
                        }

                        dataLines.Add(new DataLine(ticker++)
                        {
                            Name = "Ack Sequence", Value = ackSeq.ToString()
                        });
                    }


                    if (extensiveData != null && extensiveData.ParsedFields.Count > 0
                        ) // a parser has chugged out something
                    {
                        dataLines.Add(new DataLine(ticker++)
                        {
                            IsCategory = true, Name = "IPTCom Data"
                        });
                        foreach (var field in extensiveData.ParsedFields)
                        {
                            bool changed = false;
                            if (originalpacket.Previous != null && originalpacket.IPTWPPacket.IPTWPType == IPTTypes.PD)
                            {
                                // not checking for null because frankly it shouldn't happen and we want an exception
                                changed = !originalpacket.Previous.ParsedData.GetField(field.Name).Value
                                          .Equals(field.Value);
                            }

                            dataLines.Add(new DataLine(field, ticker++)
                            {
                                Changed = changed
                            });
                        }
                    }
                }


                if (originalpacket.SS27Packet != null)
                {
                    dataLines.Add(new DataLine(ticker++)
                    {
                        IsCategory = true, Name = "JRU Data"
                    });

                    dataLines.Add(new DataLine(ticker++)
                    {
                        IsCategory = true, Name = "Header"
                    });
                    dataLines.Add(new DataLine(ticker++)
                    {
                        Name  = "Timestamp",
                        Value = originalpacket.SS27Packet.DateTime.ToString() + ":" +
                                originalpacket.SS27Packet.DateTime.Millisecond
                    });
                    dataLines.Add(new DataLine(ticker++)
                    {
                        Name = "Level", Value = originalpacket.SS27Packet.Level
                    });
                    dataLines.Add(new DataLine(ticker++)
                    {
                        Name = "Mode", Value = originalpacket.SS27Packet.Mode
                    });
                    dataLines.Add(new DataLine(ticker++)
                    {
                        Name = "Speed", Value = originalpacket.SS27Packet.V_TRAIN.ToString()
                    });

                    dataLines.AddRange(
                        originalpacket.SS27Packet.Header.Select(parsedField => new DataLine(parsedField, ticker++)));


                    if (originalpacket.SS27Packet.SubMessage != null)
                    {
                        dataLines.Add(new DataLine(ticker++)
                        {
                            IsCategory = true, Name = "SubMessage"
                        });
                        foreach (var parsedField in originalpacket.SS27Packet.SubMessage.ParsedFields)
                        {
                            dataLines.Add(new DataLine(parsedField, ticker++));
                        }
                    }

                    foreach (var ss27PacketExtraMessage in originalpacket.SS27Packet.ExtraMessages)
                    {
                        dataLines.Add(new DataLine(ticker++)
                        {
                            IsCategory = true,
                            Name       = ss27PacketExtraMessage.Name,
                            Comment    = ss27PacketExtraMessage.Comment
                        });
                        foreach (var parsedField in ss27PacketExtraMessage.ParsedFields)
                        {
                            dataLines.Add(new DataLine(parsedField, ticker++));
                        }
                    }
                }

                if (originalpacket.IPTWPPacket == null && originalpacket.SS27Packet == null && extensiveData != null)
                {
                    dataLines.Add(new DataLine(ticker++)
                    {
                        IsCategory = true, Name = extensiveData.Name
                    });

                    foreach (var field in extensiveData.ParsedFields)
                    {
                        dataLines.Add(new DataLine(field, ticker++));
                    }
                }
            }
            catch (Exception e)
            {
                dataLines.Add(new DataLine(ticker++)
                {
                    Name = "Error", Value = e.ToString()
                });
            }

            try
            {
                var text = new StringBuilder(originalpacket.Packet.ToString(StringOutputType.Verbose));


                if (originalpacket.IPTWPPacket != null)
                {
                    // since we have IPT, straight cast to UDP, BAM
                    var udp       = (UdpPacket)originalpacket.Packet.PayloadPacket.PayloadPacket;
                    var bytes     = IPTWPPacket.GetIPTPayload(udp, originalpacket.IPTWPPacket);
                    var iptHeader = IPTWPPacket.ExtractHeader(udp.PayloadData);

                    var maxLenString = iptHeader.Max(pair => pair.Key.Length);

                    foreach (var head in iptHeader)
                    {
                        text.AppendLine("IPT:\t" + head.Key.PadLeft(maxLenString, ' ') + " = " + head.Value);
                    }

                    text.AppendLine("");

                    textBoxRAW.Text = BitConverter.ToString(bytes);

                    string str1 = "";
                    string str2 = "";
                    text.AppendLine("IPT:  ******* Raw Hex Output - length=" + (object)bytes.Length + " bytes");
                    text.AppendLine("IPT: Segment:                   Bytes:                              Ascii:");
                    text.AppendLine("IPT: --------------------------------------------------------------------------");
                    for (int index = 1; index <= bytes.Length; ++index)
                    {
                        str1 = str1 + bytes[index - 1].ToString("x").PadLeft(2, '0') + " ";
                        if (bytes[index - 1] < (byte)33 || bytes[index - 1] > (byte)126)
                        {
                            str2 += ".";
                        }
                        else
                        {
                            str2 += Encoding.ASCII.GetString(new byte[1]
                            {
                                bytes[index - 1]
                            });
                        }
                        if (index % 16 != 0 && index % 8 == 0)
                        {
                            str1 += " ";
                            str2 += " ";
                        }

                        if (index % 16 == 0)
                        {
                            string str3 = ((index - 16) / 16 * 10).ToString().PadLeft(4, '0');
                            text.AppendLine("IPT: " + str3 + "  " + str1 + "  " + str2);
                            str1 = "";
                            str2 = "";
                        }
                        else if (index == bytes.Length)
                        {
                            string str3 = (((index - 16) / 16 + 1) * 10).ToString().PadLeft(4, '0');
                            text.AppendLine("IPT: " + str3.ToString().PadLeft(4, '0') + "  " + str1.PadRight(49, ' ') +
                                            "  " + str2);
                        }
                    }
                }

                richTextBox1.Text = text.ToString();
            }
            catch (Exception e)
            {
                richTextBox1.Text = e.ToString();
            }

            dataListViewRight.DataSource = dataLines;
        }