diff -r 000000000000 -r 818e61de6cd1 crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianParserLib/Elements/ParserElementParagraph.cs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/crashanalysercmd/PerfToolsSharedLibraries/Engine/SymbianParserLib/Elements/ParserElementParagraph.cs Thu Feb 11 15:50:58 2010 +0200 @@ -0,0 +1,215 @@ +/* +* 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.RegExTranslators; +using SymbianParserLib.BaseStructures; + +namespace SymbianParserLib.Elements +{ + public class ParserParagraph : ParserElementBaseWithValueStore, IEnumerable + { + #region Constructors + public ParserParagraph( string aName ) + : base( aName ) + { + } + #endregion + + #region API + public void Add( ParserLine aLine ) + { + aLine.Parent = this; + aLine.ElementComplete += new ElementCompleteHandler( Line_ElementComplete ); + iLines.Add( aLine ); + } + + public void Add( params ParserLine[] aLines ) + { + foreach ( ParserLine line in aLines ) + { + Add( line ); + } + } + + public void Remove( ParserLine aLine ) + { + aLine.ElementComplete -= new ElementCompleteHandler( Line_ElementComplete ); + iLines.Remove( aLine ); + } + #endregion + + #region Properties + public ParserLine this[ int aIndex ] + { + get { return iLines[ aIndex ]; } + } + + public int Count + { + get { return iLines.Count; } + } + #endregion + + #region From ParserElementBase + internal override ParserResponse Offer( ref string aLine ) + { + ParserResponse ret = new ParserResponse(); + // + foreach ( ParserLine line in this ) + { + if ( !line.IsDisabled ) + { + ret = line.Offer( ref aLine ); + if ( ret.Type != ParserResponse.TResponseType.EResponseTypeUnhandled ) + { + break; + } + } + } + // + return ret; + } + #endregion + + #region From ParserElementBaseWithValueStore + internal override void SetTargetProperty( object aPropertyObject, string aPropertyName, int aIndex ) + { + if ( aIndex == ParserElementBaseWithValueStore.KGloballyApplicable ) + { + } + else + { + int cumulativeFieldCount = 0; + int count = iLines.Count; + for ( int i = 0; i < count; i++ ) + { + ParserLine line = this[ i ]; + int fieldCountForLine = line.Count; + int lastFieldIndexWithinLine = cumulativeFieldCount + fieldCountForLine; + // + if ( aIndex < fieldCountForLine ) + { + int index = aIndex - cumulativeFieldCount; + line.SetTargetProperty( aPropertyObject, aPropertyName, index ); + break; + } + // + cumulativeFieldCount += fieldCountForLine; + } + } + } + #endregion + + #region Event handlers + void Line_ElementComplete( ParserElementBase aElement ) + { + int completeCount = 0; + foreach( ParserLine line in iLines ) + { + if ( line.IsComplete && !line.IsNeverEnding ) + { + ++completeCount; + } + } + // + IsComplete = ( completeCount == Count ); + } + #endregion + + #region Internal methods + #endregion + + #region Internal constants + #endregion + + #region From IEnumerable + public IEnumerator GetEnumerator() + { + return new ParserParagraphEnumerator( this ); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return new ParserParagraphEnumerator( this ); + } + #endregion + + #region From System.Object + public override string ToString() + { + return base.ToString(); + } + #endregion + + #region Data members + private List iLines = new List(); + #endregion + } + + #region Enumerator + internal class ParserParagraphEnumerator : IEnumerator + { + #region Constructors + public ParserParagraphEnumerator( ParserParagraph 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 + ParserLine IEnumerator.Current + { + get { return iObject[ iCurrentIndex ]; } + } + #endregion + + #region From IDisposable + public void Dispose() + { + } + #endregion + + #region Data members + private readonly ParserParagraph iObject; + private int iCurrentIndex = -1; + #endregion + } + #endregion +}