realtimenetprots/sipfw/SIP/TransactionUser/src/InviteUACStates.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/TransactionUser/src/InviteUACStates.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,720 @@
+// Copyright (c) 2006-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          : InviteUACStates.cpp
+// Part of       : TransactionUser
+// Version       : SIP/5.0
+//
+
+
+
+#include "siperr.h"
+#include "siprequest.h"
+#include "sipresponse.h"
+#include "SipAssert.h"
+
+#include "InviteUAC.h"
+#include "InviteUACStates.h"
+
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_Start::CInviteUAC_Start
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_Start::CInviteUAC_Start()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_Start::~CInviteUAC_Start
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_Start::~CInviteUAC_Start()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_Start::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_Start::SetNeighbourStates(CUserAgentState& aResolveAddress)
+	{    
+	iResolveAddress = &aResolveAddress;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_Start::SendRequestL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_Start::SendRequestL(CUserAgent& aUserAgent,
+									CSIPRequest* aReq,
+									TRegistrationId aRegisterId,
+									const CURIContainer& aRemoteTarget) const
+    {
+    __SIP_ASSERT_LEAVE(aReq, KErrArgument);    
+
+	CInviteUAC::Ptr(aUserAgent).HandleSendRequestL(aReq,
+												   aRegisterId,
+												   aRemoteTarget,
+                                                   *iResolveAddress);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_Start::SendAckL
+// Can't send ACK before a 2xx has been received
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_Start::SendAckL(CUserAgent& /*aUserAgent*/,						
+							    CSIPRequest* aAck,
+							    MTransactionOwner& /*aObserver*/,
+							    const TSIPTransportParams& /*aParams*/,
+							    TRegistrationId /*aRegisterId*/,
+							    const CURIContainer& /*aRemoteTarget*/,
+							    TBool /*aDeleteRequest*/,
+							    RStringF /*aBranch*/) const
+	{
+    __SIP_ASSERT_LEAVE(aAck, KErrArgument);
+
+	User::Leave(KErrSIPInvalidTransactionState);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAddress::CInviteUAC_ResolveAddress
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_ResolveAddress::CInviteUAC_ResolveAddress()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAddress::~CInviteUAC_ResolveAddress
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_ResolveAddress::~CInviteUAC_ResolveAddress()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAddress::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void
+CInviteUAC_ResolveAddress::SetNeighbourStates(CUserAgentState& aWaitResponse)
+	{
+	iWaitResponse = &aWaitResponse;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAddress::IsResolving
+// -----------------------------------------------------------------------------
+//
+TBool CInviteUAC_ResolveAddress::IsResolving() const
+	{
+	return ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAddress::AddressResolvedL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_ResolveAddress::AddressResolvedL(CUserAgent& aUserAgent) const
+	{
+	CInviteUAC::Ptr(aUserAgent).RemoteAddressResolvedL(*iWaitResponse);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAddress::ResolvingFailed
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_ResolveAddress::ResolvingFailed(CUserAgent& aUserAgent) const
+	{
+	CInviteUAC::Ptr(aUserAgent).HandleResolvingFailure(*this, *iWaitResponse);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAddress::SendAckL
+// Can't send ACK before a 2xx has been received
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_ResolveAddress::SendAckL(CUserAgent& /*aUserAgent*/,
+										 CSIPRequest* aAck,										 
+										 MTransactionOwner& /*aObserver*/,
+										 const TSIPTransportParams& /*aParams*/,
+										 TRegistrationId /*aRegisterId*/,
+										 const CURIContainer& /*aRemoteTarget*/,
+										 TBool /*aDeleteRequest*/,
+										 RStringF /*aBranch*/) const
+	{
+    __SIP_ASSERT_LEAVE(aAck, KErrArgument);
+	
+	User::Leave(KErrSIPInvalidTransactionState);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitResponse::CInviteUAC_WaitResponse
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_WaitResponse::CInviteUAC_WaitResponse()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitResponse::~CInviteUAC_WaitResponse
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_WaitResponse::~CInviteUAC_WaitResponse()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitResponse::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitResponse::SetNeighbourStates(
+							 CUserAgentState& aWaitAckFromApp,
+							 CUserAgentState& aWaitTransactionToEnd,
+							 CUserAgentState& aResolveAddress,
+							 CUserAgentState& aWaitAuthentication)
+	{    	
+	iWaitAckFromApp = &aWaitAckFromApp;
+	iWaitTransactionToEnd = &aWaitTransactionToEnd;
+	iResolveAddress = &aResolveAddress;
+	iWaitAuthentication = &aWaitAuthentication;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitResponse::ReceiveL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitResponse::ReceiveL(CUserAgent& aUserAgent,
+	                                   CSIPResponse* aResponse) const
+	{
+    __SIP_ASSERT_LEAVE(aResponse, KErrArgument);
+
+	CInviteUAC& ua = CInviteUAC::Ptr(aUserAgent);
+
+	//If a final response has been passed to TransactionOwner, UA should be in
+	//CInviteUAC_WaitAckFromApp state
+    __SIP_ASSERT_LEAVE(!ua.FinalRespPassed(), KErrSIPInvalidTransactionState);
+	
+    TBool wait(EFalse);
+    TRAPD(err,wait = ua.PassResponseToSIPSecL(*aResponse))
+    
+    if(err )
+        {
+        if(aResponse->IsErrorResponse())
+            
+            ua.SetSipSecError(err);
+        else
+            User::Leave(err); 
+        }
+    
+	if (wait)
+		{
+		//Wait for SIPSec to handle response
+		ua.StoreResponse(aResponse);
+		aUserAgent.ChangeState(*iWaitAuthentication);
+		}
+	else
+		{
+		if (aResponse->ResponseCode() >= 300)
+			{			
+			ua.StartSIPSecTimerL();
+			ua.StoreResponse(aResponse);
+			aUserAgent.ChangeState(*iWaitAuthentication);
+			}
+		else
+			{
+			ua.ReceiveResponseL(aResponse,
+								*iResolveAddress,
+								*this,
+								*iWaitAckFromApp,
+								*iWaitTransactionToEnd);
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitResponse::TransactionEndsL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitResponse::TransactionEndsL(CUserAgent& aUserAgent,
+											   TInt aReason) const
+	{
+	CInviteUAC::Ptr(aUserAgent).TransactionEndsWithoutFinalResponseL(aReason,
+											    *iResolveAddress,
+											    *this);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitResponse::SendAckL
+// Can't send ACK before a 2xx has been received
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitResponse::SendAckL(CUserAgent& /*aUserAgent*/,
+									   CSIPRequest* aAck,
+									   MTransactionOwner& /*aObserver*/,
+									   const TSIPTransportParams& /*aParams*/,
+									   TRegistrationId /*aRegisterId*/,
+									   const CURIContainer& /*aRemoteTarget*/,
+									   TBool /*aDeleteRequest*/,
+									   RStringF /*aBranch*/) const
+	{
+    __SIP_ASSERT_LEAVE(aAck, KErrArgument);
+
+	User::Leave(KErrSIPInvalidTransactionState);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAckFromApp::CInviteUAC_WaitAckFromApp
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_WaitAckFromApp::CInviteUAC_WaitAckFromApp()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAckFromApp::~CInviteUAC_WaitAckFromApp
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_WaitAckFromApp::~CInviteUAC_WaitAckFromApp()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAckFromApp::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitAckFromApp::SetNeighbourStates(
+	CUserAgentState& aResolveAckAddress)
+	{    
+	iResolveAckAddress = &aResolveAckAddress;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAckFromApp::SendAckL
+// ACK's headers are not updated to CTransactionStore, as an ACK to a 2xx has a
+// different branch than the original INVITE, and further 2xx responses couldn't
+// be routed to this UAC anymore if the new branch is put to CTransactionStore.
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitAckFromApp::SendAckL(CUserAgent& aUserAgent,
+										 CSIPRequest* aAck,
+										 MTransactionOwner& aObserver,
+										 const TSIPTransportParams& aParams,
+										 TRegistrationId aRegisterId,
+										 const CURIContainer& aRemoteTarget,
+										 TBool aDeleteRequest,
+										 RStringF aBranch) const
+	{
+    __SIP_ASSERT_LEAVE(aAck, KErrArgument);    
+
+	CInviteUAC::Ptr(aUserAgent).SendFirstAckL(aAck,
+											  aObserver,
+											  aParams,
+											  aRegisterId,
+											  aRemoteTarget,
+											  aDeleteRequest,
+											  aBranch);	
+	aUserAgent.ChangeState(*iResolveAckAddress);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAckFromApp::ReceiveL
+// As incoming responses are routed using Via's branch parameter, the 2xx
+// responses will be received by the same UAC regardless of the To-tag value.
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitAckFromApp::ReceiveL(CUserAgent& aUserAgent,
+	                                     CSIPResponse* aResponse) const
+	{
+    __SIP_ASSERT_LEAVE(aResponse, KErrArgument);    
+	
+	CInviteUAC::Ptr(aUserAgent).HandleAdditional2xxL(aResponse);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAckFromApp::TimerExpiredL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitAckFromApp::TimerExpiredL(CUserAgent& aUserAgent,
+										      TTimerId aTimerId,
+										      TAny* aTimerParam) const
+	{
+    __SIP_ASSERT_LEAVE(aTimerParam, KErrArgument);    
+
+	HandleTimerExpirationL(aUserAgent, aTimerId, aTimerParam);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAckAddress::CInviteUAC_ResolveAckAddress
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_ResolveAckAddress::CInviteUAC_ResolveAckAddress()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAckAddress::~CInviteUAC_ResolveAckAddress
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_ResolveAckAddress::~CInviteUAC_ResolveAckAddress()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAckAddress::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void
+CInviteUAC_ResolveAckAddress::SetNeighbourStates(CUserAgentState& aSendingAck)
+	{
+	iSendingAck = &aSendingAck;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAckAddress::IsResolving
+// -----------------------------------------------------------------------------
+//
+TBool CInviteUAC_ResolveAckAddress::IsResolving() const
+	{
+	return ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAckAddress::AddressResolvedL
+// Remote address for ACK resolved, send the ACK from send buffer
+// -----------------------------------------------------------------------------
+//
+void
+CInviteUAC_ResolveAckAddress::AddressResolvedL(CUserAgent& aUserAgent) const
+	{
+	CInviteUAC::Ptr(aUserAgent).AckAddressResolvedL();
+	aUserAgent.ChangeState(*iSendingAck);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAckAddress::ResolvingFailed
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_ResolveAckAddress::ResolvingFailed(CUserAgent& aUserAgent) const
+	{
+	CInviteUAC::Ptr(aUserAgent).HandleResolvingFailure(*this, *iSendingAck);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAckAddress::SendAckL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_ResolveAckAddress::SendAckL(CUserAgent& aUserAgent,
+										    CSIPRequest* aAck,
+										    MTransactionOwner& aObserver,
+										    const TSIPTransportParams& aParams,
+										    TRegistrationId aRegisterId,
+										    const CURIContainer& aRemoteTarget,
+										    TBool aDeleteRequest,
+										    RStringF /*aBranch*/) const
+	{
+    __SIP_ASSERT_LEAVE(aAck, KErrArgument);    
+
+	CInviteUAC::Ptr(aUserAgent).SendAdditionalAckL(aAck,
+												   aObserver,
+												   aParams,
+												   aRegisterId,
+												   aRemoteTarget,
+												   aDeleteRequest);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAckAddress::ReceiveL
+// Incoming responses are routed by Via branch, so 2xx responses are received
+// by the same UAC regardless of the To-tag value.
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_ResolveAckAddress::ReceiveL(CUserAgent& aUserAgent,
+	                                        CSIPResponse* aResponse) const
+	{
+    __SIP_ASSERT_LEAVE(aResponse, KErrArgument);
+
+	CInviteUAC::Ptr(aUserAgent).HandleAdditional2xxL(aResponse);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_ResolveAckAddress::TimerExpiredL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_ResolveAckAddress::TimerExpiredL(CUserAgent& aUserAgent,
+											     TTimerId aTimerId,
+											     TAny* aTimerParam) const
+	{
+    __SIP_ASSERT_LEAVE(aTimerParam, KErrArgument);    
+
+	HandleTimerExpirationL(aUserAgent, aTimerId, aTimerParam);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_SendingAck::CInviteUAC_SendingAck
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_SendingAck::CInviteUAC_SendingAck()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_SendingAck::~CInviteUAC_SendingAck
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_SendingAck::~CInviteUAC_SendingAck()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_SendingAck::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void
+CInviteUAC_SendingAck::SetNeighbourStates(CUserAgentState& aResolveAckAddress)
+	{
+	iResolveAckAddress = &aResolveAckAddress;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_SendingAck::SendCompleteL
+// No action, UAC ends when iTimerWait2xxRetransmissions expires
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_SendingAck::SendCompleteL(CUserAgent& /*aUserAgent*/) const
+	{    
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_SendingAck::SendFailedL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_SendingAck::SendFailedL(CUserAgent& aUserAgent,
+										TInt aError) const
+	{
+	if (!CInviteUAC::Ptr(aUserAgent).TryNextAddressL(aError,
+													 *iResolveAckAddress,
+													 *this))
+		{
+		aUserAgent.Stop(aError);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_SendingAck::SendAckL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_SendingAck::SendAckL(CUserAgent& aUserAgent,
+								     CSIPRequest* aAck,
+								     MTransactionOwner& aObserver,
+								     const TSIPTransportParams& aParams,
+								     TRegistrationId aRegisterId,
+								     const CURIContainer& aRemoteTarget,
+								     TBool aDeleteRequest,
+								     RStringF /*aBranch*/) const
+	{
+    __SIP_ASSERT_LEAVE(aAck, KErrArgument);
+
+	CInviteUAC::Ptr(aUserAgent).SendAdditionalAckL(aAck,
+												   aObserver,
+												   aParams,
+												   aRegisterId,
+												   aRemoteTarget,
+												   aDeleteRequest);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_SendingAck::ReceiveL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_SendingAck::ReceiveL(CUserAgent& aUserAgent,
+	                                 CSIPResponse* aResponse) const
+	{
+    __SIP_ASSERT_LEAVE(aResponse, KErrArgument);    
+
+	CInviteUAC::Ptr(aUserAgent).HandleAdditional2xxL(aResponse);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_SendingAck::IcmpErrorL
+// InviteUAC handles IcmpErrorL only in states where it has sent a request
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_SendingAck::IcmpErrorL(CUserAgent& aUserAgent,
+							   const TInetAddr& aAddress,
+							   CSipConnectionMgr::TICMPError /*aError*/) const
+	{    
+	CInviteUAC::Ptr(aUserAgent).HandleIcmpErrorL(aAddress,
+										         *iResolveAckAddress,
+										         *this);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_SendingAck::TimerExpiredL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_SendingAck::TimerExpiredL(CUserAgent& aUserAgent,
+									      TTimerId aTimerId,
+									      TAny* aTimerParam) const
+	{
+    __SIP_ASSERT_LEAVE(aTimerParam, KErrArgument);    
+
+	HandleTimerExpirationL(aUserAgent, aTimerId, aTimerParam);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitTransactionToEnd::CInviteUAC_WaitTransactionToEnd
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_WaitTransactionToEnd::CInviteUAC_WaitTransactionToEnd()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitTransactionToEnd::~CInviteUAC_WaitTransactionToEnd
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_WaitTransactionToEnd::~CInviteUAC_WaitTransactionToEnd()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitTransactionToEnd::CanContinueWithoutOutgoingMsg
+// -----------------------------------------------------------------------------
+//
+TBool CInviteUAC_WaitTransactionToEnd::CanContinueWithoutOutgoingMsg(
+											TBool /*aFinalRespPassed*/) const
+	{
+	return ETrue;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitTransactionToEnd::TransactionEndsL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitTransactionToEnd::TransactionEndsL(CUserAgent& aUserAgent,
+													   TInt aReason) const
+	{
+	aUserAgent.Stop(aReason);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitTransactionToEnd::SendAckL
+// Upper layer can't send ACK, as a 3xx-6xx response was received.
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitTransactionToEnd::SendAckL(CUserAgent& /*aUserAgent*/,
+									CSIPRequest* aAck,
+									MTransactionOwner& /*aObserver*/,
+									const TSIPTransportParams& /*aParams*/,
+									TRegistrationId /*aRegisterId*/,
+									const CURIContainer& /*aRemoteTarget*/,
+									TBool /*aDeleteRequest*/,
+									RStringF /*aBranch*/) const
+	{
+    __SIP_ASSERT_LEAVE(aAck, KErrArgument);
+
+	User::Leave(KErrSIPInvalidTransactionState);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAuthentication::CInviteUAC_WaitAuthentication
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_WaitAuthentication::CInviteUAC_WaitAuthentication()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAuthentication::~CInviteUAC_WaitAuthentication
+// -----------------------------------------------------------------------------
+//
+CInviteUAC_WaitAuthentication::~CInviteUAC_WaitAuthentication()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAuthentication::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitAuthentication::SetNeighbourStates(
+							CUserAgentState& aResolveAddress,
+							CUserAgentState& aWaitResponse,
+							CUserAgentState& aWaitAckFromApp,
+							CUserAgentState& aWaitTransactionToEnd)
+	{    
+	iResolveAddress = &aResolveAddress;
+	iWaitResponse = &aWaitResponse;
+	iWaitAckFromApp = &aWaitAckFromApp;
+	iWaitTransactionToEnd = &aWaitTransactionToEnd;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAuthentication::SIPSecCacheUpdatedL
+// -----------------------------------------------------------------------------
+//
+void
+CInviteUAC_WaitAuthentication::SIPSecCacheUpdatedL(CUserAgent& aUserAgent,
+												   TBool aSuccess) const
+	{
+	CInviteUAC::Ptr(aUserAgent).SIPSecCacheUpdatedL(aSuccess,                          
+			                                        *iResolveAddress,
+			                                        *iWaitResponse,
+									 				*iWaitAckFromApp,
+									 				*iWaitTransactionToEnd);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAuthentication::TimerExpiredL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitAuthentication::TimerExpiredL(CUserAgent& aUserAgent,
+											      TTimerId aTimerId,
+											      TAny* aTimerParam) const
+	{
+    __SIP_ASSERT_LEAVE(aTimerParam, KErrArgument);    
+
+	HandleTimerExpirationL(aUserAgent, aTimerId, aTimerParam);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAuthentication::TransactionEndsL
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitAuthentication::TransactionEndsL(CUserAgent& aUserAgent,
+													 TInt /*aReason*/) const
+	{
+    aUserAgent.RequestDeletionOfTransactionL();
+    CInviteUAC::Ptr(aUserAgent).IgnoreResponseRetransmissionsL();
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteUAC_WaitAuthentication::SendAckL
+// 2xx hasn't been received, so application can't send ACK.
+// -----------------------------------------------------------------------------
+//
+void CInviteUAC_WaitAuthentication::SendAckL(CUserAgent& /*aUserAgent*/,
+									CSIPRequest* aAck,
+									MTransactionOwner& /*aObserver*/,
+									const TSIPTransportParams& /*aParams*/,
+									TRegistrationId /*aRegisterId*/,
+									const CURIContainer& /*aRemoteTarget*/,
+									TBool /*aDeleteRequest*/,
+									RStringF /*aBranch*/) const
+	{
+    __SIP_ASSERT_LEAVE(aAck, KErrArgument);
+
+	User::Leave(KErrSIPInvalidTransactionState);
+	}