diff -r 2580314736af -r 2669f8761a99 XDMEngine/src/XdmDocumentNode.cpp --- a/XDMEngine/src/XdmDocumentNode.cpp Thu Aug 19 10:19:02 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1143 +0,0 @@ -/* -* 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: XDM Engine document node -* -*/ - - - - -// INCLUDE FILES -#include "XdmEngine.h" -#include "XdmDocument.h" -#include "XdmNodeFactory.h" -#include "XdmDocumentNode.h" -#include "XdmNodeAttribute.h" - -//XML Escape codes -_LIT8( KXmlBracketOpenEsc, "<"); -_LIT8( KXmlBracketCloseEsc, ">"); -_LIT8( KXmlAmpersandEsc, "&"); - -// ---------------------------------------------------------- -// CXdmDocumentNode::CXdmDocumentNode -// -// ---------------------------------------------------------- -// -EXPORT_C CXdmDocumentNode::CXdmDocumentNode( CXdmEngine& aXdmEngine, - MXdmNodeFactory& aNodeFactory ) : - iPosition( KErrNotFound ), - iEmptyNode( EFalse ), - iXdmEngine( aXdmEngine ), - iNodeFactory( aNodeFactory ) - { - } - - -// ---------------------------------------------------------- -// CXdmDocumentNode::CXdmDocumentNode -// -// ---------------------------------------------------------- -// -EXPORT_C CXdmDocumentNode::CXdmDocumentNode( CXdmEngine& aXdmEngine, - MXdmNodeFactory& aNodeFactory, - CXdmDocumentNode* aParentNode ) : - iEmptyNode( EFalse ), - iXdmEngine( aXdmEngine ), - iNodeFactory( aNodeFactory ), - iParentNode( aParentNode ) - - { - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::CXdmDocumentNode -// -// ---------------------------------------------------------- -// -EXPORT_C CXdmDocumentNode::CXdmDocumentNode( const TBool aLeafNode, - CXdmEngine& aXdmEngine, - MXdmNodeFactory& aNodeFactory, - CXdmDocumentNode* aParentNode ) : - iLeafNode( aLeafNode ), - iEmptyNode( EFalse ), - iXdmEngine( aXdmEngine ), - iNodeFactory( aNodeFactory ), - iParentNode( aParentNode ) - - { - - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::ConstructL -// -// ---------------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::BaseConstructL( const TDesC& aNodeName ) - { - delete iNodeName; - iNodeName = NULL; - iNodeName = HBufC::NewL( aNodeName.Length() ); - iNodeName->Des().Copy( aNodeName ); - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::CopyConstructL -// -// ---------------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::CopyConstructL( const CXdmDocumentNode& aAnotherNode, - const CXdmDocumentNode& aParentNode ) - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CopyConstructL()" ) ); - #endif - if( aAnotherNode.ElementType() != EXdmElementAttribute ) - { - ConstructChildrenL( aAnotherNode ); - ConstructAttributesL( aAnotherNode ); - } - iLeafNode = aAnotherNode.IsLeafNode(); - iEmptyNode = aAnotherNode.IsEmptyNode(); - if( iLeafNode ) - { - iLeafContent = HBufC8::New( aAnotherNode.LeafNodeContent().Length() ); - iLeafContent->Des().Copy( aAnotherNode.LeafNodeContent() ); - } - iParentNode = CONST_CAST( CXdmDocumentNode*, &aParentNode ); - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::ConstructAttributesL -// -// ---------------------------------------------------------- -// -void CXdmDocumentNode::ConstructAttributesL( const CXdmDocumentNode& aAnotherNode ) - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CopyConstructL()" ) ); - #endif - TInt attrCount = aAnotherNode.AttributeCount(); - for( TInt i = 0;i < attrCount;i++ ) - { - TPtrC name = aAnotherNode.Attribute( i )->NodeName(); - TPtrC value = aAnotherNode.Attribute( i )->AttributeValue(); - CXdmNodeAttribute* attribute = iNodeFactory.AttributeL( name ); - CleanupStack::PushL( attribute ); - attribute->SetAttributeValueL( value ); - User::LeaveIfError( iAttributes.Append( attribute ) ); - CleanupStack::Pop(); //attribute - } - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::ConstructChildrenL -// -// ---------------------------------------------------------- -// -void CXdmDocumentNode::ConstructChildrenL( const CXdmDocumentNode& aAnotherNode ) - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::ConstructChildrenL()" ) ); - #endif - TInt childCount = aAnotherNode.NodeCount(); - for( TInt i = 0;i < childCount;i++ ) - { - CXdmDocumentNode* node = aAnotherNode.ChileNode( i ); - CXdmDocumentNode* copy = iNodeFactory.ChileNodeL( node ); - CleanupStack::PushL( copy ); - User::LeaveIfError( iChildren.Append( copy ) ); - CleanupStack::Pop(); //copy - } - } - -// ---------------------------------------------------- -// CXdmDocumentNode::~CXdmDocumentNode -// -// ---------------------------------------------------- -// -EXPORT_C CXdmDocumentNode::~CXdmDocumentNode() - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::~CXdmDocumentNode()" ) ); - #endif - delete iNextNode; - iNextNode = NULL; - delete iLeafContent; - delete iNodeName; - iChildren.ResetAndDestroy(); - iChildren.Close(); - iAttributes.ResetAndDestroy(); - iAttributes.Close(); - } - -// ---------------------------------------------------- -// CXdmDocumentNode::CreateChileNodeL -// -// ---------------------------------------------------- -// -EXPORT_C CXdmDocumentNode* CXdmDocumentNode::CreateChileNodeL() - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CreateChileNodeL()" ) ); - #endif*/ - __ASSERT_ALWAYS( !iEmptyNode, User::Panic( _L( "CXdmDocumentNode" ), ENodeNotEmpty ) ); - CXdmDocumentNode* node = iNodeFactory.ChileNodeL(); - CleanupStack::PushL( node ); - User::LeaveIfError( iChildren.Append( node ) ); - CleanupStack::Pop(); //node - return node; - } - -// ---------------------------------------------------- -// CXdmDocumentNode::CreateChileNodeL -// -// ---------------------------------------------------- -// -EXPORT_C CXdmDocumentNode* CXdmDocumentNode::CreateChileNodeL( const TDesC& aChildName ) - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CreateChileNodeL() - Name: %S" ), &aChildName ); - #endif*/ - __ASSERT_ALWAYS( !iEmptyNode, User::Panic( _L( "CXdmDocumentNode" ), ENodeNotEmpty ) ); - CXdmDocumentNode* node = iNodeFactory.ChileNodeL( aChildName ); - CleanupStack::PushL( node ); - User::LeaveIfError( iChildren.Append( node ) ); - CleanupStack::Pop(); //node - return node; - } - -// ---------------------------------------------------- -// CXdmDocumentNode::SetLeafNode -// -// ---------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::SetLeafNode( const TBool aIsLeafNode ) - { - iLeafNode = aIsLeafNode; - } - -// ---------------------------------------------------- -// CXdmDocumentNode::IsLeafNode -// -// ---------------------------------------------------- -// -EXPORT_C TBool CXdmDocumentNode::IsLeafNode() const - { - return iLeafNode; - } - -// ---------------------------------------------------- -// CXdmDocumentNode::SetEmptyNode -// -// ---------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::SetEmptyNode( const TBool aIsEmptyNode ) - { - //Do nothing if the state is not being changed - if( aIsEmptyNode != iEmptyNode ) - { - if( aIsEmptyNode ) - { - if( !iEmptyNode ) - { - TInt count = iChildren.Count(); - if( count > 0 ) - iChildren.ResetAndDestroy(); - } - } - iEmptyNode = aIsEmptyNode; - } - } - -// ---------------------------------------------------- -// CXdmDocumentNode::IsEmptyNode -// -// ---------------------------------------------------- -// -EXPORT_C TBool CXdmDocumentNode::IsEmptyNode() const - { - return iEmptyNode; - } - -// ---------------------------------------------------- -// CXdmDocumentNode::CreateAttributeL -// -// ---------------------------------------------------- -// -EXPORT_C CXdmNodeAttribute* CXdmDocumentNode::CreateAttributeL() - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CreateAttributeL()" ) ); - #endif*/ - CXdmDocumentNode* node = iNodeFactory.AttributeL(); - CleanupStack::PushL( node ); - User::LeaveIfError( iAttributes.Append( ( CXdmNodeAttribute* )node ) ); - CleanupStack::Pop(); //node - return ( CXdmNodeAttribute* )node; - } - -// ---------------------------------------------------- -// CXdmDocumentNode::CreateAttributeL -// -// ---------------------------------------------------- -// -EXPORT_C CXdmNodeAttribute* CXdmDocumentNode::CreateAttributeL( const TDesC& aAttributeName ) - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::CreateAttributeL() - Name: %S" ), &aAttributeName ); - #endif*/ - CXdmDocumentNode* node = iNodeFactory.AttributeL( aAttributeName ); - CleanupStack::PushL( node ); - User::LeaveIfError( iAttributes.Append( ( CXdmNodeAttribute* )node ) ); - CleanupStack::Pop(); //node - return ( CXdmNodeAttribute* )node; - } - -// ---------------------------------------------------- -// CXdmDocumentNode::SetLeafNodeContentL -// -// ---------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::SetLeafNodeContentL( const TDesC& aLeafContent ) - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::SetLeafNodeContentL( 16 ) - Content: %S" ), - &aLeafContent ); - #endif*/ - if( iLeafNode ) - { - delete iLeafContent; - iLeafContent = NULL; - iLeafContent = CXdmEngine::ConvertToUTF8L( aLeafContent ); - } - else - User::Leave( KErrGeneral ); - } - -// ---------------------------------------------------- -// CXdmDocumentNode::SetLeafNodeContentL -// -// ---------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::SetLeafNodeContentL( const TDesC8& aLeafContent ) - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::SetLeafNodeContentL( 8 ) - Content: %S" ), - &aLeafContent ); - #endif*/ - if( iLeafNode ) - { - delete iLeafContent; - iLeafContent = NULL; - iLeafContent = HBufC8::NewL( aLeafContent.Length() ); - iLeafContent->Des().Copy( aLeafContent ); - } - else - User::Leave( KErrGeneral ); - } - -// ---------------------------------------------------- -// CXdmDocumentNode::ElementData -// -// ---------------------------------------------------- -// -EXPORT_C HBufC8* CXdmDocumentNode::ElementDataLC() const - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::ElementDataLC()" ) ); - #endif*/ - TInt position = 0; - CBufFlat* buffer = CBufFlat::NewL( 48 ); - CleanupStack::PushL( buffer ); - buffer->InsertL( position, EightBitNodeNameLC()->Des() ); - CleanupStack::PopAndDestroy(); //EightBitNodeNameLC() - position = position + NodeName().Length(); - TInt attributeCount = iAttributes.Count(); - if( attributeCount > 0 ) - { - for( TInt i = 0;i < attributeCount;i++ ) - { - buffer->InsertL( position, KGeneralSpace ); - position = position + KGeneralSpace().Length(); - CXdmNodeAttribute* attribute = iAttributes[i]; - TPtrC8 name( attribute->EightBitNodeNameLC()->Des() ); - buffer->InsertL( position, name ); - position = position + name.Length(); - buffer->InsertL( position, KGeneralEqualsAndQuotes ); - position = position + KGeneralEqualsAndQuotes().Length(); - TPtrC8 value( attribute->EscapedValueLC()->Des() ); - buffer->InsertL( position, value ); - position = position + value.Length(); - buffer->InsertL( position, KGeneralQuotes ); - position = position + KGeneralQuotes().Length(); - CleanupStack::PopAndDestroy( 2 ); //EscapedValueLC(), - //EightBitNodeNameLC() - } - } - HBufC8* ret = HBufC8::NewL( buffer->Size() ); - TPtr8 pointer( ret->Des() ); - buffer->Read( 0, pointer, buffer->Size() ); - CleanupStack::PopAndDestroy(); //buffer - CleanupStack::PushL( ret ); - return ret; - } - -// ---------------------------------------------------------- -// CXdmNodeAttribute::NodeCount -// -// ---------------------------------------------------------- -// -EXPORT_C TInt CXdmDocumentNode::NodeCount() const - { - return iNextNode ? 1 : iChildren.Count(); - } - -// ---------------------------------------------------------- -// CXdmNodeAttribute::NodeCount -// -// ---------------------------------------------------------- -// -EXPORT_C TInt CXdmDocumentNode::AttributeCount() const - { - return iAttributes.Count(); - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::Parent -// -// ---------------------------------------------------------- -// -EXPORT_C CXdmDocumentNode* CXdmDocumentNode::ChileNode( const TInt aPosition ) const - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::ChileNode() - Position: %d" ), aPosition ); - #endif*/ - if( iNextNode ) - return iNextNode; - else - { - TInt count = NodeCount(); - if( count > 0 && aPosition >= 0 && aPosition < count ) - return iChildren[aPosition]; - else return NULL; - } - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::Attribute -// -// ---------------------------------------------------------- -// -EXPORT_C CXdmNodeAttribute* CXdmDocumentNode::Attribute( const TInt aPosition ) const - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Attribute() - Position: %d" ), aPosition ); - #endif*/ - TInt count = iAttributes.Count(); - if( count > 0 && aPosition >= 0 && aPosition < count ) - return iAttributes[aPosition]; - else return NULL; - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::Attribute -// -// ---------------------------------------------------------- -// -EXPORT_C CXdmNodeAttribute* CXdmDocumentNode::Attribute( const TDesC& aAttributeName ) const - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Attribute() - Name: %S" ), &aAttributeName ); - #endif*/ - TInt count = iAttributes.Count(); - if( count > 0 ) - { - TBool found = EFalse; - CXdmNodeAttribute* target = NULL; - for( TInt i = 0;!found && i < count;i++ ) - { - if( iAttributes[i]->NodeName().Compare( aAttributeName ) == 0 ) - { - target = iAttributes[i]; - found = ETrue; - } - } - return target; - } - else return NULL; - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::Parent -// -// ---------------------------------------------------------- -// -EXPORT_C TPtrC8 CXdmDocumentNode::LeafNodeContent() const - { - return iLeafNode && iLeafContent != NULL ? iLeafContent->Des() : TPtrC8(); - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::Parent -// -// ---------------------------------------------------------- -// -EXPORT_C HBufC8* CXdmDocumentNode::EscapeLeafNodeContentLC() const - { - return iLeafNode && iLeafContent != NULL ? EscapeDescLC( iLeafContent->Des() ) : NULL; - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::SetNextNode -// -// ---------------------------------------------------------- -// -EXPORT_C TPtrC CXdmDocumentNode::NodeName() const - { - return iNodeName != NULL ? iNodeName->Des() : TPtrC(); - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::SetNextNode -// -// ---------------------------------------------------------- -// -EXPORT_C HBufC8* CXdmDocumentNode::EightBitNodeNameLC() const - { - HBufC8* eightBit = CXdmEngine::ConvertToUTF8L( iNodeName->Des() ); - CleanupStack::PushL( eightBit ); - return eightBit; - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::SetNextNode -// -// ---------------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::SetNameL( const TDesC& aNodeName ) - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::SetNameL( 16-Bit ) - Name: %S" ), - &aNodeName ); - #endif*/ - delete iNodeName; - iNodeName = NULL; - iNodeName = HBufC::NewL( aNodeName.Length() ); - iNodeName->Des().Copy( aNodeName ); - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::SetNextNode -// -// ---------------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::SetNameL( const TDesC8& aNodeName ) - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::SetNameL( 8-Bit ) - Name: %S" ), - &aNodeName ); - #endif*/ - delete iNodeName; - iNodeName = NULL; - iNodeName = HBufC::NewL( aNodeName.Length() ); - iNodeName->Des().Copy( aNodeName ); - } - -// ---------------------------------------------------------- -// CXdmNodeAttribute::ElementType -// -// ---------------------------------------------------------- -// -EXPORT_C CXdmDocumentNode* CXdmDocumentNode::Parent() const - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Parent()" ) ); - #endif*/ - return iParentNode; - } - -// ---------------------------------------------------------- -// CXdmNodeAttribute::ElementType -// -// ---------------------------------------------------------- -// -EXPORT_C TXdmElementType CXdmDocumentNode::ElementType() const - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::ElementType()" ) ); - #endif*/ - return EXdmElementNode; - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::Match -// -// ---------------------------------------------------------- -// -EXPORT_C TBool CXdmDocumentNode::Match( const CXdmDocumentNode& aAnotherNode ) const - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Match()" ) ); - #endif - if( NodeName().Compare( aAnotherNode.NodeName() ) == 0 ) - { - TBool match = ETrue; - TInt attrCount = iAttributes.Count(); - if( attrCount == aAnotherNode.AttributeCount() ) - { - for( TInt i = 0;match && i < attrCount;i++ ) - match = HasAttribute( *aAnotherNode.Attribute( i ) ); - } - else match = EFalse; - return match; - } - else return EFalse; - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::Match -// -// ---------------------------------------------------------- -// -EXPORT_C TBool CXdmDocumentNode::Match( const TDesC& aNodeName, - const RPointerArray& - aAttributeArray ) const - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Match()" ) ); - #endif - if( NodeName().Compare( aNodeName ) == 0 ) - { - TBool match = ETrue; - TInt attrCount = iAttributes.Count(); - if( attrCount == aAttributeArray.Count() ) - { - for( TInt i = 0;match && i < attrCount;i++ ) - match = HasAttributeL( *aAttributeArray[i] ); - } - else match = EFalse; - return match; - } - else return EFalse; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::HasAttribute -// -// --------------------------------------------------------- -// -EXPORT_C TBool CXdmDocumentNode::HasAttribute( const TDesC& aAttributeName ) const - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::HasAttribute()" ) ); - #endif - TInt count = iAttributes.Count(); - for( TInt i = 0; i < count;i++ ) - { - if( !iAttributes[i]->NodeName().Compare( aAttributeName ) ) - return ETrue; - } - return EFalse; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::Print -// !!! For debugging ONLY !!! -// --------------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::Print() - { - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::Print()" ) ); - HBufC8* nameBuf = HBufC8::NewLC( iNodeName->Des().Length() ); - TPtr8 name( nameBuf->Des() ); - name.Copy( iNodeName->Des() ); - if( ElementType() == EXdmElementAttribute ) - { - CXdmNodeAttribute* attr = ( CXdmNodeAttribute* )this; - TPtrC8 value( attr->EightBitValueLC()->Des() ); - iXdmEngine.WriteToLog( _L8( "* Name: %S Value: %S" ), &name, &value ); - CleanupStack::PopAndDestroy(); //value - } - else - { - iXdmEngine.WriteToLog( _L8( "* Name: %S" ), &name ); - TInt count = iAttributes.Count(); - if( count > 0 ) - { - for( TInt i = 0;i < count;i++ ) - { - CXdmNodeAttribute* attr = iAttributes[i]; - TPtrC8 value( attr->EightBitValueLC()->Des() ); - TPtrC8 name( attr->EightBitNodeNameLC()->Des() ); - iXdmEngine.WriteToLog( _L8( "* Attribute %d - Name: %S Value: %S" ), i, &name, &value ); - CleanupStack::PopAndDestroy( 2 ); //name, value - } - - } - if( iLeafNode ) - { - TPtr8 data( iLeafContent->Des() ); - iXdmEngine.WriteToLog( _L8( "* Data: %S" ), &data ); - } - CXdmDocumentNode* node = NULL; - TInt nodeCount = NodeCount(); - for( TInt i = 0;i < nodeCount;i++ ) - { - node = ChileNode( i ); - node->Print(); - } - } - CleanupStack::PopAndDestroy(); //nameBuf - } - -// --------------------------------------------------------- -// CXdmDocumentNode::Find -// -// --------------------------------------------------------- -// -EXPORT_C TInt CXdmDocumentNode::Find( const TDesC& aNodeName, - RPointerArray& aResultArray ) const - { - TInt error = KErrNotFound; - TInt childCount = NodeCount(); - if( childCount > 0 ) - { - for( TInt i = 0;i < childCount;i++ ) - error = ChileNode( i )->DoFind( aNodeName, aResultArray ); - } - return error; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::DoFind -// -// --------------------------------------------------------- -// -TInt CXdmDocumentNode::DoFind( const TDesC& aNodeName, - RPointerArray& aResultArray ) const - { - TInt error = KErrNone; - if( NodeName().Compare( aNodeName ) == 0 ) - error = aResultArray.Append( this ); - if( error == KErrNone ) - { - TInt childCount = NodeCount(); - if( childCount > 0 ) - { - for( TInt i = 0;i < childCount;i++ ) - error = ChileNode( i )->DoFind( aNodeName, aResultArray ); - } - } - return error; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::Find -// -// --------------------------------------------------------- -// -EXPORT_C TInt CXdmDocumentNode::Find( const CXdmDocumentNode& aTargetNode, - RPointerArray& aResultArray ) const - { - TInt error = KErrNotFound; - TInt childCount = NodeCount(); - if( childCount > 0 ) - { - for( TInt i = 0;i < childCount;i++ ) - error = ChileNode( i )->DoFind( aTargetNode, aResultArray ); - } - return error; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::Find -// -// --------------------------------------------------------- -// -TInt CXdmDocumentNode::DoFind( const CXdmDocumentNode& aTargetNode, - RPointerArray& aResultArray ) const - { - TInt error = KErrNone; - if( *this == aTargetNode ) - error = aResultArray.Append( this ); - if( error == KErrNone ) - { - TInt childCount = NodeCount(); - if( childCount > 0 ) - { - for( TInt i = 0;i < childCount;i++ ) - error = ChileNode( i )->DoFind( aTargetNode, aResultArray ); - } - } - return error; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::Find -// -// --------------------------------------------------------- -// -EXPORT_C TInt CXdmDocumentNode::Find( const TDesC& aNodeName, - RPointerArray& aResultArray, - const RPointerArray& aAttributeArray ) const - { - TInt error = KErrNone; - TInt childCount = NodeCount(); - if( childCount > 0 ) - { - for( TInt j = 0;j < childCount;j++ ) - error = ChileNode( j )->DoFind( aNodeName, aResultArray, aAttributeArray ); - } - return error; - } - -// --------------------------------------------------------- -// CXcapHttpOperation::RemoveNamespaceAttributes -// -// --------------------------------------------------------- -// -void CXdmDocumentNode::RemoveNamespaceAttributes() - { - _LIT( KXmlNamespaceAttr, "xmlns" ); - for( TInt i( iAttributes.Count() - 1 ); i > KErrNotFound; i-- ) - { - CXdmNodeAttribute* attr( iAttributes[i] ); - if( attr->NodeName().Find( KXmlNamespaceAttr ) == 0 ) - { - iAttributes.Remove( i ); - delete attr; - attr = NULL; - } - } - } - -// --------------------------------------------------------- -// CXdmDocumentNode::DoFind -// -// --------------------------------------------------------- -// -TInt CXdmDocumentNode::DoFind( const TDesC& aNodeName, - RPointerArray& aResultArray, - const RPointerArray& aAttributeArray ) - { - TBool match = EFalse; - TInt error = KErrNone; - if( NodeName().Compare( aNodeName ) == 0 ) - { - match = ETrue; - RemoveNamespaceAttributes(); - TInt attrCount = iAttributes.Count(); - if( attrCount == aAttributeArray.Count() ) - { - if( attrCount > 0 ) - { - for( TInt i = 0;i < attrCount;i++ ) - match = HasAttribute( *aAttributeArray[i] ); - } - } - else match = EFalse; - error = match ? aResultArray.Append( this ) : KErrNotFound; - } - TInt childCount = NodeCount(); - if( childCount > 0 ) - { - for( TInt j = 0;j < childCount;j++ ) - error = ChileNode( j )->DoFind( aNodeName, aResultArray, aAttributeArray ); - } - return error; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::operator== -// -// --------------------------------------------------------- -// -EXPORT_C TBool CXdmDocumentNode::operator==( const CXdmDocumentNode& aNode ) const - { - TBool match = EFalse; - if( NodeName().Compare( aNode.NodeName() ) == 0 ) - { - match = ETrue; - TInt attrCount = iAttributes.Count(); - if( attrCount == aNode.AttributeCount() ) - { - if( attrCount > 0 ) - { - for( TInt i = 0;i < attrCount;i++ ) - match = aNode.HasAttribute( *iAttributes[i] ); - } - } - if( match ) - { - TInt childCount = NodeCount(); - if( childCount == aNode.NodeCount() ) - { - if( childCount > 0 ) - { - for( TInt j = 0;j < childCount;j++ ) - { - match = *ChileNode( j ) == *aNode.ChileNode( j ); - if( !match ) - break; - } - } - } - else match = EFalse; - } - else match = EFalse; - } - return match; - } - -// ---------------------------------------------------- -// CXdmDocumentNode::AppendChileNodeL -// -// ---------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::AppendChileNodeL( CXdmDocumentNode* aDocumentNode ) - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CLocalDocument::AppendChileNodeL()" ) ); - #endif - CXdmDocumentNode* node = iNodeFactory.ChileNodeL( aDocumentNode ); - CleanupStack::PushL( node ); - User::LeaveIfError( iChildren.Append( node ) ); - CleanupStack::Pop(); //node - } - -// ---------------------------------------------------- -// CXdmDocumentNode::InsertChileNodeL -// -// ---------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::InsertChileNodeL( TInt aIndex, CXdmDocumentNode* aDocumentNode ) - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CLocalDocument::InsertChileNodeL()" ) ); - #endif - __ASSERT_ALWAYS( aIndex >= 0, User::Panic( _L( "CXdmDocumentNode" ), EIndexOutOfBounds ) ); - CXdmDocumentNode* node = iNodeFactory.ChileNodeL( aDocumentNode ); - CleanupStack::PushL( node ); - User::LeaveIfError( iChildren.Insert( node, aIndex ) ); - CleanupStack::Pop(); //node - } - -// ---------------------------------------------------- -// CXdmDocumentNode::ReplaceChileNodeL -// -// ---------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::ReplaceChileNodeL( CXdmDocumentNode* aNewNode, - CXdmDocumentNode* aTargetNode ) - { - CXdmDocumentNode* remove = NULL; - TInt index = iChildren.Find( aTargetNode ); - #ifdef _DEBUG - CXdmDocumentNode* a = NULL; - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::ReplaceChileNodeL()" ) ); - iXdmEngine.WriteToLog( _L8( " New node: %x" ), aNewNode ); - iXdmEngine.WriteToLog( _L8( " Target node: %x" ), aTargetNode ); - for( TInt i = 0;i < iChildren.Count();i++ ) - { - a = iChildren[i]; - iXdmEngine.WriteToLog( _L8( " Child %d: %x" ), i, a ); - } - #endif - __ASSERT_DEBUG( index >= 0, User::Panic( _L( "CXdmDocumentNode" ), EIndexOutOfBounds ) ); - remove = iChildren[index]; - iChildren.Remove( index ); - delete remove; - remove = NULL; - CXdmDocumentNode* node = iNodeFactory.ChileNodeL( aNewNode ); - CleanupStack::PushL( node ); - User::LeaveIfError( iChildren.Insert( node, index ) ); - CleanupStack::Pop(); //node - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::RemoveChileNodeL -// -// ---------------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::RemoveChileNodeL( CXdmDocumentNode* aChileNode ) - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::RemoveChileNodeL()" ) ); - #endif - CXdmDocumentNode* remove = NULL; - switch( aChileNode->ElementType() ) - { - case EXdmElementNode: - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( " Element is a node" ) ); - #endif - TInt index( iChildren.Find( aChileNode ) ); - __ASSERT_DEBUG( index >= 0, User::Panic( _L( "CXdmDocumentNode" ), EIndexOutOfBounds ) ); - remove = iChildren[index]; - iChildren.Remove( index ); - delete remove; - remove = NULL; - } - break; - case EXdmElementAttribute: - { - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( " Element is an attribute" ) ); - #endif - TInt index( iAttributes.Find( ( CXdmNodeAttribute* )aChileNode ) ); - __ASSERT_DEBUG( index >= 0, User::Panic( _L( "CXdmDocumentNode" ), EIndexOutOfBounds ) ); - remove = iAttributes[index]; - iAttributes.Remove( index ); - delete remove; - remove = NULL; - } - break; - default: - #ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( " Element is of undefined type, ignore" ) ); - #endif - break; - } - } - -// ---------------------------------------------------------- -// CXdmDocumentNode::NextNode -// -// ---------------------------------------------------------- -// -EXPORT_C CXdmDocumentNode* CXdmDocumentNode::NextNode() const - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXcapDocumentNode::NextNode()" ) ); - #endif*/ - return iNextNode; - } - -// ---------------------------------------------------------- -// CXcapDocumentNode::SetNextNode -// -// ---------------------------------------------------------- -// -EXPORT_C void CXdmDocumentNode::SetNextNode( CXdmDocumentNode* aNextNode ) - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::SetNextNode()" ) ); - #endif*/ - __ASSERT_DEBUG( aNextNode != NULL, User::Panic( _L( "CXdmDocumentNode" ), EDocNodeNull ) ); - iNextNode = aNextNode; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::EscapeDescLC -// -// --------------------------------------------------------- -// -HBufC8* CXdmDocumentNode::EscapeDescLC( const TDesC8& aDescriptor ) const - { - /*#ifdef _DEBUG - iXdmEngine.WriteToLog( _L8( "CXdmDocumentNode::EscapeDescLC()" ) ); - #endif*/ - TInt bufPos = 0; - TBuf8<10> format; - HBufC8* ret = NULL; - CBufFlat* buffer = CBufFlat::NewL( 50 ); - CleanupStack::PushL( buffer ); - for( TInt i = 0;i < aDescriptor.Length();i++ ) - { - TUint8 byte = aDescriptor[i]; - switch( byte ) - { - case 0x26: //'&' - format.Append( KXmlAmpersandEsc ); - break; - case 0x3C: //'<' - format.Append( KXmlBracketOpenEsc ); - break; - case 0x3E: //'>' - format.Append( KXmlBracketCloseEsc ); - break; - default: - format.Append( byte ); - break; - } - buffer->InsertL( bufPos, format ); - bufPos = bufPos + format.Length(); - format.Zero(); - } - ret = HBufC8::NewL( buffer->Size() ); - ret->Des().Copy( buffer->BackPtr( buffer->Size() ) ); - CleanupStack::PopAndDestroy(); //buffer - CleanupStack::PushL( ret ); - return ret; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::HasAttribute -// -// --------------------------------------------------------- -// -TBool CXdmDocumentNode::HasAttribute( const CXdmNodeAttribute& aAttribute ) const - { - TBool ret = EFalse; - TInt count = iAttributes.Count(); - for( TInt i = 0;i < count && !ret;i++ ) - { - ret = iAttributes[i]->NodeName().Compare( aAttribute.NodeName() ) == 0 && - iAttributes[i]->AttributeValue().Compare( aAttribute.AttributeValue() ) == 0; - } - return ret; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::HasAttribute -// -// --------------------------------------------------------- -// -TBool CXdmDocumentNode::HasAttributeL( const SXdmAttribute8& aAttribute ) const - { - TBool ret = EFalse; - TInt count = iAttributes.Count(); - for( TInt i = 0;i < count && !ret;i++ ) - { - HBufC8* name = CXdmEngine::ConvertToUTF8L( iAttributes[i]->NodeName() ); - CleanupStack::PushL( name ); - HBufC8* value = CXdmEngine::ConvertToUTF8L( iAttributes[i]->AttributeValue() ); - CleanupStack::PushL( value ); - ret = name->Des().Compare( aAttribute.iName ) == 0 && - value->Des().Compare( aAttribute.iValue ) == 0; - CleanupStack::PopAndDestroy( 2 ); //value, name - } - return ret; - } - -// --------------------------------------------------------- -// CXdmDocumentNode::HasAttribute -// -// --------------------------------------------------------- -// -TBool CXdmDocumentNode::HasAttribute( const SXdmAttribute16& aAttribute ) const - { - TBool ret = EFalse; - TInt count = iAttributes.Count(); - for( TInt i = 0;i < count && !ret;i++ ) - { - ret = iAttributes[i]->NodeName().Compare( aAttribute.iName ) == 0 && - iAttributes[i]->AttributeValue().Compare( aAttribute.iValue ) == 0; - } - return ret; - } -