--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/webservices/wsutils/src/sensoapmessage.cpp Thu Jan 07 16:19:19 2010 +0200
@@ -0,0 +1,219 @@
+/*
+* 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 <badesca.h>
+#include <SenXmlReader.h>
+#include <s32mem.h>
+#include <utf.h>
+
+#include "SenWsSecurityHeader.h"
+#include "SenSoapMessage.h"
+
+
+EXPORT_C CSenSoapMessage* CSenSoapMessage::NewL()
+ {
+ CSenSoapMessage* pNew = new (ELeave) CSenSoapMessage;
+ CleanupStack::PushL(pNew);
+ pNew->BaseConstructL();
+ CleanupStack::Pop(); // pNew;
+ return pNew;
+ }
+
+EXPORT_C CSenSoapMessage* CSenSoapMessage::NewL(TSOAPVersion aVersion)
+ {
+ CSenSoapMessage* pNew = new (ELeave) CSenSoapMessage;
+ CleanupStack::PushL(pNew);
+ pNew->BaseConstructL(aVersion);
+ CleanupStack::Pop(); // pNew;
+ return pNew;
+ }
+
+EXPORT_C CSenSoapMessage* CSenSoapMessage::NewL(TSOAPVersion aVersion, const TDesC8& aSecurityNs)
+ {
+ CSenSoapMessage* pNew = new (ELeave) CSenSoapMessage;
+ CleanupStack::PushL(pNew);
+ pNew->BaseConstructL(aVersion, aSecurityNs);
+ CleanupStack::Pop(); // pNew;
+ return pNew;
+ }
+
+EXPORT_C CSenSoapMessage::~CSenSoapMessage()
+ {
+ if (ipSecurityHeader)
+ {
+ // We do not own the element, so remove it from the fragment.
+ ipSecurityHeader->ExtractElement();
+ delete ipSecurityHeader;
+ }
+ }
+EXPORT_C CSenSoapMessage::CSenSoapMessage()
+: ipSecurityHeader(NULL)
+ {
+ }
+
+EXPORT_C void CSenSoapMessage::BaseConstructL()
+ {
+ CSenSoapEnvelope::BaseConstructL();
+ }
+EXPORT_C void CSenSoapMessage::BaseConstructL(TSOAPVersion aVersion)
+ {
+ CSenSoapEnvelope::BaseConstructL(aVersion);
+ }
+
+EXPORT_C void CSenSoapMessage::BaseConstructL(TSOAPVersion aVersion, const TDesC8& aSecurityNs)
+ {
+ BaseConstructL(aVersion);
+ if ((aSecurityNs == KSecuritySchemeXmlNs) ||(aSecurityNs == KSecurityXmlNs))
+ {
+ ipSecurityHeader = CSenWsSecurityHeader::NewL(KNullDesC8, aSecurityNs);
+ CSenElement& soapHeader = HeaderL();
+ soapHeader.AddElementL(ipSecurityHeader->AsElement());
+ }
+ }
+
+EXPORT_C void CSenSoapMessage::SetSecurityHeaderL(const TDesC8& aData)
+ {
+ CSenWsSecurityHeader* pTemp = NULL;
+
+ if(aData==KNullDesC8)
+ {
+ // we don't have credential
+ pTemp = NewSecurityHeaderLC(NULL);
+ }
+ else
+ {
+ // there is a credential to add..
+ pTemp = NewSecurityHeaderLC(&aData);
+ }
+
+ delete HeaderL().RemoveElement(pTemp->XmlNs(), KSecurityName);
+ if (ipSecurityHeader)
+ {
+ // We do not own the element, so remove it from the fragment.
+ ipSecurityHeader->ExtractElement();
+ delete ipSecurityHeader;
+ ipSecurityHeader = NULL;
+ }
+ ipSecurityHeader = pTemp;
+ CleanupStack::Pop(); // pTemp
+ this->AddHeaderL(ipSecurityHeader->AsElement());
+ }
+
+EXPORT_C void CSenSoapMessage::ParseHeaderL(
+ const TDesC8& aNsUri,
+ const TDesC8& aLocalName,
+ const TDesC8& aQName,
+ const RAttributeArray& aAttributes
+ )
+ {
+ CSenWsSecurityHeader* pTemp = NewSecurityHeaderLC();
+
+ if ((pTemp->XmlNs() == aNsUri) && (KSecurityName() == aLocalName))
+ {
+ // Remove existing <Security> header
+ delete HeaderL().RemoveElement(pTemp->XmlNs(), KSecurityName);
+ if (ipSecurityHeader)
+ {
+ // We do not own the element, so remove it from the fragment.
+ ipSecurityHeader->ExtractElement();
+ delete ipSecurityHeader;
+ ipSecurityHeader = NULL;
+ }
+ ipSecurityHeader = pTemp;
+ CleanupStack::Pop(); // pTemp
+ DelegateParsingL(*ipSecurityHeader);
+ this->AddHeaderL(ipSecurityHeader->AsElement());
+ }
+ else
+ {
+ CleanupStack::PopAndDestroy(); // pTemp
+ CSenSoapEnvelope::ParseHeaderL(
+ aNsUri,
+ aLocalName,
+ aQName,
+ aAttributes);
+ }
+ }
+
+EXPORT_C TInt CSenSoapMessage::AddSecurityTokenL(const TDesC8& aNewToken)
+ {
+ CSenElement& soapHeader = HeaderL();
+
+ CSenWsSecurityHeader* pHeader = NewSecurityHeaderLC();
+
+ CSenElement* wsSecurityHeader = NULL;
+ wsSecurityHeader = soapHeader.Element(pHeader->XmlNs(), KSecurityName);
+
+ if(!wsSecurityHeader)
+ {
+ wsSecurityHeader = pHeader->ExtractElement(); // Let's take ownership
+ soapHeader.AddElementL(*wsSecurityHeader); // takes ownership
+ }
+ CleanupStack::PopAndDestroy(); // pHeader // safe to delete
+
+ HBufC8* pContent = HBufC8::NewLC(wsSecurityHeader->Content().Length() +
+ aNewToken.Length());
+
+ TPtr8 content = pContent->Des();
+ content.Append(wsSecurityHeader->Content());
+ content.Append(aNewToken);
+ wsSecurityHeader->SetContentL(content);
+ CleanupStack::PopAndDestroy(); // pContent
+
+ return KErrNone;
+ }
+
+EXPORT_C CSenWsSecurityHeader* CSenSoapMessage::NewSecurityHeaderLC(
+ const TDesC8* aData)
+ {
+ CSenWsSecurityHeader* pNew = NULL;
+ if(aData)
+ {
+ if (ipSecurityHeader)
+ {
+ pNew = CSenWsSecurityHeader::NewL(*aData, ipSecurityHeader->XmlNs());
+ }
+ else
+ {
+ pNew = CSenWsSecurityHeader::NewL(*aData);
+ }
+
+ }
+ else
+ {
+ if (ipSecurityHeader)
+ {
+ pNew = CSenWsSecurityHeader::NewL(KNullDesC8, ipSecurityHeader->XmlNs());
+ }
+ else
+ {
+ pNew = CSenWsSecurityHeader::NewL();
+ }
+ }
+ CleanupStack::PushL(pNew);
+ return pNew;
+ }
+
+// End of File