--- /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 <SenXmlUtils.h>
+#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
+
+
+