mmsharing/mmshavailability/src/musavaoptionhandler.cpp
branchRCL_3
changeset 33 bc78a40cd63c
parent 32 73a1feb507fb
equal deleted inserted replaced
32:73a1feb507fb 33:bc78a40cd63c
    31 #include "musavacapability.h"
    31 #include "musavacapability.h"
    32 #include "musavacapabilityquerybase.h"
    32 #include "musavacapabilityquerybase.h"
    33 #include "musavaterminal.h"
    33 #include "musavaterminal.h"
    34 #include "mussettingskeys.h"
    34 #include "mussettingskeys.h"
    35 #include "mussettings.h"
    35 #include "mussettings.h"
    36 #include "mussesseioninformationapi.h"
       
    37 
    36 
    38 
    37 
    39 _LIT( KMusSipPrefix, "sip:" );
    38 _LIT( KMusSipPrefix, "sip:" );
    40 _LIT( KMusTelPrefix, "tel:" );
    39 _LIT( KMusTelPrefix, "tel:" );
    41 _LIT( KMusPlusSign, "+" );
    40 _LIT( KMusPlusSign, "+" );
   140                             KMusOptionsHandlerIndex );
   139                             KMusOptionsHandlerIndex );
   141     iSharedObj->MusAvaSip().AddAdapterL(
   140     iSharedObj->MusAvaSip().AddAdapterL(
   142                             ( MMusAvaSipAdapter& ) *iSipAgent, 
   141                             ( MMusAvaSipAdapter& ) *iSipAgent, 
   143                             KMusOptionsHandlerIndex ); 
   142                             KMusOptionsHandlerIndex ); 
   144     
   143     
   145     MUS_LOG( "mus: [MUSAVA]     Check fast mode capability" )
       
   146     
       
   147     TRAPD( err,
       
   148     iFastModeCapable = 
       
   149         MultimediaSharingSettings::FastStartupModeL() == MusSettingsKeys::EFastModeOn  && 
       
   150         MultimediaSharingSettings::VideoDirectionL() == MusSettingsKeys::ETwoWayVideo &&
       
   151         MultimediaSharingSettings::CapabilityQuerySettingL() == MusSettingsKeys::EParallel );
       
   152     if ( err == KErrNoMemory )
       
   153         {
       
   154         User::Leave( err );
       
   155         }
       
   156     
       
   157     MUS_LOG2( "mus: [MUSAVA]     Fast mode check, err:%d, capable:%d", 
       
   158               err, iFastModeCapable )
       
   159     
       
   160     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::ConstructL()" )
   144     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::ConstructL()" )
   161     }
   145     }
   162 
   146 
   163 
   147 
   164 // -----------------------------------------------------------------------------
   148 // -----------------------------------------------------------------------------
   165 // 
   149 // 
   166 // -----------------------------------------------------------------------------
   150 // -----------------------------------------------------------------------------
   167 //
   151 //
   168 TBool CMusAvaOptionHandler::CapabilityQueryAnswered( TBool aAnswered )
   152 TBool CMusAvaOptionHandler::CapabilityQueryAnswered( TBool aAnswered )
   169     {
   153     {
   170     MUS_LOG1( "mus: [MUSAVA]  <-> CMusAvaOptionHandler::CapabilityQueryAnswered():%d", 
       
   171               aAnswered )
       
   172     
       
   173     iCapabilityQueryAnswered = aAnswered ? aAnswered : iCapabilityQueryAnswered;
   154     iCapabilityQueryAnswered = aAnswered ? aAnswered : iCapabilityQueryAnswered;
   174     
       
   175     HandleFastModeQueryAnswered();
       
   176     
   155     
   177     return iCapabilityQueryAnswered;
   156     return iCapabilityQueryAnswered;
   178         
   157         
   179     }
   158     }
   180 
   159 
   250         }
   229         }
   251         
   230         
   252     if ( variantSetting == MusSettingsKeys::EOperatorSpecific 
   231     if ( variantSetting == MusSettingsKeys::EOperatorSpecific 
   253         && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered )
   232         && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered )
   254         { // terminated party 
   233         { // terminated party 
   255         DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   234         SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   256         }
   235         }
   257     else if ( MusSettingsKeys::ESequential ==  
   236     else if ( MusSettingsKeys::ESequential ==  
   258      	        MultimediaSharingSettings::CapabilityQuerySettingL()
   237      	        MultimediaSharingSettings::CapabilityQuerySettingL()
   259         && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered )
   238         && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered )
   260         { // terminated party 
   239         { // terminated party 
   261         DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   240         SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   262         }
   241         }
   263     else
   242     else
   264         {
   243         {
   265         if ( MusSettingsKeys::EOperatorSpecific == variantSetting ||
   244         if ( MusSettingsKeys::EOperatorSpecific == variantSetting ||
   266              MusSettingsKeys::EParallel ==  
   245              MusSettingsKeys::EParallel ==  
   287     	    	        EscapeUtils::ConvertFromUnicodeToUtf8L( sipAddress );
   266     	    	        EscapeUtils::ConvertFromUnicodeToUtf8L( sipAddress );
   288                     CleanupStack::PushL( sipAddress8 );
   267                     CleanupStack::PushL( sipAddress8 );
   289                     if ( iCapabilityExchange->
   268                     if ( iCapabilityExchange->
   290                         TerminalL( sipAddress8->Des() ).QueryExecuting() )
   269                         TerminalL( sipAddress8->Des() ).QueryExecuting() )
   291                         {
   270                         {
   292                         DoSetState( MMusAvaObserver::EMusAvaStatusOptionsSent );
   271                         SetState( MMusAvaObserver::EMusAvaStatusOptionsSent );
   293                         }
   272                         }
   294     		    	else
   273     		    	else
   295     		    	    {
   274     		    	    {
   296     		    	    DoSetState( MMusAvaObserver::EMusAvaStatusAvailable );	
   275     		    	    SetState( MMusAvaObserver::EMusAvaStatusAvailable );	
   297     		            }
   276     		            }
   298     		        CleanupStack::PopAndDestroy( sipAddress8 );
   277     		        CleanupStack::PopAndDestroy( sipAddress8 );
   299     		    	}
   278     		    	}
   300                 // when profile is in when needed mode and registration still on
   279                 // when profile is in when needed mode and registration still on
   301                 // going we get this error and wait untill registration is successful
   280                 // going we get this error and wait untill registration is successful
   302                 // since we did not send any options set the state EMusAvaStatusNotExecuted.
   281                 // since we did not send any options set the state EMusAvaStatusNotExecuted.
   303                 else if( err == KErrSIPInvalidRegistrationState )
   282                 else if( err == KErrSIPInvalidRegistrationState )
   304                     {
   283                     {
   305                     DoSetState( MMusAvaObserver::EMusAvaStatusNotExecuted );
   284                     SetState( MMusAvaObserver::EMusAvaStatusNotExecuted );
   306                     }
   285                     }
   307                 // anything other than this should be considered default , means options sent
   286                 // anything other than this should be considered default , means options sent
   308                 // and was not successful.
   287                 // and was not successful.
   309     		    else
   288     		    else
   310     		        {
   289     		        {
   311     		        DoSetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
   290     		        SetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
   312     		        }
   291     		        }
   313     	        }
   292     	        }
   314     	    else
   293     	    else
   315     	    	{
   294     	    	{
   316     	    	DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );	
   295     	    	SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );	
   317     	    	}
   296     	    	}
   318         	}
   297         	}
   319         else
   298         else
   320         	{
   299         	{
   321         	// option sending not needed 
   300         	// option sending not needed 
   322         	DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   301         	SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   323         	}  
   302         	}  
   324         }
   303         }
   325     
   304     
   326     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::DoExecuteL()" )
   305     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::DoExecuteL()" )
   327     }
   306     }
   346 MMusAvaObserver::TAvailabilityName CMusAvaOptionHandler::Name()
   325 MMusAvaObserver::TAvailabilityName CMusAvaOptionHandler::Name()
   347     {
   326     {
   348     return MMusAvaObserver::EMusAvaOptionHandler;
   327     return MMusAvaObserver::EMusAvaOptionHandler;
   349     }
   328     }
   350 
   329 
   351 // -----------------------------------------------------------------------------
       
   352 //
       
   353 // -----------------------------------------------------------------------------
       
   354 //
       
   355 void CMusAvaOptionHandler::PrepareForReceivedInviteL()
       
   356     {
       
   357     MUS_LOG( "mus: [MUSAVA]  -> CMusAvaOptionHandler::PrepareForReceivedInviteL()" )
       
   358     
       
   359     if ( iFastModeAvailabilityDelayed )
       
   360         {
       
   361         MUS_LOG( "mus: [MUSAVA]     Set delayed availability" )
       
   362         SetState( MMusAvaObserver::EMusAvaStatusAvailable );
       
   363         iFastModeAvailabilityDelayed = EFalse;
       
   364         }
       
   365     
       
   366     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::PrepareForReceivedInviteL()" )
       
   367     }
       
   368 
   330 
   369 // -----------------------------------------------------------------------------
   331 // -----------------------------------------------------------------------------
   370 // 
   332 // 
   371 // -----------------------------------------------------------------------------
   333 // -----------------------------------------------------------------------------
   372 //
   334 //
   377         "mus: [MUSAVA]  -> CMusAvaOptionHandler::CapabilitiesResolved()" )
   339         "mus: [MUSAVA]  -> CMusAvaOptionHandler::CapabilitiesResolved()" )
   378     if ( aSentQuery.Result() == KCapabilityCapabilitesReady )
   340     if ( aSentQuery.Result() == KCapabilityCapabilitesReady )
   379         {
   341         {
   380         // tell the upper layer that
   342         // tell the upper layer that
   381         // query was succesfull. VS is available
   343         // query was succesfull. VS is available
   382         DoSetState( MMusAvaObserver::EMusAvaStatusAvailable );
   344         //record the number
       
   345         iSettings.SetOptionSentNumber( iSettings.TelNumber() );
       
   346         SetState( MMusAvaObserver::EMusAvaStatusAvailable );
   383         }
   347         }
   384     else if ( aSentQuery.Result() == KCapabilityCapabilitiesForbidden )
   348     else if ( aSentQuery.Result() == KCapabilityCapabilitiesForbidden )
   385         {
   349         {
   386         // query returned with response "403 Forbidden". VS is NOT available
   350         // query returned with response "403 Forbidden". VS is NOT available
   387         DoSetState( MMusAvaObserver::EMusAvaFailureCode );
   351         SetState( MMusAvaObserver::EMusAvaFailureCode );
   388         }
   352         }
   389     else
   353     else
   390         {
   354         {
   391         //query failed. VS is NOT available
   355         //query failed. VS is NOT available
   392         DoSetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
   356         SetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
   393         }
   357         }
   394 
   358 
   395     MUS_LOG(
   359     MUS_LOG(
   396         "mus: [MUSAVA]  <- CMusAvaOptionHandler::CapabilitiesResolved()" )
   360         "mus: [MUSAVA]  <- CMusAvaOptionHandler::CapabilitiesResolved()" )
   397     }
   361     }
   434     {
   398     {
   435     MUS_LOG(
   399     MUS_LOG(
   436         "mus: [MUSAVA]  -> CMusAvaOptionHandler::\
   400         "mus: [MUSAVA]  -> CMusAvaOptionHandler::\
   437         SetCapabilitiesResolvedForCingular()" )
   401         SetCapabilitiesResolvedForCingular()" )
   438     iCapabilitiesRequestAnswered = ETrue;
   402     iCapabilitiesRequestAnswered = ETrue;
   439     
       
   440     TRAPD( error, DoExecuteL() );
   403     TRAPD( error, DoExecuteL() );
   441     if ( error )
   404     if ( error )
   442         {
   405         {
   443         MUS_LOG1( "mus: [MUSAVA]  <- CMusAvaOptionHandler::\
   406         MUS_LOG1( "mus: [MUSAVA]  <- CMusAvaOptionHandler::\
   444         SetCapabilitiesResolvedForCingular() leave code = %d", error )
   407         SetCapabilitiesResolvedForCingular() leave code = %d", error )
   569 //
   532 //
   570 void CMusAvaOptionHandler::VideoCodecsResolvedL( const MDesCArray& aVideoCodecs )
   533 void CMusAvaOptionHandler::VideoCodecsResolvedL( const MDesCArray& aVideoCodecs )
   571     {
   534     {
   572     MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::VideoCodecsResolvedL()" )
   535     MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::VideoCodecsResolvedL()" )
   573     
   536     
   574     iSettings.SetVideoCodecsL( aVideoCodecs );
   537     iSettings.SetVideoCodecsL(aVideoCodecs);
   575     
   538     
   576     MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::VideoCodecsResolvedL()" )
   539     MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::VideoCodecsResolvedL()" )
   577     }
   540     }
   578 
   541 
   579 
       
   580 // -----------------------------------------------------------------------------
       
   581 // If MO side fast mode negotiation has failed, cannot change the value anymore
       
   582 // as it is very likely that automatic invitation fails as well.
       
   583 // -----------------------------------------------------------------------------
       
   584 //
       
   585 void CMusAvaOptionHandler::FastModeResolved( MusSettingsKeys::TFastMode aMode )
       
   586     {
       
   587     MUS_LOG1("mus: [MUSAVA]  -> CMusAvaOptionHandler::FastModeResolved():%d", 
       
   588         aMode )
       
   589     
       
   590     if ( FastModeNegotiationFailedMO() )
       
   591         {
       
   592         MUS_LOG("mus: [MUSAVA]  Ignore setting as failed already" )
       
   593         }
       
   594     else
       
   595         {
       
   596         iSettings.SetFastMode( aMode );
       
   597         }
       
   598     
       
   599     MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::FastModeResolved()" )
       
   600     }
       
   601 
       
   602 // -----------------------------------------------------------------------------
       
   603 // 
       
   604 // -----------------------------------------------------------------------------
       
   605 //
       
   606 TInt CMusAvaOptionHandler::DoSetState( MMusAvaObserver::TAvailabilityStatus aNewState )
       
   607     {
       
   608     MUS_LOG1( "mus: [MUSAVA]  -> CMusAvaOptionHandler::DoSetState() state:%d", 
       
   609               aNewState )
       
   610     TInt err( KErrNone );
       
   611     
       
   612     if ( iFastModeCapable )
       
   613         {
       
   614         TRAP( err, aNewState = HandleFastModeL( aNewState  ) );
       
   615         }
       
   616     
       
   617     SetState( aNewState );
       
   618     
       
   619     MUS_LOG1("mus: [MUSAVA]  <- CMusAvaOptionHandler::DoSetState(), err:%d", err )
       
   620     
       
   621     return err;
       
   622     }
       
   623 
       
   624 // -----------------------------------------------------------------------------
       
   625 //
       
   626 // -----------------------------------------------------------------------------
       
   627 //
       
   628 MMusAvaObserver::TAvailabilityStatus CMusAvaOptionHandler::HandleFastModeL(
       
   629     MMusAvaObserver::TAvailabilityStatus aNewState )
       
   630     {
       
   631     MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::HandleFastModeL()" )
       
   632     
       
   633     switch ( aNewState )
       
   634         {
       
   635         case MMusAvaObserver::EMusAvaOptionNotAvailable:
       
   636             {
       
   637             aNewState = HandleFastModeOptionNotAvailableL( aNewState );
       
   638             break;
       
   639             }
       
   640         case MMusAvaObserver::EMusAvaStatusOptionsNotSent:
       
   641             {
       
   642             aNewState = HandleFastModeOptionsNotSentL( aNewState );
       
   643             break;
       
   644             }
       
   645         case MMusAvaObserver::EMusAvaStatusAvailable:
       
   646             {
       
   647             aNewState = HandleFastModeAvailableL( aNewState );
       
   648             break;
       
   649             }
       
   650         default:
       
   651             {
       
   652             break;
       
   653             }
       
   654         }
       
   655     
       
   656     MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::HandleFastModeL()" )
       
   657     
       
   658     return aNewState;
       
   659     }
       
   660 
       
   661 // -----------------------------------------------------------------------------
       
   662 // If fast mode and call originator, application is started
       
   663 // automatically at background with two-way MO use case. If fast mode is
       
   664 // negotiated, availability publishing is delayed at MT side until invitation
       
   665 // is received (as MO will send invite automatically).
       
   666 // -----------------------------------------------------------------------------
       
   667 //
       
   668 MMusAvaObserver::TAvailabilityStatus CMusAvaOptionHandler::HandleFastModeAvailableL(
       
   669     MMusAvaObserver::TAvailabilityStatus aNewState )
       
   670     {
       
   671     MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::HandleFastModeAvailableL()" )
       
   672     
       
   673     __ASSERT_ALWAYS( iSettings.Observer(), User::Leave( KErrNotReady ) );
       
   674     
       
   675     if ( State() != MMusAvaObserver::EMusAvaStatusAvailable &&
       
   676          iSettings.FastMode() == MusSettingsKeys::EFastModeOn )
       
   677         {
       
   678         if ( iSettings.CallDirection() == NMusSessionInformationApi::ECallOrginated )
       
   679             {
       
   680             MUS_LOG("mus: [MUSAVA]      Starting application at background" )
       
   681             iSettings.Observer()->StartApplicationL( MultimediaSharing::EMusTwoWayVideo );
       
   682             }
       
   683         else
       
   684             {
       
   685             MUS_LOG("mus: [MUSAVA]      Delay availability publishing" )
       
   686             iFastModeAvailabilityDelayed = ETrue;
       
   687             aNewState = State();
       
   688             }
       
   689         }
       
   690     
       
   691     MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::HandleFastModeAvailableL()" )
       
   692     
       
   693     return aNewState;
       
   694     }
       
   695 
       
   696 // -----------------------------------------------------------------------------
       
   697 // If fast mode and call terminated side, answering to 200 ok is already enough
       
   698 // to set us available in delayed manner as other end can start sending
       
   699 // invitation already after getting fast mode information in answer. 
       
   700 // -----------------------------------------------------------------------------
       
   701 //
       
   702 void CMusAvaOptionHandler::HandleFastModeQueryAnswered()
       
   703     {
       
   704     if ( FastModeNegotiatedByAnswerMT() )
       
   705         {
       
   706         MUS_LOG( "mus: [MUSAVA]     Set fastmode available already as answered" )
       
   707         
       
   708         // Will result delayed availability handling
       
   709         DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
       
   710         }
       
   711     }
       
   712 
       
   713 // -----------------------------------------------------------------------------
       
   714 // If options wasn't sent because of missing information, state can be set to
       
   715 // available immediately as MT cannot start waiting for invite unless it is
       
   716 // sure that other end is about to send it.
       
   717 // -----------------------------------------------------------------------------
       
   718 //
       
   719 MMusAvaObserver::TAvailabilityStatus 
       
   720 CMusAvaOptionHandler::HandleFastModeOptionsNotSentL(
       
   721     MMusAvaObserver::TAvailabilityStatus aNewState )
       
   722     {
       
   723     MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::HandleFastModeOptionsNotSentL()" )
       
   724     
       
   725     if ( FastModeNegotiatedByAnswerMT() )
       
   726         {
       
   727         MUS_LOG("mus: [MUSAVA]      Answered already, set available" )
       
   728         // Make available but start waiting for invitation
       
   729         aNewState = HandleFastModeAvailableL( MMusAvaObserver::EMusAvaStatusAvailable );
       
   730         }
       
   731     
       
   732     MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::HandleFastModeOptionsNotSentL()" )
       
   733     
       
   734     return aNewState;
       
   735     }
       
   736 
       
   737 // -----------------------------------------------------------------------------
       
   738 //
       
   739 // -----------------------------------------------------------------------------
       
   740 //
       
   741 MMusAvaObserver::TAvailabilityStatus 
       
   742 CMusAvaOptionHandler::HandleFastModeOptionNotAvailableL(
       
   743     MMusAvaObserver::TAvailabilityStatus aNewState )
       
   744     {
       
   745     MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::HandleFastModeOptionNotAvailableL()" )
       
   746     
       
   747     if ( iFastModeAvailabilityDelayed || 
       
   748          State() == MMusAvaObserver::EMusAvaStatusAvailable )
       
   749         {
       
   750         MUS_LOG("mus: [MUSAVA]  In delayed mode or available, ignore" )
       
   751         aNewState = State();
       
   752         }
       
   753     
       
   754     MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::HandleFastModeOptionNotAvailableL()" )
       
   755     
       
   756     return aNewState;
       
   757     }
       
   758 
       
   759 // -----------------------------------------------------------------------------
       
   760 //
       
   761 // -----------------------------------------------------------------------------
       
   762 //
       
   763 TBool CMusAvaOptionHandler::FastModeNegotiatedByAnswerMT()
       
   764     {
       
   765     return ( iFastModeCapable && 
       
   766              iCapabilityQueryAnswered && 
       
   767              iSettings.FastMode() == MusSettingsKeys::EFastModeOn &&
       
   768              iSettings.CallDirection() == NMusSessionInformationApi::ECallTerminated );
       
   769     }
       
   770 
       
   771 // -----------------------------------------------------------------------------
       
   772 //
       
   773 // -----------------------------------------------------------------------------
       
   774 //
       
   775 TBool CMusAvaOptionHandler::FastModeNegotiationFailedMO()
       
   776     {
       
   777     return ( iFastModeCapable && 
       
   778              iSettings.FastMode() != MusSettingsKeys::EFastModeOn &&
       
   779              iSettings.CallDirection() == NMusSessionInformationApi::ECallOrginated &&
       
   780              State() != MMusAvaObserver::EMusAvaStatusAvailable && 
       
   781              State() != MMusAvaObserver::EMusAvaStatusOptionsSent );
       
   782     }
       
   783 
       
   784 // End of file