diff -r 000000000000 -r 62f9d29f7211 webservices/wsxml/src/sendomfragment.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wsxml/src/sendomfragment.cpp Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,326 @@ +/* +* Copyright (c) 2002-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: +* +*/ + + + + + + + + +// INCLUDE FILES +#include "SenXmlElement.h" +#include "SenDomFragment.h" +#include "SenXmlConstants.h" +#include "SenXmlUtils.h" +#include "senxmldebug.h" + +EXPORT_C CSenDomFragment* CSenDomFragment::NewL() + { + CSenDomFragment* pNew = new (ELeave) CSenDomFragment; + return pNew; + } + +EXPORT_C CSenDomFragment* CSenDomFragment::NewL(const CSenElement& aElement) + { + CSenDomFragment* pNew = new (ELeave) CSenDomFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aElement); + CleanupStack::Pop(); // delete pNew; + return pNew; + } + +EXPORT_C CSenDomFragment* CSenDomFragment::NewL(const TDesC8& aLocalName) + { + CSenDomFragment* pNew = new (ELeave) CSenDomFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aLocalName); + CleanupStack::Pop(); // delete pNew; + return pNew; + } + +EXPORT_C CSenDomFragment* CSenDomFragment::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName + ) + { + CSenDomFragment* pNew = new (ELeave) CSenDomFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName); + CleanupStack::Pop(); // delete pNew; + return pNew; + } + +EXPORT_C CSenDomFragment* CSenDomFragment::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + const RAttributeArray& aAttrs + ) + { + CSenDomFragment* pNew = new (ELeave) CSenDomFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aQName, aAttrs); + CleanupStack::Pop(); // delete pNew; + return pNew; + } + +EXPORT_C CSenDomFragment* CSenDomFragment::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + /* NOT IN JAVA */ + const RAttributeArray& aAttrs, + CSenElement& aParent + ) + { + CSenDomFragment* pNew = new (ELeave) CSenDomFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aQName, aAttrs, aParent); + CleanupStack::Pop(); // delete pNew; + return pNew; + } + +EXPORT_C CSenDomFragment* CSenDomFragment::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName + ) + { + CSenDomFragment* pNew = new (ELeave) CSenDomFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aQName); + CleanupStack::Pop(); // delete pNew; + return pNew; + } + +EXPORT_C CSenDomFragment::~CSenDomFragment() + { + if(ipDomDelegate) + { + // We do not own the element, so remove it from the fragment. + ipDomDelegate->ExtractElement(); + delete ipDomDelegate; + ipDomDelegate = NULL; + } + } + +EXPORT_C CSenDomFragment::CSenDomFragment() +:ipDomDelegate(NULL) + { + } + +EXPORT_C void CSenDomFragment::BaseConstructL(const CSenElement& aElement) + { + CSenBaseFragment::BaseConstructL(aElement); + } + +EXPORT_C void CSenDomFragment::BaseConstructL(const TDesC8& aLocalName) + { + CSenBaseFragment::BaseConstructL(aLocalName); + } + +EXPORT_C void CSenDomFragment::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName + ) + { + CSenBaseFragment::BaseConstructL(aNsUri, aLocalName); + } + +EXPORT_C void CSenDomFragment::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + const RAttributeArray& aAttrs + ) + { + CSenBaseFragment::BaseConstructL(aNsUri, aLocalName, aQName, aAttrs); + } + +EXPORT_C void CSenDomFragment::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + const RAttributeArray& aAttrs, + CSenElement& aParent + ) + { + CSenBaseFragment::BaseConstructL( aNsUri, + aLocalName, + aQName, + aAttrs, + aParent); + } + +EXPORT_C void CSenDomFragment::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName + ) + { + CSenBaseFragment::BaseConstructL(aNsUri, aLocalName, aQName); + } + + +EXPORT_C void CSenDomFragment::BaseConstructL(CSenXmlReader& aReader) + { + CSenBaseFragment::BaseConstructL(aReader); + } + + +EXPORT_C void CSenDomFragment::ParseWithL(CSenXmlReader& aReader) // IOP + { + CSenBaseFragment::ParseWithL(aReader); + iState = KStateSave; // IOP + } + +EXPORT_C void CSenDomFragment::StartElementL(const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + const RAttributeArray& aAttrs) + { + + // 2004-09-10. moved out from KStateIgnore -code segment + if(!ipElement) + { + ipElement = CSenXmlElement::NewL(aNsUri, aLocalName, aQName); + } + AllocContentSaverL(); + + if(iState == KStateIgnore) + { + const TDesC8& localName = ipElement->LocalName(); + const TDesC8& nsUri = ipElement->NamespaceURI(); + + if(localName == aLocalName && nsUri == aNsUri) + { + iState = KStateSave; // IOP + SetAttributesL(aAttrs); + } + } + else if((iState & KStateSave) == KStateSave) + { + ExpandL(aNsUri, aLocalName, aQName, aAttrs); + } + } + +EXPORT_C void CSenDomFragment::CharactersL( + const TDesC8& aChars, + const TInt /*aStart*/, + const TInt /*aLength*/ + ) + { + AllocContentSaverL(); + + + HBufC8* pCharsCopy = NULL; + + if (SenXmlUtils::EncodeHttpCharactersL(aChars, pCharsCopy)) + { + CleanupStack::PushL(pCharsCopy); + iWs.WriteL(*pCharsCopy); + CleanupStack::PopAndDestroy(); // pCharsCopy + } + else + { + iWs.WriteL(aChars); + } + } + +EXPORT_C void CSenDomFragment::SetAttributesL(const RAttributeArray& aAttrs) + { + CSenBaseFragment::SetAttributesL(aAttrs); + if(ipElement) + { + ((CSenXmlElement*)ipElement)->SetAttributesL(aAttrs); + } + } + +EXPORT_C void CSenDomFragment::ExpandL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + const RAttributeArray& aAttrs + ) + { + + if(ipDomDelegate) + { + // We do not own the element, so remove it from the fragment. + ipDomDelegate->ExtractElement(); + delete ipDomDelegate; + ipDomDelegate = NULL; + } + + // delegate parsing to a new DOMFragment, + // until we encounter the end of an element with the given qualified name + ipDomDelegate = CSenDomFragment::NewL( aNsUri, + aLocalName, + aQName, + aAttrs, + *ipElement); + + ipElement->AddElementL(ipDomDelegate->AsElement()); + + DelegateParsingL(*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 CSenDomFragment::WriteStartElementL( + const TDesC8& /* aNsUri */, + const TDesC8& /* aLocalName */, + const TDesC8& /* aQName */, + const RAttributeArray& /*aAttrs*/ + ) + { + // in DOM fragment: do nothing + } + +EXPORT_C void CSenDomFragment::WriteEndElementL( + const TDesC8& /* aNsUri */, + const TDesC8& /* aLocalName */, + const TDesC8& /* aQName */ + ) + { + // in DOM fragment: do nothing + } + + +// Overridden from CSenBaseFragment to be much more simple +EXPORT_C void CSenDomFragment::ResumeParsingFromL( // IOP + const TDesC8& /*aNsUri*/, + const TDesC8& /*aLocalName*/, + const TDesC8& /*aQName*/ + ) + { + iXmlReader->SetContentHandler(*this); + if(ipDomDelegate) + { + // We do not own the element, so remove it from the fragment. + ipDomDelegate->ExtractElement(); + delete ipDomDelegate; + ipDomDelegate = NULL; + } + } + +// End of File