realtimenetprots/sipfw/SIP/sipapi/src/sipdialogtrying.cpp
changeset 0 307788aac0a8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/sipapi/src/sipdialogtrying.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,302 @@
+// Copyright (c) 2003-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          : sipdialogtrying.cpp
+// Part of       : SIPAPI
+// Version       : SIP/4.0 
+//
+
+
+
+#include "SipAssert.h"
+#include "sip.h"
+#include "siperr.h"
+#include "siptoheader.h"
+#include "SipConnectionImplementation.h"
+#include "sipclientconnection.h"
+#include "sipdialogtrying.h"
+#include "SipDialogImplementation.h"
+#include "sipclienttransaction.h"
+#include "sipservertransaction.h"
+#include "sipmessageelements.h"
+#include "sipresponseelements.h"
+#include "sipinvitedialogassoc.h"
+#include "sipsubscribedialogassoc.h"
+#include "sipreferdialogassoc.h"
+#include "sipconnectioncallback.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::NewL
+// -----------------------------------------------------------------------------
+//
+CDialogTrying* CDialogTrying::NewL()
+    {
+    return new (ELeave) CDialogTrying();
+    }
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::CDialogTrying
+// -----------------------------------------------------------------------------
+//
+CDialogTrying::CDialogTrying()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::~CDialogTrying
+// -----------------------------------------------------------------------------
+//
+CDialogTrying::~CDialogTrying()
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::State
+// -----------------------------------------------------------------------------
+//
+CSIPDialog::TState CDialogTrying::State() const
+    {
+    return CSIPDialog::EInit;
+    }
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::SetNeighbourStates
+// -----------------------------------------------------------------------------
+//
+void CDialogTrying::SetNeighbourStates(CDialogState& aEarly,
+                                       CDialogState& aConfirmed,
+                                       CDialogState& aTerminated)
+    {
+    iEarly = &aEarly;
+    iConfirmed = &aConfirmed;
+    iTerminated = &aTerminated;
+    }
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::SendInviteL
+// Only the initial request creating the dialog, can be sent in Trying state.
+// -----------------------------------------------------------------------------
+//
+CSIPClientTransaction*
+CDialogTrying::SendInviteL(const CSIPDialogImplementation& aDialog,                           
+                           CSIPInviteDialogAssoc& aAssoc,
+                           CSIPMessageElements* aElements) const
+    {    
+    aDialog.CheckNoTransactionExistsL();
+    return aAssoc.DoSendInviteL(aElements);
+	}
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::SendSubscribeL
+// Only the initial request creating the dialog, can be sent in Trying state.
+// -----------------------------------------------------------------------------
+//
+CSIPClientTransaction*
+CDialogTrying::SendSubscribeL(const CSIPDialogImplementation& aDialog,
+                              CSIPSubscribeDialogAssoc& aAssoc,
+                              CSIPMessageElements* aElements,
+                              CSIPRefresh* aRefresh) const
+    {    
+    aDialog.CheckNoTransactionExistsL();
+    return aAssoc.DoSendSubscribeL(aElements, aRefresh, EFalse);    
+    }
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::SendReferL
+// Only the initial request creating the dialog, can be sent in Trying state.
+// -----------------------------------------------------------------------------
+//
+CSIPClientTransaction*
+CDialogTrying::SendReferL(const CSIPDialogImplementation& aDialog,
+						  CSIPReferDialogAssoc& aAssoc,
+                   		  CSIPMessageElements* aElements) const
+  	{
+  	aDialog.CheckNoTransactionExistsL();
+	return aAssoc.DoSendReferL(aElements, EFalse);
+  	}
+              
+// -----------------------------------------------------------------------------
+// CDialogTrying::SendResponseL
+// This is the first response sent and it can't be a 100 response. A 101-299
+// response creates a dialog, a 300-699 response does not.
+// -----------------------------------------------------------------------------
+//
+void CDialogTrying::SendResponseL(CSIPDialogImplementation& aDialog,
+                                  const CSIPResponseElements& aElements,
+						          TUint32 aRequestId,
+                                  TBool aAffectsDialogState,
+                                  TBool /*aTargetRefresh*/) const
+    {
+    __SIP_ASSERT_LEAVE(aAffectsDialogState, KErrArgument);
+    
+    CSIPConnection* connection = aDialog.Connection();
+    __ASSERT_ALWAYS(connection, User::Leave(KErrSIPResourceNotAvailable));
+
+	CSIPClientConnection& client =
+		connection->Implementation().ClientConnectionL();
+    if (aElements.StatusCode() >= 300)
+        {        
+        client.SendResponseL(aElements, aRequestId);
+        aDialog.ChangeState(iTerminated);
+        }
+    else
+        {        
+        TUint32 dialogId(0);
+        client.SendResponseAndCreateDialogL(aElements, aRequestId, 
+                                            dialogId, aDialog.RegistrationId());       
+        aDialog.SetDialogId(dialogId);
+        aDialog.StoreCallIdL();                
+		aDialog.FillLocalTagL(EFalse);
+
+        //Enter next state when the response has been successfully sent
+        if (aElements.StatusCode() >= 200)
+            {
+            aDialog.ChangeState(iConfirmed);
+            }
+        else
+            {                
+            //TransactionUser will add to-tag into other responses than 100
+            aDialog.ChangeState(iEarly);
+            }
+        }    
+    }
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::IncomingResponseL
+// -----------------------------------------------------------------------------
+//
+TBool
+CDialogTrying::IncomingResponseL(CSIPDialogImplementation& aDialog,
+                                 CSIPResponseElements* aElements,
+		                         TUint32 aRequestId,
+                                 TUint32 /*aDialogId*/,
+                                 CConnectionCallback& aCallback) const
+    {    
+    __SIP_ASSERT_LEAVE(aElements, KErrArgument);    
+
+    CSIPTransactionBase* ta = NULL;
+    CSIPDialogAssocBase* assoc = NULL;    
+    if (aDialog.FindTransactionAndAssoc(aRequestId, &ta, &assoc))
+        {
+        __SIP_ASSERT_LEAVE(ta->IsSIPClientTransaction(), KErrGeneral);
+        aDialog.UpdateRemoteTargetL(ta->Type(), aElements->MessageElements());
+
+		__SIP_ASSERT_LEAVE(aElements->ToHeader() != NULL, KErrArgument);        
+        aDialog.FillRemoteTagL(*aElements->ToHeader());
+
+        CSIPClientTransaction* clientTa =
+            static_cast<CSIPClientTransaction*>(ta);
+        clientTa->SetResponseElements(aElements);
+
+        aDialog.UpdateState(*clientTa,
+                            *iEarly,
+                            *iConfirmed,
+                            *iTerminated);
+        aCallback.Set(CConnectionCallback::EIncomingResponse,
+                      clientTa,
+                      NULL,
+                      NULL,
+                      assoc);
+        return ETrue;
+        }
+    
+    //Transaction not found, ignore response
+    delete aElements;
+    return EFalse;
+    }
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::IncomingResponseL
+// -----------------------------------------------------------------------------
+//
+TBool CDialogTrying::IncomingResponseL(CSIPDialogImplementation& aDialog,
+                                       CSIPResponseElements* aElements,
+		                               TUint32 aRequestId,
+                                       TUint32 aRefreshId,
+                                       TUint32 /*aDialogId*/,
+                                       CConnectionCallback& aCallback) const
+    {
+    return ResponseToRefreshL(aDialog,
+                              aElements,
+		                      aRequestId,
+                              aRefreshId,
+                              aCallback,
+                              *iEarly,
+                              *iConfirmed,
+                              *iTerminated);
+    }
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::IncomingRequestL
+// -----------------------------------------------------------------------------
+//
+TBool CDialogTrying::IncomingRequestL(CSIPDialogImplementation& aDialog,
+                                      CSIPServerTransaction* aTransaction,
+                                      CConnectionCallback& aCallback) const
+    {
+    __SIP_ASSERT_LEAVE(aTransaction, KErrArgument);
+
+    if (aTransaction->Type() == SIPStrings::StringF(SipStrConsts::ENotify) &&
+    	aDialog.DoesNotifyConfirmDialog())
+        {
+        aDialog.ChangeRefreshesToActive();
+        aDialog.ChangeState(iConfirmed);
+        }
+
+    return RequestReceivedL(aDialog, aTransaction, aCallback);
+    }
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::ErrorOccured
+// -----------------------------------------------------------------------------
+//
+TBool CDialogTrying::ErrorOccured(CSIPDialogImplementation& aDialog,
+                                  TInt aError,
+                                  TUint32 aRequestId,
+                                  CConnectionCallback& aCallback) const
+    {
+    return HandleErrorOccurred(aDialog,
+                               aError,
+                               aRequestId,
+                               aCallback,
+                               *iTerminated);
+    }
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::ErrorOccured
+// -----------------------------------------------------------------------------
+//
+TBool CDialogTrying::ErrorOccured(CSIPDialogImplementation& aDialog,
+                                  TInt aError,
+                                  TUint32 aRefreshId,
+                                  TUint32 /*aRequestId*/,
+                                  CConnectionCallback& aCallback) const
+    {    
+    return HandleRefreshErrorOccurred(aDialog,
+                               		  aError,
+                               		  aRefreshId,
+                               		  aCallback,
+                               		  *iTerminated);
+    }
+
+// -----------------------------------------------------------------------------
+// CDialogTrying::ConnectionLost
+// -----------------------------------------------------------------------------
+//
+void CDialogTrying::ConnectionLost(CSIPDialogImplementation& aDialog) const
+    {
+    aDialog.ChangeState(iTerminated);
+    }