realtimenetprots/sipfw/SIP/Transaction/src/NormalServerTaStates.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Transaction/src/NormalServerTaStates.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,344 @@
+// 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          : NormalServerTaStates.cpp
+// Part of       : Transaction
+// Version       : SIP/5.0
+//
+
+
+
+#include "siperr.h"
+#include "SipAssert.h"
+#include "siprequest.h"
+#include "sipresponse.h"
+#include "SIPMessageUtility.h"
+
+#include "NormalServerTa.h"
+#include "NormalServerTaStates.h"
+#include "ResponseQueueItem.h"
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Trying::CNormalServerTa_Trying
+// -----------------------------------------------------------------------------
+//
+CNormalServerTa_Trying::CNormalServerTa_Trying()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Trying::~CNormalServerTa_Trying
+// -----------------------------------------------------------------------------
+//
+CNormalServerTa_Trying::~CNormalServerTa_Trying()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Trying::GetState
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Trying::GetState(CSIPInternalStates::TState& aState) const
+    {
+    aState = CSIPInternalStates::ETransactionTrying;
+    }
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Trying::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Trying::SetNeighbourStates(CTransactionState& aProceeding,
+												CTransactionState& aCompleted)
+	{
+	iProceeding = &aProceeding;
+	iCompleted = &aCompleted;
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Trying::ReceiveL
+// Response can be sent when TimerSend100 has expired or been stopped.
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Trying::ReceiveL(CTransaction& aTransaction,
+	                                  CSIPRequest* aRequest) const
+	{
+    __SIP_ASSERT_LEAVE(aRequest, KErrArgument);
+
+	CNormalServerTransaction& ta = CNormalServerTransaction::Ptr(aTransaction);
+
+	if (ta.RequestPassedToUA())
+		{
+		if (!ta.IsTimerSend100Running() && !ta.IsTransmitterSending())
+			{
+			ta.SendToTransmitterL();
+			}
+		delete aRequest;
+		}
+	else
+		{
+		__ASSERT_ALWAYS(ta.UpdateTransportProtocol(*aRequest),
+					    User::Leave(KErrSIPMalformedMessage));		
+		ta.StartTimerF2UnlessExistsL();		
+		if (!ta.IsTimerSend100Running())
+			{	
+			ta.StartTimerSend100L(*aRequest);
+			}
+		ta.PassRequestToUserAgentL(aRequest);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Trying::SendResponseL
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Trying::SendResponseL(CTransaction& aTransaction,
+								   CSIPResponse* aResp,
+								   RStringF aProtocol,
+								   const TSIPTransportParams& aParams) const
+	{
+	__SIP_ASSERT_LEAVE(aResp, KErrArgument);
+    __SIP_ASSERT_LEAVE(CSIPMessageUtility::CheckTransport(aProtocol),
+                       KErrArgument);
+
+	TBool isFinalResp = CSIPMessageUtility::IsFinalResponse(*aResp);
+	CNormalServerTransaction& ta = CNormalServerTransaction::Ptr(aTransaction);
+	CResponseQueueItem* respItem =
+		CResponseQueueItem::NewLC(aResp, aParams, EFalse);
+
+	ta.SendAndStoreResponseL(respItem, aProtocol);
+	CleanupStack::Pop(respItem);
+
+	ta.StopTimerSend100();
+	if (isFinalResp)
+		{
+		ta.StopTimerF2();
+		aTransaction.ChangeState(*iCompleted);
+		}
+	else
+		{
+		aTransaction.ChangeState(*iProceeding);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Trying::TimerExpiredL
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Trying::TimerExpiredL(CTransaction& aTransaction,
+										   TTimerId aTimerId,
+										   TAny* aTimerParam) const
+	{
+	__SIP_ASSERT_LEAVE(aTimerParam, KErrArgument);
+
+	HandleTimerExpirationL(aTransaction, aTimerId, aTimerParam);
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Proceeding::CNormalServerTa_Proceeding
+// -----------------------------------------------------------------------------
+//
+CNormalServerTa_Proceeding::CNormalServerTa_Proceeding()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Proceeding::~CNormalServerTa_Proceeding
+// -----------------------------------------------------------------------------
+//
+CNormalServerTa_Proceeding::~CNormalServerTa_Proceeding()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Proceeding::GetState
+// -----------------------------------------------------------------------------
+//
+void
+CNormalServerTa_Proceeding::GetState(CSIPInternalStates::TState& aState) const
+    {
+    aState = CSIPInternalStates::ETransactionProceeding;
+    }
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Proceeding::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void
+CNormalServerTa_Proceeding::SetNeighbourStates(CTransactionState& aCompleted)
+	{
+	iCompleted = &aCompleted;
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Proceeding::SendCompleteL
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Proceeding::SendCompleteL(CTransaction& aTransaction) const
+	{
+	CNormalServerTransaction& ta = CNormalServerTransaction::Ptr(aTransaction);
+	CResponseQueueItem* respItem = ta.GetResponseFromSendQueue();
+
+	if (respItem)
+		{
+		TBool isFinalResp =
+			CSIPMessageUtility::IsFinalResponse(respItem->Response());
+
+		CleanupStack::PushL(respItem);
+		ta.SendAndStoreResponseL(respItem);
+		CleanupStack::Pop(respItem);
+
+        if (isFinalResp)
+			{
+			ta.StopTimerF2();
+			aTransaction.ChangeState(*iCompleted);
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Proceeding::SendFailedL
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Proceeding::SendFailedL(CTransaction& aTransaction,
+											 TInt aError) const
+	{
+	aTransaction.TerminatedL(aError);
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Proceeding::ReceiveL
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Proceeding::ReceiveL(CTransaction& aTransaction,
+	                                      CSIPRequest* aRequest) const
+	{
+	CNormalServerTransaction::Ptr(aTransaction).ReceiveRetransmissionL(aRequest);
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Proceeding::SendResponseL
+// If sending a previous response, queue the new response.
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Proceeding::SendResponseL(CTransaction& aTransaction,
+								   CSIPResponse* aResp,
+								   RStringF aProtocol,
+								   const TSIPTransportParams& aParams) const
+	{
+	__SIP_ASSERT_LEAVE(aResp, KErrArgument);
+    __SIP_ASSERT_LEAVE(CSIPMessageUtility::CheckTransport(aProtocol),
+                       KErrArgument);
+
+	CNormalServerTransaction& ta = CNormalServerTransaction::Ptr(aTransaction);
+	CResponseQueueItem* respItem =
+		CResponseQueueItem::NewLC(aResp, aParams, EFalse);
+	if (ta.IsTransmitterSending())
+		{
+		ta.AddResponseToSendQueueL(respItem);
+		}
+	else
+		{		
+		TBool isFinalResp =
+			CSIPMessageUtility::IsFinalResponse(respItem->Response());
+
+		ta.SendAndStoreResponseL(respItem, aProtocol);
+
+        if (isFinalResp)
+			{
+			ta.StopTimerF2();
+			aTransaction.ChangeState(*iCompleted);
+			}
+		}
+	CleanupStack::Pop(respItem);
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Proceeding::TimerExpiredL
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Proceeding::TimerExpiredL(CTransaction& aTransaction,
+											   TTimerId aTimerId,
+											   TAny* aTimerParam) const
+	{
+	__SIP_ASSERT_LEAVE(aTimerParam, KErrArgument);
+
+	HandleTimerExpirationL(aTransaction, aTimerId, aTimerParam);
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Completed::CNormalServerTa_Completed
+// -----------------------------------------------------------------------------
+//
+CNormalServerTa_Completed::CNormalServerTa_Completed()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Completed::~CNormalServerTa_Completed
+// -----------------------------------------------------------------------------
+//
+CNormalServerTa_Completed::~CNormalServerTa_Completed()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Completed::GetState
+// -----------------------------------------------------------------------------
+//
+void
+CNormalServerTa_Completed::GetState(CSIPInternalStates::TState& aState) const
+    {
+    aState = CSIPInternalStates::ETransactionCompleted;
+    }
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Completed::SendCompleteL
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Completed::SendCompleteL(CTransaction& aTransaction) const
+	{
+	CNormalServerTransaction::Ptr(aTransaction).StartTimerJUnlessExistsL();
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Completed::SendFailedL
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Completed::SendFailedL(CTransaction& aTransaction,
+											TInt aError) const
+	{
+	aTransaction.TerminatedL(aError);
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Completed::ReceiveL
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Completed::ReceiveL(CTransaction& aTransaction,
+	                                     CSIPRequest* aRequest) const
+	{
+	CNormalServerTransaction::Ptr(aTransaction).ReceiveRetransmissionL(aRequest);    
+	}
+
+// -----------------------------------------------------------------------------
+// CNormalServerTa_Completed::TimerExpiredL
+// -----------------------------------------------------------------------------
+//
+void CNormalServerTa_Completed::TimerExpiredL(CTransaction& aTransaction,
+											  TTimerId aTimerId,
+											  TAny* aTimerParam) const
+	{	
+	__SIP_ASSERT_LEAVE(aTimerParam, KErrArgument);
+
+	HandleTimerExpirationL(aTransaction, aTimerId, aTimerParam);
+	}