diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Registration/src/CSIPRegistrationBinding.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Registration/src/CSIPRegistrationBinding.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,341 @@ +// Copyright (c) 2005-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 : CSIPRegistrationBinding.cpp +// Part of : Registration +// Version : SIP/4.0 +// + + + + +#include "CSIPRegistrationBinding.h" +#include "CSIPRegistrar.h" +#include "CSIPRegistrationBindingStore.h" +#include "CSIPResponseUtility.h" +#include "MRegistrationOwner.h" +#include "csipregistrationstate.h" +#include "sipresponse.h" +#include "siprequest.h" +#include "siptoheader.h" +#include "sipaddress.h" +#include "sipminexpiresheader.h" +#include "sipcontactheader.h" +#include "uricontainer.h" +#include "SipLogs.h" +#include "SipAssert.h" + + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::NewLC +// ----------------------------------------------------------------------------- +// +CSIPRegistrationBinding* CSIPRegistrationBinding::NewLC( + CSIPRequest* aSIPRequest, + MSigComp& aSigComp, + CSIPSec& aSIPSec, + MTimerManager& aTimerMgr, + MTransactionUser& aTransactionUser, + CSIPRegistrationBindingStore& aBindingStore, + MRegistrationOwner* aRegistrationOwner, + MSIPSecUser& aSIPSecUser, + MSIPTransportMgr& aTransportMgr, + CURIContainer& aRemoteTarget, + TBool aSendWithExpires, + TBool aCacheOutboundProxyIP) + { + CSIPRegistrationBinding* self = new (ELeave) CSIPRegistrationBinding( + aSigComp, aSIPSec, aTimerMgr, aTransactionUser, aBindingStore, + aRegistrationOwner, aSIPSecUser, aTransportMgr,aSendWithExpires, + aCacheOutboundProxyIP); + CleanupStack::PushL(self); + self->ConstructL(aSIPRequest, aRemoteTarget); + return self; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::CSIPRegistrationBinding +// ----------------------------------------------------------------------------- +// +CSIPRegistrationBinding::CSIPRegistrationBinding( + MSigComp& aSigComp, + CSIPSec& aSIPSec, + MTimerManager& aTimerManager, + MTransactionUser& aTransactionUser, + CSIPRegistrationBindingStore& aBindingStore, + MRegistrationOwner* aRegistrationOwner, + MSIPSecUser& aSIPSecUser, + MSIPTransportMgr& aTransportMgr, + TBool aSendWithExpires, + TBool aCacheOutboundProxyIP) + : CSIPRegistrationBindingBase (aTransactionUser, aSigComp, aSIPSec, + aBindingStore, aRegistrationOwner, + aSIPSecUser, aTransportMgr,aSendWithExpires, + aCacheOutboundProxyIP), + iTimerMgr (aTimerManager) + { + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::~CSIPRegistrationBinding +// ----------------------------------------------------------------------------- +// +CSIPRegistrationBinding::~CSIPRegistrationBinding() + { + iTransactionUser.ClearTransactionOwner(this); + iTimerMgr.Stop(iTimerId); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::IsRefresh +// ----------------------------------------------------------------------------- +// +TBool CSIPRegistrationBinding::IsRefresh() const + { + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::DoRegisterL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationBinding::DoRegisterL(TTransactionId& aTransactionId, + CSIPRequest* aSIPRequest, + CSIPRouteHeader* aOutboundProxy) + { + if (aOutboundProxy) + { + SetOutboundProxyL(aOutboundProxy); + // If SendL fails the aOutboundProxy is detached from binding + CleanupStack::PushL(TCleanupItem(DetachOutboundProxy, this)); + } + + TSIPTransportParams transportParams(FillTransportParams()); + + if (iRegistrar) + { + iTransactionUser.SendL(aTransactionId, iRegistrationId, aSIPRequest, + this, const_cast(iRegistrar->Registrar()), + transportParams, EFalse); + } + else + { + iTransactionUser.SendL(aTransactionId, iRegistrationId, aSIPRequest, + this, *iRemoteTarget, transportParams, EFalse); + } + + if (aOutboundProxy) + { + CleanupStack::Pop(); // TCleanupItem + } + + if ( iCurrentState->Retrying() ) + { + iRetryTransactionId = aTransactionId; + } + + else + { + iTransactionId = aTransactionId; + } + + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::DoUpdateL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationBinding::DoUpdateL(TTransactionId& aTransactionId, + CSIPRequest* aSIPRequest) + { + TSIPTransportParams transportParams(FillTransportParams()); + + iTransactionUser.SendL(iTransactionId, iRegistrationId, + aSIPRequest, this, const_cast(iRegistrar->Registrar()), + transportParams, EFalse); + + aTransactionId = iTransactionId; + iTimerMgr.Stop(iTimerId); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::DoUnregisterL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationBinding::DoUnregisterL(TTransactionId& aTransactionId, + CSIPRequest* aSIPRequest) + { + TSIPTransportParams transportParams(FillTransportParams()); + + iTransactionUser.SendL(iTransactionId, iRegistrationId, + aSIPRequest, this, const_cast(iRegistrar->Registrar()), + transportParams, EFalse); + + aTransactionId = iTransactionId; + iTimerMgr.Stop(iTimerId); + } + + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::ReceiveL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationBinding::ReceiveL(TUint32 /*aIapId*/, + TTransactionId /*aTransactionId*/, + CSIPRequest* /*aSIPRequest*/) + { + // this function call is not supported + User::Leave (KErrNotSupported); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::ReceiveL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationBinding::ReceiveL(TTransactionId aTransactionId, + CSIPResponse* aSIPResponse) + { + __SIP_ASSERT_LEAVE(aSIPResponse, KErrArgument); + __SIP_ASSERT_LEAVE(aSIPResponse->To(), KErrArgument); + __SIP_ASSERT_LEAVE(aTransactionId != KEmptyTransactionId, KErrArgument); + + // panic if transaction id is not equal to the one has sent + __SIP_ASSERT_LEAVE(aTransactionId == iTransactionId || + aTransactionId == iRetryTransactionId, KErrArgument); + + __SIP_MESSAGE_LOG("Registrations: ReceiveL", *aSIPResponse) + + __TEST_INVARIANT; + + iCurrentState->ReceiveL(iTransactionId, aSIPResponse); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::TransactionEnded +// ----------------------------------------------------------------------------- +// +TInt CSIPRegistrationBinding::TransactionEnded(TUint32 /*aIapId*/, + TTransactionId aTransactionId, + TInt aReason) + { + __SIP_ASSERT_RETURN_VALUE (aTransactionId != KEmptyTransactionId, + KErrArgument); + __SIP_ASSERT_RETURN_VALUE (aTransactionId == iTransactionId, + KErrArgument); + + __TEST_INVARIANT; + + TInt res = KErrNone; + + if (aReason != KErrNone) + { + res = RemoveBinding (); + } + + if(res != KErrNone) + { + return res; + } + + return iCurrentState->TransactionEnded(aTransactionId, aReason); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::NextCSeq +// ----------------------------------------------------------------------------- +// +TInt CSIPRegistrationBinding::NextCSeq(TUint& aCSeq) + { + if (iRegistrar) + { + iRegistrar->IncreaseCSeqNumber(); + aCSeq = iRegistrar->CSeqNumber(); + } + else + { + aCSeq++; + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::SIPSecUser +// From MTransactionOwner: +// ----------------------------------------------------------------------------- +// +const MSIPSecUser* CSIPRegistrationBinding::SIPSecUser() const + { + return this; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::TimerExpiredL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationBinding::TimerExpiredL(TTimerId aTimerId, + TAny* /*aTimerParam*/) + { + __SIP_ASSERT_LEAVE(iTimerId == aTimerId, KErrArgument); + + // if register is in registered or unregistered states, + // binding can be removed. + // otherwise, the registration is pending, do not delete the binding. + if (!RegisterPending()) + { + ClearTransactionOwner(); + User::LeaveIfError(RemoveBinding()); + } + } + + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::StartTimerL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationBinding::StartTimerL(TUint aExpiresValue) + { + const TUint KMilliSecondsInSecond = 1000; + const TUint KTimerValue = (aExpiresValue * KMilliSecondsInSecond); + iTimerId = iTimerMgr.StartL(this,KTimerValue); + iContact->SetExpiresParameterL(aExpiresValue); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::ClearTransactionOwner +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationBinding::ClearTransactionOwner ( TBool aUseRetryId ) + { + TTransactionId id( iTransactionId ); + + if ( aUseRetryId ) + { + // If retry-register is sent, we should clear retry transaction + id = iRetryTransactionId; + } + iTransactionUser.ClearTransactionOwner( id ); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationBinding::__DbgTestInvariant +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationBinding::__DbgTestInvariant() const + { + if (!iOwner) + { + User::Invariant(); + } + + }