diff -r 000000000000 -r 62f9d29f7211 webservices/wsmessages/src/sensoapmessage2.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wsmessages/src/sensoapmessage2.cpp Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,436 @@ +/* +* 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 + +#include "SenWsSecurityHeader2.h" +#include "SenSoapMessage2.h" + +#include "sendebug.h" +#include "senlogger.h" + + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewL() + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewL()"); + CSenSoapMessage2* pNew = CSenSoapMessage2::NewLC(); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewLC() + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewLC()"); + CSenSoapMessage2* pNew = new (ELeave) CSenSoapMessage2(); + CleanupStack::PushL(pNew); + pNew->BaseConstructL(); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewL(TSOAPVersion aVersion) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewL(aVersion)"); + CSenSoapMessage2* pNew = CSenSoapMessage2::NewLC(aVersion); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewLC(TSOAPVersion aVersion) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewLC(aVersion)"); + CSenSoapMessage2* pNew = new (ELeave) CSenSoapMessage2(); + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aVersion); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewL(TSOAPVersion aVersion, + const TDesC8& aSecurityNs) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewL(aVersion,aSecurityNs)"); + CSenSoapMessage2* pNew = CSenSoapMessage2::NewLC(aVersion, aSecurityNs); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewLC(TSOAPVersion aVersion, + const TDesC8& aSecurityNs) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewLC(aVersion,aSecurityNs)"); + CSenSoapMessage2* pNew = new (ELeave) CSenSoapMessage2(); + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aVersion, aSecurityNs); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewL(MSenMessageContext& aContext) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewL(aContext)"); + CSenSoapMessage2* pNew = CSenSoapMessage2::NewLC(aContext); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewLC(MSenMessageContext& aContext) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewLC(aContext)"); + CSenSoapMessage2* pNew = new (ELeave) CSenSoapMessage2(); + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aContext); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewL(MSenMessageContext& aContext, + TSOAPVersion aVersion) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewL(aContext,aVersion)"); + CSenSoapMessage2* pNew = CSenSoapMessage2::NewLC(aContext, aVersion); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewLC(MSenMessageContext& aContext, + TSOAPVersion aVersion) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewLC(aContext,aVersion)"); + CSenSoapMessage2* pNew = new (ELeave) CSenSoapMessage2(); + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aContext, aVersion); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewL(MSenMessageContext& aContext, + TSOAPVersion aVersion, + const TDesC8& aSecurityNs) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewL(aContext,aVersion,aSecurityNs)"); + CSenSoapMessage2* pNew = CSenSoapMessage2::NewLC(aContext, + aVersion, + aSecurityNs); + CleanupStack::Pop(pNew); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewLC(MSenMessageContext& aContext, + TSOAPVersion aVersion, + const TDesC8& aSecurityNs) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewLC(aContext,aVersion,aSecurityNs)"); + CSenSoapMessage2* pNew = new (ELeave) CSenSoapMessage2(); + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aContext, aVersion, aSecurityNs); + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewL(CSenSoapMessage2& aMessage) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewL(aMessage)"); + CSenSoapMessage2* pNew = CSenSoapMessage2::NewLC(aMessage); + CleanupStack::Pop(pNew); // pNew + return pNew; + } + +EXPORT_C CSenSoapMessage2* CSenSoapMessage2::NewLC(CSenSoapMessage2& aMessage) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewLC(aMessage)"); + CSenSoapMessage2* pNew = new (ELeave) CSenSoapMessage2(); + CleanupStack::PushL(pNew); + pNew->BaseConstructL(aMessage); + return pNew; + } + +EXPORT_C CSenSoapMessage2::~CSenSoapMessage2() + { + if (ipSecurityHeader) + { + // We do not own the element, so remove it from the fragment. + ipSecurityHeader->ExtractElement(); + delete ipSecurityHeader; + } + } + +EXPORT_C CSenSoapMessage2::CSenSoapMessage2() +: ipSecurityHeader(NULL) + { + } + +EXPORT_C void CSenSoapMessage2::BaseConstructL() + { + CSenSoapEnvelope2::BaseConstructL(); + } + +EXPORT_C void CSenSoapMessage2::BaseConstructL(TSOAPVersion aVersion) + { + CSenSoapEnvelope2::BaseConstructL(aVersion); + } + +EXPORT_C void CSenSoapMessage2::BaseConstructL(TSOAPVersion aVersion, const TDesC8& aSecurityNs) + { + BaseConstructL(aVersion); + if ( ( aSecurityNs == KSecuritySchemeXmlNs ) || ( aSecurityNs == KSecurityXmlNs ) ) + { + TXmlEngElement element = AsElementL(); + RSenDocument document = AsDocumentL(); + ipSecurityHeader = CSenWsSecurityHeader2::NewL(KNullDesC8, + aSecurityNs, + document, + element); + this->AddHeaderL(ipSecurityHeader->AsElementL()); + } + } + +EXPORT_C void CSenSoapMessage2::BaseConstructL(MSenMessageContext& aContext) + { + CSenSoapEnvelope2::BaseConstructL(aContext); + } + +EXPORT_C void CSenSoapMessage2::BaseConstructL(MSenMessageContext& aContext, + TSOAPVersion aVersion) + { + CSenSoapEnvelope2::BaseConstructL(aContext, aVersion); + } + +EXPORT_C void CSenSoapMessage2::BaseConstructL(MSenMessageContext& aContext, + TSOAPVersion aVersion, + const TDesC8& aSecurityNs) + { + BaseConstructL(aContext, aVersion); + if ( ( aSecurityNs == KSecuritySchemeXmlNs ) || ( aSecurityNs == KSecurityXmlNs ) ) + { + TXmlEngElement element = AsElementL(); + RSenDocument document = AsDocumentL(); + ipSecurityHeader = CSenWsSecurityHeader2::NewL(KNullDesC8, + aSecurityNs, + document, + element); + this->AddHeaderL(ipSecurityHeader->AsElementL()); + } + } + +EXPORT_C void CSenSoapMessage2::BaseConstructL(CSenSoapMessage2& aMessage) + { + CSenSoapEnvelope2::BaseConstructL(aMessage); + } + +EXPORT_C void CSenSoapMessage2::SetSecurityHeaderL(const TDesC8& aData) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::SetSecurityHeaderL(aData)"); + CSenWsSecurityHeader2* pTemp = NULL; + TXmlEngElement element = AsElementL(); + RSenDocument document = AsDocumentL(); + + if ( aData == KNullDesC8 ) + { + // we don't have credential + pTemp = NewSecurityHeaderLC(NULL, document, element); + } + else + { + // there is a credential to add.. + pTemp = NewSecurityHeaderLC(&aData, document, element); + } + + TXmlEngElement header = HeaderL(); + RXmlEngNodeList list; + CleanupClosePushL(list); + header.GetElementsByTagNameL(list, KSecurityName, + pTemp->XmlNs()); + while ( list.HasNext() ) + { + TXmlEngElement element = list.Next(); + element.Remove(); + } + + if ( ipSecurityHeader ) + { + delete ipSecurityHeader; + ipSecurityHeader = NULL; + } + + CleanupStack::PopAndDestroy(&list); + + ipSecurityHeader = pTemp; + CleanupStack::Pop(); // pTemp + this->AddHeaderL(ipSecurityHeader->AsElementL()); + } + +EXPORT_C void CSenSoapMessage2::ParseHeaderL( const RTagInfo& aElement, + const RAttributeArray& aAttributes) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::ParseHeaderL"); + const TPtrC8 saxLocalName = aElement.LocalName().DesC(); + const TPtrC8 saxNsUri = aElement.Uri().DesC(); + const TPtrC8 saxPrefix = aElement.Prefix().DesC(); + + TXmlEngElement element = AsElementL(); + RSenDocument document = AsDocumentL(); + + CSenWsSecurityHeader2* pTemp = NewSecurityHeaderLC(NULL, document, element); + + if ((pTemp->XmlNs() == saxNsUri) && (KSecurityName() == saxLocalName)) + { + // Remove existing header + TXmlEngElement header = HeaderL(); + RXmlEngNodeList list; + CleanupClosePushL(list); + header.GetElementsByTagNameL(list, KSecurityName, pTemp->XmlNs()); + while ( list.HasNext() ) + { + TXmlEngElement element = list.Next(); + element.Remove(); + } + + CleanupStack::PopAndDestroy(&list); + + if ( ipSecurityHeader ) + { + delete ipSecurityHeader; + ipSecurityHeader = NULL; + } + + ipSecurityHeader = pTemp; + CleanupStack::Pop(); // pTemp + + TXmlEngElement wsSecurityHeader = ipSecurityHeader->AsElementL(); + wsSecurityHeader.MoveTo(header); + OnDelegateParsingL(*ipSecurityHeader); + } + else + { + TXmlEngElement rootElement = pTemp->AsElementL(); + rootElement.Remove(); + CleanupStack::PopAndDestroy(); // pTemp + CSenSoapEnvelope2::ParseHeaderL(aElement, aAttributes); + } + } + +EXPORT_C TInt CSenSoapMessage2::AddSecurityTokenL(const TDesC8& aNewToken) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::AddSecurityTokenL(aNewToken)"); + TXmlEngElement element = AsElementL(); + RSenDocument document = AsDocumentL(); + TXmlEngElement soapHeader = HeaderL(); + TXmlEngElement wsSecurityHeader; + + // Create element into wrong place + // <=> into a root element = Envelope. + // + // ... + // + // That's because we don't want following search to find + // this new header inside element. + CSenWsSecurityHeader2* pHeader = NewSecurityHeaderLC(NULL, document, element); + RXmlEngNodeList list; + CleanupClosePushL(list); + soapHeader.GetElementsByTagNameL(list, KSecurityName, + pHeader->XmlNs()); + + if ( !list.HasNext() ) + { + // element was not found from element. + // => Add new header by moving header from (root) + // element into element. + wsSecurityHeader = pHeader->ExtractElement(); + wsSecurityHeader.MoveTo(soapHeader); + } + else + { + // element was found from element. + // => Delete new header element from SoapMessage DOM tree by + // removing header from (root) element. + wsSecurityHeader = pHeader->ExtractElement(); + wsSecurityHeader.Remove(); + + // Select found element to be edited + wsSecurityHeader = list.Next(); + } + + CleanupStack::PopAndDestroy(&list); + + CleanupStack::PopAndDestroy(); // pHeader // safe to delete + + TPtrC8 content = wsSecurityHeader.Text(); + HBufC8* pContent = HBufC8::NewLC( content.Length() + aNewToken.Length() ); + TPtr8 ptrContent = pContent->Des(); + ptrContent.Append(content); + ptrContent.Append(aNewToken); + wsSecurityHeader.SetTextNoEncL(*pContent); + CleanupStack::PopAndDestroy(pContent); + + return KErrNone; + } + +EXPORT_C CSenWsSecurityHeader2* CSenSoapMessage2::NewSecurityHeaderLC( const TDesC8* aData, + RSenDocument aDocument, + TXmlEngElement element ) + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::NewSecurityHeaderLC"); + CSenWsSecurityHeader2* pNew = NULL; + + if ( aData ) + { + if ( ipSecurityHeader ) + { + pNew = CSenWsSecurityHeader2::NewL(*aData, ipSecurityHeader->XmlNs(), aDocument, element); + } + else + { + pNew = CSenWsSecurityHeader2::NewL(*aData, aDocument, element); + } + } + else + { + if ( ipSecurityHeader ) + { + pNew = CSenWsSecurityHeader2::NewL(KNullDesC8, ipSecurityHeader->XmlNs(), aDocument, element); + } + else + { + pNew = CSenWsSecurityHeader2::NewL(aDocument, element); + } + } + + CleanupStack::PushL(pNew); + return pNew; + } + +EXPORT_C MSenMessage::TClass CSenSoapMessage2::Type() + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::Type"); + return MSenMessage::ESoapMessage2; + } + +EXPORT_C MSenMessage* CSenSoapMessage2::CloneL() + { + TLSLOG_L(KSenMessagesLogChannel, KMinLogLevel, "CSenSoapMessage2::CloneL"); + CSenSoapMessage2* pMessage = CSenSoapMessage2::NewL(*this); + return pMessage; + } + +// End of File