diff -r 000000000000 -r 307788aac0a8 realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileStateUnregistered.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileStateUnregistered.cpp Tue Feb 02 01:03:15 2010 +0200 @@ -0,0 +1,270 @@ +// 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 : sipprofilestateunregistered +// Part of : Sip Profile Server +// implementation +// Version : 1.0 +// + + + +// INCLUDE FILES +#include "SipProfileStateUnregistered.h" +#include "SipProfileServerCore.h" +#include "sipconcreteprofile.h" +#include "SipProfileCacheItem.h" +#include "sipplugindirector.h" +#include "sipalrmonitor.h" +#include "SipProfileLog.h" + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::NewL +// ----------------------------------------------------------------------------- +// +CSIPProfileStateUnregistered* CSIPProfileStateUnregistered::NewL( + CSIPPluginDirector& aDirector) + { + return new (ELeave) CSIPProfileStateUnregistered(aDirector); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::CSIPProfileStateUnregistered +// ----------------------------------------------------------------------------- +// +CSIPProfileStateUnregistered::CSIPProfileStateUnregistered( + CSIPPluginDirector& aDirector): + CSIPProfileState(aDirector) + { + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::~CSIPProfileStateUnregistered +// ----------------------------------------------------------------------------- +// +CSIPProfileStateUnregistered::~CSIPProfileStateUnregistered() + { + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::Name +// ----------------------------------------------------------------------------- +// +CSIPConcreteProfile::TStatus CSIPProfileStateUnregistered::Name() const + { + return CSIPConcreteProfile::EUnregistered; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::SetNeighbourStates +// ----------------------------------------------------------------------------- +// +void +CSIPProfileStateUnregistered::SetNeighbourStates(CSIPProfileState& aRegInProg, + CSIPProfileState& aWaitForIAP) + { + iRegInProg = &aRegInProg; + iWaitForIAP = &aWaitForIAP; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::EnterL +// Check if should initiate registration. +// ----------------------------------------------------------------------------- +// +void +CSIPProfileStateUnregistered::EnterL(CSIPProfileCacheItem& aItem, + TBool /*aMaySendRegStatusEvent*/, + CSIPProfileServerCore& /*aServerCore*/) + { + TBool updating = aItem.HasProfileUpdate(); + // Use current IAP if updating profile, but SNAP stays same. + // Call IsSnapIdUpdated before ClearOldProfile. + TBool getIap = !updating || aItem.IsSnapIdUpdated(aItem.Profile()); + aItem.SetSnapRetryCounter(0); + + PROFILE_DEBUG5("ProfileStateUnregistered::EnterL id,updating,getIap", + aItem.ProfileId(), + updating, + getIap) + __ASSERT_ALWAYS( + aItem.Profile().Status() == CSIPConcreteProfile::EUnregistered, + User::Leave(KErrGeneral)); + + // aItem.ClearOldProfile() can't be called here, because + // iPluginDirector.TerminateHandling is tring to do something + // to oldProfile still, and it got crashes + aItem.ClearMigrationProfiles(); + if (aItem.IsActiveState()) + { + aItem.SendUnregisteredStatusEventL(); + + if (aItem.IsReferred() && !aItem.IsShutdownInitiated() && !aItem.IsRfsInprogress()) + { + aItem.ClearOldProfile(); + aItem.StartRegisterL(*iWaitForIAP, *iRegInProg, getIap); + // CSIPProfileCacheItem::MonitorSnapL stops ALR monitor later if + // updating SNAP. + return; + } + } + // Stay unregistered, no need to monitor SNAP + aItem.StopSnapMonitoring(); + iPluginDirector.TerminateHandling(aItem.UsedProfile()); + iPluginDirector.StartTimerForCleanup(); + aItem.ClearOldProfile(); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::RegisterL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateUnregistered::RegisterL(CSIPProfileCacheItem& aItem) + { + PROFILE_DEBUG3("ProfileStateUnregistered::RegisterL id", aItem.ProfileId()) + + iPluginDirector.RegisterL(aItem.Profile()); + aItem.ChangeStateL(iRegInProg); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::RegistrationStatusEventL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateUnregistered::RegistrationStatusEventL( + CSIPProfileCacheItem& aItem, + CSIPConcreteProfile::TStatus aStatus) + { + PROFILE_DEBUG4("ProfileStateUnregistered::RegStatusEventL", + aItem.ProfileId(), + aStatus) + + if (aStatus == CSIPConcreteProfile::ERegistrationInProgress) + { + aItem.ChangeStateL(iRegInProg); + } + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::EnableL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateUnregistered::EnableL(CSIPProfileCacheItem& aItem, + const MSIPExtendedConcreteProfileObserver& aObserver) + { + PROFILE_DEBUG3("ProfileStateUnregistered::EnableL id", aItem.ProfileId()) + + RegisterL(aItem); + DoCommonEnableL(aItem, aObserver); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::EnableSnapInUseL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateUnregistered::EnableSnapInUseL( + CSIPProfileCacheItem& aItem, + const MSIPExtendedConcreteProfileObserver& aObserver, + TUint32 aSnapId) + { + PROFILE_DEBUG4("ProfileStateUnregistered::EnableSnapInUseL(profile,snap)", + aItem.ProfileId(), + aSnapId) + + aItem.MonitorSnapL(aSnapId, *iWaitForIAP, *iRegInProg); + DoCommonEnableL(aItem, aObserver); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::DisableL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateUnregistered::DisableL(CSIPProfileCacheItem& aItem, + const MSIPExtendedConcreteProfileObserver& aObserver) + { + PROFILE_DEBUG3("ProfileStateUnregistered::DisableL id", aItem.ProfileId()) + + DoCommonDisable(aItem, aObserver); + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::CanBePermanentlyRemoved +// ----------------------------------------------------------------------------- +// +TBool CSIPProfileStateUnregistered::CanBePermanentlyRemoved( + const CSIPProfileCacheItem& aItem) const + { + TUint profileId(aItem.ProfileId()); + PROFILE_DEBUG3("ProfileStateUnregistered::CanBePermanentlyRemoved id", + profileId) + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::UpdateRegistrationL +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateUnregistered::UpdateRegistrationL( + CSIPProfileCacheItem& aItem, + const MSIPExtendedConcreteProfileObserver& /*aObserver*/) + { + PROFILE_DEBUG3("ProfileStateUnregistered::UpdateRegistrationL id", + aItem.ProfileId()) + aItem.ClearOldProfile(); + + CSIPConcreteProfile::TStatus state; + __ASSERT_ALWAYS( + iPluginDirector.State(state, aItem.Profile()) == KErrNotFound || + state == CSIPConcreteProfile::EUnregistered, User::Leave(KErrArgument)); + + if (aItem.IsReferred() && !aItem.IsShutdownInitiated()) + { + aItem.StartRegisterL(*iWaitForIAP, *iRegInProg, ETrue); + } + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::ErrorOccurred +// ----------------------------------------------------------------------------- +// +TBool CSIPProfileStateUnregistered::ErrorOccurred(CSIPProfileCacheItem& aItem, + TInt /*aError*/) + { + PROFILE_DEBUG3("ProfileStateUnregistered::ErrorOccurred(profile id)", + aItem.ProfileId()) + DoCommonErrorOccurred(aItem); + return ETrue; + } + +// ----------------------------------------------------------------------------- +// CSIPProfileStateUnregistered::IapAvailableL +// Disallow migration during profile update. +// ----------------------------------------------------------------------------- +// +void CSIPProfileStateUnregistered::IapAvailableL(CSIPProfileCacheItem& aItem, + TUint32 /*aSnapId*/, + TUint32 aNewIapId) + { + PROFILE_DEBUG4("ProfileStateUnregistered::IapAvailableL(profile,iap)", + aItem.ProfileId(), + aNewIapId) + + TBool allowMigration = !aItem.HasProfileUpdate(); + if (!allowMigration) + { + aItem.SetIAPRefreshReminder(); + } + aItem.SetClientPermission(aNewIapId, NULL, allowMigration); + }