realtimenetprots/sipfw/SIP/Transaction/src/InviteClientTaStates.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Transaction/src/InviteClientTaStates.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,379 @@
+// 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          : InviteClientTaStates.cpp
+// Part of       : Transaction
+// Version       : SIP/5.0
+//
+
+
+
+#include "siprequest.h"
+#include "sipresponse.h"
+#include "SipAssert.h"
+#include "SIPMessageUtility.h"
+
+#include "InviteClientTa.h"
+#include "InviteClientTaStates.h"
+#include "ClearProxy.h"
+
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Calling::CInviteClientTa_Calling
+// -----------------------------------------------------------------------------
+//
+CInviteClientTa_Calling::CInviteClientTa_Calling()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Calling::~CInviteClientTa_Calling
+// -----------------------------------------------------------------------------
+//
+CInviteClientTa_Calling::~CInviteClientTa_Calling()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Calling::GetState
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Calling::GetState(CSIPInternalStates::TState& aState) const
+    {
+    aState = CSIPInternalStates::ETransactionCalling;
+    }
+
+#if defined(USE_SIP_LOGS)
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Calling::Log
+// -----------------------------------------------------------------------------
+//
+const TDesC8& CInviteClientTa_Calling::Log() const
+	{
+	_LIT8(KState, "Calling");
+	return KState;
+	}
+#endif
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Calling::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void
+CInviteClientTa_Calling::SetNeighbourStates(CTransactionState& aProceeding,
+                                 			CTransactionState& aCompleted)
+	{
+	iProceeding = &aProceeding;
+	iCompleted = &aCompleted;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Calling::SendRequestL
+// CleanupItem handles ownership of aOutboundProxy in case of leave.
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Calling::SendRequestL(CTransaction& aTransaction,
+										   CSIPRequest& aInvite,
+										   const TInetAddr& aAddress,										   
+										   RStringF aProtocol,
+										   TBool aForceUDP,
+										   const TSIPTransportParams& aParams,
+										   CUri8* aOutboundProxy) const
+	{
+    __SIP_ASSERT_LEAVE(CSIPMessageUtility::CheckTransport(aProtocol),
+                       KErrArgument);
+
+	CInviteClientTransaction& ta = CInviteClientTransaction::Ptr(aTransaction);
+
+	TClearProxy clearProxy(ta);
+    CleanupStack::PushL(clearProxy.CleanupItem());
+
+	ta.StoreRequest(aInvite,
+					aAddress,
+					aParams,
+					aProtocol,
+					aForceUDP,
+					aOutboundProxy);
+	ta.SendToTransmitterL();	
+
+	CleanupStack::Pop(); //cleanupItem
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Calling::SendCompleteL
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Calling::SendCompleteL(CTransaction& aTransaction) const
+	{
+	CInviteClientTransaction& ta = CInviteClientTransaction::Ptr(aTransaction);
+	ta.CheckForTransportChange();
+	ta.StartTimerBUnlessExistsL();
+
+	if (aTransaction.IsUnreliableTransportUsed())
+		{
+		ta.StartTimerAL();
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Calling::SendFailedL
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Calling::SendFailedL(CTransaction& aTransaction,
+										  TInt aError) const
+	{    
+	aTransaction.TerminatedL(aError);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Calling::ReceiveL
+// If 2xx is received, UAC terminates the transaction. Stop timers when
+// transaction can't return to previous state (ReceiveResponseL has returned).
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Calling::ReceiveL(CTransaction& aTransaction,
+	                                   CSIPResponse* aResponse) const
+	{
+    __SIP_ASSERT_LEAVE(aResponse, KErrArgument);
+
+	CInviteClientTransaction& ta = CInviteClientTransaction::Ptr(aTransaction);
+
+	if (ta.ShouldTaHandleResponse(aResponse))
+		{
+		CTransactionTimer* proceedingTimer = NULL;
+		CTransactionTimer* natTimer = NULL;
+		if (!CSIPMessageUtility::IsFinalResponse(*aResponse))
+			{
+			proceedingTimer = ta.StartTimerProceedingL();
+			natTimer = ta.StartTimerNATL();
+            aTransaction.ChangeState(*iProceeding);
+			}
+
+		ta.ReceiveResponseL(aResponse,
+							*this,
+							*iCompleted,
+							proceedingTimer,
+							natTimer);
+        //Stop retransmission timer A. Timer B has only effect in Calling state
+		ta.StopTimerA();
+		ta.StopTimerB();
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Calling::TimerExpiredL
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Calling::TimerExpiredL(CTransaction& aTransaction,
+										    TTimerId aTimerId,
+										    TAny* aTimerParam) const
+	{    
+    __SIP_ASSERT_LEAVE(aTimerParam, KErrArgument);
+
+	HandleTimerExpirationL(aTransaction, aTimerId, aTimerParam);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Proceeding::CInviteClientTa_Proceeding
+// -----------------------------------------------------------------------------
+//
+CInviteClientTa_Proceeding::CInviteClientTa_Proceeding()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Proceeding::~CInviteClientTa_Proceeding
+// -----------------------------------------------------------------------------
+//
+CInviteClientTa_Proceeding::~CInviteClientTa_Proceeding()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Proceeding::GetState
+// -----------------------------------------------------------------------------
+//
+void
+CInviteClientTa_Proceeding::GetState(CSIPInternalStates::TState& aState) const
+    {
+    aState = CSIPInternalStates::ETransactionProceeding;
+    }
+
+#if defined(USE_SIP_LOGS)
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Proceeding::Log
+// -----------------------------------------------------------------------------
+//
+const TDesC8& CInviteClientTa_Proceeding::Log() const
+	{
+	_LIT8(KState, "Proceeding");
+	return KState;
+	}
+#endif
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Proceeding::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void
+CInviteClientTa_Proceeding::SetNeighbourStates(CTransactionState& aCompleted)
+	{
+	iCompleted = &aCompleted;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Proceeding::SendCompleteL
+// Occurs if 1xx comes before CTransmitter sent SendCompleteL or if iTimerNAT
+// retransmitted INVITE.
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Proceeding::SendCompleteL(CTransaction& aTransaction) const
+	{
+	CInviteClientTransaction& ta = CInviteClientTransaction::Ptr(aTransaction);
+	ta.CheckForTransportChange();
+	ta.StartTimerNATL();
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Proceeding::SendFailedL
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Proceeding::SendFailedL(CTransaction& aTransaction,
+											 TInt aError) const
+	{
+	aTransaction.TerminatedL(aError);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Proceeding::ReceiveL
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Proceeding::ReceiveL(CTransaction& aTransaction,
+	                                      CSIPResponse* aResponse) const
+	{    
+    __SIP_ASSERT_LEAVE(aResponse, KErrArgument);
+	
+	CInviteClientTransaction& ta = CInviteClientTransaction::Ptr(aTransaction);
+
+	if (ta.ShouldTaHandleResponse(aResponse))
+		{		
+		TBool isErrorResponse = aResponse->IsErrorResponse();
+		ta.ReceiveResponseL(aResponse, *this, *iCompleted);
+		if (isErrorResponse)
+            {
+            ta.StopTimerProceeding();
+            ta.StopTimerNAT();
+            }
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Proceeding::TimerExpiredL
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Proceeding::TimerExpiredL(CTransaction& aTransaction,
+											   TTimerId aTimerId,
+											   TAny* aTimerParam) const
+	{
+    __SIP_ASSERT_LEAVE(aTimerParam, KErrArgument);
+
+	HandleTimerExpirationL(aTransaction, aTimerId, aTimerParam);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Completed::CInviteClientTa_Completed
+// -----------------------------------------------------------------------------
+//
+CInviteClientTa_Completed::CInviteClientTa_Completed()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Completed::~CInviteClientTa_Completed
+// -----------------------------------------------------------------------------
+//
+CInviteClientTa_Completed::~CInviteClientTa_Completed()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Completed::GetState
+// -----------------------------------------------------------------------------
+//
+void
+CInviteClientTa_Completed::GetState(CSIPInternalStates::TState& aState) const
+    {
+    aState = CSIPInternalStates::ETransactionCompleted;
+    }
+
+#if defined(USE_SIP_LOGS)
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Completed::Log
+// -----------------------------------------------------------------------------
+//
+const TDesC8& CInviteClientTa_Completed::Log() const
+	{
+	_LIT8(KState, "Completed");
+	return KState;
+	}
+#endif
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Completed::SendCompleteL
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Completed::SendCompleteL(CTransaction& aTransaction) const
+	{
+	CInviteClientTransaction::Ptr(aTransaction).StartTimerDUnlessExistsL();
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Completed::SendFailedL
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Completed::SendFailedL(CTransaction& aTransaction,
+											TInt aError) const
+	{
+	aTransaction.TerminatedL(aError);
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Completed::ReceiveL
+// Retransmit ACK unless currently being sent.
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Completed::ReceiveL(CTransaction& aTransaction,
+	                                     CSIPResponse* aResponse) const
+	{
+    __SIP_ASSERT_LEAVE(aResponse, KErrArgument);
+
+	if (!aTransaction.IsTransmitterSending() && aResponse->IsErrorResponse())
+        {
+	    CInviteClientTransaction::Ptr(aTransaction).SendToTransmitterL();
+        }
+
+    delete aResponse;
+	}
+
+// -----------------------------------------------------------------------------
+// CInviteClientTa_Completed::TimerExpiredL
+// -----------------------------------------------------------------------------
+//
+void CInviteClientTa_Completed::TimerExpiredL(CTransaction& aTransaction,
+											  TTimerId aTimerId,
+											  TAny* aTimerParam) const
+	{    
+    __SIP_ASSERT_LEAVE(aTimerParam, KErrArgument);	
+
+	HandleTimerExpirationL(aTransaction, aTimerId, aTimerParam);
+	}