diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/sipmessagebuilder.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/sipmessagebuilder.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,286 @@ +// Copyright (c) 2003-2009 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: +// Name : sipmessagebuilder.cpp +// Part of : sip profile fsm +// implementation +// Version : 1.0 +// + + + + +// INCLUDE FILES +#include +#include "sipmessagebuilder.h" +#include "sipcontactheader.h" +#include "sipaddress.h" +#include "siptoheader.h" +#include "siprouteheader.h" +#include "sipextensionheader.h" +#include "sipgendefs.h" +#include "sipstrings.h" +#include "sipstrconsts.h" +#include "sipcodecerr.h" + +_LIT8(KUriParamTemplate, ";%S=%S"); +_LIT8(KCompSigCompParam, "comp=sigcomp"); + +// ----------------------------------------------------------------------------- +// SIPMessageBuilder::CreateToLC +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CSIPToHeader* SIPMessageBuilder::CreateToLC(const TDesC8& aUri) + { + TUriParser8 parser; + User::LeaveIfError( parser.Parse( aUri ) ); + + CUri8* tmpUri = CUri8::NewLC( parser ); + + CSIPAddress* tmpAddr = CSIPAddress::NewL( tmpUri ); + + CleanupStack::Pop( tmpUri ); + CleanupStack::PushL( tmpAddr ); + + CSIPToHeader* to = CSIPToHeader::NewL( tmpAddr ); + CleanupStack::Pop( tmpAddr ); + + CleanupStack::PushL( to ); + return to; + } + +// ----------------------------------------------------------------------------- +// SIPMessageBuilder::CreateContactLC +// adds contact header +// REGISTER request +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CSIPContactHeader* SIPMessageBuilder::CreateContactLC( + const TDesC8& aUser, + TInt aExpiresValue, + const MDesC8Array& aParams, + RStringF aTransport, + TBool aSigComp) + { + RStringF comp = SIPStrings::StringF(SipStrConsts::EComp); + RStringF sigcomp = SIPStrings::StringF(SipStrConsts::ESigComp); + RStringF transport = SIPStrings::StringF(SipStrConsts::ETransport); + + TUriParser8 uriParser; + User::LeaveIfError(uriParser.Parse(KSIPlocalhost)); + CUri8* uri = CUri8::NewLC(uriParser); + + if (aUser.Length() > 0) + { + uri->SetComponentL(aUser, EUriUserinfo); + } + + if (aSigComp) + { + AddUriParamL(*uri,comp.DesC(),sigcomp.DesC()); + } + + if (aTransport.DesC().Length() > 0) + { + AddUriParamL(*uri,transport.DesC(),aTransport.DesC()); + } + + CSIPAddress* sipAddress = CSIPAddress::NewL(uri); + CleanupStack::Pop(uri); + CleanupStack::PushL(sipAddress); + CSIPContactHeader* contact = CSIPContactHeader::NewL(sipAddress); + CleanupStack::Pop(sipAddress); + CleanupStack::PushL(contact); + contact->SetExpiresParameterL(aExpiresValue); + + for (TInt i=0; i locationAfterEquals) + { + RStringF key = SIPStrings::Pool().OpenFStringL(param.Left(index)); + CleanupClosePushL(key); + RStringF value = + SIPStrings::Pool().OpenFStringL(param.Mid(locationAfterEquals)); + CleanupClosePushL(value); + contact->SetParamL(key, value); + CleanupStack::PopAndDestroy(2); //key, value + } + else + { + RStringF key = SIPStrings::Pool().OpenFStringL(param); + CleanupClosePushL(key); + contact->SetParamL(key); + CleanupStack::PopAndDestroy(); //key + } + } + + return contact; + } + +// ----------------------------------------------------------------------------- +// SIPMessageBuilder::CreateAuthorizationLC +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// + +EXPORT_C CSIPExtensionHeader* SIPMessageBuilder::CreateAuthorizationLC( + const TDesC8& aUri, + const TDesC8& aRealm, + const TDesC8& aPrivateId) + { + HBufC8* authorizationValue = HBufC8::NewLC(aPrivateId.Length() + + aUri.Length() + aRealm.Length() + (5*KSIPequals().Length()) + + (KSIPquotneeded) + (4*KSIPcomma().Length()) + KSIPUsername().Length() + + KSIPauthForHeader().Length() + KSIPrealm().Length() + KSIPuri().Length() + + KSIPnonce().Length() + KSIPresponse().Length()); + + TPtr8 ptr = authorizationValue->Des(); + ptr.Append(KSIPauthForHeader()); + ptr.Append(KSIPUsername()); + ptr.Append(KSIPequals()); + ptr.Append(KSIPquot); + ptr.Append(aPrivateId); + ptr.Append(KSIPquot); + ptr.Append(KSIPcomma()); + ptr.Append(KSIPrealm()); + ptr.Append(KSIPequals()); + ptr.Append(KSIPquot); + ptr.Append(aRealm); + ptr.Append(KSIPquot); + ptr.Append(KSIPcomma()); + ptr.Append(KSIPnonce()); + ptr.Append(KSIPequals()); + ptr.Append(KSIPquot); + ptr.Append(KSIPquot); + ptr.Append(KSIPcomma()); + ptr.Append(KSIPuri()); + ptr.Append(KSIPequals()); + ptr.Append(KSIPquot); + ptr.Append(aUri); + ptr.Append(KSIPquot); + ptr.Append(KSIPcomma()); + ptr.Append(KSIPresponse()); + ptr.Append(KSIPequals()); + ptr.Append(KSIPquot); + ptr.Append(KSIPquot); + + CSIPExtensionHeader* authorizationHeader = CSIPExtensionHeader::NewL( + KSIPauthheader(), *authorizationValue); + CleanupStack::PopAndDestroy(authorizationValue); + CleanupStack::PushL(authorizationHeader); + return authorizationHeader; + } + +// ----------------------------------------------------------------------------- +// SIPMessageBuilder::CreateRouteLC +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CSIPRouteHeader* SIPMessageBuilder::CreateRouteLC( + const TDesC8& aRoute, + TBool aSigComp) + { + RStringF comp = SIPStrings::StringF(SipStrConsts::EComp); + RStringF sigcomp = SIPStrings::StringF(SipStrConsts::ESigComp); + + TUriParser8 uriParser; + User::LeaveIfError(uriParser.Parse(aRoute)); + CUri8* uri = CUri8::NewLC(uriParser); + if (aSigComp && uri->Uri().Extract(EUriPath).FindF(KCompSigCompParam) < 0) + { + AddUriParamL(*uri, comp.DesC(), sigcomp.DesC()); + } + CSIPAddress* sipAddress = CSIPAddress::NewL(uri); + CleanupStack::Pop(uri); + CleanupStack::PushL(sipAddress); + CSIPRouteHeader* route = CSIPRouteHeader::NewL(sipAddress); + CleanupStack::Pop(sipAddress); + CleanupStack::PushL(route); + return route; + } + +// ----------------------------------------------------------------------------- +// SIPMessageBuilder::CreateHeaderLC +// ----------------------------------------------------------------------------- +// +EXPORT_C CSIPHeaderBase* SIPMessageBuilder::CreateHeaderLC( + const TDesC8& aHeaderDes) + { + TInt colonPos = aHeaderDes.Locate(':'); + __ASSERT_ALWAYS(colonPos > 0, User::Leave(KErrSipCodecHeaderName)); + TPtrC8 name(aHeaderDes.Left(colonPos)); + TPtrC8 value(aHeaderDes.Mid(colonPos+1)); + TLex8 lex(value); + lex.SkipSpace(); + TPtrC8 trimmedValue(lex.Remainder()); + CSIPExtensionHeader* header = CSIPExtensionHeader::NewLC(name,trimmedValue); + return header; + } + +// ----------------------------------------------------------------------------- +// SIPMessageBuilder::ParseParamL +// ----------------------------------------------------------------------------- +// +EXPORT_C TBool SIPMessageBuilder::ParseParamL( + const TDesC8& aParam, + TPtrC8& aName, + TPtrC8& aValue) + { + __ASSERT_ALWAYS (aParam.Length() > 0, User::Leave(KErrSipCodecAnyParam)); + TInt equalsPos = aParam.Locate('='); + if (equalsPos == 0 || equalsPos == aParam.Length()-1) + { + User::Leave (KErrSipCodecAnyParam); + } + TBool hasValue = EFalse; + if (equalsPos > 0) + { + aName.Set(aParam.Left(equalsPos)); + aValue.Set(aParam.Mid(equalsPos+1)); + hasValue = ETrue; + } + else + { + aName.Set(aParam); + aValue.Set(KNullDesC8); + } + return hasValue; + } + +// ----------------------------------------------------------------------------- +// SIPMessageBuilder::AddUriParamL +// ----------------------------------------------------------------------------- +// +void SIPMessageBuilder::AddUriParamL( + CUri8& aUri, + const TDesC8& aName, + const TDesC8& aValue) + { + TPtrC8 currentParamsPtr(aUri.Uri().Extract(EUriPath)); + TInt newParamsLength = currentParamsPtr.Length() + + KUriParamTemplate().Length() + + aName.Length() + + aValue.Length(); + HBufC8* newParams = HBufC8::NewLC(newParamsLength); + TPtr8 newParamsDes(newParams->Des()); + newParamsDes.Copy(currentParamsPtr); + newParamsDes.AppendFormat(KUriParamTemplate,&aName,&aValue); + aUri.SetComponentL(newParamsDes,EUriPath); + CleanupStack::PopAndDestroy(newParams); + }