diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/SIP/Registration/src/CSIPRegistrationRefreshBinding.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/SIP/Registration/src/CSIPRegistrationRefreshBinding.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,388 @@ +// 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 : CSIPRegistrationRefreshBinding.cpp +// Part of : Registration +// Version : SIP/5.0 +// + + + + +#include "CSIPRegistrationRefreshBinding.h" +#include "CSIPRegistrar.h" +#include "CSIPRegistrationBindingStore.h" +#include "CSIPResponseUtility.h" +#include "MRegistrationOwner.h" +#include "csipregistered.h" +#include "csipregistering.h" +#include "sipresponse.h" +#include "uricontainer.h" +#include "MSipRefreshMgr.h" +#include "SipLogs.h" +#include "SipAssert.h" +#include "sipcontactheader.h" + + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::NewLC +// ----------------------------------------------------------------------------- +// +CSIPRegistrationRefreshBinding* CSIPRegistrationRefreshBinding::NewLC( + CSIPRequest* aSIPRequest, + MTransactionUser& aTransactionUser, + MSigComp& aSigComp, + CSIPSec& aSIPSec, + MSipRefreshMgr& aRefreshMgr, + CSIPRegistrationBindingStore& aBindingStore, + MRegistrationOwner* aRegistrationOwner, + MSIPSecUser& aSIPSecUser, + MSIPTransportMgr& aTransportMgr, + CURIContainer& aRemoteTarget, + TBool aSendWithExpires, + TBool aCacheOutboundProxyIP) + { + CSIPRegistrationRefreshBinding* self = + new (ELeave) CSIPRegistrationRefreshBinding(aTransactionUser, + aSigComp, + aSIPSec, + aBindingStore, + aRegistrationOwner, + aSIPSecUser, + aTransportMgr, + aRefreshMgr, + aSendWithExpires, + aCacheOutboundProxyIP); + CleanupStack::PushL(self); + self->ConstructL(aSIPRequest, aRemoteTarget); + return self; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::CSIPRegistrationRefreshBinding +// ----------------------------------------------------------------------------- +// +CSIPRegistrationRefreshBinding::CSIPRegistrationRefreshBinding( + MTransactionUser& aTransactionUser, + MSigComp& aSigComp, + CSIPSec& aSIPSec, + CSIPRegistrationBindingStore& aBindingStore, + MRegistrationOwner* aRegistrationOwner, + MSIPSecUser& aSIPSecUser, + MSIPTransportMgr& aTransportMgr, + MSipRefreshMgr& aRefreshMgr, + TBool aSendWithExpires, + TBool aCacheOutboundProxyIP) + : CSIPRegistrationBindingBase (aTransactionUser, aSigComp, aSIPSec, + aBindingStore, aRegistrationOwner, + aSIPSecUser, aTransportMgr,aSendWithExpires, + aCacheOutboundProxyIP), + iRefreshMgr(aRefreshMgr), + iIsSubsequentResponse(EFalse) + { + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::~CSIPRegistrationRefreshBinding +// ----------------------------------------------------------------------------- +// +CSIPRegistrationRefreshBinding::~CSIPRegistrationRefreshBinding() + { + iRefreshMgr.RemoveRefreshesFor (this); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::RequestCredentialsL +// From MSIPSecUser +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationRefreshBinding::RequestCredentialsL( + CSIPResponse& aResponse, + TTransactionId aTransactionId, + TRefreshId /*aRefreshId*/) + { + iSIPSecUser.RequestCredentialsL(aResponse,aTransactionId,iRefreshId); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::RefreshId +// ----------------------------------------------------------------------------- +// +TRefreshId CSIPRegistrationRefreshBinding::RefreshId() const + { + return iRefreshId; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::IsRefresh +// ----------------------------------------------------------------------------- +// +TBool CSIPRegistrationRefreshBinding::IsRefresh() const + { + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::RefreshReceivedL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationRefreshBinding::RefreshReceivedL ( + TTransactionId aTransactionId, + TRefreshId aRefreshId, + CSIPResponse* aSIPResponse) + { + __SIP_ASSERT_LEAVE(aSIPResponse, KErrArgument); + __SIP_ASSERT_LEAVE(aTransactionId != KEmptyTransactionId, KErrArgument); + __SIP_ASSERT_LEAVE(aRefreshId != KEmptyRefreshId, KErrArgument); + __SIP_ASSERT_LEAVE(aSIPResponse->To(), KErrArgument); + + __SIP_MESSAGE_LOG("Registration::RefreshReceivedL", *aSIPResponse) + + if (iCurrentState == iRegistered) + { + // update the transaction id for subsequent received response. + iTransactionId = aTransactionId; + } + else + { + // when unregister, updating or subsequent response received, + // transaction id must be same. + __SIP_ASSERT_LEAVE(aTransactionId == iTransactionId || + aTransactionId == iRetryTransactionId, KErrArgument); + } + + __TEST_INVARIANT; + + iCurrentState->ReceiveL(iTransactionId, aSIPResponse); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::RefreshError +// ----------------------------------------------------------------------------- +// +TInt CSIPRegistrationRefreshBinding::RefreshError ( + TRefreshId /*aRefreshId*/, + TTransactionId aTransactionId, + TInt aReason) + { + __TEST_INVARIANT; + + if (iCurrentState == iRegistered) + { + // update the transaction id for subsequent received response. + iTransactionId = aTransactionId; + } + else + { + // when unregister, updating or subsequent response received, + // transaction id must be same. + __SIP_ASSERT_RETURN_VALUE(aTransactionId==iTransactionId,KErrArgument); + } + + TInt res = KErrNone; + if (aReason != KErrNone) + { + res = RemoveBinding (); + } + if(res != KErrNone) + { + return res; + } + + return iCurrentState->TransactionEnded(aTransactionId, aReason); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::NextRefreshCSeq +// ----------------------------------------------------------------------------- +// +TInt CSIPRegistrationRefreshBinding::NextRefreshCSeq (TUint& aCSeq) + { + if (iRegistrar) + { + iRegistrar->IncreaseCSeqNumber(); + aCSeq = iRegistrar->CSeqNumber(); + } + else + { + aCSeq++; + } + + return KErrNone; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::TransportParams +// From MRefreshOwner +// ----------------------------------------------------------------------------- +// +TSIPTransportParams CSIPRegistrationRefreshBinding::TransportParams( + const TRegistrationId& /*aRegistrationId*/) + { + return FillTransportParams(); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::SIPSecUser +// From MRefreshOwner +// ----------------------------------------------------------------------------- +// +const MSIPSecUser* CSIPRegistrationRefreshBinding::SIPSecUser( + const TRegistrationId& /*aRegistrationId*/) + { + // Don't return a this-pointer. + // It could cause cyclic dependecies elsewhere in the code. + return NULL; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::RefreshDurationL +// ----------------------------------------------------------------------------- +// +TUint CSIPRegistrationRefreshBinding::RefreshDurationL() + { + return Contact().ExpiresParameter(); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::DoRegisterL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationRefreshBinding::DoRegisterL( + TTransactionId& aTransactionId, + CSIPRequest* aRequest, + CSIPRouteHeader* aOutboundProxy) + { + if (aOutboundProxy) + { + SetOutboundProxyL(aOutboundProxy); + // If SendL fails the aOutboundProxy is detached from binding + CleanupStack::PushL(TCleanupItem(DetachOutboundProxy, this)); + } + + if (iRegistrar) + { + // send refresh registration request, + // the ownership of request is not passed + iRefreshMgr.RefreshL(aTransactionId,iRefreshId,iRegistrationId, + aRequest,this,*this, + const_cast(iRegistrar->Registrar()), + EFalse,ETrue); + } + else + { + // the ownership of the request is not passed. + iRefreshMgr.RefreshL(aTransactionId,iRefreshId,iRegistrationId,aRequest, + this,*this,*iRemoteTarget,EFalse,ETrue); + } + + if (aOutboundProxy) + { + CleanupStack::Pop(); // TCleanupItem + } + + + if ( iCurrentState->Retrying() ) + { + iRetryTransactionId = aTransactionId; + } + + else + { + iTransactionId = aTransactionId; + } + + + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::DoUpdateL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationRefreshBinding::DoUpdateL( + TTransactionId& aTransactionId, CSIPRequest* aRequest) + { + // send update refresh registration request, + // the ownership of request is not passed. + iRefreshMgr.UpdateRefreshL(iTransactionId, iRefreshId, aRequest, + this, EFalse); + + aTransactionId = iTransactionId; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::DoUnregisterL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationRefreshBinding::DoUnregisterL( + TTransactionId& aTransactionId, CSIPRequest* aRequest) + { + // the ownership of the request is not passed + iRefreshMgr.TerminateRefreshL(iTransactionId, iRefreshId, aRequest, + this, EFalse); + + aTransactionId = iTransactionId; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::SetOutboundProxyL +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationRefreshBinding::SetOutboundProxyL( + CSIPRouteHeader* aOutboundProxy) + { + __SIP_ASSERT_LEAVE (aOutboundProxy, KErrArgument); + + if (iRouteSet.Count() > 0) + { + iRefreshMgr.UpdateRouteSetsL(this,iRouteSet); + } + else + { + iRefreshMgr.RemoveRouteSets(this); + } + CreateProxyTransportResourcesL(*aOutboundProxy); + SetOutboundProxy(aOutboundProxy); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::ClearRefreshOwner +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationRefreshBinding::ClearRefreshOwner () + { + iRefreshMgr.TerminateRefresh(iRefreshId,this); + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::SetRefreshId +// ----------------------------------------------------------------------------- +// +void CSIPRegistrationRefreshBinding::SetRefreshId(TRefreshId aRefreshId) + { + iRefreshId = aRefreshId; + } + +// ----------------------------------------------------------------------------- +// CSIPRegistrationRefreshBinding::__DbgTestInvariant +// ----------------------------------------------------------------------------- +// + +void CSIPRegistrationRefreshBinding::__DbgTestInvariant() const + { + if (!iOwner) + { + User::Invariant(); + } + } +