Exemple #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);
        }
Exemple #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="SegmentContext"/> class.
        /// </summary>
        /// <param name="ediSegment">The segment line.</param>
        /// <param name="separators">The separators.</param>
        public SegmentContext(string ediSegment, Separators separators)
        {
            if (string.IsNullOrEmpty(ediSegment))
            {
                throw new ArgumentNullException("ediSegment");
            }
            if (separators == null)
            {
                throw new ArgumentNullException("separators");
            }

            var dataElements = ediSegment.Split(new [] { separators.DataElement }, StringSplitOptions.None);

            // Support for blank/situational segments
            if (dataElements[0] == ediSegment)
            {
                dataElements[0] = dataElements[0].TrimEnd(separators.Segment);
            }

            Name  = string.Concat(dataElements[0].Take(3));
            Value = ediSegment;

            // UNA segments don't have values
            if (ediSegment.StartsWith(SegmentTags.UNA.ToString(), StringComparison.Ordinal))
            {
                Name = SegmentTags.UNA.ToString();
            }

            if (dataElements.Length > 1)
            {
                // Handle blank segments, e.g. BHT+'
                var firstComponentDataElements = dataElements[1].Split(new[] { separators.ComponentDataElement },
                                                                       StringSplitOptions.None);
                FirstValue = firstComponentDataElements[0];
                if (dataElements.Length > 2)
                {
                    var secondComponentDataElements =
                        dataElements[2].Split(new[] { separators.ComponentDataElement },
                                              StringSplitOptions.None);
                    SecondValue = secondComponentDataElements[0];
                }
                if (Name == Hl && !string.IsNullOrEmpty(dataElements[2]))
                {
                    ParentId = dataElements[2];
                }
            }

            IsJump    = Jump();
            Tag       = ediSegment.ToSegmentTag(separators);
            IsControl = Control();
            LogName   = ToLogName();
        }
Exemple #3
0
        public SegmentContext(string ediSegment, Separators separators)
        {
            if (string.IsNullOrEmpty(ediSegment))
            {
                throw new ArgumentNullException("ediSegment");
            }
            if (separators == null)
            {
                throw new ArgumentNullException("separators");
            }

            var dataElements = ediSegment.Split(new [] { separators.DataElement }, StringSplitOptions.None);

            if (dataElements.Length < 2)
            {
                throw new Exception("Segment is blank.");
            }

            Name  = dataElements[0];
            Value = ediSegment;

            // UNA segments don't have values
            if (ediSegment.StartsWith(SegmentTags.UNA.ToString()))
            {
                Name = SegmentTags.UNA.ToString();
            }

            // Handle blank segments, e.g. BHT+'
            var firstComponentDataElements = dataElements[1].Split(new[] { separators.ComponentDataElement },
                                                                   StringSplitOptions.None);

            FirstValue = firstComponentDataElements[0];
            if (dataElements.Length > 2)
            {
                var secondComponentDataElements =
                    dataElements[2].Split(new[] { separators.ComponentDataElement },
                                          StringSplitOptions.None);
                SecondValue = secondComponentDataElements[0];
            }
            if (Name == Hl && !string.IsNullOrEmpty(dataElements[2]))
            {
                ParentId = dataElements[2];
            }
            IsJump = Name == Hl && FirstValue != null && FirstValue != "1" &&
                     (int.Parse(FirstValue) - int.Parse(ParentId ?? "0") > 1);

            Tag      = ediSegment.ToSegmentTag(separators);
            IsHeader = Header();
            LogName  = ToLogName();
        }