realtimenetprots/sipfw/ProfileAgent/IETF_Agent/src/Sipietfprofilecontext.cpp
changeset 0 307788aac0a8
child 12 c2e8c8b73582
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/IETF_Agent/src/Sipietfprofilecontext.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,750 @@
+// Copyright (c) 2005-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        : sipietfprofilecontext.cpp
+// Part of     : sip ietf agent
+// implementation
+// Version     : 1.0
+//
+
+
+
+
+// INCLUDE FILES
+#include "sipietfprofilecontext.h"
+#include "sipprflstatebase.h"
+#include "sipconcreteprofile.h"
+#include "sipietfprofileagent.h"
+#include "sipregistrationbinding.h"
+#include "sipclienttransaction.h"
+#include "siprouteheader.h"
+#include "sipgendefs.h"
+#include "siprefresh.h"
+#include "sipmessagebuilder.h"
+#include "sipaddress.h"
+#include "siptoheader.h"
+#include "siprouteheader.h"
+#include "sipmessageelements.h"
+#include "sipresponseelements.h"
+#include "sipsecurityclientheader.h"
+#include "sipconnection.h"
+#include "SipProfileLog.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+#include "siperr.h"
+#include "sipcodecerr.h"
+#include "sipcontactheader.h"
+#include <sipprofile.h>
+#include <bamdesca.h>
+#include <e32math.h>
+#include <uri8.h>
+#include <uriutils.h>
+
+_LIT8(KNATTraversalRequiredDes, "nat_traversal_required");
+_LIT8(KSIPTls, "tls");
+_LIT8(KTransportUdpParam, "transport=udp");
+_LIT8(KTransportTcpParam, "transport=tcp");
+_LIT8(KTransportTlsParam, "transport=tls");
+
+const TUint KMaxRandomLimit = 50;
+const TUint KBaseTimeInSec	= 30;
+const TUint KWaitTimeCoefficient = 2;
+const TUint KRandomDivider		= 100;
+const TUint KMaxRetryForOneAddress = 9;
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::NewLC
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSIPIetfProfileContext* CSIPIetfProfileContext::NewLC(
+	CSIP& aSIP,
+	CSIPIetfConnectionContext& aConnection, 
+	MSIPProfileAgentObserver& aObserver,
+	CSIPPrflStateBase& aInitState,
+	CSIPConcreteProfile& aProfile,
+	CDeltaTimer& aDeltaTimer,
+	CSipProfileAgentConfigExtension& aConfigExtension)
+	{
+	CSIPIetfProfileContext* self = new (ELeave) CSIPIetfProfileContext(aSIP,
+		aConnection, aObserver, aInitState, aProfile, aDeltaTimer,aConfigExtension);
+	CleanupStack::PushL(self);
+	self->ConstructL();
+	return self;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::NewL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSIPIetfProfileContext* CSIPIetfProfileContext::NewL(
+	CSIP& aSIP,
+	CSIPIetfConnectionContext& aConnection, 
+	MSIPProfileAgentObserver& aObserver,
+	CSIPPrflStateBase& aInitState,
+	CSIPConcreteProfile& aProfile,
+	CDeltaTimer& aDeltaTimer,
+	CSipProfileAgentConfigExtension& aConfigExtension)
+	{
+	CSIPIetfProfileContext* self = CSIPIetfProfileContext::NewLC(
+		aSIP, aConnection, aObserver, aInitState, aProfile, aDeltaTimer,aConfigExtension);
+	CleanupStack::Pop();
+	return self;
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::CSIPIetfProfileContext
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSIPIetfProfileContext::CSIPIetfProfileContext(
+	CSIP& aSIP,
+	CSIPIetfConnectionContext& aConnection,
+	MSIPProfileAgentObserver& aObserver,
+	CSIPPrflStateBase& aInitState,
+	CSIPConcreteProfile& aProfile,
+	CDeltaTimer& aDeltaTimer,
+	CSipProfileAgentConfigExtension& aConfigExtension)
+	: CSIPProfileContextBase(aSIP,
+	                         *(aConnection.Connection()),
+	                         aObserver,
+	                         aInitState,
+	                         aProfile,
+	                         aDeltaTimer),
+	  iConnectionContext(aConnection),
+	  iRetryTimerUse(EFalse),
+	  iConfigExtension(aConfigExtension)
+	{
+	iRandomSeed = 0;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::ConstructL
+// -----------------------------------------------------------------------------
+//	
+void CSIPIetfProfileContext::ConstructL()
+    {
+    iStrNATTraversalRequired = 
+        SIPStrings::Pool().OpenFStringL(KNATTraversalRequiredDes);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::~CSIPIetfProfileContext
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSIPIetfProfileContext::~CSIPIetfProfileContext()
+	{
+	iStrNATTraversalRequired.Close();
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::DestroyRegistration()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPIetfProfileContext::DestroyRegistration()
+	{
+	PROFILE_DEBUG3("SIPIetfProfileContext::DestroyRegistration", ProfileId())
+	delete iRegistration;
+	iRegistration = 0;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::CreateRegistrationL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPIetfProfileContext::CreateRegistrationL()
+	{
+	ASSERT(iProfile);
+    RStringF transport(SIPStrings::StringF(SipStrConsts::EEmpty));
+    CleanupClosePushL(transport);
+	CSIPRouteHeader* proxy = 0;
+	CUri8* remoteUri = 0;
+	CSIPRefresh* refresh = CSIPRefresh::NewLC();
+	CSIPToHeader* to = SIPMessageBuilder::CreateToLC(iProfile->AOR());
+	to->SetParamL(iStrNATTraversalRequired);
+	TUint pops = 2; //initial amount to pop from CleanupStack
+    
+	const TDesC8& proxyAddr = ProxyAddressL();
+	HBufC8* sipsproxy = NULL;
+	if(IsAddressSIPSURIL(iProfile->AOR()) && proxyAddr.Length() > 0)
+		{
+		if (!IsProxyResolvingEnabled())
+			{
+			__ASSERT_ALWAYS (IsAddressSIPSURIL(proxyAddr), 
+						User::Leave(KErrArgument));
+			}
+		else
+			{
+			sipsproxy = SetAddressToSIPSURIL(proxyAddr);
+			CleanupStack::PushL(sipsproxy);
+			pops++;
+			}
+		__ASSERT_ALWAYS (!iProfile->IsSecurityNegotiationEnabled(), 
+					User::Leave(KErrArgument));	
+		}
+		
+	if (!sipsproxy)
+		{
+		sipsproxy = proxyAddr.AllocLC();
+		pops++;
+		}
+
+	if (sipsproxy->Length()) //there's an outbound proxy defined
+		{
+		(iProfile->IsSigCompEnabled())?
+		proxy = SIPMessageBuilder::CreateRouteLC(*sipsproxy, ETrue):
+		proxy = SIPMessageBuilder::CreateRouteLC(*sipsproxy);
+		pops++;
+		RStringF proxyTransport = TransportProtocol(proxy->SIPAddress().Uri8());	
+		if (proxyTransport.DesC().Length() > 0)
+			{
+			transport = proxyTransport.Copy();
+			}		
+		}
+		
+	if (iProfile->Server(KSIPRegistrar).Length()) //there's a registrar defined
+		{
+        TUriParser8 parser;
+        User::LeaveIfError(parser.Parse(iProfile->Server(KSIPRegistrar)));
+        remoteUri = CUri8::NewLC(parser);			
+	    pops++;
+		if (!proxy)
+			{
+			RStringF registrarTransport = TransportProtocol(*remoteUri);		
+		    if (registrarTransport.DesC().Length() > 0)
+			    {
+			    transport = registrarTransport.Copy();
+			    }
+			}
+        }		
+
+	TBool sigcomp = iProfile->IsSigCompEnabled();
+	
+	const TDesC8* user = NULL;
+	User::LeaveIfError(
+		iProfile->ExtensionParameter(KSIPContactHeaderUser,user));
+	
+	CSIPContactHeader* contact =
+	    SIPMessageBuilder::CreateContactLC(*user, 
+	    		iConfigExtension.ExpiryValueL(TSIPProfileTypeInfo::EInternet,
+				CSipProfileAgentConfigExtension::EProfileRegistrationValue),
+	    		iProfile->ContactHeaderParams(),
+	    		transport, sigcomp);
+    pops++;
+
+	if (IsAddressSIPSURIL(iProfile->AOR()))
+		{
+		CUri8* contactUriClone = 
+		    CUri8::NewLC(contact->SIPAddress()->Uri8().Uri());
+        contactUriClone->SetComponentL(
+            SIPStrings::StringF(SipStrConsts::ESips).DesC(),EUriScheme);
+        contactUriClone->SetComponentL(*user,EUriUserinfo);            	
+		contact->SIPAddress()->SetUri8L(contactUriClone);
+		CleanupStack::Pop(contactUriClone);
+		}
+	
+	iRegistration = CSIPRegistrationBinding::NewL(iConnection, to, contact,
+	                                              refresh, proxy, remoteUri);
+	CleanupStack::Pop(pops);
+	delete sipsproxy;
+	CleanupStack::PopAndDestroy(1); // transport
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::CreateMsgElementsLC()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+CSIPMessageElements* CSIPIetfProfileContext::CreateMsgElementsLC()
+	{
+	ASSERT(iProfile);
+	
+	CSIPMessageElements* elements = CSIPMessageElements::NewLC();
+	
+	RPointerArray<CSIPHeaderBase> headers;
+	CSIPHeaderBase::PushLC(&headers);
+	if (SetTlsToSecurityClientL())
+		{
+		CSIPSecurityClientHeader* sclient = 
+		    CSIPSecurityClientHeader::NewLC(KSIPTls);
+		headers.AppendL(sclient);
+		CleanupStack::Pop(sclient);
+		}
+		
+	if (iProfile->IsSecurityNegotiationEnabled())
+		{
+		CSIPSecurityClientHeader* sclient = 
+		    CSIPSecurityClientHeader::NewLC(KSIPdigest);
+		headers.AppendL(sclient);
+		CleanupStack::Pop(sclient);
+		}
+		
+	TInt sipHeaderCount = iProfile->SIPHeaders().MdcaCount();
+	for (TInt i=0; i < sipHeaderCount; i++)
+	    {
+	    TPtrC8 headerDes(iProfile->SIPHeaders().MdcaPoint(i));
+	    CSIPHeaderBase* header = SIPMessageBuilder::CreateHeaderLC(headerDes);
+	    headers.AppendL(header);
+	    CleanupStack::Pop(header);
+	    }   
+	
+	elements->SetUserHeadersL(headers); // // An empty array is also allowed
+	CleanupStack::Pop(1); // headers
+	    
+	return elements;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::CreateDeRegisterElementsL()
+// -----------------------------------------------------------------------------
+//	
+CSIPMessageElements* CSIPIetfProfileContext::CreateDeRegisterElementsL()
+    {
+    return NULL;
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::UpdateContactHeaderParamsL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPIetfProfileContext::UpdateContactHeaderParamsL(
+    CSIPConcreteProfile& aNewProfile)
+	{
+	CSIPContactHeader& contact = Registration()->ContactHeader();
+    TPtrC8 paramName;
+	TPtrC8 paramValue;
+
+	for (TInt i = Profile()->ContactHeaderParams().MdcaCount()-1;i >= 0; i--)
+		{
+		TPtrC8 param(Profile()->ContactHeaderParams().MdcaPoint(i));
+		SIPMessageBuilder::ParseParamL(param,paramName,paramValue);		
+		RStringF name = SIPStrings::Pool().OpenFStringL(paramName);
+		CleanupClosePushL(name);
+		contact.DeleteParam(name);
+		CleanupStack::PopAndDestroy(1); // name
+		}
+
+	for (TInt i = 0; &(aNewProfile.ContactHeaderParams()) && 
+				     (i < aNewProfile.ContactHeaderParams().MdcaCount()); i++)
+		{
+		TPtrC8 param(aNewProfile.ContactHeaderParams().MdcaPoint(i));
+		TBool hasValue = 
+		    SIPMessageBuilder::ParseParamL(param,paramName,paramValue);
+		RStringF name = SIPStrings::Pool().OpenFStringL(paramName);
+		CleanupClosePushL(name);
+		if (hasValue)
+			{
+			RStringF value = SIPStrings::Pool().OpenFStringL(paramValue);
+			CleanupClosePushL(value);
+			contact.SetParamL(name,value);
+			CleanupStack::PopAndDestroy(1); // value
+			}
+		else
+			{
+			contact.SetParamL(name);	
+			}
+		CleanupStack::PopAndDestroy(1); // name	
+		}
+	
+	CSIPMessageElements* elements = CreateMsgElementsForUpdateLC(aNewProfile);
+	SetTransaction(Registration()->UpdateL(
+			iConfigExtension.ExpiryValueL(TSIPProfileTypeInfo::EInternet,
+			CSipProfileAgentConfigExtension::EProfileRegistrationValue),
+			elements));
+	CleanupStack::Pop(elements);
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::SetRegisteredAORsL()
+// -----------------------------------------------------------------------------
+//	
+void CSIPIetfProfileContext::SetRegisteredAORsL()
+    {
+    if (iProfile)
+        {
+        CDesC8ArrayFlat* array = new(ELeave)CDesC8ArrayFlat(1);
+	    CleanupStack::PushL(array);    
+        array->AppendL(iProfile->AOR());
+	    iProfile->SetRegisteredAORsL(*array);
+	    CleanupStack::PopAndDestroy(array);
+	    if (iRegistration && iRegistration->RegisteredContact())
+	        {
+	        HBufC8* contact = 
+	            iRegistration->RegisteredContact()->ToTextValueLC();
+	        iProfile->SetExtensionParameterL(KSIPRegisteredContact,*contact);
+	        CleanupStack::PopAndDestroy(contact);
+	        }
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::ResolveProxyL
+// -----------------------------------------------------------------------------
+//	
+void CSIPIetfProfileContext::ResolveProxyL()
+    {
+    iConnectionContext.ResolveL();
+    }
+       
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::CancelProxyResolving
+// -----------------------------------------------------------------------------
+//
+void CSIPIetfProfileContext::CancelProxyResolving()
+    {
+    iConnectionContext.CleanProxyResolving();
+    }	
+
+// -----------------------------------------------------------------------------
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::RetryAfterTimer
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//	
+TBool CSIPIetfProfileContext::RetryAfterTimer()
+	{
+	return ( iRetryCounterSum == 0 && iRetryTimerUse );
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::RetryRegister
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//	
+TBool CSIPIetfProfileContext::RetryRegister( 
+    CSIPClientTransaction* /*aTransaction*/,
+    TInt aError )
+	{
+	PROFILE_DEBUG4("CSIPIetfProfileContext::RetryRegister",
+	               aError, iRetryCounterSum)
+
+	TBool retry = EFalse;
+		
+	if (iProfile &&
+	    AgentObserver().ProceedRegistration(*iProfile, aError) &&
+	    (CurrentState() == MSIPProfileContext::ERegistrationInProgress ||
+	     CurrentState() == MSIPProfileContext::ERegistered) &&
+		(aError == KErrSIPOutboundProxyNotResponding || 
+		 aError == KErrSIPResolvingFailure || 
+		 aError == KErrTimedOut || 
+		 aError == KErrSIPTransportFailure ||
+		 aError == KErrSIPICMPFailure  && 
+		 iConnection.State() != CSIPConnection::ESuspended))		
+	    {
+		if ( iRetryCounterSum + 1 < KMaxRetryForOneAddress &&
+		     iRetryCounter < KMaxRetryForOneAddress )
+			{
+			retry = ETrue;
+			}
+		else
+			{
+			if (iRetryCounterSum < KMaxRetryForOneAddress && 
+			    iRetryCounter + 1 >= KMaxRetryForOneAddress ||
+			    iRetryCounter >=  KMaxRetryForOneAddress)
+				{
+				iRetryCounter = 0;
+				retry = RetryPossible(aError);
+				}
+			else
+				{
+				retry = ETrue;
+				}
+			}
+		iRetryTimerUse = retry;
+		SetRetryPossible(retry);
+		}
+	else
+		{
+		iRetryCounter = 0;
+		iRetryCounterSum = 0;
+		iRetryTimerUse = EFalse;
+		}
+	if (!retry)
+		{
+		iRetryCounter = 0;
+		iRetryCounterSum = 0;
+		}
+	return retry;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::ShouldRetryRegistration
+// -----------------------------------------------------------------------------
+//	
+TBool CSIPIetfProfileContext::ShouldRetryRegistration( TInt aError )
+	{
+	return (aError == K503ServiceUnavailable || 
+		    aError == KErrSIPOutboundProxyNotResponding || 
+		    aError == KErrTimedOut ||
+		    ((aError == KErrSIPResolvingFailure || 
+		      aError == KErrSIPTransportFailure ||
+		      aError == KErrSIPICMPFailure) && 
+			 iConnection.State() != CSIPConnection::ESuspended));
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::InitializeRetryTimerValue
+// -----------------------------------------------------------------------------
+//	
+void CSIPIetfProfileContext::InitializeRetryTimerValue()
+	{
+	iRetryTimerUse = 0;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::ConnectionStateChangedImpl
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPIetfProfileContext::ConnectionStateChangedImpl(
+    CSIPConnection::TState /*aState*/)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::DeregisterL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPIetfProfileContext::DeregisterL()
+	{
+	PROFILE_DEBUG4("CSIPIetfProfileContext::DeregisterL", ProfileId()\
+		, iCurrentState->Name())
+	iCurrentState->DeregisterL(*this);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::UpdateL
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPIetfProfileContext::UpdateL(
+	CSIPConcreteProfile& aNewProfile)
+	{
+	PROFILE_DEBUG4("CSIPIetfProfileContext::UpdateL", ProfileId()\
+		, iCurrentState->Name())
+	iCurrentState->UpdateL(*this, aNewProfile);
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::IncomingResponse()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+void CSIPIetfProfileContext::IncomingResponse(
+	CSIPClientTransaction& aTransaction,
+	CSIPRegistrationBinding& aRegistration,
+	TBool& aHandled)
+	{
+	if (iClientTx && iRegistration && 
+		aTransaction==*iClientTx && aRegistration==*iRegistration)
+		{
+		PROFILE_DEBUG3("SIPIetfProfileContext::IncomingResponse", ProfileId())
+		aHandled = ETrue;
+		const CSIPResponseElements* response = aTransaction.ResponseElements();
+		if (response)
+		    {
+		    TUint responseCode = response->StatusCode();
+		    if (responseCode >= K300MultipleChoices)
+		        {
+		        PROFILE_DEBUG1("IETFProfileContext: registration failed")
+                RetryPossible(responseCode);
+		        }
+		    else
+		        {
+			    if (responseCode >= K200Ok)
+				    {
+				    PROFILE_DEBUG1("IETFProfileContext: registration complete")
+				    iRetryCounter = 0;
+				    iRetryCounterSum = 0;
+				    Received2XXRegisterResponse();
+		            }
+		        }
+		    }
+        iCurrentState->ResponseReceived(*this, aTransaction);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::RandomPercent()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint CSIPIetfProfileContext::RandomPercent()
+	{
+	const TInt rand = Math::Rand(iRandomSeed);
+	TInt result = 0;
+	result = KMaxRandomLimit + (rand%KMaxRandomLimit);
+	return result;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::DelayTime()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TUint CSIPIetfProfileContext::DelayTime()
+	{
+	PROFILE_DEBUG1("CSIPIetfProfileContext::DelayTime")
+	TReal res;
+	iRetryCounter++;
+	iRetryCounterSum++;
+	Math::Pow(res,KWaitTimeCoefficient,iRetryCounter);
+	TUint respond = res;
+	TUint waitTime = KBaseTimeInSec*respond;
+	if (waitTime > 1800)
+		{
+		waitTime = 1800;
+		}
+	return ((waitTime*RandomPercent())/KRandomDivider);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::RetryTimerInUse()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPIetfProfileContext::RetryTimerInUse()
+	{
+	return iRetryTimerUse;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::IsAddressSIPSURIL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPIetfProfileContext::IsAddressSIPSURIL(const TDesC8& aValue) const
+	{
+	__ASSERT_ALWAYS (aValue.Length() > 0, User::Leave(KErrArgument));
+    TUriParser8 uriParser;
+    User::LeaveIfError(uriParser.Parse(aValue));
+    TPtrC8 sips(SIPStrings::StringF(SipStrConsts::ESips).DesC());
+    return (uriParser.Extract(EUriScheme).CompareF(sips) == 0);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::SetAddressToSIPSURIL()
+// -----------------------------------------------------------------------------
+//
+HBufC8* CSIPIetfProfileContext::SetAddressToSIPSURIL(const TDesC8& aValue)
+	{
+    TUriParser8 uriParser;
+    User::LeaveIfError(uriParser.Parse(aValue));
+    CUri8* uri = CUri8::NewLC(uriParser);	
+	uri->SetComponentL(
+	    SIPStrings::StringF(SipStrConsts::ESips).DesC(),EUriScheme);
+	HBufC8* value = uri->Uri().UriDes().AllocL();
+	CleanupStack::PopAndDestroy(uri);
+	return value;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::SetTlsToSecurityClientL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPIetfProfileContext::SetTlsToSecurityClientL()
+	{
+	TBool tlsSet = EFalse;
+	if(!IsAddressSIPSURIL(iProfile->AOR()) && 
+	   iProfile->IsSecurityNegotiationEnabled())
+		{
+		const TDesC8& proxyAddr = ProxyAddressL();
+		if (proxyAddr.Length() > 0)
+			{
+			if(IsConfiguredOutboundProxySIPURIL(proxyAddr)|| 
+			   IsDynamicNumericIPAddress(proxyAddr))
+				{
+				tlsSet = ETrue;
+				}
+			}
+		}
+	return tlsSet;
+	}
+	
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::IsDynamicNumericIPAddress()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPIetfProfileContext::IsDynamicNumericIPAddress( const TDesC8& aValue )
+	{
+	return ( IsProxyResolvingEnabled() && 
+		 !( UriUtils::HostType( aValue ) == UriUtils::ETextHost ) );
+	}	
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::IsConfiguredOutboundProxySIPURIL()
+// (other items were commented in a header).
+// -----------------------------------------------------------------------------
+//
+TBool CSIPIetfProfileContext::IsConfiguredOutboundProxySIPURIL( const TDesC8& aValue )
+	{
+	return ( !IsProxyResolvingEnabled() && !IsAddressSIPSURIL(aValue) );
+	}	
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::CreateMsgElementsForUpdateLC
+// add SIP headers to REGISTER request
+// -----------------------------------------------------------------------------
+//
+CSIPMessageElements* CSIPIetfProfileContext::CreateMsgElementsForUpdateLC(
+    CSIPConcreteProfile& aProfile)
+	{
+	CSIPMessageElements* elements = CSIPMessageElements::NewLC();
+	
+	RPointerArray<CSIPHeaderBase> headers;
+	CSIPHeaderBase::PushLC(&headers);
+
+	TInt sipHeaderCount = aProfile.SIPHeaders().MdcaCount();
+	for (TInt i=0; i < sipHeaderCount; i++)
+	    {
+	    TPtrC8 headerDes(aProfile.SIPHeaders().MdcaPoint(i));
+	    CSIPHeaderBase* header = SIPMessageBuilder::CreateHeaderLC(headerDes);
+	    headers.AppendL(header);
+	    CleanupStack::Pop(header);
+	    }   
+	    
+	elements->SetUserHeadersL(headers); // An empty array is also allowed
+	CleanupStack::Pop(1); // headers
+	    
+	return elements;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPIetfProfileContext::TransportProtocol
+// -----------------------------------------------------------------------------
+//
+RStringF CSIPIetfProfileContext::TransportProtocol(const CUri8& aUri) const
+    {
+    if (aUri.Uri().Extract(EUriPath).FindF(KTransportUdpParam) >= 0)
+        {
+        return SIPStrings::StringF(SipStrConsts::EUdp);
+        }
+    if (aUri.Uri().Extract(EUriPath).FindF(KTransportTcpParam) >= 0)
+        {
+        return SIPStrings::StringF(SipStrConsts::ETcp);
+        }
+    if (aUri.Uri().Extract(EUriPath).FindF(KTransportTlsParam) >= 0)
+        {
+        return SIPStrings::StringF(SipStrConsts::ETLS);
+        }
+    return SIPStrings::StringF(SipStrConsts::EEmpty);
+    }