stif/Parser/src/StifSectionParser.cpp
changeset 0 a03f92240627
child 18 3406c99bc375
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/stif/Parser/src/StifSectionParser.cpp	Tue Feb 02 01:57:15 2010 +0200
@@ -0,0 +1,1107 @@
+/*
+* 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: This module contains implementation of 
+* CStifSectionParser class member functions.
+*
+*/
+
+// INCLUDE FILES
+#include <e32std.h>
+#include "StifSectionParser.h"
+#include "ParserTracing.h"
+
+// EXTERNAL DATA STRUCTURES
+// None
+
+// EXTERNAL FUNCTION PROTOTYPES
+// None
+
+// CONSTANTS
+// None
+
+// MACROS
+// None
+
+// LOCAL CONSTANTS AND MACROS
+// None
+
+// MODULE DATA STRUCTURES
+// None
+
+// LOCAL FUNCTION PROTOTYPES
+// None
+
+// FORWARD DECLARATIONS
+// None
+
+// ==================== LOCAL FUNCTIONS =======================================
+// None
+
+// ================= MEMBER FUNCTIONS =========================================
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: CStifSectionParser
+
+    Description: Default constructor.
+
+    C++ default constructor can NOT contain any code, that
+    might leave.
+
+    Parameters: const TInt aLength: in: Parsed section length
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CStifSectionParser::CStifSectionParser( const TInt aLength ) :
+    iSection( 0, 0 ),
+    iLength( aLength ),
+    iSkipAndMarkPos( 0 ),
+    iLineIndicator( EFalse )
+    {
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: ConstructL
+
+    Description: Symbian OS second phase constructor.
+
+    Symbian OS default constructor can leave.
+
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions:  Leaves if iLength is negative
+                        Leaves if called NewL method fails
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+void CStifSectionParser::ConstructL()
+    {
+    // Construct modifiable heap-based descriptor
+    iHBufferSection = HBufC::NewL( iLength );
+    iSection.Set(iHBufferSection->Des());
+
+    iSubOffset = 0;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: NewL
+
+    Description: Two-phased constructor.
+
+    Parameters: const TInt aLength: in: Parsed section length
+
+    Return Values: CStifSectionParser* : pointer to CStifSectionParser object
+
+    Errors/Exceptions:  Leaves if section length is negative
+                        Leaves if construction fails
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+CStifSectionParser* CStifSectionParser::NewL( const TInt aLength )
+    {
+    __TRACE( KInfo, ( _L( "STIFPARSER: Create a section" ) ) );
+    __ASSERT_ALWAYS( aLength > 0, User::Leave( KErrArgument ) );
+
+    CStifSectionParser* item = new (ELeave) CStifSectionParser( aLength );
+
+    CleanupStack::PushL( item );
+    item->ConstructL();
+    CleanupStack::Pop( item );
+
+    return item;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: ~CStifSectionParser
+
+    Description: Destructor
+
+    Parameters: None
+
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/    
+CStifSectionParser::~CStifSectionParser()
+    {
+    __TRACE( KInfo, ( _L( "STIFPARSER: Call destructor '~CStifSectionParser'" ) ) );
+
+    delete iHBufferSection;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: ParseStartAndEndPos
+
+    Description: Start and end position parser.
+
+    Parameters: TPtrC aSection: in: Parsed section
+                const TDesC& aStartTag: in: Start tag of parsing
+                TTagToReturnValue aTagIndicator: in: Will aStartTag included to
+                the returned values
+                TInt& aStartPos: inout: Start point of parsing
+                TInt& aEndPos: inout: End point of parsing
+                TInt& aLength: inout: Length of parsed section
+
+    Return Values: TInt: Error code
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+TInt CStifSectionParser::ParseStartAndEndPos( TPtrC aSection,
+                                            const TDesC& aStartTag,
+                                            TTagToReturnValue aTagIndicator,
+                                            TInt& aStartPos,
+                                            TInt& aEndPos,
+                                            TInt& aLength )
+    {
+    TLex lex( aSection );
+    lex.SkipAndMark( iSkipAndMarkPos );
+
+    // Check is aStartTag given
+    if ( aStartTag.Length() == 0 )
+        {
+        // Skip line break, tabs, spaces etc.
+        lex.SkipSpace();
+        aStartPos = lex.Offset();
+        }
+    else
+        {
+        // While end of section and aStartTag is given
+        while ( !lex.Eos() )
+            {
+            lex.SkipSpace();
+            TPtrC line = SubstractLine( lex.Remainder() );
+            TInt tagStartPos = 0;
+            TInt tagEndPos = 0;
+            if ( FindTag( line, aStartTag, tagStartPos, tagEndPos ) == KErrNone )
+            	{
+            	if ( aTagIndicator == ETag )
+            		{
+            		aStartPos = lex.Offset();
+            		}
+            	else
+            		{
+            		aStartPos = lex.Offset() + tagEndPos;
+            		if ( line.Length() - tagEndPos == 0 )
+            			{
+            			return KErrNotFound;
+            			}
+            		}
+            	break;
+            	}
+                
+            GotoEndOfLine( lex );
+            }
+        }
+
+    // End tag parsing starts and if we are end of the section
+    if( lex.Eos() )
+        {
+        return KErrNotFound;
+        }
+
+    // "Delete" white spaces(includes line break) 
+    aEndPos = GotoEndOfLine( lex );
+    // Position where start next parsing.(End position, includes white spaces)
+    iSkipAndMarkPos = lex.Offset();
+    // The length includes spaces and end of lines
+    aLength = ( aEndPos - aStartPos );
+
+    return KErrNone;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: SubstractLine
+
+    Description: Substracts line from selected text
+
+    Parameters: TPtrC& aText: in: text.
+
+    Return Values: TPtrC: Substracted line.
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+TPtrC CStifSectionParser::SubstractLine( const TPtrC& aText )
+	{
+	TLex lex( aText );
+	
+	while( !lex.Eos() )
+		{
+		if ( lex.Get() == 0x0A ) // "\n" character. Unix style
+			{
+			break;
+			}		
+		}
+	
+	return aText.Left( lex.Offset() );
+	}
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: FindTag
+
+    Description: Searches for selected tag in text
+
+    Parameters: const TPtrC& aText: in: text,
+				const TPtrC& aTag: in: tag,
+				TInt& aStartPos: out: tag start position,
+				TInt& aEndPos: out: tag end position.
+
+    Return Values: TInt: KErrNone, if tag was found. KErrNotFound if it was not found. 
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+TInt CStifSectionParser::FindTag( const TDesC& aText, const TDesC& aTag, TInt& aStartPos, TInt& aEndPos ) {
+	TBool tagWithEqualChar = EFalse;
+
+	HBufC* tagBuf = NULL;
+	TRAPD( err, tagBuf = aTag.AllocL() );
+	if ( err != KErrNone )
+		{
+		return err;
+		}
+
+	RBuf tag( tagBuf );
+	tag.Trim();
+	if ( tag.Right( 1 ) == _L("=") )
+		{
+		tagWithEqualChar = ETrue;
+		tag.SetLength( tag.Length() - 1 );
+		}
+	
+	TLex lex(aText);
+	lex.SkipSpaceAndMark();
+	TInt startPos = lex.Offset();
+	TPtrC token = lex.NextToken(); 
+	
+	
+	if ( !tagWithEqualChar )
+		{
+		if ( token == tag )
+			{
+			aStartPos = startPos;
+			lex.SkipSpace();
+			aEndPos = lex.Offset();
+			tag.Close();
+			return KErrNone;
+			}
+		}
+	else
+		{
+		lex.UnGetToMark();
+		TPtrC remText = lex.Remainder();
+		if ( remText.Find( tag ) == 0 )
+			{
+			lex.SkipAndMark( tag.Length() );
+			lex.SkipSpaceAndMark();
+			if ( !lex.Eos() )
+				{
+				if ( lex.Get() == '=' )
+					{
+					aStartPos = startPos;
+					lex.SkipSpace();					
+					aEndPos = lex.Offset();
+					tag.Close();
+					return KErrNone;
+					}
+				}
+			}
+		}
+	
+	tag.Close();
+	return KErrNotFound;
+}
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: GotoEndOfLine
+
+    Description: Goes end of the line.
+
+    Parameters: TLex& lex: inout: Parsed line.
+
+    Return Values: TInt: Last item's end position.
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+TInt CStifSectionParser::GotoEndOfLine( TLex& lex )
+    {
+    // End position of the last token(Initialized with current position)
+    TInt lastItemPosition( lex.Offset() );
+
+    // LINE BREAK NOTE:
+    // Line break in SOS, WIN:  '\r\n'
+    // Line break in UNIX:      '\n'
+
+    do
+        {
+        // Peek next character(10 or '\n' in UNIX style )
+        if( lex.Peek() == 0x0A )
+            {
+            lex.Inc();
+            break;
+            }
+
+        // Peek next character(13 or '\r' in Symbian OS)
+        if ( lex.Peek() == 0x0D )
+            {
+            // Increment the lex position
+            lex.Inc();
+            // Peek next character(10 or '\n' in Symbian OS)
+            if ( lex.Peek() == 0x0A )
+                {
+                // End of the section is found and increment the lex position
+                lex.Inc();
+                break;
+                }
+            // 0x0A not found, decrement position
+            lex.UnGet();
+            }
+        // Peek for tabulator(0x09) and space(0x20)
+        else if ( lex.Peek() == 0x09 || lex.Peek() == 0x20 )
+            {
+            // Increment the lex position
+            lex.Inc();
+            continue;
+            }
+        
+        // If white spaces not found take next token
+        lex.NextToken();
+        lastItemPosition = lex.Offset();    
+        
+        } while ( !lex.Eos() );
+        
+    return lastItemPosition;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: GetItemLineL
+
+    Description: Parses a line for items parsing.
+
+    If start tag is empty the parsing starts beging of the section.
+
+    Parameters: const TDesC& aTag: in: Indicates parsing start point.
+                TTagToReturnValue aTagIndicator: in: Will aTag included to the
+                returned object(For default the tag will be added)
+
+    Return Values:  CStifItemParser* : pointer to CStifItemParser object
+                    NULL will return if ParseStartAndEndPos() method returns -1
+                    NULL will return if length is 0 or negative
+                    NULL will return if iStartPos is 0
+
+    Errors/Exceptions: Leaves if called CStifItemParser::NewL method fails
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C CStifItemParser* CStifSectionParser::GetItemLineL( const TDesC& aTag,
+                                            TTagToReturnValue aTagIndicator )
+    {
+    TInt startPos( 0 );
+    TInt endPos( 0 );
+    TInt length( 0 );
+
+    // Indicator that GetItemLineL has been used
+    iLineIndicator = ETrue;
+
+    iSkipAndMarkPos = 0;
+
+    TInt ret = ParseStartAndEndPos( iSection, aTag, aTagIndicator,
+                                    startPos, endPos, length );
+
+    // No parsing found
+    if ( KErrNone != ret || length <= 0 || startPos < 0 )
+        {
+        __TRACE( 
+            KInfo, ( _L( "STIFPARSER: GetItemLineL method returns a NULL" ) ) );
+        return NULL;
+        }
+
+    CStifItemParser* line = CStifItemParser::NewL(
+                                            iSection, startPos, length );
+
+    return line;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: GetNextItemLineL
+
+    Description: Parses a next line for items parsing.
+
+    Parameters: None
+
+    Return Values:  CStifItemParser* : pointer to CStifItemParser object
+                    NULL will return if iLineIndicator is false
+                    NULL will return if ParseStartAndEndPos() method returns -1
+                    NULL will return if length is 0 or negative
+                    NULL will return if iStartPos is 0
+
+    Errors/Exceptions: Leaves if called CStifItemParser::NewL method fails
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C CStifItemParser* CStifSectionParser::GetNextItemLineL()
+    {
+    // GetLine() or GetItemLineL() method is not called
+    if ( !iLineIndicator )
+        {
+        __TRACE( KInfo, 
+            ( _L( "STIFPARSER: GetNextItemLineL method returns a NULL" ) ) );
+        return NULL;
+        }
+
+    TInt startPos( 0 );
+    TInt endPos( 0 );
+    TInt length( 0 );
+
+    // tagIndicator has no meaning in this method
+    TTagToReturnValue tagIndicator( ETag );
+
+    TInt ret = ParseStartAndEndPos( iSection, KNullDesC, tagIndicator,
+                                    startPos, endPos, length );
+
+    // No parsing found
+    if ( KErrNone != ret || length <= 0 || startPos < 0 )
+        {
+        __TRACE( KInfo, 
+            ( _L( "STIFPARSER: GetNextItemLineL method returns a NULL" ) ) );
+        return NULL;
+        }
+
+    CStifItemParser* line = CStifItemParser::NewL(
+                                            iSection, startPos, length );
+
+    return line;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: GetNextItemLineL
+
+    Description: Parses a next line for items parsing with a tag.
+
+    If start tag is empty the parsing starts beging of the section.
+
+    Parameters: const TDesC& aTag: in: Indicates parsing start point
+                TTagToReturnValue aTagIndicator: in: Will aTag included to the
+                returned object(For default the tag will be added)
+
+    Return Values:  CStifItemParser* : pointer to CStifItemParser object
+                    NULL will return if iLineIndicator is false
+                    NULL will return if ParseStartAndEndPos() method returns -1
+                    NULL will return if length is 0 or negative
+                    NULL will return if iStartPos is 0
+
+    Errors/Exceptions: Leaves if called CStifItemParser::NewL method fails
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C CStifItemParser* CStifSectionParser::GetNextItemLineL(
+                                            const TDesC& aTag,
+                                            TTagToReturnValue aTagIndicator )
+    {
+    // GetLine() or GetItemLineL() method is not called
+    if ( !iLineIndicator )
+        {
+        __TRACE( KInfo, 
+            ( _L( "STIFPARSER: GetNextItemLineL method returns a NULL" ) ) );
+        return NULL;
+        }
+
+    TInt startPos( 0 );
+    TInt endPos( 0 );
+    TInt length( 0 );
+
+    TInt ret = ParseStartAndEndPos( iSection, aTag, aTagIndicator,
+                                    startPos, endPos, length );
+    // No parsing found
+    if ( KErrNone != ret || length <= 0 || startPos < 0 )
+        {
+        __TRACE( KInfo, 
+            ( _L( "STIFPARSER: GetNextItemLineL method returns a NULL" )  ) );
+        return NULL;
+        }
+
+    CStifItemParser* line = CStifItemParser::NewL(
+                                            iSection, startPos, length );
+
+    return line;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: SubSectionL
+
+    Description: Parses sub sections from the main section.
+
+    If start tag is empty the parsing starts begin of the section.
+    If end tag is empty the parsing goes end of section.
+    This method starts always from beginning of parsed section and parses
+    first subsection if aSeeked parameters is not given.
+    If parsed section includes several subsections with both start and end
+    tags so aSeeked parameter seeks the required subsection. The aSeeked
+    parameters indicates subsection that will be parsed.
+
+    Parameters: const TDesC& aStartTag: in: Indicates parsing start point
+                const TDesC& aEndTag: in: Indicates parsing end point
+                TInt aSeeked: in: a seeked subsection which will be parsed
+
+    Return Values:  CStifItemParser* : pointer to CStifItemParser object
+                    NULL will return if end tag is not found
+                    NULL will return if length is 0 or negative
+                    NULL will return if lengthStart is 0
+
+    Errors/Exceptions: Leaves if called CStifSectionParser::NewL method fails
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C CStifSectionParser* CStifSectionParser::SubSectionL( 
+                                                        const TDesC& aStartTag,
+                                                        const TDesC& aEndTag,
+                                                        TInt aSeeked )
+    {
+    
+    iSubOffset = 0;
+    return NextSubSectionL( aStartTag, aEndTag, aSeeked );
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: SubSectionL
+
+    Description: Parses subsections from the main section.
+
+    If start tag is empty the parsing starts begin of the section.
+    If end tag is empty the parsing goes end of section.
+    This method will parse next subsection after the earlier subsection if
+    aSeeked parameter is not given.
+    If parser section includes several subsections with both start and end
+    tags so aSeeked parameter seeks the required subsection. The aSeeked
+    parameter indicates subsection that will be parsed.
+
+    Parameters: const TDesC& aStartTag: in: Indicates parsing start point
+                const TDesC& aEndTag: in: Indicates parsing end point
+                TInt aSeeked: in: a seeked subsection which will be parsed
+
+    Return Values:  CStifItemParser* : pointer to CStifItemParser object
+                    NULL will return if end tag is not found
+                    NULL will return if length is 0 or negative
+                    NULL will return if lengthStart is 0
+
+    Errors/Exceptions: Leaves if called CStifSectionParser::NewL method fails
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C CStifSectionParser* CStifSectionParser::NextSubSectionL( 
+                                                    const TDesC& aStartTag,
+                                                    const TDesC& aEndTag,
+                                                    TInt aSeeked )
+    {
+    
+    TLex lex( iSection );
+
+    lex.SkipAndMark( iSubOffset );
+
+    // Get the required sub section length
+    TInt length( 0 );
+    TInt lengthStartPos( 0 );
+    TInt lengthEndPos( 0 );
+    TBool eos( EFalse );
+    TInt tagCount( 1 );
+
+    // Check is aStartTag given
+    if ( aStartTag.Length() == 0 )
+        {
+        // Skip line break, tabs, spaces etc.
+        lex.SkipSpace();
+        lengthStartPos = lex.Offset();
+        }
+    else
+        {
+        // While end of section and aStartTag is given
+        while ( !lex.Eos() )
+            {
+            TPtrC ptr = lex.NextToken();
+            // Start of the section is found and correct section
+            if ( ptr == aStartTag && tagCount == aSeeked )
+                {
+                // Start position
+                lengthStartPos = lex.Offset();
+                break;
+                }
+            // Start tag is found but not correct section
+            else if ( ptr == aStartTag )
+                {
+                tagCount++;
+                }
+            }
+        }
+
+    // If we are end of section lex.Eos() and eos will be ETrue
+    eos = lex.Eos();
+
+    // Seeked section is not found
+    if ( tagCount != aSeeked )
+        {
+        __TRACE( KInfo, ( _L( "STIFPARSER: NextSubSectionL method: Seeked subsection is not found" ) ) );
+        User::Leave( KErrNotFound );
+        }
+
+    // Check is aEndTag given
+    if ( aEndTag.Length() == 0 )
+        {
+        lengthEndPos = iSection.MaxLength();
+        }
+    else
+        {
+        // While end of section and aEndTag is given
+        while ( !lex.Eos() )
+            {
+            TPtrC ptr = lex.NextToken();
+            // End tag of the section is found
+            if ( ptr == aEndTag )
+                {
+                // End position
+                lengthEndPos = lex.Offset();
+                // Because Offset() position is after the aEndTag
+                lengthEndPos -= aEndTag.Length();
+                break;
+                }
+            }
+        }
+
+    // If we are end of section and lengthEndPos is 0
+    if ( lengthEndPos == 0 )
+        {
+        // lex.Eos() and eos will be ETrue
+        eos = lex.Eos();
+        }
+
+    // The length includes spaces and end of lines
+    length = ( lengthEndPos - lengthStartPos );
+
+    CStifSectionParser* section = NULL;
+
+    // If eos is true or length is negative
+    if ( eos || length <= 0  ) 
+        {
+        __TRACE( KInfo, 
+            ( _L( "STIFPARSER: SubSectionL method returns a NULL" ) ) );
+        }    
+    else
+        {
+        // Position where start next parsing.(End position,
+        // includes white spaces)
+        iSubOffset = lex.Offset();
+        
+        // Make CStifSectionParser object and alloc required length
+        section = CStifSectionParser::NewL( length );
+        CleanupStack::PushL( section );
+
+        // Copy required data to the section object
+        section->SetData( iSection, lengthStartPos, length );
+
+        CleanupStack::Pop( section );
+        }
+
+    return section;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: GetLine
+
+    Description: Get a line.
+
+    Search an item from the section and return rest of the line. If start tag 
+    is empty the parsing starts beging of the section.
+
+    Parameters: const TDesC& aTag: in: Indicates parsing start point
+                TPtr& aLine: inout: Parsed line
+                TTagToReturnValue aTagIndicator: in: Will aTag included to the
+                returned value(For default the tag will be added)
+
+    Return Values: TInt: Error code
+
+    Errors/Exceptions: None
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifSectionParser::GetLine( const TDesC& aTag,
+                                            TPtrC& aLine,
+                                            TTagToReturnValue aTagIndicator )
+    {
+    TInt ret( KErrNone );
+
+    if ( 0 == iSection.Length() )
+        {
+        return KErrNotFound;
+        }
+
+    // Indicator that GetLine has been used
+    iLineIndicator = ETrue;
+
+    TInt startPos( 0 );
+    TInt endPos( 0 );
+    TInt length( 0 );
+
+    iSkipAndMarkPos = 0;
+
+    ret = ParseStartAndEndPos( iSection, aTag, aTagIndicator,
+                                startPos, endPos, length );
+
+    if ( KErrNone != ret )
+        {
+        // Nothing to parse
+        return ret;
+        }
+
+    aLine.Set( &iSection[startPos], length );
+
+    return KErrNone;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: GetNextLine
+
+    Description: Get a line
+
+    Search an item from the section and return rest of the line.
+
+    Parameters: TPtr& aLine: inout: Parsed line
+
+    Return Values: TInt: Error code
+
+    Errors/Exceptions: None
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifSectionParser::GetNextLine( TPtrC& aLine )
+    {
+    TInt ret( KErrNone );
+
+    // GetLine() or GetItemLineL() method is not called
+    if ( !iLineIndicator )
+        {
+        return KErrNotReady;
+        }
+
+    TInt startPos( 0 );
+    TInt endPos( 0 );
+    TInt length( 0 );
+
+    // tagIndicator has no meaning in this method
+    TTagToReturnValue tagIndicator( ETag );
+
+    ret = ParseStartAndEndPos( iSection, KNullDesC, tagIndicator,
+                                startPos, endPos, length );
+    if ( KErrNone != ret )
+        {
+        // Nothing to parse
+        return ret;
+        }
+
+    aLine.Set( &iSection[startPos], length );
+
+    return KErrNone;
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: GetNextLine
+
+    Description: Get a line with tag
+
+    Search a next line with the required tag from the section. If start tag
+    is empty the parsing starts beging of the section.
+
+    Parameters: const TDesC& aTag: in: Indicates parsing start point
+                TPtr& aLine: inout: Parsed line
+                TTagToReturnValue aTagIndicator: in: Will aTag included to the
+                returned value(For default the tag will be added)
+
+    Return Values: TInt: Error code
+
+    Errors/Exceptions: None
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifSectionParser::GetNextLine( const TDesC& aTag, TPtrC& aLine,
+                                            TTagToReturnValue aTagIndicator )
+    {
+    TInt ret( KErrNone );
+
+    // GetLine() or GetItemLineL() method is not called
+    if ( !iLineIndicator )
+        {
+        return KErrNotReady;
+        }
+
+    TInt startPos( 0 );
+    TInt endPos( 0 );
+    TInt length( 0 );
+
+    ret = ParseStartAndEndPos( iSection, aTag, aTagIndicator,
+                                startPos, endPos, length );
+    if ( KErrNone != ret )
+        {
+        // Nothing to parse
+        return ret;
+        }
+
+    aLine.Set( &iSection[startPos], length );
+
+    return KErrNone;
+
+    }
+
+ /*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: GetPosition
+
+    Description: Get current position.
+
+    Returns current parsing position, which
+    can be used as parameter for SetPosition afterwards to go back
+    to old parsing position.
+
+    Parameters: None
+    
+    Return Values: TInt: Current parsing position.
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifSectionParser::GetPosition()
+    {
+    
+    return iSkipAndMarkPos;
+    
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: SetPosition
+
+    Description: Set current position.
+                
+    SetPosition can be used to set parsing position, e.g. to rewind 
+    back to some old position retrieved with GetPosition.
+    
+    Parameters: TInt aPos: in: new parsing position.
+    
+    Return Values: TInt: Error code
+
+    Errors/Exceptions: None
+
+    Status: Proposal
+
+-------------------------------------------------------------------------------
+*/
+EXPORT_C TInt CStifSectionParser::SetPosition( TInt aPos )  
+    {
+    
+    if( aPos < 0 || aPos >= iSection.Length() )
+        {
+        return KErrArgument;
+        }
+        
+    iSkipAndMarkPos = aPos;    
+    
+    return KErrNone;
+    
+    }        
+        
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: SetData
+
+    Description: Create a section.
+
+    Parameters: const TPtr aData: in: Data to be parsed
+                TInt aStartPos: in: Indicates parsing start position
+                TInt aLength: in: Indicates length of parsed section
+    
+    Return Values: None
+
+    Errors/Exceptions: None
+
+    Status: Approved
+    
+-------------------------------------------------------------------------------
+*/
+void CStifSectionParser::SetData( TPtr aData,
+                                    TInt aStartPos,
+                                    TInt aLength )
+    {
+    iSection.Copy( aData.Mid( aStartPos, aLength ) );
+
+    }
+
+/*
+-------------------------------------------------------------------------------
+
+    Class: CStifSectionParser
+
+    Method: Des
+
+    Description: Returns a section.
+
+    Parameters: None
+
+    Return Values: const TPtrC: Returns a current section
+
+    Errors/Exceptions: None
+
+    Status: Approved
+
+-------------------------------------------------------------------------------
+*/
+const TPtrC CStifSectionParser::Des()
+    {
+    return (TPtrC)iSection;
+
+    }
+
+// ================= OTHER EXPORTED FUNCTIONS =================================
+
+//  End of File