public bool GetCurrentMessageAndMoveToNextOne(TextMessageCapture capture) { if (capture == null) { throw new ArgumentNullException("capture"); } CheckIsReading(); if (CurrentMessageHeaderIsEmpty) { return(false); } if (capture.HeaderMatch == null || capture.HeaderMatch.OwnerRegex != re) { capture.HeaderMatch = re.CreateEmptyMatch(); } if (direction == MessagesParserDirection.Forward) { return(GetCurrentMessageAndMoveToNextOneFwd(capture)); } else { return(GetCurrentMessageAndMoveToNextOneBwd(capture)); } }
bool GetCurrentMessageAndMoveToNextOneFwd(TextMessageCapture capture) { if (headerBeginPosition >= range.End) { return(false); } capture.HeaderBuffer = cachedCurrentBuffer; capture.HeaderMatch.CopyFrom(currentMessageHeaderMatch); capture.BeginPosition = headerBeginPosition; bool nextMessageFound = FindNextMessageStart(); capture.BodyBuffer = cachedCurrentBuffer; if (nextMessageFound) { capture.BodyIndex = prevHeaderPointer1; capture.BodyLength = headerPointer2 - prevHeaderPointer1; capture.EndPosition = headerBeginPosition; capture.IsLastMessage = capture.EndPosition >= range.End; } else { capture.BodyIndex = headerPointer1; capture.BodyLength = capture.BodyBuffer.Length - headerPointer1; capture.EndPosition = textIterator.CharIndexToPosition(capture.BodyBuffer.Length); capture.IsLastMessage = true; } return(true); }
public SearchingParser( IPositionedMessagesReader owner, CreateSearchingParserParams p, TextStreamPositioningParams textStreamPositioningParams, DejitteringParams?dejitteringParams, Stream rawStream, Encoding streamEncoding, bool allowPlainTextSearchOptimization, LoadedRegex headerRe, ILogSourceThreads threads, ITraceSourceFactory traceSourceFactory, RegularExpressions.IRegexFactory regexFactory ) { this.owner = owner; this.parserParams = p; this.plainTextSearchOptimizationAllowed = allowPlainTextSearchOptimization && ((p.Flags & MessagesParserFlag.DisablePlainTextSearchOptimization) == 0); this.threads = threads; this.requestedRange = p.Range; this.textStreamPositioningParams = textStreamPositioningParams; this.dejitteringParams = dejitteringParams; this.rawStream = rawStream; this.streamEncoding = streamEncoding; this.regexFactory = regexFactory; this.trace = traceSourceFactory.CreateTraceSource("LogSource", "srchp." + GetHashCode().ToString("x")); this.dummyFilter = new Filter(FilterAction.Include, "", true, new Search.Options(), null, regexFactory); var continuationToken = p.ContinuationToken as ContinuationToken; if (continuationToken != null) { this.requestedRange = new FileRange.Range(continuationToken.NextPosition, requestedRange.End); } this.aligmentTextAccess = new StreamTextAccess(rawStream, streamEncoding, textStreamPositioningParams); this.aligmentSplitter = new MessagesSplitter(aligmentTextAccess, headerRe.Clone().Regex, headerRe.GetHeaderReSplitterFlags()); this.aligmentCapture = new TextMessageCapture(); this.progressAndCancellation = new ProgressAndCancellation() { progressHandler = p.ProgressHandler, cancellationToken = p.Cancellation, continuationToken = new ContinuationToken() { NextPosition = requestedRange.Begin } }; this.impl = Enum(); }
bool GetCurrentMessageAndMoveToNextOneBwd(TextMessageCapture capture) { int headerEnd = headerPointer2; long captureEndPos; if (headersCounter == 1) // first message when reading backward is the last message { captureEndPos = textIterator.CharIndexToPosition(prevHeaderPointer1); } else { captureEndPos = prevHeaderBeginPosition; } if (captureEndPos <= range.Begin) { return(false); } capture.HeaderBuffer = cachedCurrentBuffer; capture.HeaderMatch.CopyFrom(currentMessageHeaderMatch); capture.BeginPosition = headerBeginPosition; capture.EndPosition = captureEndPos; capture.BodyBuffer = cachedCurrentBuffer; capture.BodyIndex = headerEnd; if (headersCounter == 1) // first message when reading backward is the last message { capture.BodyLength = prevHeaderPointer1 - headerEnd; capture.IsLastMessage = true; } else { capture.BodyLength = prevHeaderPointer1 - headerEnd; capture.IsLastMessage = false; } FindNextMessageStart(); return(true); }
public bool GetCurrentMessageAndMoveToNextOne(TextMessageCapture capture) { return(underlyingSplitter.GetCurrentMessageAndMoveToNextOne(capture)); }
public void BeginSplittingSession(FileRange.Range range, long startPosition, MessagesParserDirection direction) { if (direction == MessagesParserDirection.Forward) { if (startPosition > range.Begin) { long?fixedStartPosition = null; underlyingSplitter.BeginSplittingSession(range, startPosition, MessagesParserDirection.Backward); try { TextMessageCapture capt = new TextMessageCapture(); if (underlyingSplitter.GetCurrentMessageAndMoveToNextOne(capt)) { fixedStartPosition = capt.EndPosition; } } finally { underlyingSplitter.EndSplittingSession(); } if (fixedStartPosition != null) { underlyingSplitter.BeginSplittingSession(range, fixedStartPosition.Value, direction); try { TextMessageCapture capt = new TextMessageCapture(); while (underlyingSplitter.GetCurrentMessageAndMoveToNextOne(capt)) { if (capt.BeginPosition >= startPosition) { break; } fixedStartPosition = capt.EndPosition; } } finally { underlyingSplitter.EndSplittingSession(); } startPosition = fixedStartPosition.Value; } } } else { if (startPosition < range.End) { long?fixedStartPosition = null; underlyingSplitter.BeginSplittingSession(range, startPosition, MessagesParserDirection.Forward); try { TextMessageCapture capt = new TextMessageCapture(); if (underlyingSplitter.GetCurrentMessageAndMoveToNextOne(capt)) { fixedStartPosition = capt.BeginPosition; } } finally { underlyingSplitter.EndSplittingSession(); } if (fixedStartPosition != null) { underlyingSplitter.BeginSplittingSession(range, fixedStartPosition.Value, direction); try { TextMessageCapture capt = new TextMessageCapture(); while (underlyingSplitter.GetCurrentMessageAndMoveToNextOne(capt)) { if (capt.EndPosition <= startPosition) { break; } fixedStartPosition = capt.BeginPosition; } } finally { underlyingSplitter.EndSplittingSession(); } startPosition = fixedStartPosition.Value; } } } underlyingSplitter.BeginSplittingSession(range, startPosition, direction); }