realtimenetprots/sipfw/ProfileAgent/Server/Src/sipprofilestatewaitforpermission.cpp
changeset 0 307788aac0a8
child 1 dd3853b8dc3f
equal deleted inserted replaced
-1:000000000000 0:307788aac0a8
       
     1 // Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
       
     2 // All rights reserved.
       
     3 // This component and the accompanying materials are made available
       
     4 // under the terms of "Eclipse Public License v1.0"
       
     5 // which accompanies this distribution, and is available
       
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     7 //
       
     8 // Initial Contributors:
       
     9 // Nokia Corporation - initial contribution.
       
    10 //
       
    11 // Contributors:
       
    12 //
       
    13 // Description:
       
    14 // Name        : sipprofilestatewaitforpermission.cpp
       
    15 // Part of     : Sip Profile Server
       
    16 // implementation
       
    17 // Version     : 1.0
       
    18 //
       
    19 
       
    20 
       
    21 
       
    22 // INCLUDE FILES
       
    23 #include "sipprofilestatewaitforpermission.h"
       
    24 #include "sipconcreteprofile.h"
       
    25 #include "SipProfileCacheItem.h"
       
    26 #include "sipplugindirector.h"
       
    27 #include "SipProfileLog.h"
       
    28 #include "sipprofile.h"
       
    29 
       
    30 // ============================ MEMBER FUNCTIONS ===============================
       
    31 
       
    32 // -----------------------------------------------------------------------------
       
    33 // CSIPProfileStateWaitForPermission::NewL
       
    34 // -----------------------------------------------------------------------------
       
    35 //
       
    36 CSIPProfileStateWaitForPermission*
       
    37 CSIPProfileStateWaitForPermission::NewL(CSIPPluginDirector& aDirector)
       
    38     {
       
    39     return new (ELeave) CSIPProfileStateWaitForPermission(aDirector);
       
    40     }
       
    41 
       
    42 // -----------------------------------------------------------------------------
       
    43 // CSIPProfileStateWaitForPermission::CSIPProfileStateWaitForPermission
       
    44 // -----------------------------------------------------------------------------
       
    45 //
       
    46 CSIPProfileStateWaitForPermission::CSIPProfileStateWaitForPermission(
       
    47 	CSIPPluginDirector& aDirector):
       
    48 	CSIPProfileState(aDirector)
       
    49     {
       
    50     }
       
    51 
       
    52 // -----------------------------------------------------------------------------
       
    53 // CSIPProfileStateWaitForPermission::~CSIPProfileStateWaitForPermission
       
    54 // -----------------------------------------------------------------------------
       
    55 //
       
    56 CSIPProfileStateWaitForPermission::~CSIPProfileStateWaitForPermission()
       
    57     {
       
    58     }
       
    59 
       
    60 // -----------------------------------------------------------------------------
       
    61 // CSIPProfileStateWaitForPermission::Name
       
    62 // -----------------------------------------------------------------------------
       
    63 //
       
    64 CSIPConcreteProfile::TStatus CSIPProfileStateWaitForPermission::Name() const
       
    65 	{
       
    66 	return static_cast<CSIPConcreteProfile::TStatus>(EWaitForPermission);
       
    67 	}
       
    68 
       
    69 // -----------------------------------------------------------------------------
       
    70 // CSIPProfileStateWaitForPermission::EnableL
       
    71 // EnableL is used by a profile that doesn't have a SNAP configured, and it
       
    72 // should not be in this state.
       
    73 // -----------------------------------------------------------------------------
       
    74 //
       
    75 void CSIPProfileStateWaitForPermission::EnableL(
       
    76 	CSIPProfileCacheItem& aItem,
       
    77 	const MSIPExtendedConcreteProfileObserver& /*aObserver*/)
       
    78 	{
       
    79 	TUint profileId(aItem.ProfileId());
       
    80 	PROFILE_DEBUG3("ProfileStateWaitForPermission::EnableL(profile id)",
       
    81 				   profileId)
       
    82 
       
    83 	User::Leave(KErrArgument);
       
    84 	}
       
    85 
       
    86 // -----------------------------------------------------------------------------
       
    87 // CSIPProfileStateWaitForPermission::EnableSnapInUseL
       
    88 // -----------------------------------------------------------------------------
       
    89 //
       
    90 void CSIPProfileStateWaitForPermission::EnableSnapInUseL(
       
    91 	CSIPProfileCacheItem& aItem,
       
    92 	const MSIPExtendedConcreteProfileObserver& aObserver,
       
    93 	TUint32 /*aSnapId*/)
       
    94 	{
       
    95 	PROFILE_DEBUG3("ProfileStateWaitForPermission::EnableSnapInUseL id,snap",
       
    96 				   aItem.ProfileId())
       
    97 
       
    98 	DoCommonEnableL(aItem, aObserver);
       
    99 	}
       
   100 
       
   101 // -----------------------------------------------------------------------------
       
   102 // CSIPProfileStateWaitForPermission::DisableL
       
   103 // Waiting for migration permission, so actual registration has not started yet.
       
   104 // -----------------------------------------------------------------------------
       
   105 //
       
   106 void CSIPProfileStateWaitForPermission::DisableL(CSIPProfileCacheItem& aItem,
       
   107 	const MSIPExtendedConcreteProfileObserver& aObserver)
       
   108 	{
       
   109 	PROFILE_DEBUG3("ProfileStateWaitForPermission::DisableL id",
       
   110 				   aItem.ProfileId())
       
   111 
       
   112 	DisableWhileWaitingIAPL(aItem, aObserver, *iUnregInProg, *iUnregistered);
       
   113 	}
       
   114 
       
   115 // -----------------------------------------------------------------------------
       
   116 // CSIPProfileStateWaitForPermission::SetNeighbourStates
       
   117 // -----------------------------------------------------------------------------
       
   118 //
       
   119 void CSIPProfileStateWaitForPermission::SetNeighbourStates(
       
   120 	CSIPProfileState& aWaitForIAP,
       
   121 	CSIPProfileState& aMigratingToNewIAP,
       
   122 	CSIPProfileState& aRegInProg,
       
   123 	CSIPProfileState& aRegistered,
       
   124 	CSIPProfileState& aUnregInProg,
       
   125 	CSIPProfileState& aUnregistered)
       
   126 	{
       
   127 	iWaitForIAP 	   = &aWaitForIAP;
       
   128 	iMigratingToNewIAP = &aMigratingToNewIAP;
       
   129 	iRegInProg 		   = &aRegInProg;
       
   130 	iRegistered 	   = &aRegistered;
       
   131 	iUnregInProg 	   = &aUnregInProg;
       
   132 	iUnregistered 	   = &aUnregistered;
       
   133 	}
       
   134 
       
   135 // -----------------------------------------------------------------------------
       
   136 // CSIPProfileStateWaitForPermission::RegistrationStatusEventL.
       
   137 // If aStatus is "register in progress" or unregistered, current IAP dropped.
       
   138 // If unregistered, IsInitialRegisterDone would return EFalse, but if status
       
   139 // CHANGES to unregistered, it was different before (registration existed). As
       
   140 // it ends, allow migration automatically and wait migration result.
       
   141 // -----------------------------------------------------------------------------
       
   142 //
       
   143 void CSIPProfileStateWaitForPermission::RegistrationStatusEventL(
       
   144 	CSIPProfileCacheItem& aItem,
       
   145 	CSIPConcreteProfile::TStatus aStatus)
       
   146 	{
       
   147 	PROFILE_DEBUG4("ProfileStateWaitForPermission::RegStatusEventL id,status",
       
   148 	    		   aItem.ProfileId(),
       
   149 	    		   aStatus)
       
   150 
       
   151 	if (aStatus == CSIPConcreteProfile::EUnregistered ||
       
   152 		aStatus == CSIPConcreteProfile::ERegistrationInProgress)
       
   153 		{
       
   154 		aItem.SendUnregisteredStatusEventL();
       
   155 		iPluginDirector.TerminateHandling(aItem.Profile());
       
   156 		aItem.RegistrationEnded();
       
   157 		}
       
   158 	}
       
   159 
       
   160 // -----------------------------------------------------------------------------
       
   161 // CSIPProfileStateWaitForPermission::ErrorOccurred
       
   162 // -----------------------------------------------------------------------------
       
   163 //
       
   164 TBool CSIPProfileStateWaitForPermission::ErrorOccurred(
       
   165     CSIPProfileCacheItem& aItem,
       
   166     TInt /*aError*/)
       
   167 	{
       
   168 	PROFILE_DEBUG3("ProfileStateWaitForPermission::ErrorOccurred(profile id)",
       
   169 				   aItem.ProfileId())
       
   170 	DoCommonErrorOccurred(aItem);
       
   171 	return ETrue;
       
   172 	}
       
   173 
       
   174 // -----------------------------------------------------------------------------
       
   175 // CSIPProfileStateWaitForPermission::IapAvailableL
       
   176 // -----------------------------------------------------------------------------
       
   177 //
       
   178 void
       
   179 CSIPProfileStateWaitForPermission::IapAvailableL(CSIPProfileCacheItem& aItem,
       
   180 										        TUint32 aSnapId,
       
   181 											    TUint32 aNewIapId)
       
   182 	{
       
   183 	PROFILE_DEBUG5("ProfileStateWaitForPermission::IapAvailableL id,snap,iap",
       
   184 				   aItem.ProfileId(),
       
   185 				   aSnapId,
       
   186 				   aNewIapId)
       
   187 
       
   188 	aItem.HandleNewIapL(aSnapId,
       
   189 						aNewIapId,
       
   190 						IsInitialRegisterDone(aItem),
       
   191 						*this);
       
   192 	}
       
   193 
       
   194 // -----------------------------------------------------------------------------
       
   195 // CSIPProfileStateWaitForPermission::ClientAllowsMigrationL
       
   196 // -----------------------------------------------------------------------------
       
   197 //
       
   198 void CSIPProfileStateWaitForPermission::ClientAllowsMigrationL(
       
   199 	CSIPProfileCacheItem& aItem,
       
   200 	TUint32 aIapId,
       
   201 	const MSIPExtendedConcreteProfileObserver& aObserver)
       
   202 	{
       
   203 	PROFILE_DEBUG4(
       
   204 		"ProfileStateWaitForPermission::ClientAllowsMigrationL id,iap",
       
   205 		aItem.ProfileId(),
       
   206 		aIapId)
       
   207 
       
   208 	SetClientPermissionL(aItem, aIapId, aObserver, ETrue);
       
   209 	}
       
   210 
       
   211 // -----------------------------------------------------------------------------
       
   212 // CSIPProfileStateWaitForPermission::ClientDisallowsMigrationL
       
   213 // -----------------------------------------------------------------------------
       
   214 //
       
   215 void CSIPProfileStateWaitForPermission::ClientDisallowsMigrationL(
       
   216 	CSIPProfileCacheItem& aItem,
       
   217 	TUint32 aIapId,
       
   218 	const MSIPExtendedConcreteProfileObserver& aObserver)
       
   219 	{
       
   220 	PROFILE_DEBUG4(
       
   221 		"ProfileStateWaitForPermission::ClientDisallowsMigrationL id,iap",
       
   222 		aItem.ProfileId(),
       
   223 		aIapId)
       
   224 
       
   225 	SetClientPermissionL(aItem, aIapId, aObserver, EFalse);
       
   226 	}
       
   227 
       
   228 // -----------------------------------------------------------------------------
       
   229 // CSIPProfileStateWaitForPermission::MigrationIsAllowedL
       
   230 // -----------------------------------------------------------------------------
       
   231 //
       
   232 void CSIPProfileStateWaitForPermission::MigrationIsAllowedL(
       
   233 	CSIPProfileCacheItem& aItem,
       
   234 	TUint32 aIapId)
       
   235 	{
       
   236 	PROFILE_DEBUG4("ProfileStateWaitForPermission::MigrationIsAllowedL: id,iap",
       
   237 				   aItem.ProfileId(),
       
   238 				   aIapId)
       
   239 	// Handle only one update or migration to IAP event at a time.
       
   240 	__ASSERT_ALWAYS(!aItem.HasProfileUpdate(), User::Leave(KErrAlreadyExists));
       
   241 	TUint32 snapId(0);
       
   242 	__ASSERT_ALWAYS(aItem.IsSNAPConfigured(snapId), User::Leave(KErrNotFound));
       
   243 
       
   244 	if (IsInitialRegisterDone(aItem))
       
   245 		{
       
   246 		iPluginDirector.RegisterL(aItem.CloneProfileL(aIapId));
       
   247 		aItem.ChangeStateL(iMigratingToNewIAP);
       
   248 		aItem.PassMigrationStartedToClientL(snapId, aIapId);
       
   249 		}
       
   250 	else
       
   251 		{
       
   252 		// Don't pass MigrationStarted to clients.
       
   253 		TRAPD(err, RegisterWithIapL(aItem, aIapId, *iRegInProg));
       
   254 		if (err != KErrNone)
       
   255 			{
       
   256 			aItem.HandleProfileError(err, aItem.Profile());
       
   257 			}
       
   258 		User::Leave(err);
       
   259 		}
       
   260 	}
       
   261 
       
   262 // -----------------------------------------------------------------------------
       
   263 // CSIPProfileStateWaitForPermission::MigrationIsDisallowedL
       
   264 // -----------------------------------------------------------------------------
       
   265 //
       
   266 void CSIPProfileStateWaitForPermission::MigrationIsDisallowedL(
       
   267 	CSIPProfileCacheItem& aItem,
       
   268 	TUint32 aIapId)
       
   269 	{
       
   270 	PROFILE_DEBUG4(
       
   271 		"ProfileStateWaitForPermission::MigrationIsDisAllowedL: id,iap",
       
   272 		aItem.ProfileId(),
       
   273 		aIapId)
       
   274 	// Migration never happens in this state
       
   275 	__ASSERT_ALWAYS(!aItem.IAPMigrationInProgress(), User::Leave(KErrGeneral));
       
   276 
       
   277 	if (IsInitialRegisterDone(aItem))
       
   278 		{
       
   279 		// The existing profile remains registered.		
       
   280 		aItem.ChangeStateL(iRegistered);
       
   281 		User::LeaveIfError(
       
   282 		    aItem.PassAlrErrorToClient(KErrAccessDenied, aIapId));
       
   283 		}
       
   284 	else
       
   285 		{
       
   286 		// Wait for another IAP to become available
       
   287 		aItem.ChangeStateL(iWaitForIAP);
       
   288 		}
       
   289 	}
       
   290 
       
   291 // -----------------------------------------------------------------------------
       
   292 // CSIPProfileStateWaitForPermission::IsAlrState
       
   293 // -----------------------------------------------------------------------------
       
   294 //
       
   295 TBool CSIPProfileStateWaitForPermission::IsAlrState() const
       
   296 	{
       
   297 	return ETrue;
       
   298 	}
       
   299 
       
   300 // -----------------------------------------------------------------------------
       
   301 // CSIPProfileStateWaitForPermission::ShutdownInitiated
       
   302 // -----------------------------------------------------------------------------
       
   303 //
       
   304 void CSIPProfileStateWaitForPermission::ShutdownInitiated(
       
   305 	CSIPProfileCacheItem& aItem)
       
   306 	{
       
   307 	if (IsInitialRegisterDone(aItem))
       
   308 		{
       
   309 		TRAP_IGNORE(StartDeregisterL(aItem, *iUnregInProg))
       
   310 		}
       
   311 	}
       
   312 
       
   313 // -----------------------------------------------------------------------------
       
   314 // CSIPProfileStateWaitForPermission::SetClientPermissionL
       
   315 // Profile update can't exist now.
       
   316 // -----------------------------------------------------------------------------
       
   317 //
       
   318 void CSIPProfileStateWaitForPermission::SetClientPermissionL(
       
   319 	CSIPProfileCacheItem& aItem,
       
   320 	TUint32 aIapId,
       
   321 	const MSIPExtendedConcreteProfileObserver& aObserver,
       
   322 	TBool aAllowMigration) const
       
   323 	{
       
   324 	TUint32 snapId(0);
       
   325 	__ASSERT_ALWAYS(aItem.IsSNAPConfigured(snapId), User::Leave(KErrNotFound));
       
   326 	__ASSERT_ALWAYS(!aItem.HasProfileUpdate(), User::Leave(KErrAlreadyExists));
       
   327 
       
   328 	aItem.SetClientPermission(aIapId, &aObserver, aAllowMigration);
       
   329 	}