diff -r fc8c25e5a2e8 -r 7117cbf1600a voipplugins/sipconnectionprovider/src/scppresencehandler.cpp --- a/voipplugins/sipconnectionprovider/src/scppresencehandler.cpp Fri Feb 19 22:44:34 2010 +0200 +++ b/voipplugins/sipconnectionprovider/src/scppresencehandler.cpp Fri Mar 12 15:42:09 2010 +0200 @@ -207,6 +207,7 @@ if ( iReqIdArray.Count() ) { iDisableAfterXimpRequestsCompleted = ETrue; + StartForcedDisableTimer( CScpPresenceHandler::ForcePresenceServiceDisable ); } else { @@ -244,7 +245,13 @@ if ( EScpNetworkLost == aEvent ) { SCPLOGSTRING( "CScpPresenceHandler - EScpNetworkLost -> unbind" ); - TRAP_IGNORE( HandleDeregistrationL( EFalse ) ); + TRAPD( err, HandleDeregistrationL( EFalse ) ); + + if ( KErrNotReady == err ) + { + SCPLOGSTRING( "CScpPresenceHandler - EScpNetworkLost -> note ready: unbind" ); + TRAP_IGNORE( ServerUnBindL() ); + } } if ( EScpRoaming == aEvent ) @@ -298,6 +305,15 @@ { CancelDisableTimer(); } + + // If this flag is still true, it could be that presence server + // has not given answer -> ximp requests cannot be completed. + // But still have to unbind from ximp context + if ( iDisableAfterXimpRequestsCompleted ) + { + TRAP_IGNORE( ServerUnBindL() ); + } + // When SIP is deregistered, change presence state to no bind iPresenceState = ENoBind; } @@ -411,6 +427,7 @@ CancelDisableTimer(); + iReqIdArray.Reset(); iPresenceState = ENoBind; // Check if disable was not requested @@ -913,7 +930,7 @@ if ( iDisableAfterXimpRequestsCompleted && !iReqIdArray.Count() ) { iDisableAfterXimpRequestsCompleted = EFalse; - DisableSubService(); + DeregisterNow(); } SCPLOGSTRING( "CScpPresenceHandler::HandleRequestCompleteEvent OUT" );