/// <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); }
/// <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); }
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; } }
/// <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"); }
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; } } }
/// <summary> /// Clears the current message /// </summary> public void ClearCurrentMessage() { CurrentMessage.Clear(); NotifyPropertyChanged("CurrentMessage"); }