diff -r 000000000000 -r c8caa15ef882 xdmprotocols/XdmXmlParser/src/XdmXmlContentHandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xdmprotocols/XdmXmlParser/src/XdmXmlContentHandler.cpp Tue Feb 02 01:05:17 2010 +0200 @@ -0,0 +1,512 @@ +/* +* 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: CXdmXmlContentHandler +* +*/ + + + +#include +#include +#include +#include +#include "XdmNamespaceContainer.h" +#include "XdmXmlParser.h" +#include "XdmNodeInterface.h" +#include "XmlParserNodePath.h" +#include "XdmXmlContentHandler.h" + +// --------------------------------------------------------- +// CXdmXmlContentHandler::CXdmXmlContentHandler +// +// --------------------------------------------------------- +// +CXdmXmlContentHandler::CXdmXmlContentHandler( CXdmXmlParser& aParserMain ) : + iFinished( EFalse ), + iTargetFound( EFalse ), + iPartialDocument( EFalse ), + iParserMain( aParserMain ) + + { + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::NewL +// +// --------------------------------------------------------- +// +CXdmXmlContentHandler* CXdmXmlContentHandler::NewL( CXdmXmlParser& aParserMain ) + { + CXdmXmlContentHandler* self = new ( ELeave ) CXdmXmlContentHandler( aParserMain ); + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::ConstructL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::ConstructL() + { + iContentBuffer = CBufFlat::NewL( 50 ); + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::~CXdmXmlContentHandler +// +// --------------------------------------------------------- +// +CXdmXmlContentHandler::~CXdmXmlContentHandler() + { + delete iNodePath; + delete iContentBuffer; + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::SetTarget +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::SetTarget( const CXdmDocument& aTargetDocument ) + { + iTargetDocument = CONST_CAST( CXdmDocument*, &aTargetDocument ); + iRootNode = iTargetDocument->DocumentRoot(); + iDocumentSubset = NULL; + iIsRootNode = ETrue; + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::SetTarget +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::SetTarget( const CXdmDocumentNode& aDocumentRoot ) + { + iTargetDocument = NULL; + iRootNode = CONST_CAST( CXdmDocumentNode*, &aDocumentRoot ); + iDocumentSubset = NULL; + iIsRootNode = ETrue; + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::SetTarget +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::SetTargetL( const CXdmDocument& aTargetDocument, + const CXdmDocumentNode& aTargetNode ) + { + iElementType = aTargetNode.ElementType(); + iTargetDocument = CONST_CAST( CXdmDocument*, &aTargetDocument ); + if( iElementType == EXdmElementAttribute ) + { + iTargetAttribute = ( CXdmNodeAttribute* )&aTargetNode; + iDocumentSubset = CONST_CAST( CXdmDocumentNode*, aTargetNode.Parent() ); + } + else + { + iTargetAttribute = NULL; + iDocumentSubset = CONST_CAST( CXdmDocumentNode*, &aTargetNode ); + } + iNodePath = CXmlParserNodePath::NewL( iParserMain, iElementType, *iDocumentSubset, this ); + iRootNode = iDocumentSubset; + iPartialDocument = ETrue; + iCurrentNode = NULL; + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::TargetAttribute +// +// --------------------------------------------------------- +// +CXdmNodeAttribute* CXdmXmlContentHandler::TargetAttribute() const + { + return iTargetAttribute; + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::Reset +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::Reset() + { + iTargetDocument = NULL; + iTargetAttribute = NULL; + iDocumentSubset = NULL; + iRootNode = NULL; + iCurrentNode = NULL; + delete iNodePath; + iNodePath = NULL; + iFinished = EFalse; + iTargetFound = EFalse; + iPartialDocument = EFalse; + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::GetExtendedInterface +// +// --------------------------------------------------------- +// +TAny* CXdmXmlContentHandler::GetExtendedInterface( const TInt32 /*aUid*/ ) + { + return NULL; + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnContentL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnContentL( const TDesC8 &aBytes, + TInt aErrorCode ) + { + #ifdef _DEBUG + iParserMain.WriteToLog( _L8( "CXmlNode::OnContentL()" ), aErrorCode ); + iParserMain.WriteToLog( _L8( " Bytes: %S" ), &aBytes ); + iParserMain.WriteToLog( _L8( " Error: %d" ), aErrorCode ); + #endif + if( iPartialDocument && !iTargetFound ) + return; + TInt length = aBytes.Length(); + TPtr8 desc( CONST_CAST( TUint8*, aBytes.Ptr() ), length, length ); + desc.TrimAll(); + if( desc.Length() > 0 ) + { + iContentBuffer->InsertL( iContentIndex, desc ); + iContentIndex = iContentIndex + desc.Length(); + } + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnEndDocumentL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnEndDocumentL( TInt aErrorCode ) + { + iIsRootNode = ETrue; + #ifdef _DEBUG + iParserMain.WriteToLog( _L8( "CXmlNode::OnEndDocumentL() - Error: %d "), aErrorCode ); + #endif + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnEndElementL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnEndElementL( const RTagInfo &aElement, + TInt aErrorCode ) + { + TPtrC8 element( aElement.LocalName().DesC() ); + #ifdef _DEBUG + iParserMain.WriteToLog( _L8( "CXmlNode::OnEndElementL() - Element: %S Error: %d "), + &element, aErrorCode ); + #endif + if( iCurrentNode != NULL && iContentBuffer->Size() > 0 ) + { + TPtrC8 data( iContentBuffer->Ptr( 0 ) ); + iCurrentNode->SetLeafNode( ETrue ); + iCurrentNode->SetLeafNodeContentL( data ); + iContentBuffer->Reset(); + iContentIndex = 0; + } + if( iCurrentNode != NULL && iCurrentNode->NodeCount() == 0 ) + iCurrentNode->SetEmptyNode( ETrue ); + if( iPartialDocument ) + { + if( !iFinished ) + { + if( iCurrentNode != NULL ) + { + CXdmDocumentNode* parent = iCurrentNode->Parent(); + #ifdef _DEBUG + TBuf8<64> parentName; + TBuf8<64> currentName; + parentName.Copy( parent->NodeName() ); + currentName.Copy( iCurrentNode->NodeName() ); + iParserMain.WriteToLog( _L8( " Parent: %x - %S "), parent, &parentName ); + iParserMain.WriteToLog( _L8( " Current: %x - %S"), iCurrentNode, ¤tName ); + #endif + if( parent != NULL && iCurrentNode != parent ) + iCurrentNode = iCurrentNode->Parent(); + iFinished = iCurrentNode == iDocumentSubset->Parent(); + if( iFinished ) + iCurrentNode = NULL; + #ifdef _DEBUG + iParserMain.WriteToLog( _L8( " Current: %x"), iCurrentNode ); + #endif + } + } + } + else iCurrentNode = iCurrentNode->Parent(); + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnEndPrefixMappingL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnEndPrefixMappingL( const RString& /*aPrefix*/, + TInt aErrorCode ) + { + #ifdef _DEBUG + iParserMain.WriteToLog( _L8( "CXmlNode::OnEndPrefixMappingL() - Error: %d "), aErrorCode ); + #endif + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnError +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnError( TInt aErrorCode ) + { + #ifdef _DEBUG + iParserMain.WriteToLog( _L8( "CXmlNode::OnError() - Error: %d" ), aErrorCode ); + #endif + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnIgnorableWhiteSpaceL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnIgnorableWhiteSpaceL( const TDesC8& /*aBytes*/, + TInt /*aErrorCode*/ ) + { + #ifdef _DEBUG + //iParserMain.WriteToLog( _L8( "CXmlNode::OnIgnorableWhiteSpaceL() - Error: %d" ), aErrorCode ); + #endif + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnProcessingInstructionL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnProcessingInstructionL( const TDesC8& /*aTarget*/, + const TDesC8& /*aData*/, + TInt /*aErrorCode*/ ) + { + #ifdef _DEBUG + // iParserMain.WriteToLog( _L8( "CXmlNode::OnProcessingInstructionL() - Error: %d" ), aErrorCode ); + #endif + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnSkippedEntityL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnSkippedEntityL( const RString& /*aName*/, + TInt /*aErrorCode*/ ) + { + #ifdef _DEBUG + //iParserMain.WriteToLog( _L8( "CXmlNode::OnSkippedEntityL() - Error: %d" ), aErrorCode ); + #endif + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnStartDocumentL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnStartDocumentL( const RDocumentParameters& /*aDocParam*/, TInt aErrorCode ) + { + #ifdef _DEBUG + iParserMain.WriteToLog( _L8( "CXmlNode::OnStartDocumentL() - Error: %d "), aErrorCode ); + #endif + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnStartElementL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnStartElementL( const RTagInfo& aElement, + const RAttributeArray& aAttributes, + TInt aErrorCode ) + { + TPtrC8 name( aElement.LocalName().DesC() ); + TPtrC8 uri( aElement.Uri().DesC() ); + TPtrC8 prefix( aElement.Prefix().DesC() ); + #ifdef _DEBUG + iParserMain.WriteToLog( _L8( "CXmlNode::OnStartElementL(): Error: %d" ), aErrorCode ); + iParserMain.WriteToLog( _L8( " URI: %S" ), &uri ); + iParserMain.WriteToLog( _L8( " Name: %S" ), &name ); + iParserMain.WriteToLog( _L8( " Prefix: %S" ), &prefix ); + #endif + if( iPartialDocument ) + { + if( !iFinished ) + { + if( iTargetFound ) + { + iCurrentNode = iCurrentNode->CreateChileNodeL(); + HandleNextElementL( aElement, aAttributes ); + } + else + { + if( iNodePath->CheckNextNodeL( name, aAttributes ) ) + { + if( iElementType == EXdmElementAttribute ) + AppendAttributeValueL( aAttributes ); + else + { + iTargetFound = ETrue; + iCurrentNode = iDocumentSubset; + } + } + } + } + } + else + { + iCurrentNode = iIsRootNode ? iRootNode : iCurrentNode->CreateChileNodeL(); + HandleNextElementL( aElement, aAttributes ); + iIsRootNode = EFalse; + } + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::HandleNextElementL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::HandleNextElementL( const RTagInfo& aElement, + const RAttributeArray& aAttributes ) + { + #ifdef _DEBUG + //iParserMain.WriteToLog( _L8( "CXdmXmlContentHandler::HandleNextElementL()") ); + #endif + iCurrentNode->SetNameL( aElement.LocalName().DesC() ); + SetNamespaceInformationL( aElement, iCurrentNode ); + TInt count = aAttributes.Count(); + if( count > 0 ) + { + CXdmNodeAttribute* attribute = NULL; + for( TInt i = 0;i < count;i++ ) + { + attribute = iCurrentNode->CreateAttributeL(); + CleanupStack::PushL( attribute ); + attribute->SetNameL( aAttributes[i].Attribute().LocalName().DesC() ); + attribute->SetAttributeValueL( aAttributes[i].Value().DesC() ); + CleanupStack::Pop(); //attribute + } + } + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::CompileAttributesL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::AppendAttributeValueL( const RAttributeArray& aAttributes ) + { + #ifdef _DEBUG + //iParserMain.WriteToLog( _L8( "CXdmXmlContentHandler::AppendAttributeValueL()") ); + #endif + TInt count = aAttributes.Count(); + TPtrC8 targetName( iTargetAttribute->EightBitNodeNameLC()->Des() ); + for( TInt i = 0;!iFinished && i < count;i++ ) + { + TPtrC8 desc = aAttributes[i].Attribute().LocalName().DesC(); + #ifdef _DEBUG + iParserMain.WriteToLog( _L8( " Name of attribute %d: %S"), i, &desc ); + #endif + if( targetName.Compare( desc ) == 0 ) + { + iFinished = ETrue; + TPtrC8 value( aAttributes[i].Value().DesC() ); + iTargetAttribute->SetAttributeValueL( value ); + } + } + CleanupStack::PopAndDestroy(); //desc + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::OnStartPrefixMappingL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::OnStartPrefixMappingL( const RString& aPrefix, + const RString& aUri, + TInt aErrorCode ) + { + #ifdef _DEBUG + iParserMain.WriteToLog( _L8( "CXdmXmlContentHandler::OnStartPrefixMappingL() - Error: %d" ), aErrorCode ); + #endif + AppendNameSpaceL( aPrefix.DesC(), aUri.DesC() ); + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::IsWhiteSpace +// +// --------------------------------------------------------- +// +TBool CXdmXmlContentHandler::IsWhiteSpace( const TDesC8 &aBytes ) const + { + #ifdef _DEBUG + //iParserMain.WriteToLog( _L8( "CXdmXmlContentHandler::IsWhiteSpace()") ); + #endif + TBool ret = ETrue; + if( aBytes.Length() > 0 ) + { + TChar ch = aBytes[0]; + ret = ch == 32 || ch == 10 || ch == 13 || ch == 9; + } + return ret; + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::AppendNameSpaceL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::AppendNameSpaceL( const TDesC8& aPrefix, const TDesC8& aUri ) + { + #ifdef _DEBUG + //iParserMain.WriteToLog( _L8( "CXdmXmlContentHandler::SetNameSpaceInformationL()") ); + #endif + if( iTargetDocument != NULL ) + { + MXdmNamespaceContainer* container = iTargetDocument; + container->AppendNamespaceL( aUri, aPrefix ); + } + } + +// --------------------------------------------------------- +// CXdmXmlContentHandler::SetNameSpaceInformationL +// +// --------------------------------------------------------- +// +void CXdmXmlContentHandler::SetNamespaceInformationL( const RTagInfo& aElement, + MXdmNodeInterface* aXcapNode ) + { + #ifdef _DEBUG + //iParserMain.WriteToLog( _L8( "CXdmXmlContentHandler::SetNameSpaceInformationL()") ); + #endif + TPtrC8 prefix( aElement.Prefix().DesC() ); + if( prefix.Length() > 0 ) + { + aXcapNode->SetPrefixL( prefix ); + } + } + +// End of File