diff -r ac5daea24fb0 -r 9f263f780e41 bearermanagement/S60MCPR/src/s60mcprstates.cpp --- a/bearermanagement/S60MCPR/src/s60mcprstates.cpp Wed Oct 27 17:43:56 2010 +0300 +++ b/bearermanagement/S60MCPR/src/s60mcprstates.cpp Wed Oct 27 17:51:11 2010 +0300 @@ -214,6 +214,19 @@ ASSERT( error != KErrNone ); + // Special handling for GoneDown errors. In this phase it is necessary + // to make sure that we are actually in GoneDown recovery, not in + // start recovery. So check activity instead of error code + if (iContext.iNodeActivity->ActivityId() == ECFActivityConnectionGoneDownRecovery) + { + // We are requesting error recovery from MPM for GoneDown error + // Set the flag indicating that lower layer is not in a valid state + // so that we can discard NoBearer request coming from data clients + // for the time being. + S60MCPRLOGSTRING1("S60MCPR<%x>::TProcessError::DoL() Setting GoneDown recovery flag",(TInt*)&iContext.Node()) + node.SetGoneDownRecoveryOngoing(); + } + // Create the callback that will eventually create the message that completes this state. CProcessErrorCb* cb = new( ELeave ) CProcessErrorCb( node, iContext.iNodeActivity ); // codescanner::leave CleanupStack::PushL( cb ); // codescanner::leave @@ -223,6 +236,20 @@ // After this we wait for cancellation/error/completion. } +// ----------------------------------------------------------------------------- +// THandleNoBearerDuringGoneDownRecovery::DoL +// ----------------------------------------------------------------------------- +// +DEFINE_SMELEMENT( THandleNoBearerDuringGoneDownRecovery, NetStateMachine::MStateTransition, TContext ) +void THandleNoBearerDuringGoneDownRecovery::DoL() // codescanner::leave + { + // As this is a single triple activity, there is no real activity + // instance available. Therefore, we need to live with the info + // available in the context. + S60MCPRLOGSTRING1("S60MCPR<%x>::THandleNoBearerDuringGoneDownRecovery::DoL() Return error",(TInt*)&iContext.Node()) + TEBase::TError errorMsg ( iContext.iMessage.MessageId(), KErrNotReady ); + iContext.PostToSender( errorMsg ); + } // ----------------------------------------------------------------------------- // TAwaitingSelectNextLayerCompletedOrError::Accept @@ -515,6 +542,28 @@ } // ----------------------------------------------------------------------------- +// TAwaitingNoBearerInGoneDownRecovery::Accept +// ----------------------------------------------------------------------------- +// +DEFINE_SMELEMENT( TAwaitingNoBearerInGoneDownRecovery, NetStateMachine::MState, TContext ) +TBool TAwaitingNoBearerInGoneDownRecovery::Accept() + { + if ( iContext.iMessage.IsMessage() ) + { + // Get MCPR to check gone down flag status + CS60MetaConnectionProvider& node = (CS60MetaConnectionProvider&)iContext.Node(); + if ( node.IsGoneDownRecoveryOngoing() ) + { + // We have received a NoBearer while recovering from a GoneDown error + // Needs special handling -> accept + S60MCPRLOGSTRING1("S60MCPR<%x>::TAwaitingNoBearerInGoneDownRecovery::Accept() return true", (TInt*)&iContext.Node()) + return ETrue; + } + } + return EFalse; + } + +// ----------------------------------------------------------------------------- // TRetrieveServiceId::DoL // ----------------------------------------------------------------------------- //