diff -r 000000000000 -r 818e61de6cd1 crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianParserLib/Engine/ParserEngine.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianParserLib/Engine/ParserEngine.cs Thu Feb 11 15:50:58 2010 +0200 @@ -0,0 +1,228 @@ +/* +* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ +using System; +using System.Collections.Generic; +using System.Text; +using System.Reflection; +using SymbianParserLib.Enums; +using SymbianParserLib.Elements; +using SymbianParserLib.Exceptions; +using SymbianParserLib.BaseStructures; +using SymbianParserLib.RegExTranslators; + +namespace SymbianParserLib.Engine +{ + public class ParserEngine : BaseStructures.ParserElementBase, IEnumerable + { + #region Delegates and events + public event BaseStructures.ParserElementBase.ElementCompleteHandler ParagraphComplete; + #endregion + + #region Constructors + public ParserEngine() + { + } + #endregion + + #region API + public bool OfferLine( ref string aLine ) + { + iCurrentLine = aLine; + // + ParserResponse response = Offer( ref aLine ); + bool ret = response.WasHandled; + // + return ret; + } + + public void Reset() + { + iParagraphs.Clear(); + } + + public void Remove( ParserParagraph aParagraph ) + { + aParagraph.ElementComplete -= new SymbianParserLib.BaseStructures.ParserElementBase.ElementCompleteHandler( Paragraph_ElementComplete ); + iParagraphs.Remove( aParagraph ); + } + + public void RemoveRange( int aStartAt ) + { + int count = iParagraphs.Count - aStartAt; + iParagraphs.RemoveRange( aStartAt, count ); + } + + public void Add( params ParserParagraph[] aParagraphs ) + { + foreach ( ParserParagraph para in aParagraphs ) + { + Add( para ); + } + } + + public void Add( ParserParagraph aParagraph ) + { + aParagraph.Parent = this; + aParagraph.ElementComplete += new SymbianParserLib.BaseStructures.ParserElementBase.ElementCompleteHandler( Paragraph_ElementComplete ); + iParagraphs.Add( aParagraph ); + } + #endregion + + #region Properties + public int Count + { + get { return iParagraphs.Count; } + } + + public ParserParagraph this[ int aIndex ] + { + get { return iParagraphs[ aIndex ]; } + } + #endregion + + #region From ParserElementBase + internal override string CurrentLine + { + get { return iCurrentLine; } + } + + internal override ParserResponse Offer( ref string aLine ) + { + ++iLineNumber; + // + ParserResponse ret = new ParserResponse(); + // + do + { + ret = TryToConsumeLine( ref aLine ); + } + while ( ret.Type == ParserResponse.TResponseType.EResponseTypeHandledByRequiresReProcessing ); + // + return ret; + } + #endregion + + #region Internal methods + private ParserResponse TryToConsumeLine( ref string aLine ) + { + ParserResponse ret = new ParserResponse(); + // + foreach ( ParserParagraph paragraph in iParagraphs ) + { + if ( !paragraph.IsDisabled ) + { + ret = paragraph.Offer( ref aLine ); + if ( ret.Type != ParserResponse.TResponseType.EResponseTypeUnhandled ) + { + break; + } + } + } + // + return ret; + } + #endregion + + #region Internal constants + #endregion + + #region From IEnumerable + public IEnumerator GetEnumerator() + { + return new ParserEngineEnumerator( this ); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return new ParserEngineEnumerator( this ); + } + #endregion + + #region Internal event handlers + void Paragraph_ElementComplete( SymbianParserLib.BaseStructures.ParserElementBase aElement ) + { + if ( ParagraphComplete != null ) + { + ParagraphComplete( aElement ); + } + } + #endregion + + #region From System.Object + public override string ToString() + { + return base.ToString(); + } + #endregion + + #region Data members + private long iLineNumber = 0; + private string iCurrentLine = string.Empty; + private List iParagraphs = new List(); + #endregion + } + + #region Enumerator + internal class ParserEngineEnumerator : IEnumerator + { + #region Constructors + public ParserEngineEnumerator( ParserEngine aObject ) + { + iObject = aObject; + } + #endregion + + #region IEnumerator Members + public void Reset() + { + iCurrentIndex = -1; + } + + public object Current + { + get + { + return iObject[ iCurrentIndex ]; + } + } + + public bool MoveNext() + { + return ( ++iCurrentIndex < iObject.Count ); + } + #endregion + + #region From IEnumerator + ParserParagraph IEnumerator.Current + { + get { return iObject[ iCurrentIndex ]; } + } + #endregion + + #region From IDisposable + public void Dispose() + { + } + #endregion + + #region Data members + private readonly ParserEngine iObject; + private int iCurrentIndex = -1; + #endregion + } + #endregion +}