diff -r 000000000000 -r 62f9d29f7211 webservices/wshttpchanneltransportplugin/src/senmtomtxnstate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wshttpchanneltransportplugin/src/senmtomtxnstate.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 "senmtomtxnstate.h" +#include "senhttpchannel.h" +#include "sendebug.h" +#include "senlogger.h" + + +// =========================== MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// CSenMtomTxnState::CSenMtomTxnState +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CSenMtomTxnState::CSenMtomTxnState(MSenResponseObserver& aObserver) + : CSenMultiPartTxnState(aObserver) + { + } + +CSenMtomTxnState* CSenMtomTxnState::NewL(MSenResponseObserver& aObserver, + const TDesC8* aUri, + const TDesC8& aSoapAction, + CSenSoapEnvelope2& aSoapEnvelope2) + + { + CSenMtomTxnState* pNew = NewLC( aObserver, aUri, aSoapAction, + aSoapEnvelope2); + CleanupStack::Pop(pNew); + return pNew; + } + +CSenMtomTxnState* CSenMtomTxnState::NewLC(MSenResponseObserver& aObserver, + const TDesC8* aUri, + const TDesC8& aSoapAction, + CSenSoapEnvelope2& aSoapEnvelope2) + + { + CSenMtomTxnState* pNew = new (ELeave) CSenMtomTxnState(aObserver);; + CleanupStack::PushL(pNew); + pNew->ConstructL(aUri, aSoapAction, aSoapEnvelope2); + return pNew; + } + + +void CSenMtomTxnState::ConstructL(const TDesC8* aUri, + const TDesC8& aSoapAction, + CSenSoapEnvelope2& aSoapEnvelope2) + { + + __ASSERT_ALWAYS(aUri != NULL, + User::Panic(KRequestUriNullPanicText, + CSenHttpChannel::ERequestUriNull)); + iRequestUri = aUri->AllocL(); + iSoapAction.CreateL(aSoapAction.Length()); + iSoapAction.Copy(aSoapAction); + + if(!&aSoapEnvelope2) + { + iHasRequestBody = EFalse; + User::Panic(KMultiPartNoRequestMessagePanicText, SenMultiPartUtils::EMultiPartNoRequestMessage); + } + TLSLOG(KSenHttpChannelLogChannelBase , KMinLogLevel,(_L("CSenMtomTxnState::ConstructL"))); + + iMessage = &aSoapEnvelope2; // not owned + RSenDocument doc = aSoapEnvelope2.AsDocumentL(); + doc.GetDataContainerList(iBinaryDataList); + + iCountDataParts = 3 + iBinaryDataList.Count()*2; //how many parts there are in XOP + iHasRequestBody = ETrue; + } + + +// --------------------------------------------------------------------------- +// creates HTTP content type header for XOP message +// +// HTTP content type header for SOAP v1.1 should be the next: +// Content-Type: Multipart/Related;boundary=MIME_boundary;type="application/xop+xml"; +// start="<>"; start-info="text/xml" +// +// HTTP content type header for SOAP v1.2 should be the next: +// Content-Type: Multipart/Related;boundary=MIME_boundary;type="application/xop+xml"; +// start="<>";start-info="application/soap+xml" +// +// Note: 1.it's one line without return carrige +// 2."boundary" is generated as +// 3."start" is generated as @ +// 4."actionVal12" = SoapAction from transport properties +// --------------------------------------------------------------------------- +// +void CSenMtomTxnState::SetContentTypeHeaderL(const RHTTPSession aSession, RHTTPHeaders aHeaders) + { + _LIT8(KMultipartRelated,"Multipart/Related"); //CodeScannerWarning + _LIT8(KBoundry,"boundary"); + _LIT8(KType,"type"); + _LIT8(KStart,"start"); + _LIT8(KStartInfo,"start-info"); + _LIT8(KApplicationXop,"\"application/xop+xml\""); + _LIT8(KApplicationSoap,"\"application/soap+xml\""); + _LIT8(KTextXml,"\"text/xml\""); + _LIT8(KSlashLessthan,"\"<"); + _LIT8(KSlashGreaterthan,">\""); + SenMultiPartUtils::GenerateRandomRootCidL(iRootCid); + RBuf8 rootCid(NULL); + rootCid.ReAllocL(4+iRootCid.Length()); + CleanupClosePushL(rootCid); + rootCid.Append(KSlashLessthan); + rootCid.Append(iRootCid); + rootCid.Append(KSlashGreaterthan); + + SenMultiPartUtils::GenerateRandomBoundaryL(iMimeBoundaryOut); + + RStringF multipartRelated = aSession.StringPool().OpenFStringL(KMultipartRelated); + RStringF boundary = aSession.StringPool().OpenFStringL(KBoundry); + RStringF boundaryVal = aSession.StringPool().OpenFStringL(iMimeBoundaryOut); + RStringF type = aSession.StringPool().OpenFStringL(KType); + RStringF typeVal = aSession.StringPool().OpenFStringL(KApplicationXop); + RStringF start = aSession.StringPool().OpenFStringL(KStart); + RStringF startVal = aSession.StringPool().OpenFStringL(rootCid); + RStringF startInfo = aSession.StringPool().OpenFStringL(KStartInfo); + RStringF startInfoVal11 = aSession.StringPool().OpenFStringL(KTextXml); + RStringF startInfoVal12 = aSession.StringPool().OpenFStringL(KApplicationSoap); + + CleanupStack::PopAndDestroy(&rootCid); + + THTTPHdrVal contentTypeVal(multipartRelated); + THTTPHdrVal boundVal(boundaryVal); + THTTPHdrVal tVal(typeVal); + THTTPHdrVal stVal(startVal); + + THTTPHdrVal stInfoVal; + + switch (((CSenSoapEnvelope2*)iMessage)->SoapVersion()) + { + case ESOAP11: + { + stInfoVal = startInfoVal11; + break; + } + case ESOAP12: + { + stInfoVal = startInfoVal12; + break; + } + default: + { + User::Panic(KMultiPartSoapVersionInvalidPanicText, SenMultiPartUtils::EMultiPartSoapVersionInvalid); } + } + aHeaders.SetFieldL(aSession.StringPool().StringF(HTTP::EContentType,RHTTPSession::GetTable()), + contentTypeVal, boundary, boundVal); + aHeaders.SetFieldL(aSession.StringPool().StringF(HTTP::EContentType,RHTTPSession::GetTable()), + contentTypeVal, type, tVal); + aHeaders.SetFieldL(aSession.StringPool().StringF(HTTP::EContentType,RHTTPSession::GetTable()), + contentTypeVal, start, stVal); + aHeaders.SetFieldL(aSession.StringPool().StringF(HTTP::EContentType,RHTTPSession::GetTable()), + contentTypeVal, startInfo, stInfoVal); + + + if (((CSenSoapEnvelope2*)iMessage)->SoapVersion() == ESOAP12) + { + RStringF action = aSession.StringPool().OpenFStringL(_L8("action")); + RStringF actionVal12 = aSession.StringPool().OpenFStringL(iSoapAction); + + aHeaders.SetFieldL(aSession.StringPool().StringF(HTTP::EContentType,RHTTPSession::GetTable()), + contentTypeVal, action, actionVal12); + action.Close(); + actionVal12.Close(); + } + + multipartRelated.Close(); + boundary.Close(); + boundaryVal.Close(); + type.Close(); + typeVal.Close(); + start.Close(); + startVal.Close(); + startInfo.Close(); + startInfoVal11.Close(); + startInfoVal12.Close(); + } +// --------------------------------------------------------------------- +// creates SoapEnvelope in Request +// --------------------------------------------------------------------- +// +void CSenMtomTxnState::MessageL() + { + // iCurrentPart == XOP envelope: + SenMultiPartUtils::SerializeMessageL(*(CSenSoapEnvelope2*)iMessage, iCurrentPart); + TLSLOG(KSenHttpChannelLogChannelBase , KMinLogLevel,(_L("CSenMtomTxnState::GetNextDataPart - aDataPart (XOP Envelope):"))); + iCurPart = ETrue; + } + +// End of File