--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/SIP/Dialogs/src/Early.cpp Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,193 @@
+// 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 : Early.cpp
+// Part of : SIPDialogs
+// Version : SIP/5.0
+//
+
+
+
+
+#include "siperr.h"
+#include "Early.h"
+#include "MDialogContext.h"
+#include "TransactionItemBase.h"
+#include "SipAssert.h"
+#include "sipresponse.h"
+#include "siprequest.h"
+#include "siptoheader.h"
+#include "sipfromheader.h"
+#include "sipcallidheader.h"
+#include "sipcseqheader.h"
+#include "CSigCompMgr.h"
+#include "sipstrings.h"
+#include "sipstrconsts.h"
+#include "TSIPTransportParams.h"
+
+_LIT8(KEarly, "Early");
+const TUint K100Response = 100;
+
+// -----------------------------------------------------------------------------
+// TEarly::TEarly
+// -----------------------------------------------------------------------------
+//
+TEarly::TEarly (MDialogContext& aDialog,
+ TDialogStateBase& aStateConfirmed,
+ TDialogStateBase& aStateTerminated)
+ : TDialogStateBase(aDialog),
+ iStateConfirmed(aStateConfirmed),
+ iStateTerminated(aStateTerminated)
+ {
+ }
+
+// -----------------------------------------------------------------------------
+// TEarly::Name
+// -----------------------------------------------------------------------------
+//
+const TDesC8& TEarly::Name () const
+ {
+ return KEarly;
+ }
+
+// -----------------------------------------------------------------------------
+// TEarly::SendL
+// -----------------------------------------------------------------------------
+//
+void TEarly::SendL (TTransactionId& aTransactionId,
+ CSIPRequest* aRequest,
+ CTransactionItemBase& aTransactionItem,
+ CURIContainer& aRemoteTarget)
+ {
+ TSIPTransportParams params(iDialog.TransportParams(KEmptyRegistrationId));
+ params.SetSkipNaptrAndSrv(iDialog.HasRouteSet());
+ aTransactionItem.SendL(params,aTransactionId,KEmptyRegistrationId,
+ aRequest,aRemoteTarget);
+ }
+
+// -----------------------------------------------------------------------------
+// TEarly::SendL
+// -----------------------------------------------------------------------------
+//
+void TEarly::SendL (CTransactionItemBase& aTransactionItem,
+ CSIPResponse* aResponse)
+ {
+ TSIPTransportParams params(iDialog.TransportParams(KEmptyRegistrationId));
+ // Check that 2xx response is for correct request
+ if(aResponse->Type() == CSIPResponse::E2XX &&
+ iDialog.FirstTransactionId() == aTransactionItem.Id())
+ {
+ iDialog.ChangeState(iStateConfirmed);
+ }
+ aTransactionItem.SendL(params,aResponse,ETrue);
+ }
+
+// -----------------------------------------------------------------------------
+// TEarly::ReceiveL
+// -----------------------------------------------------------------------------
+//
+void TEarly::ReceiveL (CTransactionItemBase& aTransactionItem,
+ CSIPResponse* aResponse)
+ {
+ if (aResponse->IsErrorResponse())
+ {
+ if (iDialog.FirstTransactionId() == aTransactionItem.Id())
+ {
+ iDialog.TerminateForkedDialogs(aTransactionItem.Id());
+ iDialog.ChangeState(iStateTerminated);
+ }
+ }
+ else // 100-299 response
+ {
+ if (aResponse->ResponseCode() > K100Response)
+ {
+ iDialog.SetRemoteTagL(aResponse->To());
+ if (aTransactionItem.TargetRefresh())
+ {
+ // Only the final response to the initial transaction
+ // updates the route-set
+ if (aResponse->Type() == CSIPResponse::E2XX &&
+ iDialog.FirstTransactionId() == aTransactionItem.Id())
+ {
+ iDialog.SetRouteSetUsingRecordRouteL(
+ *aResponse, ETrue, KErrSIPInvalidDialogResponse);
+ }
+ iDialog.SetRemoteTargetWithMsgL(*aResponse);
+ }
+ }
+
+ if (aResponse->Type() == CSIPResponse::E2XX)
+ {
+ if (aTransactionItem.OverlappingRestricted())
+ {
+ aTransactionItem.SetOverlappingRestricted(EFalse);
+ }
+ if (iDialog.FirstTransactionId() == aTransactionItem.Id())
+ {
+ iDialog.ChangeState(iStateConfirmed);
+ }
+ }
+ }
+ PassToOwnerL(aTransactionItem,aResponse);
+ }
+
+// -----------------------------------------------------------------------------
+// TEarly::ReceiveL
+// -----------------------------------------------------------------------------
+//
+void TEarly::ReceiveL (TTransactionId aTransactionId,
+ CSIPRequest* aRequest)
+ {
+ CSIPFromHeader* from = aRequest->From();
+ __SIP_ASSERT_LEAVE (from != 0, KErrArgument);
+ if (iDialog.RemoteTagSet())
+ {
+ RStringF tagParamName = SIPStrings::StringF(SipStrConsts::ETag);
+ __ASSERT_ALWAYS(iDialog.RemoteTag() == from->ParamValue(tagParamName),
+ User::Leave(KErrSIPInvalidDialogRequest));
+ }
+ else
+ {
+ iDialog.SetRemoteTagL(aRequest->From());
+ }
+ CSIPCSeqHeader* cseq = aRequest->CSeq();
+ __SIP_ASSERT_LEAVE (cseq != 0, KErrArgument);
+ iDialog.SetRemoteSeqNum(cseq->Seq());
+ PassToOwnerL(aTransactionId,aRequest);
+ }
+
+// -----------------------------------------------------------------------------
+// TEarly::EndTransaction
+// -----------------------------------------------------------------------------
+//
+void TEarly::EndTransaction (CTransactionItemBase& aTransactionItem,
+ TInt aReason)
+ {
+ if (aReason)
+ {
+ PassToOwner(aTransactionItem,aReason);
+ }
+ if (iDialog.FirstTransactionId() == aTransactionItem.Id())
+ {
+ iDialog.SelfDestruct();
+ }
+ }
+
+// -----------------------------------------------------------------------------
+// TEarly::GetState
+// -----------------------------------------------------------------------------
+//
+void TEarly::GetState (CSIPInternalStates::TState& aState)
+ {
+ aState = CSIPInternalStates::EDialogEarly;
+ }