realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileState.cpp
changeset 0 307788aac0a8
child 9 1e1cc61f56c3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileState.cpp	Tue Feb 02 01:03:15 2010 +0200
@@ -0,0 +1,409 @@
+// Copyright (c) 2008-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        : sipprofilestate.cpp
+// Part of     : Sip Profile Server
+// implementation
+// Version     : 1.0
+//
+
+
+
+// INCLUDE FILES
+#include "SipProfileState.h"
+#include "SipProfileCacheItem.h"
+#include "sipplugindirector.h"
+#include "SipProfileLog.h"
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::CSIPProfileState
+// -----------------------------------------------------------------------------
+//
+CSIPProfileState::CSIPProfileState(CSIPPluginDirector& aDirector) :
+	iPluginDirector(aDirector)
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::~CSIPProfileState
+// -----------------------------------------------------------------------------
+//
+CSIPProfileState::~CSIPProfileState()
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::EnterL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::EnterL(CSIPProfileCacheItem& /*aItem*/,
+							  TBool /*aMaySendRegStatusEvent*/,
+							  CSIPProfileServerCore& /*aServerCore*/)
+	{
+	PROFILE_DEBUG1("CSIPProfileState::EnterL")
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::RegisterL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::RegisterL(CSIPProfileCacheItem& /*aItem*/)
+	{
+    PROFILE_DEBUG1("CSIPProfileState::RegisterL")
+	User::Leave(KErrArgument);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::RemoveL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::RemoveL(CSIPProfileCacheItem& /*aItem*/)
+	{
+	PROFILE_DEBUG1("CSIPProfileState::RemoveL")
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::CanBePermanentlyRemoved
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileState::CanBePermanentlyRemoved(
+	const CSIPProfileCacheItem& /*aItem*/) const
+	{
+	PROFILE_DEBUG1("CSIPProfileState::CanBePermanentlyRemoved")
+	return EFalse;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::UpdateRegistrationL
+// -----------------------------------------------------------------------------
+//			
+void CSIPProfileState::UpdateRegistrationL(
+    CSIPProfileCacheItem& /*aItem*/,
+	const MSIPExtendedConcreteProfileObserver& /*aObserver*/)
+    {
+    PROFILE_DEBUG1("CSIPProfileState::UpdateRegistrationL")
+    User::Leave(KErrArgument);
+    }
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::RegistrationStatusEventL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::RegistrationStatusEventL(
+	CSIPProfileCacheItem& /*aItem*/,
+	CSIPConcreteProfile::TStatus /*aStatus*/)
+	{
+	PROFILE_DEBUG1("CSIPProfileState::RegistrationStatusEventL")
+	User::Leave(KErrArgument);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::IapAvailableL
+// Migration is disallowed by default.
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::IapAvailableL(CSIPProfileCacheItem& aItem,
+									 TUint32 /*aSnapId*/,
+									 TUint32 aNewIapId)
+	{
+	PROFILE_DEBUG4("ProfileState::IapAvailableL(state,iap)",
+				   Name(),
+				   aNewIapId)
+
+	aItem.SetIAPRefreshReminder();
+	aItem.SetClientPermission(aNewIapId, NULL, EFalse);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::ClientAllowsMigrationL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::ClientAllowsMigrationL(
+    CSIPProfileCacheItem& /*aItem*/,
+	TUint32 /*aIapId*/,
+	const MSIPExtendedConcreteProfileObserver& /*aObserver*/)
+	{
+	User::Leave(KErrArgument);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::ClientDisallowsMigrationL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::ClientDisallowsMigrationL(
+    CSIPProfileCacheItem& /*aItem*/,
+	TUint32 /*aIapId*/,
+	const MSIPExtendedConcreteProfileObserver& /*aObserver*/)
+	{
+	User::Leave(KErrArgument);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::MigrationIsAllowedL
+// By default, ignore the event.
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::MigrationIsAllowedL(CSIPProfileCacheItem& /*aItem*/,
+										   TUint32 /*aIapId*/)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::MigrationIsDisallowedL
+// By default, ignore the event.
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::MigrationIsDisallowedL(CSIPProfileCacheItem& /*aItem*/,
+										      TUint32 /*aIapId*/)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::DoCommonErrorOccurred
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::DoCommonErrorOccurred(CSIPProfileCacheItem& aItem) const
+	{
+	PROFILE_DEBUG4("ProfileState::DoCommonErrorOccurred state,id",
+				   Name(),
+				   aItem.ProfileId())
+
+	aItem.ClearOldProfile();
+	aItem.ClearMigrationProfiles();
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::DoCommonEnableL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::DoCommonEnableL(CSIPProfileCacheItem& aItem,
+	const MSIPExtendedConcreteProfileObserver& aObserver) const
+	{
+	PROFILE_DEBUG4("ProfileState::DoCommonEnableL state,id",
+				   Name(),
+				   aItem.ProfileId())
+	__ASSERT_ALWAYS(!aItem.IsUser(aObserver), User::Leave(KErrAlreadyExists));
+	__ASSERT_ALWAYS(aItem.IsActiveState(), User::Leave(KErrNotFound));
+
+	aItem.MoveToUserL(aObserver);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::DoCommonDisable
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::DoCommonDisable(
+	CSIPProfileCacheItem& aItem,
+	const MSIPExtendedConcreteProfileObserver& aObserver) const
+	{
+	PROFILE_DEBUG4("ProfileState::DoCommonDisable state,id",
+				   Name(),
+				   aItem.ProfileId())
+
+	aItem.RemoveUser(aObserver);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::ShouldRefreshIAPs
+// Not all states handle "IAP available" event, so by default don't refresh IAPs
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileState::ShouldRefreshIAPs(CSIPProfileCacheItem& /*aItem*/) const
+	{
+	return EFalse;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::IsAlrState
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileState::IsAlrState() const
+	{
+	return EFalse;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::ShutdownInitiated
+// No action.
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::ShutdownInitiated(CSIPProfileCacheItem& /*aItem*/)
+	{
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::CanProfileBeUpdated
+// PluginDirector may have a pending register in (un)registered progress state,
+// but not in (un)register state.
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileState::CanProfileBeUpdated(CSIPProfileCacheItem& aItem) const
+	{
+	return !IsAlrState() &&
+		   !iPluginDirector.IsRegisterPending(aItem.UsedProfile());
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::IsInitialRegisterDone
+// Used in "wait for IAP", "wait for permission" and "migrating" states, so use
+// current profile (aItem.Profile()), not profile of new IAP
+// (aItem.UsedProfile()).
+//
+// NOTE: if IsInitialRegisterDone is used also from non-ALR states, use code:
+//		const CSIPConcreteProfile* profile = &aItem.Profile();
+//		if (!IsAlrState())
+//			{
+//			profile = &aItem.UsedProfile();
+//			}
+//		TBool done = (iPluginDirector.State(status, *profile) == KErrNone...
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileState::IsInitialRegisterDone(CSIPProfileCacheItem& aItem) const
+	{
+	// Check that in ALR-related state
+	__ASSERT_ALWAYS(IsAlrState(),
+		User::Panic(_L("ProfileState::IsInitRegDone"), KErrNotReady));
+	
+	CSIPConcreteProfile::TStatus status(CSIPConcreteProfile::EUnregistered);
+	TBool done = (iPluginDirector.State(status, aItem.Profile()) == KErrNone &&
+		   		  (status == CSIPConcreteProfile::ERegistered ||
+		   		   status == CSIPConcreteProfile::ERegistrationInProgress));
+	PROFILE_DEBUG4("ProfileState::IsInitRegDone id,done",
+				   aItem.ProfileId(),
+				   done)
+	return done;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::RegisterWithIapL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::RegisterWithIapL(CSIPProfileCacheItem& aItem,
+							  			TUint32 aIapId,
+							  			CSIPProfileState& aRegInProg) const
+	{
+	CSIPConcreteProfile& profile = aItem.Profile();
+	profile.SetIapId(aIapId);
+	iPluginDirector.RegisterL(profile);
+	aItem.ChangeStateL(&aRegInProg);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::StartDeregisterL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::StartDeregisterL(CSIPProfileCacheItem& aItem,
+										CSIPProfileState& aUnregInProg) const
+	{
+	PROFILE_DEBUG4("ProfileState::StartDeregisterL state,id",
+				   Name(),
+				   aItem.ProfileId())
+
+	iPluginDirector.DeregisterL(aItem.UsedProfile());
+	aItem.ChangeStateL(&aUnregInProg);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::DoUpdateL
+// -----------------------------------------------------------------------------
+//
+TBool CSIPProfileState::DoUpdateL(CSIPConcreteProfile& aProfile,
+								  CSIPConcreteProfile& aOldProfile) const
+	{
+	iPluginDirector.UpdateRegistrationL(aProfile, aOldProfile);
+	// Get old profile's state
+	CSIPConcreteProfile::TStatus state;
+	iPluginDirector.State(state, aOldProfile);
+	return state == CSIPConcreteProfile::EUnregistrationInProgress;
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::RefreshIAPsFailed
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::RefreshIAPsFailed(CSIPProfileCacheItem& aItem) const
+	{
+	PROFILE_DEBUG4("ProfileState::RefreshIAPsFailed state,id",
+				   Name(),
+				   aItem.ProfileId())
+
+	iPluginDirector.TerminateHandling(aItem.UsedProfile());
+	DoCommonErrorOccurred(aItem);
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::DisableWhileWaitingIAPL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::DisableWhileWaitingIAPL(CSIPProfileCacheItem& aItem,
+	const MSIPExtendedConcreteProfileObserver& aObserver,
+	CSIPProfileState& aUnregInProg,
+	CSIPProfileState& aUnregistered) const
+	{
+	PROFILE_DEBUG3("ProfileState::DisableWhileWaitingIAPL id",
+				   aItem.ProfileId())
+
+	DoCommonDisable(aItem, aObserver);
+
+	if (!aItem.IsReferred())
+		{
+		if (IsInitialRegisterDone(aItem))
+			{
+			// Work as in Registered-state
+			StartDeregisterL(aItem, aUnregInProg);
+			}
+		else
+			{
+			aItem.ChangeStateL(&aUnregistered);
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::DisableWhileInProgressL
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::DisableWhileInProgressL(CSIPProfileCacheItem& aItem,
+	CSIPProfileState& aUnregInProg,
+	CSIPProfileState& aUnregistered) const
+	{
+	PROFILE_DEBUG3("ProfileState::DisableWhileInProgressL id",
+				   aItem.ProfileId())
+
+	if (!aItem.IsReferred() &&
+		!iPluginDirector.IsRegisterPending(aItem.UsedProfile()))
+		{
+		CSIPConcreteProfile::TStatus status;
+		iPluginDirector.State(status, aItem.UsedProfile());
+		iPluginDirector.DeregisterL(aItem.UsedProfile());
+		if (status == CSIPConcreteProfile::ERegistrationInProgress)
+			{
+			aItem.ChangeStateL(&aUnregistered);
+			}
+		else
+			{
+			aItem.ChangeStateL(&aUnregInProg);
+			}
+		}
+	}
+
+// -----------------------------------------------------------------------------
+// CSIPProfileState::NoNewIapAvailable()
+// -----------------------------------------------------------------------------
+//
+void CSIPProfileState::NoNewIapAvailable(CSIPProfileCacheItem& /*aItem*/) 
+	{
+	PROFILE_DEBUG1("CSIPProfileState::NoNewIapAvailable")
+	}