diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/Sipprflregisteredstate.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/ProfileAgent/profile_fsm/src/Sipprflregisteredstate.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,390 @@ +// 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 : sipprflregisteredstate.cpp +// Part of : sip profile fsm +// implementation +// Version : %version: 2.1.1 % +// + + + +// INCLUDE FILES +#include "sipprflregisteredstate.h" +#include "sipconcreteprofile.h" +#include "sipregistrationbinding.h" +#include "sipclienttransaction.h" +#include "sipresponseelements.h" +#include "sipmessageelements.h" +#include "sipconcreteprofilecomparison.h" +#include "sipprofile.h" +#include "siperr.h" +#include "sipprofileagentobserver.h" +#include "sipprofilefsmuser.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSIPPrflRegisteredState::NewL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CSIPPrflRegisteredState* CSIPPrflRegisteredState::NewL( + MSIPProfileFSMUser& aUser) + { + return new (ELeave) CSIPPrflRegisteredState(aUser); + } + +// ----------------------------------------------------------------------------- +// CSIPPrflRegisteredState::CSIPPrflRegisteredState +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +CSIPPrflRegisteredState::CSIPPrflRegisteredState(MSIPProfileFSMUser& aUser): + CSIPPrflStateBase(aUser,MSIPProfileContext::ERegistered) + { + } + +// ----------------------------------------------------------------------------- +// CSIPPrflRegisteredState::~CSIPPrflRegisteredState +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C CSIPPrflRegisteredState::~CSIPPrflRegisteredState() + { + } + +// ----------------------------------------------------------------------------- +// CSIPPrflRegisteredState::LinkStates() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +EXPORT_C void CSIPPrflRegisteredState::LinkStates( + CSIPPrflStateBase& aDeregisterState, + CSIPPrflStateBase& aDeregistrationInProgressState, + CSIPPrflStateBase& aInitState, + CSIPPrflStateBase& aRegisterRequested, + CSIPPrflStateBase& aRegisterDelayRequested) + { + iDeregisterState = &aDeregisterState; + iDeregistrationInProgressState = &aDeregistrationInProgressState; + iInitState = &aInitState; + iRegisterRequestedState = &aRegisterRequested; + iRegisterDelayRequestedState = &aRegisterDelayRequested; + } + +// ----------------------------------------------------------------------------- +// CSIPPrflRegisteredState::ConcreteProfileState() +// ----------------------------------------------------------------------------- +// +CSIPConcreteProfile::TStatus +CSIPPrflRegisteredState::ConcreteProfileState() const + { + return CSIPConcreteProfile::ERegistered; + } + +// ----------------------------------------------------------------------------- +// CSIPPrflRegisteredState::DeregisterL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPPrflRegisteredState::DeregisterL( + MSIPProfileContext& aContext) + { + __ASSERT_DEBUG(aContext.Profile()!=0, User::Invariant()); + __ASSERT_DEBUG(aContext.Registration()!=0, User::Invariant()); + if (aContext.Connection().State()==CSIPConnection::EActive) + { + if (iUser.AddProfileIntoQueue(*aContext.Profile())) + { + aContext.SetNextState(*iDeregisterState); + iUser.DeregisterProfileL(*aContext.Profile()); + } + else + { + CSIPMessageElements* elements = + aContext.CreateDeRegisterElementsL(); + CleanupStack::PushL(elements); + CSIPClientTransaction* tx = + aContext.Registration()->DeregisterL(elements); + CleanupStack::Pop(elements); + aContext.SetTransaction(tx); + aContext.SetNextState(*iDeregistrationInProgressState); + } + } + else + { + aContext.SetNextState(*iDeregisterState); + } + aContext.AgentObserver().SIPProfileStatusEvent( + *aContext.Profile(), + aContext.Registration()->ContextId()); + } + +// ----------------------------------------------------------------------------- +// CSIPPrflRegisteredState::UpdateL() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPPrflRegisteredState::UpdateL( + MSIPProfileContext& aContext, + CSIPConcreteProfile& aNewProfile) + { + __ASSERT_DEBUG(aContext.Profile()!=0, User::Invariant()); + + CSIPConcreteProfile* oldProfile = aContext.Profile(); + + if (SIPConcreteProfileComparison::ValueModified( + CSIPConcreteProfile::EOutboundProxyParameters, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::EOutboundProxyParameters, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::EOutboundProxyParameters| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EOutboundProxyParameters| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile)) + { + aContext.SetProfile(&aNewProfile); + } + else if (SIPConcreteProfileComparison::ValueModified( + CSIPConcreteProfile::ERegistrarParameters, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::ERegistrarParameters, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::ERegistrarParameters| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::ERegistrarParameters| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile)) + { + aContext.SetProfile(&aNewProfile); + } + else if (SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::ERegistrarParameters| + CSIPConcreteProfile::EOutboundProxyParameters, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::ERegistrarParameters| + CSIPConcreteProfile::EOutboundProxyParameters, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::ERegistrarParameters| + CSIPConcreteProfile::EOutboundProxyParameters| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::ERegistrarParameters| + CSIPConcreteProfile::EOutboundProxyParameters| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile)) + { + aContext.SetProfile(&aNewProfile); + } + else if (SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EContactHeaderParams| + CSIPConcreteProfile::EOutboundProxyParameters, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::EContactHeaderParams| + CSIPConcreteProfile::EOutboundProxyParameters, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::EContactHeaderParams| + CSIPConcreteProfile::EOutboundProxyParameters| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EContactHeaderParams| + CSIPConcreteProfile::EOutboundProxyParameters| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile)) + { + aContext.UpdateContactHeaderParamsL(aNewProfile); + aContext.SetProfile(&aNewProfile); + } + else if (SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EContactHeaderParams| + CSIPConcreteProfile::ERegistrarParameters, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::EContactHeaderParams| + CSIPConcreteProfile::ERegistrarParameters, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::EContactHeaderParams| + CSIPConcreteProfile::ERegistrarParameters| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EContactHeaderParams| + CSIPConcreteProfile::ERegistrarParameters| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile)) + { + aContext.UpdateContactHeaderParamsL(aNewProfile); + aContext.SetProfile(&aNewProfile); + } + else if (SIPConcreteProfileComparison::ValueModified( + CSIPConcreteProfile::EContactHeaderParams, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::EContactHeaderParams, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::EContactHeaderParams| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EContactHeaderParams| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile)) + { + aContext.UpdateContactHeaderParamsL(aNewProfile); + aContext.SetProfile(&aNewProfile); + } + else if (SIPConcreteProfileComparison::ValueModified( + CSIPConcreteProfile::EContactHeaderParams, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EName| + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile) || + SIPConcreteProfileComparison::ValuesModified( + CSIPConcreteProfile::EAutoRegistration, + *oldProfile, aNewProfile)) + { + aContext.SetProfile(&aNewProfile); + } + else if((&aNewProfile)->IsDefault() != (oldProfile)->IsDefault()) + { + aContext.SetProfile(&aNewProfile); + } + else + { + DeregisterL(aContext); + } + } + +// ----------------------------------------------------------------------------- +// CSIPPrflRegisteredState::ConnectionStateChanged() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPPrflRegisteredState::ConnectionStateChanged( + MSIPProfileContext& aContext, + CSIPConnection::TState aState) + { + if (aState==CSIPConnection::EInactive) + { + //registration was cleared by the SIP stack + aContext.SetNextState(*iRegisterRequestedState); + __ASSERT_DEBUG(aContext.Profile()!=0, User::Invariant()); + __ASSERT_DEBUG(aContext.Registration()!=0, User::Invariant()); + TUint32 contextId(aContext.Registration()->ContextId()); + aContext.DestroyRegistration(); + aContext.AgentObserver().SIPProfileStatusEvent( + *aContext.Profile(),contextId); + } + /* When State EUnavailable is received, the registration Binding in the SIPStack + * is no longer present. Hence we have to do the cleanup here and propagate the + * error back to clients of profiles. + */ + else if(aState==CSIPConnection::EUnavailable) + { + HandleError(aContext, KErrCouldNotConnect, iInitState); + } + else + { + // make pclint happy + } + } + +// ----------------------------------------------------------------------------- +// CSIPPrflRegisteredState::ErrorOccurred() +// (other items were commented in a header). +// ----------------------------------------------------------------------------- +// +void CSIPPrflRegisteredState::ErrorOccured( + MSIPProfileContext& aContext, + TInt aError) + { + __ASSERT_DEBUG(aContext.Registration()!=0, User::Invariant()); + CSIPConcreteProfile& profile = *aContext.Profile(); + TUint32 contextId(aContext.Registration()->ContextId()); + if ( aError == KErrTotalLossOfPrecision ) + { + iUser.SetInterimProfile(&profile); + } + aContext.DestroyRegistration(); + if ( aContext.RetryAfterTimer() ) + { + //registration failed , re-try later + aContext.SetTransaction(0); + + if( aContext.RetryTimerInUse() ) + { + aContext.SetNextState(*iRegisterDelayRequestedState); + aContext.AgentObserver().SIPProfileStatusEvent(profile,contextId); + } + else + { + DoCleanup(aContext,contextId); + aContext.SetNextState(*iRegisterDelayRequestedState); + aContext.AgentObserver().SIPProfileStatusEvent(profile,contextId); + aContext.SetNextState(*iInitState); + } + } + else if ((aError == KErrSIPTransportFailure || + aError == KErrSIPResolvingFailure || + aError == KErrSIPICMPFailure) && + aContext.Connection().State() == CSIPConnection::ESuspended) + { + //registration was dropped due to the expired + // refresh while connection is suspended + aContext.SetNextState(*iRegisterRequestedState); + aContext.AgentObserver().SIPProfileStatusEvent(profile,contextId); + } + else if (aContext.RetryTimerInUse()) + { + aContext.SetNextState(*iRegisterDelayRequestedState); + aContext.AgentObserver().SIPProfileErrorEvent(profile,contextId); + } + else + { + HandleError(aContext, aError, iInitState); + } + }