xdmprotocols/XdmXmlParser/src/XmlParserNodePath.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 02 Feb 2010 01:05:17 +0200
changeset 0 c8caa15ef882
permissions -rw-r--r--
Revision: 201003 Kit: 201005

/*
* Copyright (c) 2005 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:   CXmlParserNodePath
*
*/



#include <contenthandler.h>
#include "XdmDocument.h"
#include "XdmXmlParser.h"
#include "XdmDocumentNode.h"
#include "XdmNodeAttribute.h"
#include "XmlParserNodePath.h"
#include "XmlNodePathInterface.h"

// ---------------------------------------------------------
// CXmlParserNodePath::CXmlParserNodePath
//
// ---------------------------------------------------------
//
CXmlParserNodePath::CXmlParserNodePath( CXdmXmlParser& aParserMain,
                                        TXdmElementType aElementType,
                                        MXmlNodePathInterface* aPathInterface ) :
                                        iElementType( aElementType ),
                                        iPathInterface( aPathInterface ),
                                        iParserMain( aParserMain )
    {
    }
    
// ---------------------------------------------------------
// CXmlParserNodePath::ExtractString
//
// ---------------------------------------------------------
//
CXmlParserNodePath* CXmlParserNodePath::NewL( CXdmXmlParser& aParserMain,
                                              TXdmElementType aElementType,
                                              const CXdmDocumentNode& aTargetNode,
                                              MXmlNodePathInterface* aPathInterface )
    {
    CXmlParserNodePath* self = new ( ELeave ) CXmlParserNodePath( aParserMain, aElementType, aPathInterface );
    CleanupStack::PushL( self );
    self->ConstructL( aTargetNode );
    CleanupStack::Pop();
    return self;
    }

// ---------------------------------------------------------
// CXmlParserNodePath::~CXmlParserNodePath
//
// ---------------------------------------------------------
//
CXmlParserNodePath::~CXmlParserNodePath()
    {
    iNodes.Close();
    }
    
// ---------------------------------------------------------
// CXmlParserNodePath::ConstructL
//
// ---------------------------------------------------------
//
void CXmlParserNodePath::ConstructL( const CXdmDocumentNode& aTargetNode )
    {
    #ifdef _DEBUG
        iParserMain.WriteToLog( _L8( "CXmlParserNodePath::ConstructL()" ) );
    #endif
    CXdmDocumentNode* current = CONST_CAST( CXdmDocumentNode*, &aTargetNode );
    while( current != NULL )
        {   
        iNodes.InsertL( current, 0 );
        current = current->Parent();
        }
    }
                               
// ---------------------------------------------------------
// CXmlParserNodePath::CheckNextNodeL
//
// ---------------------------------------------------------
//
TBool CXmlParserNodePath::CheckNextNodeL( const TDesC8& aNextElement,
                                          const RAttributeArray& aAttributes )
    {
    #ifdef _DEBUG
        //iParserMain.WriteToLog( _L8( "CXmlParserNodePath::CheckNextNodeL" ) );
    #endif
    if( !iComplete && aNextElement.Length() > 0 )
        {
        TInt attrCount = aAttributes.Count();
        RPointerArray<SXdmAttribute8> attributes;
        CleanupClosePushL( attributes );
        for( TInt i = 0;i < attrCount;i++ )
            {
            SXdmAttribute8 attribute; 
            attribute.iName.Set( aAttributes[i].Attribute().LocalName().DesC() );
            attribute.iValue.Set( aAttributes[i].Value().DesC() );
            User::LeaveIfError( attributes.Append( &attribute ) );
            }
        HBufC* unicode = HBufC::NewLC( aNextElement.Length() );
        unicode->Des().Copy( aNextElement );
        if( iNodes[iIndex]->Match( unicode->Des(), attributes ) )
            {
            iIndex++;
            if( iElementType == EXdmElementAttribute )
                iComplete = iNodes[iIndex] == iPathInterface->TargetAttribute()->Parent();
            else /* or else if, the next if is not needed */
                {
                if( iIndex == iNodes.Count() )
                    iComplete = ETrue;
                }
            }
        CleanupStack::PopAndDestroy( 2 );   //unicode, attributes
        }
    return iComplete;
    }
    
// ---------------------------------------------------------
// CXmlParserNodePath::CheckNextNodeL
//
// ---------------------------------------------------------
//
TBool CXmlParserNodePath::CheckNextNode( const CXdmDocumentNode& aNextNode )
    {
    #ifdef _DEBUG
        //iParserMain.WriteToLog( _L8( "CXmlParserNodePath::CheckNextNodeL" ) );
    #endif
    if( !iComplete )
        {
        if( iNodes[iIndex]->Match( aNextNode ) )
            {
            iIndex++;
            if( iElementType == EXdmElementAttribute )
                iComplete = iNodes[iIndex] == iPathInterface->TargetAttribute()->Parent();
            else /* or else if, the next if is not needed */
                {
                if( iIndex == iNodes.Count() )
                    iComplete = ETrue;
                }
            }
        }
    return iComplete;
    }

// End of File