realtimenetprots/sipfw/SIP/Dialogs/src/Establishing.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Dialogs/src/Establishing.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,286 @@
+// Copyright (c) 2007-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          : Establishing.cpp
+// Part of       : SIPDialogs
+// Version       : SIP/6.0 
+//
+
+
+
+
+#include "Establishing.h"
+#include "MDialogContext.h"
+#include "TransactionItemBase.h"
+#include "siperr.h"
+#include "SipAssert.h"
+#include "MTransactionUser.h"
+#include "MTransactionHeaders.h"
+#include "siprequest.h"
+#include "sipresponse.h"
+#include "siptoheader.h"
+#include "sipfromheader.h"
+#include "sipcallidheader.h"
+#include "sipcseqheader.h"
+#include "CSigCompMgr.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+_LIT8(KEstablishing, "Establishing");
+const TUint K100Response = 100;
+
+
+// -----------------------------------------------------------------------------
+// TEstablishing::TEstablishing
+// -----------------------------------------------------------------------------
+//
+TEstablishing::TEstablishing (MDialogContext& aDialog,
+                              TDialogStateBase& aStateEarly,
+	                          TDialogStateBase& aStateConfirmed,
+	                          TDialogStateBase& aStateTerminated)
+ : TDialogStateBase(aDialog),
+   iTagParamName(SIPStrings::StringF(SipStrConsts::ETag)),
+   iStateEarly(aStateEarly),
+   iStateConfirmed(aStateConfirmed),
+   iStateTerminated(aStateTerminated)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// TEstablishing::Name
+// -----------------------------------------------------------------------------
+//
+const TDesC8& TEstablishing::Name () const
+	{
+	return KEstablishing;
+	}
+	
+// -----------------------------------------------------------------------------
+// TEstablishing::RequestsWithinDialogAllowed
+// -----------------------------------------------------------------------------
+//
+TBool TEstablishing::RequestsWithinDialogAllowed () const
+    {
+    return EFalse; 
+    }
+    
+// -----------------------------------------------------------------------------
+//TEstablishing::Accept
+// -----------------------------------------------------------------------------
+//
+TBool TEstablishing::Accept (CSIPRequest& aRequest) const
+    {
+    return (aRequest.Method() == SIPStrings::StringF(SipStrConsts::ENotify));
+    }
+
+// -----------------------------------------------------------------------------
+// TEstablishing::SendL
+// -----------------------------------------------------------------------------
+//
+void TEstablishing::SendL (TTransactionId& aTransactionId,
+                           CSIPRequest* aRequest,
+                           CTransactionItemBase& aTransactionItem,
+                           CURIContainer& aRemoteTarget)
+
+	{
+	TSIPTransportParams params(
+	    iDialog.TransportParams(iDialog.RegistrationId()));
+	
+	if (iDialog.CallId())
+	    {
+	    // The dialog state has been reseted, the data already exists
+	    aRequest->From()->SetParamL(SIPStrings::StringF(SipStrConsts::ETag),
+	                                iDialog.LocalTag());
+	    iDialog.AddCallIdHeaderInDialogL(*aRequest);
+	    iDialog.AddCSeqHeaderInDialogL(*aRequest); 
+        aTransactionItem.SendL(params,aTransactionId,iDialog.RegistrationId(),
+                               aRequest,aRemoteTarget);    
+	    }
+	else
+	    {
+    	MTransactionHeaders* transactionHeaders = 
+            aTransactionItem.SendAndGetHeadersL(params,aTransactionId,
+                                                iDialog.RegistrationId(),
+                                                aRequest,aRemoteTarget);
+     
+        TCleanupItem cleanupItem(DeleteTransactionHeaders,transactionHeaders);
+        CleanupStack::PushL(cleanupItem);
+
+        __ASSERT_ALWAYS(aTransactionId != KEmptyTransactionId,
+                        User::Leave(KErrSIPInvalidDialogRequest));
+     
+        // Local CSeq
+        iDialog.SetLocalSeqNum(transactionHeaders->CSeqNumber());
+        
+        // Call-ID
+    	CSIPCallIDHeader* callId = transactionHeaders->CallIDHeader();
+        __ASSERT_ALWAYS(callId, User::Leave(KErrSIPInvalidDialogRequest));
+        iDialog.SetCallId(callId);
+
+        // Local tag
+    	CSIPFromHeader* from = transactionHeaders->FromHeader();
+        __ASSERT_ALWAYS(from, User::Leave(KErrSIPInvalidDialogRequest));
+        CleanupStack::PushL(from);
+        __ASSERT_ALWAYS(from->HasParam(iTagParamName),
+                        User::Leave(KErrSIPInvalidDialogRequest));
+    	iDialog.SetLocalTag(from->ParamValue(iTagParamName));
+    	CleanupStack::PopAndDestroy(from);
+    	
+    	CleanupStack::PopAndDestroy(); // transactionHeaders
+	    }
+	}
+
+// -----------------------------------------------------------------------------
+// TEstablishing::SendL
+// -----------------------------------------------------------------------------
+//
+void TEstablishing::SendL (CTransactionItemBase& aTransactionItem,
+                           CSIPResponse* aResponse)
+	{
+	TSIPTransportParams params(iDialog.TransportParams(KEmptyRegistrationId));
+	if (aResponse->Type() == CSIPResponse::E1XX)
+		{
+		iDialog.ChangeState(iStateEarly);
+		}
+	else		
+		{
+		iDialog.ChangeState(iStateConfirmed);
+		}
+    aTransactionItem.SendL(params,aResponse,ETrue);
+	}
+
+// -----------------------------------------------------------------------------
+// TEstablishing::ReceiveL
+// -----------------------------------------------------------------------------
+//
+void TEstablishing::ReceiveL (CTransactionItemBase& aTransactionItem, 
+                              CSIPResponse* aResponse)
+	{
+    if (aResponse->IsErrorResponse())
+		{
+		TUint resCode = aResponse->ResponseCode();
+		if( resCode == 494 || resCode == 401 || resCode == 407)
+		    {
+		    delete aResponse;
+		    PassToOwner(aTransactionItem,KErrSIPInvalidDialogResponse);
+		    }
+		else
+		    {
+		    PassToOwnerL(aTransactionItem,aResponse);
+		    }
+		iDialog.ChangeState(iStateTerminated);
+		}
+    else if (aResponse->ResponseCode() == K100Response)
+		{
+		PassToOwnerL(aTransactionItem,aResponse);
+		}
+    else // 101-299 response
+		{
+		iDialog.SetRouteSetUsingRecordRouteL(
+		    *aResponse, ETrue, KErrSIPInvalidDialogResponse); 
+        iDialog.SetRemoteTargetWithMsgL(*aResponse);
+		iDialog.SetRemoteTagL(aResponse->To());
+
+        if (aResponse->Type() == CSIPResponse::E1XX) // Provisional response
+			{
+			PassToOwnerL(aTransactionItem,aResponse);
+			iDialog.ChangeState(iStateEarly); 
+			return;
+			}
+
+		if (aTransactionItem.OverlappingRestricted())
+            {
+			aTransactionItem.SetOverlappingRestricted(EFalse);
+            }
+
+		PassToOwnerL(aTransactionItem,aResponse);
+		iDialog.ChangeState(iStateConfirmed);
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// TEstablishing::ReceiveL
+// -----------------------------------------------------------------------------
+//
+void TEstablishing::ReceiveL (TTransactionId aTransactionId, 
+                              CSIPRequest* aRequest)
+	{
+    CSIPFromHeader* from = aRequest->From();
+    __SIP_ASSERT_LEAVE (from != 0, KErrArgument);
+	if (iDialog.RemoteTagSet())
+		{
+		__ASSERT_ALWAYS(iDialog.RemoteTag() == from->ParamValue(iTagParamName), 
+                        User::Leave(KErrSIPInvalidDialogRequest));
+		}
+	else
+        {
+		iDialog.SetRemoteTagL(aRequest->From());
+        }
+
+	iDialog.SetRouteSetUsingRecordRouteL(
+	    *aRequest, EFalse, KErrSIPInvalidDialogRequest);
+	iDialog.SetRemoteTargetWithMsgL(*aRequest);	    
+	    
+    CSIPCSeqHeader* cseq = aRequest->CSeq();
+    __SIP_ASSERT_LEAVE (cseq != 0, KErrArgument);
+	
+    iDialog.SetRemoteSeqNum(cseq->Seq());
+
+    TBool isNotify = 
+        (aRequest->Method() == SIPStrings::StringF(SipStrConsts::ENotify));
+    
+    PassToOwnerL(aTransactionId,aRequest);
+
+    if (isNotify)
+        {
+        iDialog.ChangeState(iStateConfirmed);
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// TEstablishing::EndTransaction
+// -----------------------------------------------------------------------------
+//
+void TEstablishing::EndTransaction (CTransactionItemBase& aTransactionItem, 
+                                    TInt aReason)
+	{
+	if (aReason)
+		{
+		PassToOwner(aTransactionItem,aReason);
+		}
+	if (iDialog.FirstTransactionId() == aTransactionItem.Id())
+		{
+		iDialog.SelfDestruct();
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// TEstablishing::DeleteTransactionHeaders
+// -----------------------------------------------------------------------------
+//
+void TEstablishing::DeleteTransactionHeaders (TAny* aTransactionHeaders)
+	{
+	MTransactionHeaders* transactionHeaders = 
+        reinterpret_cast<MTransactionHeaders*>(aTransactionHeaders);
+    delete transactionHeaders;
+	}
+
+// -----------------------------------------------------------------------------
+// TEstablishing::GetState
+// -----------------------------------------------------------------------------
+//
+void TEstablishing::GetState (CSIPInternalStates::TState& aState)
+    {
+    aState = CSIPInternalStates::EDialogEstablishing;
+    }
+