realtimenetprots/sipfw/SIP/Dialogs/src/Establishing.cpp
changeset 0 307788aac0a8
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Name          : Establishing.cpp
       
    15 // Part of       : SIPDialogs
       
    16 // Version       : SIP/6.0 
       
    17 //
       
    18 
       
    19 
       
    20 
       
    21 
       
    22 #include "Establishing.h"
       
    23 #include "MDialogContext.h"
       
    24 #include "TransactionItemBase.h"
       
    25 #include "siperr.h"
       
    26 #include "SipAssert.h"
       
    27 #include "MTransactionUser.h"
       
    28 #include "MTransactionHeaders.h"
       
    29 #include "siprequest.h"
       
    30 #include "sipresponse.h"
       
    31 #include "siptoheader.h"
       
    32 #include "sipfromheader.h"
       
    33 #include "sipcallidheader.h"
       
    34 #include "sipcseqheader.h"
       
    35 #include "CSigCompMgr.h"
       
    36 #include "sipstrings.h"
       
    37 #include "sipstrconsts.h"
       
    38 
       
    39 _LIT8(KEstablishing, "Establishing");
       
    40 const TUint K100Response = 100;
       
    41 
       
    42 
       
    43 // -----------------------------------------------------------------------------
       
    44 // TEstablishing::TEstablishing
       
    45 // -----------------------------------------------------------------------------
       
    46 //
       
    47 TEstablishing::TEstablishing (MDialogContext& aDialog,
       
    48                               TDialogStateBase& aStateEarly,
       
    49 	                          TDialogStateBase& aStateConfirmed,
       
    50 	                          TDialogStateBase& aStateTerminated)
       
    51  : TDialogStateBase(aDialog),
       
    52    iTagParamName(SIPStrings::StringF(SipStrConsts::ETag)),
       
    53    iStateEarly(aStateEarly),
       
    54    iStateConfirmed(aStateConfirmed),
       
    55    iStateTerminated(aStateTerminated)
       
    56 	{
       
    57 	}
       
    58 
       
    59 // -----------------------------------------------------------------------------
       
    60 // TEstablishing::Name
       
    61 // -----------------------------------------------------------------------------
       
    62 //
       
    63 const TDesC8& TEstablishing::Name () const
       
    64 	{
       
    65 	return KEstablishing;
       
    66 	}
       
    67 	
       
    68 // -----------------------------------------------------------------------------
       
    69 // TEstablishing::RequestsWithinDialogAllowed
       
    70 // -----------------------------------------------------------------------------
       
    71 //
       
    72 TBool TEstablishing::RequestsWithinDialogAllowed () const
       
    73     {
       
    74     return EFalse; 
       
    75     }
       
    76     
       
    77 // -----------------------------------------------------------------------------
       
    78 //TEstablishing::Accept
       
    79 // -----------------------------------------------------------------------------
       
    80 //
       
    81 TBool TEstablishing::Accept (CSIPRequest& aRequest) const
       
    82     {
       
    83     return (aRequest.Method() == SIPStrings::StringF(SipStrConsts::ENotify));
       
    84     }
       
    85 
       
    86 // -----------------------------------------------------------------------------
       
    87 // TEstablishing::SendL
       
    88 // -----------------------------------------------------------------------------
       
    89 //
       
    90 void TEstablishing::SendL (TTransactionId& aTransactionId,
       
    91                            CSIPRequest* aRequest,
       
    92                            CTransactionItemBase& aTransactionItem,
       
    93                            CURIContainer& aRemoteTarget)
       
    94 
       
    95 	{
       
    96 	TSIPTransportParams params(
       
    97 	    iDialog.TransportParams(iDialog.RegistrationId()));
       
    98 	
       
    99 	if (iDialog.CallId())
       
   100 	    {
       
   101 	    // The dialog state has been reseted, the data already exists
       
   102 	    aRequest->From()->SetParamL(SIPStrings::StringF(SipStrConsts::ETag),
       
   103 	                                iDialog.LocalTag());
       
   104 	    iDialog.AddCallIdHeaderInDialogL(*aRequest);
       
   105 	    iDialog.AddCSeqHeaderInDialogL(*aRequest); 
       
   106         aTransactionItem.SendL(params,aTransactionId,iDialog.RegistrationId(),
       
   107                                aRequest,aRemoteTarget);    
       
   108 	    }
       
   109 	else
       
   110 	    {
       
   111     	MTransactionHeaders* transactionHeaders = 
       
   112             aTransactionItem.SendAndGetHeadersL(params,aTransactionId,
       
   113                                                 iDialog.RegistrationId(),
       
   114                                                 aRequest,aRemoteTarget);
       
   115      
       
   116         TCleanupItem cleanupItem(DeleteTransactionHeaders,transactionHeaders);
       
   117         CleanupStack::PushL(cleanupItem);
       
   118 
       
   119         __ASSERT_ALWAYS(aTransactionId != KEmptyTransactionId,
       
   120                         User::Leave(KErrSIPInvalidDialogRequest));
       
   121      
       
   122         // Local CSeq
       
   123         iDialog.SetLocalSeqNum(transactionHeaders->CSeqNumber());
       
   124         
       
   125         // Call-ID
       
   126     	CSIPCallIDHeader* callId = transactionHeaders->CallIDHeader();
       
   127         __ASSERT_ALWAYS(callId, User::Leave(KErrSIPInvalidDialogRequest));
       
   128         iDialog.SetCallId(callId);
       
   129 
       
   130         // Local tag
       
   131     	CSIPFromHeader* from = transactionHeaders->FromHeader();
       
   132         __ASSERT_ALWAYS(from, User::Leave(KErrSIPInvalidDialogRequest));
       
   133         CleanupStack::PushL(from);
       
   134         __ASSERT_ALWAYS(from->HasParam(iTagParamName),
       
   135                         User::Leave(KErrSIPInvalidDialogRequest));
       
   136     	iDialog.SetLocalTag(from->ParamValue(iTagParamName));
       
   137     	CleanupStack::PopAndDestroy(from);
       
   138     	
       
   139     	CleanupStack::PopAndDestroy(); // transactionHeaders
       
   140 	    }
       
   141 	}
       
   142 
       
   143 // -----------------------------------------------------------------------------
       
   144 // TEstablishing::SendL
       
   145 // -----------------------------------------------------------------------------
       
   146 //
       
   147 void TEstablishing::SendL (CTransactionItemBase& aTransactionItem,
       
   148                            CSIPResponse* aResponse)
       
   149 	{
       
   150 	TSIPTransportParams params(iDialog.TransportParams(KEmptyRegistrationId));
       
   151 	if (aResponse->Type() == CSIPResponse::E1XX)
       
   152 		{
       
   153 		iDialog.ChangeState(iStateEarly);
       
   154 		}
       
   155 	else		
       
   156 		{
       
   157 		iDialog.ChangeState(iStateConfirmed);
       
   158 		}
       
   159     aTransactionItem.SendL(params,aResponse,ETrue);
       
   160 	}
       
   161 
       
   162 // -----------------------------------------------------------------------------
       
   163 // TEstablishing::ReceiveL
       
   164 // -----------------------------------------------------------------------------
       
   165 //
       
   166 void TEstablishing::ReceiveL (CTransactionItemBase& aTransactionItem, 
       
   167                               CSIPResponse* aResponse)
       
   168 	{
       
   169     if (aResponse->IsErrorResponse())
       
   170 		{
       
   171 		TUint resCode = aResponse->ResponseCode();
       
   172 		if( resCode == 494 || resCode == 401 || resCode == 407)
       
   173 		    {
       
   174 		    delete aResponse;
       
   175 		    PassToOwner(aTransactionItem,KErrSIPInvalidDialogResponse);
       
   176 		    }
       
   177 		else
       
   178 		    {
       
   179 		    PassToOwnerL(aTransactionItem,aResponse);
       
   180 		    }
       
   181 		iDialog.ChangeState(iStateTerminated);
       
   182 		}
       
   183     else if (aResponse->ResponseCode() == K100Response)
       
   184 		{
       
   185 		PassToOwnerL(aTransactionItem,aResponse);
       
   186 		}
       
   187     else // 101-299 response
       
   188 		{
       
   189 		iDialog.SetRouteSetUsingRecordRouteL(
       
   190 		    *aResponse, ETrue, KErrSIPInvalidDialogResponse); 
       
   191         iDialog.SetRemoteTargetWithMsgL(*aResponse);
       
   192 		iDialog.SetRemoteTagL(aResponse->To());
       
   193 
       
   194         if (aResponse->Type() == CSIPResponse::E1XX) // Provisional response
       
   195 			{
       
   196 			PassToOwnerL(aTransactionItem,aResponse);
       
   197 			iDialog.ChangeState(iStateEarly); 
       
   198 			return;
       
   199 			}
       
   200 
       
   201 		if (aTransactionItem.OverlappingRestricted())
       
   202             {
       
   203 			aTransactionItem.SetOverlappingRestricted(EFalse);
       
   204             }
       
   205 
       
   206 		PassToOwnerL(aTransactionItem,aResponse);
       
   207 		iDialog.ChangeState(iStateConfirmed);
       
   208 		}
       
   209 	}
       
   210 
       
   211 // -----------------------------------------------------------------------------
       
   212 // TEstablishing::ReceiveL
       
   213 // -----------------------------------------------------------------------------
       
   214 //
       
   215 void TEstablishing::ReceiveL (TTransactionId aTransactionId, 
       
   216                               CSIPRequest* aRequest)
       
   217 	{
       
   218     CSIPFromHeader* from = aRequest->From();
       
   219     __SIP_ASSERT_LEAVE (from != 0, KErrArgument);
       
   220 	if (iDialog.RemoteTagSet())
       
   221 		{
       
   222 		__ASSERT_ALWAYS(iDialog.RemoteTag() == from->ParamValue(iTagParamName), 
       
   223                         User::Leave(KErrSIPInvalidDialogRequest));
       
   224 		}
       
   225 	else
       
   226         {
       
   227 		iDialog.SetRemoteTagL(aRequest->From());
       
   228         }
       
   229 
       
   230 	iDialog.SetRouteSetUsingRecordRouteL(
       
   231 	    *aRequest, EFalse, KErrSIPInvalidDialogRequest);
       
   232 	iDialog.SetRemoteTargetWithMsgL(*aRequest);	    
       
   233 	    
       
   234     CSIPCSeqHeader* cseq = aRequest->CSeq();
       
   235     __SIP_ASSERT_LEAVE (cseq != 0, KErrArgument);
       
   236 	
       
   237     iDialog.SetRemoteSeqNum(cseq->Seq());
       
   238 
       
   239     TBool isNotify = 
       
   240         (aRequest->Method() == SIPStrings::StringF(SipStrConsts::ENotify));
       
   241     
       
   242     PassToOwnerL(aTransactionId,aRequest);
       
   243 
       
   244     if (isNotify)
       
   245         {
       
   246         iDialog.ChangeState(iStateConfirmed);
       
   247         }
       
   248     }
       
   249 
       
   250 // -----------------------------------------------------------------------------
       
   251 // TEstablishing::EndTransaction
       
   252 // -----------------------------------------------------------------------------
       
   253 //
       
   254 void TEstablishing::EndTransaction (CTransactionItemBase& aTransactionItem, 
       
   255                                     TInt aReason)
       
   256 	{
       
   257 	if (aReason)
       
   258 		{
       
   259 		PassToOwner(aTransactionItem,aReason);
       
   260 		}
       
   261 	if (iDialog.FirstTransactionId() == aTransactionItem.Id())
       
   262 		{
       
   263 		iDialog.SelfDestruct();
       
   264 		}
       
   265 	}
       
   266 
       
   267 // -----------------------------------------------------------------------------
       
   268 // TEstablishing::DeleteTransactionHeaders
       
   269 // -----------------------------------------------------------------------------
       
   270 //
       
   271 void TEstablishing::DeleteTransactionHeaders (TAny* aTransactionHeaders)
       
   272 	{
       
   273 	MTransactionHeaders* transactionHeaders = 
       
   274         reinterpret_cast<MTransactionHeaders*>(aTransactionHeaders);
       
   275     delete transactionHeaders;
       
   276 	}
       
   277 
       
   278 // -----------------------------------------------------------------------------
       
   279 // TEstablishing::GetState
       
   280 // -----------------------------------------------------------------------------
       
   281 //
       
   282 void TEstablishing::GetState (CSIPInternalStates::TState& aState)
       
   283     {
       
   284     aState = CSIPInternalStates::EDialogEstablishing;
       
   285     }
       
   286