mmsharing/mmshavailability/src/musavaoptionhandler.cpp
branchRCL_3
changeset 22 73a1feb507fb
parent 21 33a5d2bbf6fc
child 23 bc78a40cd63c
--- a/mmsharing/mmshavailability/src/musavaoptionhandler.cpp	Thu Aug 19 09:51:39 2010 +0300
+++ b/mmsharing/mmshavailability/src/musavaoptionhandler.cpp	Tue Aug 31 15:12:07 2010 +0300
@@ -33,6 +33,7 @@
 #include "musavaterminal.h"
 #include "mussettingskeys.h"
 #include "mussettings.h"
+#include "mussesseioninformationapi.h"
 
 
 _LIT( KMusSipPrefix, "sip:" );
@@ -141,6 +142,21 @@
                             ( MMusAvaSipAdapter& ) *iSipAgent, 
                             KMusOptionsHandlerIndex ); 
     
+    MUS_LOG( "mus: [MUSAVA]     Check fast mode capability" )
+    
+    TRAPD( err,
+    iFastModeCapable = 
+        MultimediaSharingSettings::FastStartupModeL() == MusSettingsKeys::EFastModeOn  && 
+        MultimediaSharingSettings::VideoDirectionL() == MusSettingsKeys::ETwoWayVideo &&
+        MultimediaSharingSettings::CapabilityQuerySettingL() == MusSettingsKeys::EParallel );
+    if ( err == KErrNoMemory )
+        {
+        User::Leave( err );
+        }
+    
+    MUS_LOG2( "mus: [MUSAVA]     Fast mode check, err:%d, capable:%d", 
+              err, iFastModeCapable )
+    
     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::ConstructL()" )
     }
 
@@ -151,8 +167,13 @@
 //
 TBool CMusAvaOptionHandler::CapabilityQueryAnswered( TBool aAnswered )
     {
+    MUS_LOG1( "mus: [MUSAVA]  <-> CMusAvaOptionHandler::CapabilityQueryAnswered():%d", 
+              aAnswered )
+    
     iCapabilityQueryAnswered = aAnswered ? aAnswered : iCapabilityQueryAnswered;
     
+    HandleFastModeQueryAnswered();
+    
     return iCapabilityQueryAnswered;
         
     }
@@ -231,13 +252,13 @@
     if ( variantSetting == MusSettingsKeys::EOperatorSpecific 
         && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered )
         { // terminated party 
-        SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
+        DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
         }
     else if ( MusSettingsKeys::ESequential ==  
      	        MultimediaSharingSettings::CapabilityQuerySettingL()
         && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered )
         { // terminated party 
-        SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
+        DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
         }
     else
         {
@@ -268,11 +289,11 @@
                     if ( iCapabilityExchange->
                         TerminalL( sipAddress8->Des() ).QueryExecuting() )
                         {
-                        SetState( MMusAvaObserver::EMusAvaStatusOptionsSent );
+                        DoSetState( MMusAvaObserver::EMusAvaStatusOptionsSent );
                         }
     		    	else
     		    	    {
-    		    	    SetState( MMusAvaObserver::EMusAvaStatusAvailable );	
+    		    	    DoSetState( MMusAvaObserver::EMusAvaStatusAvailable );	
     		            }
     		        CleanupStack::PopAndDestroy( sipAddress8 );
     		    	}
@@ -281,24 +302,24 @@
                 // since we did not send any options set the state EMusAvaStatusNotExecuted.
                 else if( err == KErrSIPInvalidRegistrationState )
                     {
-                    SetState( MMusAvaObserver::EMusAvaStatusNotExecuted );
+                    DoSetState( MMusAvaObserver::EMusAvaStatusNotExecuted );
                     }
                 // anything other than this should be considered default , means options sent
                 // and was not successful.
     		    else
     		        {
-    		        SetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
+    		        DoSetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
     		        }
     	        }
     	    else
     	    	{
-    	    	SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );	
+    	    	DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );	
     	    	}
         	}
         else
         	{
         	// option sending not needed 
-        	SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
+        	DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
         	}  
         }
     
@@ -327,6 +348,23 @@
     return MMusAvaObserver::EMusAvaOptionHandler;
     }
 
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void CMusAvaOptionHandler::PrepareForReceivedInviteL()
+    {
+    MUS_LOG( "mus: [MUSAVA]  -> CMusAvaOptionHandler::PrepareForReceivedInviteL()" )
+    
+    if ( iFastModeAvailabilityDelayed )
+        {
+        MUS_LOG( "mus: [MUSAVA]     Set delayed availability" )
+        SetState( MMusAvaObserver::EMusAvaStatusAvailable );
+        iFastModeAvailabilityDelayed = EFalse;
+        }
+    
+    MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::PrepareForReceivedInviteL()" )
+    }
 
 // -----------------------------------------------------------------------------
 // 
@@ -341,19 +379,17 @@
         {
         // tell the upper layer that
         // query was succesfull. VS is available
-        //record the number
-        iSettings.SetOptionSentNumber( iSettings.TelNumber() );
-        SetState( MMusAvaObserver::EMusAvaStatusAvailable );
+        DoSetState( MMusAvaObserver::EMusAvaStatusAvailable );
         }
     else if ( aSentQuery.Result() == KCapabilityCapabilitiesForbidden )
         {
         // query returned with response "403 Forbidden". VS is NOT available
-        SetState( MMusAvaObserver::EMusAvaFailureCode );
+        DoSetState( MMusAvaObserver::EMusAvaFailureCode );
         }
     else
         {
         //query failed. VS is NOT available
-        SetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
+        DoSetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
         }
 
     MUS_LOG(
@@ -400,6 +436,7 @@
         "mus: [MUSAVA]  -> CMusAvaOptionHandler::\
         SetCapabilitiesResolvedForCingular()" )
     iCapabilitiesRequestAnswered = ETrue;
+    
     TRAPD( error, DoExecuteL() );
     if ( error )
         {
@@ -534,8 +571,214 @@
     {
     MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::VideoCodecsResolvedL()" )
     
-    iSettings.SetVideoCodecsL(aVideoCodecs);
+    iSettings.SetVideoCodecsL( aVideoCodecs );
     
     MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::VideoCodecsResolvedL()" )
     }
 
+
+// -----------------------------------------------------------------------------
+// If MO side fast mode negotiation has failed, cannot change the value anymore
+// as it is very likely that automatic invitation fails as well.
+// -----------------------------------------------------------------------------
+//
+void CMusAvaOptionHandler::FastModeResolved( MusSettingsKeys::TFastMode aMode )
+    {
+    MUS_LOG1("mus: [MUSAVA]  -> CMusAvaOptionHandler::FastModeResolved():%d", 
+        aMode )
+    
+    if ( FastModeNegotiationFailedMO() )
+        {
+        MUS_LOG("mus: [MUSAVA]  Ignore setting as failed already" )
+        }
+    else
+        {
+        iSettings.SetFastMode( aMode );
+        }
+    
+    MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::FastModeResolved()" )
+    }
+
+// -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+TInt CMusAvaOptionHandler::DoSetState( MMusAvaObserver::TAvailabilityStatus aNewState )
+    {
+    MUS_LOG1( "mus: [MUSAVA]  -> CMusAvaOptionHandler::DoSetState() state:%d", 
+              aNewState )
+    TInt err( KErrNone );
+    
+    if ( iFastModeCapable )
+        {
+        TRAP( err, aNewState = HandleFastModeL( aNewState  ) );
+        }
+    
+    SetState( aNewState );
+    
+    MUS_LOG1("mus: [MUSAVA]  <- CMusAvaOptionHandler::DoSetState(), err:%d", err )
+    
+    return err;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+MMusAvaObserver::TAvailabilityStatus CMusAvaOptionHandler::HandleFastModeL(
+    MMusAvaObserver::TAvailabilityStatus aNewState )
+    {
+    MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::HandleFastModeL()" )
+    
+    switch ( aNewState )
+        {
+        case MMusAvaObserver::EMusAvaOptionNotAvailable:
+            {
+            aNewState = HandleFastModeOptionNotAvailableL( aNewState );
+            break;
+            }
+        case MMusAvaObserver::EMusAvaStatusOptionsNotSent:
+            {
+            aNewState = HandleFastModeOptionsNotSentL( aNewState );
+            break;
+            }
+        case MMusAvaObserver::EMusAvaStatusAvailable:
+            {
+            aNewState = HandleFastModeAvailableL( aNewState );
+            break;
+            }
+        default:
+            {
+            break;
+            }
+        }
+    
+    MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::HandleFastModeL()" )
+    
+    return aNewState;
+    }
+
+// -----------------------------------------------------------------------------
+// If fast mode and call originator, application is started
+// automatically at background with two-way MO use case. If fast mode is
+// negotiated, availability publishing is delayed at MT side until invitation
+// is received (as MO will send invite automatically).
+// -----------------------------------------------------------------------------
+//
+MMusAvaObserver::TAvailabilityStatus CMusAvaOptionHandler::HandleFastModeAvailableL(
+    MMusAvaObserver::TAvailabilityStatus aNewState )
+    {
+    MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::HandleFastModeAvailableL()" )
+    
+    __ASSERT_ALWAYS( iSettings.Observer(), User::Leave( KErrNotReady ) );
+    
+    if ( State() != MMusAvaObserver::EMusAvaStatusAvailable &&
+         iSettings.FastMode() == MusSettingsKeys::EFastModeOn )
+        {
+        if ( iSettings.CallDirection() == NMusSessionInformationApi::ECallOrginated )
+            {
+            MUS_LOG("mus: [MUSAVA]      Starting application at background" )
+            iSettings.Observer()->StartApplicationL( MultimediaSharing::EMusTwoWayVideo );
+            }
+        else
+            {
+            MUS_LOG("mus: [MUSAVA]      Delay availability publishing" )
+            iFastModeAvailabilityDelayed = ETrue;
+            aNewState = State();
+            }
+        }
+    
+    MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::HandleFastModeAvailableL()" )
+    
+    return aNewState;
+    }
+
+// -----------------------------------------------------------------------------
+// If fast mode and call terminated side, answering to 200 ok is already enough
+// to set us available in delayed manner as other end can start sending
+// invitation already after getting fast mode information in answer. 
+// -----------------------------------------------------------------------------
+//
+void CMusAvaOptionHandler::HandleFastModeQueryAnswered()
+    {
+    if ( FastModeNegotiatedByAnswerMT() )
+        {
+        MUS_LOG( "mus: [MUSAVA]     Set fastmode available already as answered" )
+        
+        // Will result delayed availability handling
+        DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
+        }
+    }
+
+// -----------------------------------------------------------------------------
+// If options wasn't sent because of missing information, state can be set to
+// available immediately as MT cannot start waiting for invite unless it is
+// sure that other end is about to send it.
+// -----------------------------------------------------------------------------
+//
+MMusAvaObserver::TAvailabilityStatus 
+CMusAvaOptionHandler::HandleFastModeOptionsNotSentL(
+    MMusAvaObserver::TAvailabilityStatus aNewState )
+    {
+    MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::HandleFastModeOptionsNotSentL()" )
+    
+    if ( FastModeNegotiatedByAnswerMT() )
+        {
+        MUS_LOG("mus: [MUSAVA]      Answered already, set available" )
+        // Make available but start waiting for invitation
+        aNewState = HandleFastModeAvailableL( MMusAvaObserver::EMusAvaStatusAvailable );
+        }
+    
+    MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::HandleFastModeOptionsNotSentL()" )
+    
+    return aNewState;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+MMusAvaObserver::TAvailabilityStatus 
+CMusAvaOptionHandler::HandleFastModeOptionNotAvailableL(
+    MMusAvaObserver::TAvailabilityStatus aNewState )
+    {
+    MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::HandleFastModeOptionNotAvailableL()" )
+    
+    if ( iFastModeAvailabilityDelayed || 
+         State() == MMusAvaObserver::EMusAvaStatusAvailable )
+        {
+        MUS_LOG("mus: [MUSAVA]  In delayed mode or available, ignore" )
+        aNewState = State();
+        }
+    
+    MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::HandleFastModeOptionNotAvailableL()" )
+    
+    return aNewState;
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMusAvaOptionHandler::FastModeNegotiatedByAnswerMT()
+    {
+    return ( iFastModeCapable && 
+             iCapabilityQueryAnswered && 
+             iSettings.FastMode() == MusSettingsKeys::EFastModeOn &&
+             iSettings.CallDirection() == NMusSessionInformationApi::ECallTerminated );
+    }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+TBool CMusAvaOptionHandler::FastModeNegotiationFailedMO()
+    {
+    return ( iFastModeCapable && 
+             iSettings.FastMode() != MusSettingsKeys::EFastModeOn &&
+             iSettings.CallDirection() == NMusSessionInformationApi::ECallOrginated &&
+             State() != MMusAvaObserver::EMusAvaStatusAvailable && 
+             State() != MMusAvaObserver::EMusAvaStatusOptionsSent );
+    }
+
+// End of file