diff -r 000000000000 -r 62f9d29f7211 webservices/wsutils/src/senpropertiesfragment.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wsutils/src/senpropertiesfragment.cpp Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,329 @@ +/* +* Copyright (c) 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: +* +*/ + + + + + + + + +#include +#include "senpropertiesfragment.h" +#include "senpropertieselement.h" + +EXPORT_C CSenPropertiesFragment* CSenPropertiesFragment::NewL( + RStringPool* aStringPool) + { + CSenPropertiesFragment* pNew = new (ELeave) CSenPropertiesFragment; + pNew->ipStringPool = aStringPool; + return pNew; + } + +EXPORT_C CSenPropertiesFragment* CSenPropertiesFragment::NewL( + const CSenElement& aElement, + RStringPool* aStringPool) + { + CSenPropertiesFragment* pNew = new (ELeave) CSenPropertiesFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aElement, aStringPool); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenPropertiesFragment* CSenPropertiesFragment::NewL( + const TDesC8& aLocalName, + RStringPool* aStringPool) + { + CSenPropertiesFragment* pNew = new (ELeave) CSenPropertiesFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aLocalName, aStringPool); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenPropertiesFragment* CSenPropertiesFragment::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + RStringPool* aStringPool) + { + CSenPropertiesFragment* pNew = new (ELeave) CSenPropertiesFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aStringPool); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenPropertiesFragment* CSenPropertiesFragment::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + const RAttributeArray& aAttrs, + RStringPool* aStringPool) + { + CSenPropertiesFragment* pNew = new (ELeave) CSenPropertiesFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aQName, aAttrs, aStringPool); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenPropertiesFragment* CSenPropertiesFragment::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + const RAttributeArray& aAttrs, + CSenElement& aParent, + RStringPool* aStringPool) + { + CSenPropertiesFragment* pNew = new (ELeave) CSenPropertiesFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aQName, aAttrs, aParent, + aStringPool); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenPropertiesFragment* CSenPropertiesFragment::NewL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + RStringPool* aStringPool) + { + CSenPropertiesFragment* pNew = new (ELeave) CSenPropertiesFragment; + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aNsUri, aLocalName, aQName, aStringPool); + CleanupStack::Pop(pNew); + return pNew; + } + +CSenPropertiesFragment::~CSenPropertiesFragment() + { + } + +CSenPropertiesFragment::CSenPropertiesFragment() + { + } + +void CSenPropertiesFragment::BaseConstructL(const CSenElement& aElement, + RStringPool* aStringPool) + { + ipStringPool = aStringPool; + ipElement = CSenPropertiesElement::NewL(aElement.LocalName(), + ipStringPool); + ipElement->CopyFromL((CSenElement&)aElement); + } + +void CSenPropertiesFragment::BaseConstructL(const TDesC8& aLocalName, + RStringPool* aStringPool) + { + ipStringPool = aStringPool; + ipElement = CSenPropertiesElement::NewL(aLocalName, ipStringPool); + } + +void CSenPropertiesFragment::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + RStringPool* aStringPool) + { + ipStringPool = aStringPool; + ipElement = CSenPropertiesElement::NewL(aNsUri, aLocalName, ipStringPool); + } + +void CSenPropertiesFragment::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + const RAttributeArray& aAttrs, + RStringPool* aStringPool) + { + ipStringPool = aStringPool; + ipElement = CSenPropertiesElement::NewL(aNsUri, aLocalName, aQName, + aAttrs, ipStringPool); + } + +void CSenPropertiesFragment::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + const RAttributeArray& aAttrs, + CSenElement& aParent, + RStringPool* aStringPool) + { + ipStringPool = aStringPool; + // this transfers the ipElement ownership to the parent(!) + ipElement = CSenPropertiesElement::NewL(aNsUri, aLocalName, aQName, aAttrs, + aParent, ipStringPool); + } + +void CSenPropertiesFragment::BaseConstructL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + RStringPool* aStringPool + ) + { + ipStringPool = aStringPool; + ipElement = CSenPropertiesElement::NewL(aNsUri, aLocalName, aQName, + ipStringPool); + } + +void CSenPropertiesFragment::BaseConstructL(CSenXmlReader& aReader, + RStringPool* aStringPool) + { + ipStringPool = aStringPool; + CSenDomFragment::BaseConstructL(aReader); + } + +void CSenPropertiesFragment::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 = CSenPropertiesFragment::NewL(aNsUri, + aLocalName, + aQName, + aAttrs, + *ipElement, + ipStringPool); + + 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(!) + } + + +void CSenPropertiesFragment::StartElementL(const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName, + const RAttributeArray& aAttrs) + { + if(!ipElement) + { + ipElement = CSenPropertiesElement::NewL(aNsUri, aLocalName, aQName, + ipStringPool); + } + + if ( !ipStringPool ) + { + 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) + { + // When a new property is parsed, any existing one (with same [local] name) must be removed first + CSenElement* pElement = AsElement().RemoveElement(aNsUri, aLocalName); + delete pElement; + + ExpandL(aNsUri, aLocalName, aQName, aAttrs); + } + } + +void CSenPropertiesFragment::EndElementL( + const TDesC8& aNsUri, + const TDesC8& aLocalName, + const TDesC8& aQName + ) + { + CSenDomFragment::EndElementL(aNsUri, aLocalName, aQName); + } + +void CSenPropertiesFragment::CharactersL( + const TDesC8& aChars, + const TInt /*aStart*/, + const TInt /*aLength*/ + ) + { + if ( !ipStringPool ) + { + AllocContentSaverL(); + + HBufC8* pCharsCopy = NULL; + + if (SenXmlUtils::DecodeHttpCharactersL(aChars, pCharsCopy)) + { + CleanupStack::PushL(pCharsCopy); + iWs.WriteL(*pCharsCopy); + CleanupStack::PopAndDestroy(); // pCharsCopy + } + else + { + delete pCharsCopy; + iWs.WriteL(aChars); + } + } + else + { + ipElement->SetContentL(aChars); + } + } + +void CSenPropertiesFragment::AllocContentSaverL() + { + if ( !ipStringPool ) + { + CSenBaseFragment::AllocContentSaverL(); + } + } + +RStringPool& CSenPropertiesFragment::StringPool() + { + return *ipStringPool; + } + +void CSenPropertiesFragment::SetStringPool(RStringPool& aStringPool) + { + ipStringPool = &aStringPool; + } + +TBool CSenPropertiesFragment::HasStringPool() const + { + return ( ipStringPool ) ? ETrue : EFalse; + } + +// END OF FILE + + +