diff -r 000000000000 -r 62f9d29f7211 webservices/wsfragment/src/sendomfragmentbase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wsfragment/src/sendomfragmentbase.cpp Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,560 @@ +/* +* Copyright (c) 2002-2006 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: Class implements XML DOM fragment using libxml2 classes +* +*/ + + + + + + + + +// INCLUDE FILES +#include "SenDomFragmentBase.h" +#include // needed for TSerializationOptions + + +EXPORT_C CSenDomFragmentBase* CSenDomFragmentBase::NewL() + { + CSenDomFragmentBase* pNew = new (ELeave) CSenDomFragmentBase; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(); + CleanupStack::Pop(); // Pop pNew + return pNew; + } + +EXPORT_C CSenDomFragmentBase* CSenDomFragmentBase::NewL(const TXmlEngElement& aElement) + { + CSenDomFragmentBase* pNew = new (ELeave) CSenDomFragmentBase; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aElement); + CleanupStack::Pop(); // Pop pNew + return pNew; + } + +EXPORT_C CSenDomFragmentBase* CSenDomFragmentBase::NewL(const TDesC8& aLocalName) + { + CSenDomFragmentBase* pNew = new (ELeave) CSenDomFragmentBase; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aLocalName); + CleanupStack::Pop(); // Pop pNew + return pNew; + } + +EXPORT_C CSenDomFragmentBase* CSenDomFragmentBase::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName + ) + { + CSenDomFragmentBase* pNew = new (ELeave) CSenDomFragmentBase; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName); + CleanupStack::Pop(); // Pop pNew + return pNew; + } + +EXPORT_C CSenDomFragmentBase* CSenDomFragmentBase::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aPrefix, + const RAttributeArray& aAttrs + ) + { + CSenDomFragmentBase* pNew = new (ELeave) CSenDomFragmentBase; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aPrefix, aAttrs); + CleanupStack::Pop(); // Pop pNew + return pNew; + } + +EXPORT_C CSenDomFragmentBase* CSenDomFragmentBase::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aPrefix, + const RAttributeArray& aAttrs, + TXmlEngElement& aParent + ) + { + CSenDomFragmentBase* pNew = new (ELeave) CSenDomFragmentBase; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aPrefix, aAttrs, aParent); + CleanupStack::Pop(); // delete pNew; + return pNew; + } + +EXPORT_C CSenDomFragmentBase* CSenDomFragmentBase::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aPrefix, + const RAttributeArray& aAttrs, + TXmlEngElement& aParent, + RSenDocument& aOwnerDocument + ) + { + CSenDomFragmentBase* pNew = new (ELeave) CSenDomFragmentBase; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aPrefix, aAttrs, aParent, + aOwnerDocument); + CleanupStack::Pop(); // delete pNew; + return pNew; + } + +EXPORT_C CSenDomFragmentBase* CSenDomFragmentBase::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aPrefix + ) + { + CSenDomFragmentBase* pNew = new (ELeave) CSenDomFragmentBase; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aPrefix); + CleanupStack::Pop(); // delete pNew; + return pNew; + } + +EXPORT_C CSenDomFragmentBase::~CSenDomFragmentBase() + { + if ( ipDomDelegate ) + { + // We do not own the element, so remove it from the fragment. + //ipDomDelegate->ExtractElement(); + delete ipDomDelegate; + ipDomDelegate = NULL; + } + } + +EXPORT_C CSenDomFragmentBase::CSenDomFragmentBase() +: ipDomDelegate(NULL) + { + } + +EXPORT_C void CSenDomFragmentBase::BaseConstructL() + { + iDocument = RSenDocument::NewL(); + } + +EXPORT_C void CSenDomFragmentBase::BaseConstructL(const TXmlEngElement& aElement) + { + CSenFragmentBase::BaseConstructL(aElement); + } + +EXPORT_C void CSenDomFragmentBase::BaseConstructL(const TDesC8& aLocalName) + { + CSenFragmentBase::BaseConstructL(aLocalName); + } + +EXPORT_C void CSenDomFragmentBase::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName + ) + { + CSenFragmentBase::BaseConstructL(aNsUri, aLocalName); + } + +EXPORT_C void CSenDomFragmentBase::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aPrefix, + const RAttributeArray& aAttrs + ) + { + CSenFragmentBase::BaseConstructL(aNsUri, aLocalName, aPrefix, aAttrs); + } + +EXPORT_C void CSenDomFragmentBase::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aPrefix, + const RAttributeArray& aAttrs, + TXmlEngElement& aParent + ) + { + CSenFragmentBase::BaseConstructL( aNsUri, + aLocalName, + aPrefix, + aAttrs, + aParent); + } + +EXPORT_C void CSenDomFragmentBase::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aPrefix, + const RAttributeArray& aAttrs, + TXmlEngElement& aParent, + RSenDocument& aOwnerDocument + ) + { + CSenFragmentBase::BaseConstructL( aNsUri, + aLocalName, + aPrefix, + aAttrs, + aParent, + aOwnerDocument); + } + +EXPORT_C void CSenDomFragmentBase::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aPrefix + ) + { + CSenFragmentBase::BaseConstructL(aNsUri, aLocalName, aPrefix); + } + +EXPORT_C void CSenDomFragmentBase::OnStartElementL(const RTagInfo& aElement, + const RAttributeArray& aAttributes, + TInt aErrorCode) + { + const TPtrC8 saxLocalName = aElement.LocalName().DesC(); + const TPtrC8 saxNsUri = aElement.Uri().DesC(); + const TPtrC8 saxPrefix = aElement.Prefix().DesC(); + + + if ( iElement.IsNull() ) + { + if ( saxNsUri == KNullDesC8 && saxPrefix == KNullDesC8 ) + { + iDocument.CreateDocumentElementL(saxLocalName); + } + else + { + if ( saxPrefix == KNullDesC8 ) + { + iDocument.CreateDocumentElementL(saxLocalName, + saxNsUri, + KNullDesC8); + } + else + { + iDocument.CreateDocumentElementL(saxLocalName, + saxNsUri, + saxPrefix); + } + } + iElement = iDocument.DocumentElement(); + } + + TXmlEngElement element = AsElementL(); + + TPtrC8 localName = element.Name(); + TPtrC8 nsUri(KNullDesC8); + if ( element.NamespaceUri() != KNullDesC8 ) + { + nsUri.Set(element.NamespaceUri()); + } + + if(iState == KSenStateIgnore) + { + if(localName == saxLocalName && nsUri == saxNsUri) + { + iState = KSenStateSave; + AddNamespacesL(); + AddAttributesL(aAttributes); + } + else + { + if ( ipNamespaceArray ) + { + ipNamespaceArray->ResetAndDestroy(); + } + } + } + else if((iState & KSenStateSave) == KSenStateSave) + { + ExpandL(aElement, aAttributes, aErrorCode); + } + } + +EXPORT_C void CSenDomFragmentBase::OnContentL(const TDesC8& aBytes, + TInt /*aErrorCode*/) + { + if((iState & KSenStateSave) == KSenStateSave) + { + TXmlEngElement element = AsElementL(); + element.AddTextL(aBytes); + } + } + +EXPORT_C void CSenDomFragmentBase::ExpandL(const RTagInfo& aElement, + const RAttributeArray& aAttributes, + TInt /*aErrorCode*/) + { + if ( ipDomDelegate ) + { + // We do not own the element, so remove it from the fragment. + //ipDomDelegate->ExtractElement(); + delete ipDomDelegate; + ipDomDelegate = NULL; + } + + const TPtrC8 saxLocalName = aElement.LocalName().DesC(); + const TPtrC8 saxNsUri = aElement.Uri().DesC(); + const TPtrC8 saxPrefix = aElement.Prefix().DesC(); + + TXmlEngElement element = AsElementL(); + RSenDocument document = AsDocumentL(); + + // delegate parsing to a new DOMFragment, + // until we encounter the end of an element with the given qualified name + ipDomDelegate = CSenDomFragmentBase::NewL( saxNsUri, + saxLocalName, + saxPrefix, + aAttributes, + element, + document ); + + ipDomDelegate->iState = KSenStateDelegate; + + OnDelegateParsingL(*ipDomDelegate); // note that the parsing is actually + // performed AFTER the StartElement() + // method, which called this ExpandL() + // has been fully executed (this is an + // async signal send to the _same_ + // parser(!) + } + + +EXPORT_C void CSenDomFragmentBase::OnWriteStartElementL( + const RTagInfo& /*aElement*/, + const RAttributeArray& /*aAttributes*/) + { + // in DOM fragment: do nothing + } + +EXPORT_C void CSenDomFragmentBase::OnWriteEndElementL( + const RTagInfo& /*aElement*/) + { + // in DOM fragment: do nothing + } + + +// Overridden from CSenBaseFragment to be much more simple +EXPORT_C void CSenDomFragmentBase::OnResumeParsingFromL( + const RTagInfo& /*aElement*/, + TInt /*aErrorCode*/) + { + SetContentHandler(*this); + + if ( ipDomDelegate ) + { + delete ipDomDelegate; + ipDomDelegate = NULL; + } + } + +EXPORT_C HBufC8* CSenDomFragmentBase::AsXmlL() + { + return CSenFragmentBase::AsXmlL(); + } + +EXPORT_C void CSenDomFragmentBase::AddNamespacesL() + { + CSenFragmentBase::AddNamespacesL(); + } + +EXPORT_C void CSenDomFragmentBase::AddAttributesL(const RAttributeArray& aAttrs) + { + CSenFragmentBase::AddAttributesL(aAttrs); + } + +EXPORT_C void CSenDomFragmentBase::OnEndElementL(const RTagInfo& aElement, TInt aErrorCode) + { + CSenFragmentBase::OnEndElementL(aElement, aErrorCode); + } + +EXPORT_C void CSenDomFragmentBase::OnStartDocumentL(const RDocumentParameters& /*aDocParam*/, TInt /*aErrorCode*/) + { + // in DOM fragment: do nothing + } + +EXPORT_C void CSenDomFragmentBase::OnEndDocumentL(TInt /*aErrorCode*/) + { + // in DOM fragment: do nothing + } + +EXPORT_C void CSenDomFragmentBase::OnStartPrefixMappingL(const RString& aPrefix, const RString& aUri, TInt aErrorCode) + { + CSenFragmentBase::OnStartPrefixMappingL(aPrefix, aUri, aErrorCode); + } + +EXPORT_C void CSenDomFragmentBase::OnEndPrefixMappingL(const RString& aPrefix, TInt aErrorCode) + { + CSenFragmentBase::OnEndPrefixMappingL(aPrefix, aErrorCode); + } + +EXPORT_C void CSenDomFragmentBase::OnIgnorableWhiteSpaceL(const TDesC8& aBytes, TInt ErrorCode) + { + CSenFragmentBase::OnIgnorableWhiteSpaceL(aBytes, ErrorCode); + } + +EXPORT_C void CSenDomFragmentBase::OnSkippedEntityL(const RString& aName, TInt aErrorCode) + { + CSenFragmentBase::OnSkippedEntityL(aName, aErrorCode); + } + +EXPORT_C void CSenDomFragmentBase::OnProcessingInstructionL(const TDesC8& aTarget, const TDesC8& aData, TInt aErrorCode) + { + CSenFragmentBase::OnProcessingInstructionL(aTarget, aData, aErrorCode); + } + +EXPORT_C void CSenDomFragmentBase::OnError(TInt aErrorCode) + { + CSenFragmentBase::OnError(aErrorCode); + } + +EXPORT_C TAny* CSenDomFragmentBase::GetExtendedInterface(const TInt32 aUid) + { + return CSenFragmentBase::GetExtendedInterface(aUid); + } + +EXPORT_C TPtrC8 CSenDomFragmentBase::ContentL() + { + return CSenFragmentBase::ContentL(); + } + +EXPORT_C TXmlEngNamespace CSenDomFragmentBase::Namespace(const TDesC8& aPrefix) + { + return CSenFragmentBase::Namespace(aPrefix); + } + +//EXPORT_C void CSenDomFragmentBase::DetachL() +// { +// CSenFragmentBase::DetachL(); +// } + +EXPORT_C void CSenDomFragmentBase::ResetContentL() + { + CSenFragmentBase::ResetContentL(); + } + +EXPORT_C TPtrC8 CSenDomFragmentBase::LocalName() const + { + return CSenFragmentBase::LocalName(); + } + +EXPORT_C TPtrC8 CSenDomFragmentBase::NsUri() const + { + return CSenFragmentBase::NsUri(); + } + +EXPORT_C TPtrC8 CSenDomFragmentBase::NsPrefix() const + { + return CSenFragmentBase::NsPrefix(); + } + +EXPORT_C TXmlEngElement CSenDomFragmentBase::AsElementL() + { + return CSenFragmentBase::AsElementL(); + } + +EXPORT_C RSenDocument& CSenDomFragmentBase::AsDocumentL() + { + return CSenFragmentBase::AsDocumentL(); + } + +EXPORT_C TXmlEngElement CSenDomFragmentBase::ExtractElement() + { + return CSenFragmentBase::ExtractElement(); + } + +EXPORT_C void CSenDomFragmentBase::OnDelegateParsingL(CSenFragmentBase& aDelegate) + { + CSenFragmentBase::OnDelegateParsingL(aDelegate); + } + +EXPORT_C void CSenDomFragmentBase::OnDelegateParsingL(const RTagInfo& aElement, + const RAttributeArray& aAttributes, + TInt aErrorCode) + { + CSenFragmentBase::OnDelegateParsingL(aElement, aAttributes, aErrorCode); + } + +EXPORT_C void CSenDomFragmentBase::SetOwner(CSenFragmentBase& aFragment) + { + CSenFragmentBase::SetOwner(aFragment); + } + +EXPORT_C HBufC* CSenDomFragmentBase::AsXmlUnicodeL() + { + return CSenFragmentBase::AsXmlUnicodeL(); + } + +EXPORT_C void CSenDomFragmentBase::WriteAsXMLToL(RWriteStream& aWs) + { + CSenFragmentBase::WriteAsXMLToL(aWs); + } + +EXPORT_C TBool CSenDomFragmentBase::ConsistsOfL(CSenFragmentBase& aCandidate) + { + return CSenFragmentBase::ConsistsOfL(aCandidate); + } + +EXPORT_C void CSenDomFragmentBase::SetContentHandler(CSenFragmentBase& aContentHandler) + { + CSenFragmentBase::SetContentHandler(aContentHandler); + } + +void CSenDomFragmentBase::RenameL(const TDesC8& aLocalName, const TDesC8& aPrefix, const TDesC8& aNamespace) + { + CSenFragmentBase::RenameL(aLocalName, aPrefix, aNamespace); + } + +void CSenDomFragmentBase::RenameL(const TDesC8& aLocalName, const TDesC8& aNamespace) + { + CSenFragmentBase::RenameL(aLocalName, aNamespace); + } + +void CSenDomFragmentBase::RenameLocalNameL(const TDesC8& aLocalName) + { + CSenFragmentBase::RenameLocalNameL(aLocalName); + } + +void CSenDomFragmentBase::RenameNamespaceL(const TDesC8& aNamespace) + { + CSenFragmentBase::RenameNamespaceL(aNamespace); + } + +void CSenDomFragmentBase::RenamePrefixL(const TDesC8& aPrefix) + { + CSenFragmentBase::RenamePrefixL(aPrefix); + } + +void CSenDomFragmentBase::RenameNamespaceL(const TDesC8& aPrefix, const TDesC8& aNamespace) + { + CSenFragmentBase::RenameNamespaceL(aPrefix, aNamespace); + } + +EXPORT_C TXmlEngElement CSenDomFragmentBase::SetContentOfL(const TDesC8& aLocalName, + const TDesC8& aContent) + { + return CSenFragmentBase::SetContentOfL(aLocalName, aContent); + } + +EXPORT_C TPtrC8 CSenDomFragmentBase::ContentOf(const TDesC8& aLocalName) + { + return CSenFragmentBase::ContentOf(aLocalName); + } + +EXPORT_C TBool CSenDomFragmentBase::ConsistsOfL(TXmlEngElement& aElement, + TXmlEngElement& aCandidate) + { + return CSenFragmentBase::ConsistsOfL(aElement, aCandidate); + } + + +// End of File +