mmsharing/mmshavailability/src/musavaoptionhandler.cpp
branchRCL_3
changeset 22 73a1feb507fb
parent 21 33a5d2bbf6fc
child 23 bc78a40cd63c
equal deleted inserted replaced
21:33a5d2bbf6fc 22:73a1feb507fb
    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"
    36 
    37 
    37 
    38 
    38 _LIT( KMusSipPrefix, "sip:" );
    39 _LIT( KMusSipPrefix, "sip:" );
    39 _LIT( KMusTelPrefix, "tel:" );
    40 _LIT( KMusTelPrefix, "tel:" );
    40 _LIT( KMusPlusSign, "+" );
    41 _LIT( KMusPlusSign, "+" );
   139                             KMusOptionsHandlerIndex );
   140                             KMusOptionsHandlerIndex );
   140     iSharedObj->MusAvaSip().AddAdapterL(
   141     iSharedObj->MusAvaSip().AddAdapterL(
   141                             ( MMusAvaSipAdapter& ) *iSipAgent, 
   142                             ( MMusAvaSipAdapter& ) *iSipAgent, 
   142                             KMusOptionsHandlerIndex ); 
   143                             KMusOptionsHandlerIndex ); 
   143     
   144     
       
   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     
   144     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::ConstructL()" )
   160     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::ConstructL()" )
   145     }
   161     }
   146 
   162 
   147 
   163 
   148 // -----------------------------------------------------------------------------
   164 // -----------------------------------------------------------------------------
   149 // 
   165 // 
   150 // -----------------------------------------------------------------------------
   166 // -----------------------------------------------------------------------------
   151 //
   167 //
   152 TBool CMusAvaOptionHandler::CapabilityQueryAnswered( TBool aAnswered )
   168 TBool CMusAvaOptionHandler::CapabilityQueryAnswered( TBool aAnswered )
   153     {
   169     {
       
   170     MUS_LOG1( "mus: [MUSAVA]  <-> CMusAvaOptionHandler::CapabilityQueryAnswered():%d", 
       
   171               aAnswered )
       
   172     
   154     iCapabilityQueryAnswered = aAnswered ? aAnswered : iCapabilityQueryAnswered;
   173     iCapabilityQueryAnswered = aAnswered ? aAnswered : iCapabilityQueryAnswered;
       
   174     
       
   175     HandleFastModeQueryAnswered();
   155     
   176     
   156     return iCapabilityQueryAnswered;
   177     return iCapabilityQueryAnswered;
   157         
   178         
   158     }
   179     }
   159 
   180 
   229         }
   250         }
   230         
   251         
   231     if ( variantSetting == MusSettingsKeys::EOperatorSpecific 
   252     if ( variantSetting == MusSettingsKeys::EOperatorSpecific 
   232         && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered )
   253         && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered )
   233         { // terminated party 
   254         { // terminated party 
   234         SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   255         DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   235         }
   256         }
   236     else if ( MusSettingsKeys::ESequential ==  
   257     else if ( MusSettingsKeys::ESequential ==  
   237      	        MultimediaSharingSettings::CapabilityQuerySettingL()
   258      	        MultimediaSharingSettings::CapabilityQuerySettingL()
   238         && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered )
   259         && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered )
   239         { // terminated party 
   260         { // terminated party 
   240         SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   261         DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   241         }
   262         }
   242     else
   263     else
   243         {
   264         {
   244         if ( MusSettingsKeys::EOperatorSpecific == variantSetting ||
   265         if ( MusSettingsKeys::EOperatorSpecific == variantSetting ||
   245              MusSettingsKeys::EParallel ==  
   266              MusSettingsKeys::EParallel ==  
   266     	    	        EscapeUtils::ConvertFromUnicodeToUtf8L( sipAddress );
   287     	    	        EscapeUtils::ConvertFromUnicodeToUtf8L( sipAddress );
   267                     CleanupStack::PushL( sipAddress8 );
   288                     CleanupStack::PushL( sipAddress8 );
   268                     if ( iCapabilityExchange->
   289                     if ( iCapabilityExchange->
   269                         TerminalL( sipAddress8->Des() ).QueryExecuting() )
   290                         TerminalL( sipAddress8->Des() ).QueryExecuting() )
   270                         {
   291                         {
   271                         SetState( MMusAvaObserver::EMusAvaStatusOptionsSent );
   292                         DoSetState( MMusAvaObserver::EMusAvaStatusOptionsSent );
   272                         }
   293                         }
   273     		    	else
   294     		    	else
   274     		    	    {
   295     		    	    {
   275     		    	    SetState( MMusAvaObserver::EMusAvaStatusAvailable );	
   296     		    	    DoSetState( MMusAvaObserver::EMusAvaStatusAvailable );	
   276     		            }
   297     		            }
   277     		        CleanupStack::PopAndDestroy( sipAddress8 );
   298     		        CleanupStack::PopAndDestroy( sipAddress8 );
   278     		    	}
   299     		    	}
   279                 // when profile is in when needed mode and registration still on
   300                 // when profile is in when needed mode and registration still on
   280                 // going we get this error and wait untill registration is successful
   301                 // going we get this error and wait untill registration is successful
   281                 // since we did not send any options set the state EMusAvaStatusNotExecuted.
   302                 // since we did not send any options set the state EMusAvaStatusNotExecuted.
   282                 else if( err == KErrSIPInvalidRegistrationState )
   303                 else if( err == KErrSIPInvalidRegistrationState )
   283                     {
   304                     {
   284                     SetState( MMusAvaObserver::EMusAvaStatusNotExecuted );
   305                     DoSetState( MMusAvaObserver::EMusAvaStatusNotExecuted );
   285                     }
   306                     }
   286                 // anything other than this should be considered default , means options sent
   307                 // anything other than this should be considered default , means options sent
   287                 // and was not successful.
   308                 // and was not successful.
   288     		    else
   309     		    else
   289     		        {
   310     		        {
   290     		        SetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
   311     		        DoSetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
   291     		        }
   312     		        }
   292     	        }
   313     	        }
   293     	    else
   314     	    else
   294     	    	{
   315     	    	{
   295     	    	SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );	
   316     	    	DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );	
   296     	    	}
   317     	    	}
   297         	}
   318         	}
   298         else
   319         else
   299         	{
   320         	{
   300         	// option sending not needed 
   321         	// option sending not needed 
   301         	SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   322         	DoSetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent );
   302         	}  
   323         	}  
   303         }
   324         }
   304     
   325     
   305     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::DoExecuteL()" )
   326     MUS_LOG( "mus: [MUSAVA]  <- CMusAvaOptionHandler::DoExecuteL()" )
   306     }
   327     }
   325 MMusAvaObserver::TAvailabilityName CMusAvaOptionHandler::Name()
   346 MMusAvaObserver::TAvailabilityName CMusAvaOptionHandler::Name()
   326     {
   347     {
   327     return MMusAvaObserver::EMusAvaOptionHandler;
   348     return MMusAvaObserver::EMusAvaOptionHandler;
   328     }
   349     }
   329 
   350 
       
   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     }
   330 
   368 
   331 // -----------------------------------------------------------------------------
   369 // -----------------------------------------------------------------------------
   332 // 
   370 // 
   333 // -----------------------------------------------------------------------------
   371 // -----------------------------------------------------------------------------
   334 //
   372 //
   339         "mus: [MUSAVA]  -> CMusAvaOptionHandler::CapabilitiesResolved()" )
   377         "mus: [MUSAVA]  -> CMusAvaOptionHandler::CapabilitiesResolved()" )
   340     if ( aSentQuery.Result() == KCapabilityCapabilitesReady )
   378     if ( aSentQuery.Result() == KCapabilityCapabilitesReady )
   341         {
   379         {
   342         // tell the upper layer that
   380         // tell the upper layer that
   343         // query was succesfull. VS is available
   381         // query was succesfull. VS is available
   344         //record the number
   382         DoSetState( MMusAvaObserver::EMusAvaStatusAvailable );
   345         iSettings.SetOptionSentNumber( iSettings.TelNumber() );
       
   346         SetState( MMusAvaObserver::EMusAvaStatusAvailable );
       
   347         }
   383         }
   348     else if ( aSentQuery.Result() == KCapabilityCapabilitiesForbidden )
   384     else if ( aSentQuery.Result() == KCapabilityCapabilitiesForbidden )
   349         {
   385         {
   350         // query returned with response "403 Forbidden". VS is NOT available
   386         // query returned with response "403 Forbidden". VS is NOT available
   351         SetState( MMusAvaObserver::EMusAvaFailureCode );
   387         DoSetState( MMusAvaObserver::EMusAvaFailureCode );
   352         }
   388         }
   353     else
   389     else
   354         {
   390         {
   355         //query failed. VS is NOT available
   391         //query failed. VS is NOT available
   356         SetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
   392         DoSetState( MMusAvaObserver::EMusAvaOptionNotAvailable );
   357         }
   393         }
   358 
   394 
   359     MUS_LOG(
   395     MUS_LOG(
   360         "mus: [MUSAVA]  <- CMusAvaOptionHandler::CapabilitiesResolved()" )
   396         "mus: [MUSAVA]  <- CMusAvaOptionHandler::CapabilitiesResolved()" )
   361     }
   397     }
   398     {
   434     {
   399     MUS_LOG(
   435     MUS_LOG(
   400         "mus: [MUSAVA]  -> CMusAvaOptionHandler::\
   436         "mus: [MUSAVA]  -> CMusAvaOptionHandler::\
   401         SetCapabilitiesResolvedForCingular()" )
   437         SetCapabilitiesResolvedForCingular()" )
   402     iCapabilitiesRequestAnswered = ETrue;
   438     iCapabilitiesRequestAnswered = ETrue;
       
   439     
   403     TRAPD( error, DoExecuteL() );
   440     TRAPD( error, DoExecuteL() );
   404     if ( error )
   441     if ( error )
   405         {
   442         {
   406         MUS_LOG1( "mus: [MUSAVA]  <- CMusAvaOptionHandler::\
   443         MUS_LOG1( "mus: [MUSAVA]  <- CMusAvaOptionHandler::\
   407         SetCapabilitiesResolvedForCingular() leave code = %d", error )
   444         SetCapabilitiesResolvedForCingular() leave code = %d", error )
   532 //
   569 //
   533 void CMusAvaOptionHandler::VideoCodecsResolvedL( const MDesCArray& aVideoCodecs )
   570 void CMusAvaOptionHandler::VideoCodecsResolvedL( const MDesCArray& aVideoCodecs )
   534     {
   571     {
   535     MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::VideoCodecsResolvedL()" )
   572     MUS_LOG("mus: [MUSAVA]  -> CMusAvaOptionHandler::VideoCodecsResolvedL()" )
   536     
   573     
   537     iSettings.SetVideoCodecsL(aVideoCodecs);
   574     iSettings.SetVideoCodecsL( aVideoCodecs );
   538     
   575     
   539     MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::VideoCodecsResolvedL()" )
   576     MUS_LOG("mus: [MUSAVA]  <- CMusAvaOptionHandler::VideoCodecsResolvedL()" )
   540     }
   577     }
   541 
   578 
       
   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