webservices/wsxml/src/sendomfragment.cpp
changeset 0 62f9d29f7211
--- /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