diff -r 000000000000 -r 62f9d29f7211 webservices/wshttpchanneltransportplugin/src/senatomtxnstate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/webservices/wshttpchanneltransportplugin/src/senatomtxnstate.cpp Thu Jan 07 16:19:19 2010 +0200 @@ -0,0 +1,182 @@ +/* +* Copyright (c) 2007-2008 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 "senatomtxnstate.h" +#include "senhttpchannel.h" +#include "sendebug.h" +#include "senlogger.h" + + + +// =========================== MEMBER FUNCTIONS =============================== + +// ---------------------------------------------------------------------------- +// CSenAtomTxnState::CSenAtomTxnState +// C++ default constructor can NOT contain any code, that +// might leave. +// ---------------------------------------------------------------------------- +// +CSenAtomTxnState::CSenAtomTxnState(MSenResponseObserver& aObserver) + : CSenMultiPartTxnState(aObserver) + { + } + +CSenAtomTxnState* CSenAtomTxnState::NewL(MSenResponseObserver& aObserver, + const TDesC8* aUri, + CSenAtomEntry& aAtomEntry) + + { + CSenAtomTxnState* pNew = NewLC( aObserver, aUri, + aAtomEntry); + CleanupStack::Pop(pNew); + return pNew; + } + +CSenAtomTxnState* CSenAtomTxnState::NewLC(MSenResponseObserver& aObserver, + const TDesC8* aUri, + CSenAtomEntry& aAtomEntry) + + { + CSenAtomTxnState* pNew = new (ELeave) CSenAtomTxnState(aObserver); + CleanupStack::PushL(pNew); + pNew->ConstructL(aUri, aAtomEntry); + return pNew; + } + + +void CSenAtomTxnState::ConstructL(const TDesC8* aUri, + CSenAtomEntry& aAtomEntry) + { + + __ASSERT_ALWAYS(aUri != NULL, + User::Panic(KRequestUriNullPanicText, + CSenHttpChannel::ERequestUriNull)); + iRequestUri = aUri->AllocL(); + + if(!&aAtomEntry) + { + iHasRequestBody = EFalse; + User::Panic(KMultiPartNoRequestMessagePanicText, SenMultiPartUtils::EMultiPartNoRequestMessage); + } + TLSLOG(KSenHttpChannelLogChannelBase , KMinLogLevel,(_L("CSenAtomTxnState::ConstructL"))); + iMessage = &(MSenMessage&)aAtomEntry; // not owned + RSenDocument doc = aAtomEntry.AsDocumentL(); + doc.GetDataContainerList(iBinaryDataList); + + iCountDataParts = 3 + iBinaryDataList.Count()*2; //how many parts there are in MultiPart message + iHasRequestBody = ETrue; + } + + +// --------------------------------------------------------------------------- +// creates HTTP content type header for Atom multipart message +// +// HTTP content type header should be the next: +// Content-Type: Multipart/Related;boundary=MIME_boundary;type="application/atom+xml"; +// start="<>"; start-info="text/xml" +// +// +// Note: 1.it's one line without return carrige +// 2."boundary" is generated as +// 3."start" is generated as @ +// --------------------------------------------------------------------------- +// +void CSenAtomTxnState::SetContentTypeHeaderL(const RHTTPSession aSession, RHTTPHeaders aHeaders) + { + _LIT8(KMultipartRelated,"Multipart/Related"); + _LIT8(KBoundry,"boundary"); + _LIT8(KType,"type"); + _LIT8(KStart,"start"); + _LIT8(KStartInfo,"start-info"); + _LIT8(KApplicationAtom,"\"application/atom+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(KApplicationAtom); + RStringF start = aSession.StringPool().OpenFStringL(KStart); + RStringF startVal = aSession.StringPool().OpenFStringL(rootCid); + RStringF startInfo = aSession.StringPool().OpenFStringL(KStartInfo); + RStringF startInfoVal = aSession.StringPool().OpenFStringL(KTextXml); + + CleanupStack::PopAndDestroy(&rootCid); + + THTTPHdrVal contentTypeVal(multipartRelated); + THTTPHdrVal boundVal(boundaryVal); + THTTPHdrVal tVal(typeVal); + THTTPHdrVal stVal(startVal); + + THTTPHdrVal stInfoVal; + + stInfoVal = startInfoVal; + 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); + + + multipartRelated.Close(); + boundary.Close(); + boundaryVal.Close(); + type.Close(); + typeVal.Close(); + start.Close(); + startVal.Close(); + startInfo.Close(); + startInfoVal.Close(); + } + +// --------------------------------------------------------------------- +// creates AtomEntry in Request +// --------------------------------------------------------------------- +// +void CSenAtomTxnState::MessageL() + { + SenMultiPartUtils::SerializeMessageL(*(CSenAtomEntry*)iMessage, iCurrentPart, ESerializerDefault); + TLSLOG(KSenHttpChannelLogChannelBase , KMinLogLevel,(_L("CSenAtomTxnState::GetNextDataPart - aDataPart (Atom Message):"))); + iCurPart = ETrue; + } + + +// End of File