diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileStateRegistered.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileStateRegistered.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,285 @@ +// 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 : sipprofilestateregistered +// Part of : Sip Profile Server +// implementation +// Version : 1.0 +// + + + +// INCLUDE FILES +#include "SipProfileStateRegistered.h" +#include "SipProfileCacheItem.h" +#include "sipplugindirector.h" +#include "SipProfileServerCore.h" +#include "SipProfileLog.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::NewL +// ----------------------------------------------------------------------------- +// +CSIPProfileStateRegistered* CSIPProfileStateRegistered::NewL( + CSIPPluginDirector& aDirector) + { + return new (ELeave) CSIPProfileStateRegistered(aDirector); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::CSIPProfileStateRegistered +// ----------------------------------------------------------------------------- +// +CSIPProfileStateRegistered::CSIPProfileStateRegistered( + CSIPPluginDirector& aDirector): + CSIPProfileState(aDirector) + { + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::~CSIPProfileStateRegistered +// ----------------------------------------------------------------------------- +// +CSIPProfileStateRegistered::~CSIPProfileStateRegistered() + { + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::Name +// ----------------------------------------------------------------------------- +// +CSIPConcreteProfile::TStatus CSIPProfileStateRegistered::Name() const + { + return CSIPConcreteProfile::ERegistered; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::SetNeighbourStates +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateRegistered::SetNeighbourStates( + CSIPProfileState& aUnregInProg, + CSIPProfileState& aUnregistered, + CSIPProfileState& aRegInProg, + CSIPProfileState& aWaitForPermission) + { + iUnregInProg = &aUnregInProg; + iUnregistered = &aUnregistered; + iRegInProg = &aRegInProg; + iWaitForPermission = &aWaitForPermission; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::EnterL +// Checks if a deregister or update registration should be initiated. +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateRegistered::EnterL(CSIPProfileCacheItem& aItem, + TBool aMaySendRegStatusEvent, + CSIPProfileServerCore& aServerCore) + { + PROFILE_DEBUG3("ProfileStateRegistered::EnterL id", aItem.ProfileId()) + // Migration never happens in this state + __ASSERT_ALWAYS(!aItem.IAPMigrationInProgress(), User::Leave(KErrGeneral)); + aItem.SetSnapRetryCounter(0); + // Clear the error code here, because it might be set to KErrDisconnnected, + // if the state was previously changed from registered to registering. + aItem.Profile().SetLastRegistrationError( KErrNone ); + + if (aItem.IsActiveState()) + { + // Don't pass registration status event if migration was disallowed, as + // application sees the profile stays registered. + if (aMaySendRegStatusEvent) + { + aServerCore.SendRegistrationStatusEventL(aItem); + } + + if (aItem.IsReferred()) + { + aItem.ProceedUpdatingProfileL(*iUnregInProg); + return; + } + } + + StartDeregisterL(aItem, *iUnregInProg); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::EnableL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateRegistered::EnableL( + CSIPProfileCacheItem& aItem, + const MSIPExtendedConcreteProfileObserver& aObserver) + { + PROFILE_DEBUG3("ProfileStateRegistered::EnableL id", aItem.ProfileId()) + + DoCommonEnableL(aItem, aObserver); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::EnableSnapInUseL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateRegistered::EnableSnapInUseL( + CSIPProfileCacheItem& aItem, + const MSIPExtendedConcreteProfileObserver& aObserver, + TUint32 /*aSnapId*/) + { + PROFILE_DEBUG3("ProfileStateRegistered::EnableSnapInUseL(profile id)", + aItem.ProfileId()) + + DoCommonEnableL(aItem, aObserver); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::DisableL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateRegistered::DisableL( + CSIPProfileCacheItem& aItem, + const MSIPExtendedConcreteProfileObserver& aObserver) + { + PROFILE_DEBUG3("ProfileStateRegistered::DisableL id", aItem.ProfileId()) + + DoCommonDisable(aItem, aObserver); + if (!aItem.IsReferred()) + { + StartDeregisterL(aItem, *iUnregInProg); + } + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::RemoveL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateRegistered::RemoveL(CSIPProfileCacheItem& aItem) + { + PROFILE_DEBUG3("ProfileStateRegistered::RemoveL id", aItem.ProfileId()) + + StartDeregisterL(aItem, *iUnregInProg); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::UpdateRegistrationL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateRegistered::UpdateRegistrationL( + CSIPProfileCacheItem& aItem, + const MSIPExtendedConcreteProfileObserver& /*aObserver*/) + { + PROFILE_DEBUG3("ProfileStateRegistered::UpdateRegistrationL id", + aItem.ProfileId()) + + if (aItem.IsReferred()) + { + aItem.ProceedUpdatingProfileL(*iUnregInProg); + } + else + { + StartDeregisterL(aItem, *iUnregInProg); + } + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::RegistrationStatusEventL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateRegistered::RegistrationStatusEventL( + CSIPProfileCacheItem& aItem, + CSIPConcreteProfile::TStatus aStatus) + { + PROFILE_DEBUG4("ProfileStateRegistered::RegStatusEventL id,status", + aItem.ProfileId(), + aStatus) + + if (aStatus == CSIPConcreteProfile::ERegistrationInProgress) + { + aItem.ChangeStateL(iRegInProg); + // If state is changed REGISTERED->REGISTERING, we can assume that + // the connection was lost. + aItem.Profile().SetLastRegistrationError( KErrDisconnected ); + aItem.SendUnregisteredStatusEventL(); + } + if (aStatus == CSIPConcreteProfile::EUnregistered) + { + aItem.ChangeStateL(iUnregistered); + } + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::ErrorOccurred +// CSIPProfileCacheItem::HandleError calls SetLastRegistrationError. No need to +// call it here. +// ----------------------------------------------------------------------------- +// +TBool CSIPProfileStateRegistered::ErrorOccurred(CSIPProfileCacheItem& aItem, + TInt /*aError*/) + { + PROFILE_DEBUG3("ProfileStateRegistered::ErrorOccurred(profile id)", + aItem.ProfileId()) + + DoCommonErrorOccurred(aItem); + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::IapAvailableL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateRegistered::IapAvailableL(CSIPProfileCacheItem& aItem, + TUint32 aSnapId, + TUint32 aNewIapId) + { + if ( aNewIapId == aItem.Profile().IapId() ) + { + // The IAP that we are already using was offered for migration. + // Let's allow the migration in order to allow other profiles + // to use the IAP. + aItem.SetClientPermission(aNewIapId, NULL, ETrue); + } + else if (aItem.HasProfileUpdate()) + { + // Currently updating, disallow migration + aItem.SetIAPRefreshReminder(); + aItem.SetClientPermission(aNewIapId, NULL, EFalse); + } + else + { + aItem.HandleNewIapL(aSnapId, aNewIapId, ETrue, *iWaitForPermission); + } + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::ShouldRefreshIAPs +// ----------------------------------------------------------------------------- +// +TBool CSIPProfileStateRegistered::ShouldRefreshIAPs( + CSIPProfileCacheItem& aItem) const + { + return !aItem.HasProfileUpdate(); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateRegistered::ShutdownInitiated +// Initiate de-registration. PluginDirector never has a pending register in +// registered state. +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateRegistered::ShutdownInitiated(CSIPProfileCacheItem& aItem) + { + TRAP_IGNORE(StartDeregisterL(aItem, *iUnregInProg)) + }