--- /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")
+ }