realtimenetprots/sipfw/ProfileAgent/Server/Src/SipProfileStateRegistered.cpp
changeset 0 307788aac0a8
--- /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))
+	}