--- 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