예제 #1
0
        /// <summary>
        /// Tries to parse what had been collected before a new message starts.
        /// </summary>
        /// <param name="segmentContext">The current segment.</param>
        /// <param name="tag">The start new message tag.</param>
        /// <returns>If flushed.</returns>
        internal bool Flush(SegmentContext segmentContext, SegmentTags tag)
        {
            if ((segmentContext.IsControl || segmentContext.Tag == tag) && CurrentMessage.Any())
            {
                foreach (var c in segmentContext.Value)
                {
                    Buffer.Enqueue(c);
                }
                Buffer.Enqueue(Separators.Segment);

                try
                {
                    if (CurrentGroupHeader != null)
                    {
                        CurrentMessage.Add(CurrentGroupHeader);
                    }
                    Item = CurrentMessage.Analyze(Separators, BuildContext());
                }
                finally
                {
                    CurrentMessage.Clear();
                }

                return(true);
            }

            return(false);
        }
예제 #2
0
        internal override void ProcessSegment(string segment)
        {
            if (string.IsNullOrEmpty(segment) || Separators == null)
            {
                return;
            }

            var segmentContext = new SegmentContext(segment, Separators);

            if (Flush(segmentContext, SegmentId.UNH))
            {
                return;
            }

            switch (segmentContext.Tag)
            {
            case SegmentId.UNA:
                break;

            case SegmentId.UNB:
                Item = segmentContext.Value.ParseSegment <S_UNB>(Separators);
                break;

            case SegmentId.UNG:
                Item = segmentContext.Value.ParseSegment <S_UNG>(Separators);
                break;

            case SegmentId.UNH:
                CurrentMessage.Add(segmentContext);
                break;

            case SegmentId.UNT:
                try
                {
                    CurrentMessage.Add(segmentContext);
                    Item = CurrentMessage.Analyze(Separators, BuildContext());
                }
                finally
                {
                    CurrentMessage.Clear();
                }
                break;

            case SegmentId.UNE:
                Item = segmentContext.Value.ParseSegment <S_UNE>(Separators);
                break;

            case SegmentId.UNZ:
                Item = segmentContext.Value.ParseSegment <S_UNZ>(Separators);
                break;

            default:
                CurrentMessage.Add(segmentContext);
                break;
            }
        }
예제 #3
0
        /// <summary>
        /// Parses a text string for bytes the user would like to add to the current message
        /// Bytes should be separated by spaces.
        /// If a byte starts with "0x", it will be parsed as a hexidecimal value.
        /// Otherwise, it will be parsed as a decimal value.
        /// </summary>
        public void AddBytesToMessage(string text)
        {
            if (!string.IsNullOrEmpty(text))
            {
                var string_pieces = text.Split(new char[] { ' ' }).ToList();
                if (string_pieces.Count > 0)
                {
                    for (int i = 0; i < string_pieces.Count; i++)
                    {
                        var this_piece = string_pieces[i];
                        if (this_piece.StartsWith("0x", StringComparison.CurrentCultureIgnoreCase))
                        {
                            //Parse as a hexidecimal value
                            this_piece = this_piece.Substring(2);
                            bool hex_parsed_successfully = Byte.TryParse(this_piece,
                                                                         NumberStyles.HexNumber, CultureInfo.CurrentCulture, out byte hex_result);
                            if (hex_parsed_successfully)
                            {
                                CurrentMessage.Add(hex_result);
                            }
                        }
                        else
                        {
                            //Parse as a decimal value
                            bool decimal_parsed_successfully = Byte.TryParse(this_piece, out byte decimal_result);
                            if (decimal_parsed_successfully)
                            {
                                CurrentMessage.Add(decimal_result);
                            }
                        }
                    }

                    NotifyPropertyChanged("CurrentMessage");
                }
            }
        }
예제 #4
0
        internal override void ProcessSegment(string segment)
        {
            if (string.IsNullOrEmpty(segment) || Separators == null)
            {
                return;
            }

            var segmentContext = new SegmentContext(segment, Separators);

            if (Flush(segmentContext, SegmentId.ST))
            {
                return;
            }

            switch (segmentContext.Tag)
            {
            case SegmentId.ISA:
                Item = segmentContext.Value.ParseSegment <S_ISA>(Separators);
                break;

            case SegmentId.TA1:
                Item = segmentContext.Value.ParseSegment <S_TA1>(Separators);
                break;

            case SegmentId.GS:
                Item = segmentContext.Value.ParseSegment <S_GS>(Separators);
                CurrentGroupHeader = segmentContext;
                break;

            case SegmentId.ST:
                CurrentMessage.Add(segmentContext);
                break;

            case SegmentId.SE:
                try
                {
                    CurrentMessage.Add(segmentContext);
                    Item = CurrentMessage.Analyze(Separators, BuildContext());
                }
                finally
                {
                    CurrentMessage.Clear();
                }
                break;

            case SegmentId.GE:
                Item = segmentContext.Value.ParseSegment <S_GE>(Separators);
                break;

            case SegmentId.IEA:
                Item = segmentContext.Value.ParseSegment <S_IEA>(Separators);
                break;

            default:
                CurrentMessage.Add(segmentContext);
                break;
            }

            if (segmentContext.IsControl)
            {
                if (segmentContext.Tag != SegmentId.GS)
                {
                    CurrentGroupHeader = null;
                }
            }
        }
예제 #5
0
 private void lineAddButton_Click(object sender, EventArgs e)
 {
     CurrentMessage.Add(new Message());
     lineNum.Items.Add((lineNum.Items.Count + 1) + ": ");
     lineNum.SelectedIndex = lineNum.Items.Count - 1;
 }