diff -r 000000000000 -r 62f9d29f7211 webservices/wsutils/src/sensoapmessage.cpp --- /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 +#include +#include +#include + +#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 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