diff -r b6139031a239 -r 928ed51ddc43 datacommsserver/esockserver/MobilityCoreProviders/src/mobilitymcpractivities.cpp --- a/datacommsserver/esockserver/MobilityCoreProviders/src/mobilitymcpractivities.cpp Fri Jan 22 10:58:59 2010 +0200 +++ b/datacommsserver/esockserver/MobilityCoreProviders/src/mobilitymcpractivities.cpp Tue Jan 26 13:09:14 2010 +0200 @@ -100,7 +100,7 @@ //first checks (TNoTagOrAwaitMobilityBlockedByErrorRecovery) if the availability has changed since it last checked //(availability could have been reported amidst the previous handshake loop) THROUGH_NODEACTIVITY_ENTRY(MobilityMCprStates::KStartMobilityHandshake, CMobilityActivity::TClearHandshakingFlag, CMobilityActivity::TNoTagOrAwaitMobilityBlockedByErrorRecovery) - NODEACTIVITY_ENTRY(MobilityMCprStates::KAwaitMobility, MeshMachine::TDoNothing, CMobilityActivity::TAwaitingCurrentCarrierRejectedOrAvailabilityChange, CMobilityActivity::TNoTagOrAwaitMobilityBackwardsOnMobilityTriggerBlockedByErrorRecovery) + NODEACTIVITY_ENTRY(MobilityMCprStates::KAwaitMobility, MeshMachine::TDoNothing, CMobilityActivity::TAwaitingCurrentCarrierRejectedOrAvailabilityChange, CMobilityActivity::TNoTagOrAwaitMobilityBackwardsOnMobilityTriggerBlockedByErrorRecovery) //Mobility has been triggered ((a) or (b)). Start mobility handshake (set handshaking flag and inform the client about the preferred bearer) NODEACTIVITY_ENTRY(KNoTag, CMobilityActivity::TInformMigrationAvailableAndSetHandshakingFlag, MobilityMCprStates::TAwaitingMigrationRequestedOrRejected, CMobilityActivity::TNoTagOrStartMobilityHandshakeBackwards) @@ -112,7 +112,8 @@ NODEACTIVITY_ENTRY(KNoTag, CMobilityActivity::TRequestReConnect, MCprStates::TAwaitingReConnectCompleteOrError, CMobilityActivity::TNoTagOrStartMobilityHandshakeBackwards) //Rebinding has been successful. As far as MCPR is concerned, the mobility is finished, but the MCPR must await //for the handshake (accept|reject) before it can offer another bearer. - NODEACTIVITY_ENTRY(KNoTag, CMobilityActivity::TInformMigrationCompleted, MobilityMCprStates::TAwaitingMigrationAcceptedOrRejected, MeshMachine::TTag) + NODEACTIVITY_ENTRY(KNoTag, CMobilityActivity::TInformMigrationCompleted, MobilityMCprStates::TAwaitingMigrationAcceptedOrRejected, CMobilityActivity::TRejectedOrStartMobilityHandshakeBackwards) + NODEACTIVITY_ENTRY(MobilityMCprStates::KRejected, CoreNetStates::TStopDataClients, CoreNetStates::TAwaitingDataClientsStopped, MeshMachine::TTag) NODEACTIVITY_END() } @@ -311,6 +312,53 @@ return MobilityMCprStates::KAwaitMobility; } + +DEFINE_SMELEMENT(CMobilityActivity::TRejectedOrStartMobilityHandshakeBackwards, NetStateMachine::MStateFork, MobilityMCprStates::TContext) +TInt CMobilityActivity::TRejectedOrStartMobilityHandshakeBackwards::TransitionTag() + { + __ASSERT_DEBUG(iContext.iNodeActivity, User::Panic(KCoreMobileMCprPanic, KPanicNoActivity)); + CMobilityActivity& activity = static_cast(*iContext.iNodeActivity); + + // if rejected last ap and there's no more + if (iContext.iMessage.IsMessage()) + { + TBool otherSP = EFalse; + + // Find if there anymore available non rejected service providers + TClientIter iter = iContext.Node().GetClientIter(TClientType(TCFClientType::EServProvider)); + __ASSERT_DEBUG(iter[0], User::Panic(KCoreMobileMCprPanic, KPanicNoServiceProvider)); //A Service Provider must exist! + RMetaServiceProviderInterface* rejected = static_cast(iContext.Node().ServiceProvider()); + RMetaServiceProviderInterface* candidate = NULL; + + while ((candidate = static_cast(iter++)) != NULL) + { + if (candidate == rejected) + { + continue; + } + + const TAvailabilityStatus& status = candidate->AvailabilityStatus(); + if (!status.IsKnown()) + { + continue; + } + + if (status.Score() > activity.iAvailabilityScoreTreshold) + { + otherSP=ETrue; + break; + } + } + + if (!otherSP) + { + return MobilityMCprStates::KRejected; + } + } + + return MobilityMCprStates::KStartMobilityHandshake | NetStateMachine::EBackward; + } + DEFINE_SMELEMENT(CMobilityActivity::TSendAvailabilityRequest, NetStateMachine::MStateTransition, CMobilityActivity::TContext) void CMobilityActivity::TSendAvailabilityRequest::DoL() {