Пример #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
        /// <summary>
        /// Reads an EDI item from the stream.
        /// An EDI item is an IEdiControl or a message or a ParsingException.
        /// </summary>
        /// <returns>Indication if an item was read.</returns>
        public bool Read()
        {
            Item = null;

            try
            {
                while ((!StreamReader.EndOfStream || Buffer.Any()) && Item == null)
                {
                    ProcessSegment(ReadSegment());

                    if (Separators != null)
                    {
                        continue;
                    }

                    Item = new ParsingException(ErrorCodes.InvalidControlStructure, "No valid interchange header was found.");
                }
            }
            catch (ParsingException ex)
            {
                Item = ex;
            }
            catch (Exception ex)
            {
                Item = new ParsingException(ErrorCodes.Unknown, ex.Message, ex);
            }

            if (StreamReader.EndOfStream && CurrentMessage.Any())
            {
                Item = new ParsingException(ErrorCodes.ImproperEndOfFile, "Unprocessed segments before the end of file.");
                CurrentMessage.Clear();
            }

            return(Item != null);
        }
Пример #3
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;
            }
        }
Пример #4
0
        /// <summary>
        /// Sends the current message across the serial line
        /// </summary>
        public void SendCurrentMessage()
        {
            lock (_serial_port_lock)
            {
                if (_serial_port != null && _serial_port.IsOpen)
                {
                    _serial_port.Write(CurrentMessage.ToArray(), 0, CurrentMessage.Count);
                }
            }

            CurrentMessage.Clear();
            NotifyPropertyChanged("CurrentMessage");
        }
Пример #5
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;
                }
            }
        }
Пример #6
0
 /// <summary>
 /// Clears the current message
 /// </summary>
 public void ClearCurrentMessage()
 {
     CurrentMessage.Clear();
     NotifyPropertyChanged("CurrentMessage");
 }