diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Dialogs/src/Establishing.cpp --- /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(aTransactionHeaders); + delete transactionHeaders; + } + +// ----------------------------------------------------------------------------- +// TEstablishing::GetState +// ----------------------------------------------------------------------------- +// +void TEstablishing::GetState (CSIPInternalStates::TState& aState) + { + aState = CSIPInternalStates::EDialogEstablishing; + } +