diff -r b31261fd4e04 -r ccd8e69b5392 mmsharing/mmshavailability/src/musavaoptionhandler.cpp --- a/mmsharing/mmshavailability/src/musavaoptionhandler.cpp Tue Feb 02 00:09:07 2010 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,539 +0,0 @@ -/* -* Copyright (c) 2005-2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". -* -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: -* -* Description: Provide interface for the client requestin availability class. -* -*/ - - -#include "musavaoptionhandler.h" - -#include -#include -#include "musunittesting.h" -#include "musavasharedobject.h" -#include "muslogger.h" -#include "musavasip.h" -#include "musavasettingsimp.h" -#include "musavacapabilitysipagent.h" -#include "musavacapabilityexchange.h" -#include "musavacapabilityquery.h" -#include "musavacapability.h" -#include "musavacapabilityquerybase.h" -#include "musavaterminal.h" -#include "mussettingskeys.h" -#include "mussettings.h" - - -_LIT( KMusSipPrefix, "sip:" ); -_LIT( KMusTelPrefix, "tel:" ); -_LIT( KMusPlusSign, "+" ); - -const TInt KMaxUriLength = 512; -const TInt KMusMinDigitCountInTelNumber = 7; - -const TInt KMusOptionsHandlerIndex = 1; - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -CMusAvaOptionHandler* CMusAvaOptionHandler::NewL( - MMusAvaAvailabilityObserver& aObserver, - CMusAvaSettingsImp& aSettings ) - { - MUS_LOG( "mus: [MUSAVA] <- CMusAvaOptionHandler::NewL()" ) - CMusAvaOptionHandler* self = CMusAvaOptionHandler::NewLC( - aObserver, - aSettings ); - CleanupStack::Pop( self ); - - MUS_LOG( "mus: [MUSAVA] <- CMusAvaOptionHandler::NewL()" ) - return self; - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -CMusAvaOptionHandler* CMusAvaOptionHandler::NewLC( - MMusAvaAvailabilityObserver& aObserver, - CMusAvaSettingsImp& aSettings ) - { - MUS_LOG( "mus: [MUSAVA] <- CMusAvaOptionHandler::NewLC()" ) - CMusAvaOptionHandler* self = new( ELeave ) CMusAvaOptionHandler( - aObserver, - aSettings ); - CleanupStack::PushL( self ); - self->ConstructL(); - - MUS_LOG( "mus: [MUSAVA] <- CMusAvaOptionHandler::NewLC()" ) - return self; - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -CMusAvaOptionHandler::~CMusAvaOptionHandler() - { - MUS_LOG( - "mus: [MUSAVA] -> CMusAvaOptionHandler::~CMusAvaOptionHandler()" ) - if (iSharedObj ) - { - iSharedObj->DeleteSingleton(); - } - delete iCapabilityExchange; - iCapabilityExchange = NULL; - delete iSipAgent; - iSipAgent = NULL; - - MUS_LOG( - "mus: [MUSAVA] <- CMusAvaOptionHandler::~CMusAvaOptionHandler()" ) - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -CMusAvaOptionHandler::CMusAvaOptionHandler( - MMusAvaAvailabilityObserver& aObserver, - CMusAvaSettingsImp& aSettings ) - :CMusAvaAvailability( aObserver ), - iSettings( aSettings ) - { - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CMusAvaOptionHandler::ConstructL() - { - MUS_LOG( "mus: [MUSAVA] -> CMusAvaOptionHandler::ConstructL()" ) - - //construct capability exchange - ConstructCapabilityExchangeL(); - - iSharedObj = CMusAvaSharedObject::GetSingletonL(); - iSipAgent = CMusAvaCapabilitySipAgent::NewL( *iCapabilityExchange, - *iSharedObj, - iObserver ); - iSharedObj->MusAvaSip().AddAdapterL( - ( MMusAvaSipConnectionAdapter& ) *iSipAgent, - KMusOptionsHandlerIndex ); - iSharedObj->MusAvaSip().AddAdapterL( - ( MMusAvaSipAdapter& ) *iSipAgent, - KMusOptionsHandlerIndex ); - - MUS_LOG( "mus: [MUSAVA] <- CMusAvaOptionHandler::ConstructL()" ) - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -TBool CMusAvaOptionHandler::CapabilityQueryAnswered( TBool aAnswered ) - { - iCapabilityQueryAnswered = aAnswered ? aAnswered : iCapabilityQueryAnswered; - - return iCapabilityQueryAnswered; - - } - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CMusAvaOptionHandler::ConstructCapabilityExchangeL() - { - MUS_LOG( - "mus: [MUSAVA] -> CMusAvaOptionHandler::ConstructCapabilityExchangeL()" ) - HBufC8* terminalId = ConstructTerminalIdL(); - CleanupStack::PushL( terminalId ); - - //create capability exchange - iCapabilityExchange = - CMusAvaCapabilityExchange::NewL( *terminalId, *this ); - - //create SWIS capability - CMusAvaCapability* capability = CMusAvaCapability::NewL( - *iCapabilityExchange ); - CleanupStack::PushL( capability ); - iCapabilityExchange->AddCapabilityL( capability ); - CleanupStack::Pop( capability ); - - iSwisCapability = capability; - - CleanupStack::PopAndDestroy( terminalId ); - MUS_LOG( - "mus: [MUSAVA] <- CMusAvaOptionHandler::ConstructCapabilityExchangeL()" ) - } - - -// ----------------------------------------------------------------------------- -// @TODO: Currently terminal id is not in use i.e User-Agent header is not -// sent in request nor response. -// ----------------------------------------------------------------------------- -// -HBufC8* CMusAvaOptionHandler::ConstructTerminalIdL() - { - return KNullDesC8().AllocL(); - } - - -// ----------------------------------------------------------------------------- -// Starts the loopy execution. -// ----------------------------------------------------------------------------- -// -void CMusAvaOptionHandler::DoExecuteL() - { - MUS_LOG( "mus: [MUSAVA] -> CMusAvaOptionHandler::DoExecuteL()" ) - - MusSettingsKeys::TOperatorVariant variantSetting = - MultimediaSharingSettings::OperatorVariantSettingL(); - - /* - Do not resent the OPTIONS request in the below scenario - i) Options Sent and waiting for Response. - ii) We already sent OPTIONS and got positive response.So we know that - other device is VS capable. - iii) We already sent OPTIONS and got negative response.So we know that - other device is VS incapable. - - Also OPTIONS should be sent only once if it matches to VS Call criteria. - */ - MUS_LOG1( "mus: [MUSAVA] - Current State %d",State() ) - - if ( State() == MMusAvaObserver::EMusAvaStatusOptionsSent || - State() == MMusAvaObserver::EMusAvaStatusAvailable || - State() == MMusAvaObserver::EMusAvaOptionNotAvailable ) - { - return; - } - - if ( variantSetting == MusSettingsKeys::EOperatorSpecific - && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered ) - { // terminated party - SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent ); - } - else if ( MusSettingsKeys::ESequential == - MultimediaSharingSettings::CapabilityQuerySettingL() - && iSettings.CallDirection() == 2 && !iCapabilitiesRequestAnswered ) - { // terminated party - SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent ); - } - else - { - if ( MusSettingsKeys::EOperatorSpecific == variantSetting || - MusSettingsKeys::EParallel == - MultimediaSharingSettings::CapabilityQuerySettingL() || - MusSettingsKeys::ESequential == - MultimediaSharingSettings::CapabilityQuerySettingL() ) - { - const MDesCArray& addresses = iSettings.SipAddresses(); - - TInt addressesCount = addresses.MdcaCount(); - MUS_LOG1( "mus: [MUSAVA] addresses.MdcaCount() %d", - addressesCount ) - if( addressesCount ) - { - const TDesC& sipAddress = addresses.MdcaPoint( 0 ); - MUS_LOG_TDESC( "mus: [MUSAVA] SIP Address: ", - sipAddress ) - TRAPD( err, iSipAgent->ExecuteCapabilityQueryL( - *iSwisCapability, sipAddress ) ); - // set status available and report to the observer - if ( err == KErrNone ) - { - HBufC8* sipAddress8 = - EscapeUtils::ConvertFromUnicodeToUtf8L( sipAddress ); - CleanupStack::PushL( sipAddress8 ); - if ( iCapabilityExchange-> - TerminalL( sipAddress8->Des() ).QueryExecuting() ) - { - SetState( MMusAvaObserver::EMusAvaStatusOptionsSent ); - } - else - { - SetState( MMusAvaObserver::EMusAvaStatusAvailable ); - } - CleanupStack::PopAndDestroy( sipAddress8 ); - } - // when profile is in when needed mode and registration still on - // going we get this error and wait untill registration is successful - // since we did not send any options set the state EMusAvaStatusNotExecuted. - else if( err == KErrSIPInvalidRegistrationState ) - { - SetState( MMusAvaObserver::EMusAvaStatusNotExecuted ); - } - // anything other than this should be considered default , means options sent - // and was not successful. - else - { - SetState( MMusAvaObserver::EMusAvaOptionNotAvailable ); - } - } - else - { - SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent ); - } - } - else - { - // option sending not needed - SetState( MMusAvaObserver::EMusAvaStatusOptionsNotSent ); - } - } - - MUS_LOG( "mus: [MUSAVA] <- CMusAvaOptionHandler::DoExecuteL()" ) - } - - -// ----------------------------------------------------------------------------- -// Stops executing availability. -// ----------------------------------------------------------------------------- -// -void CMusAvaOptionHandler::Stop() - { - MUS_LOG( "mus: [MUSAVA] -> CMusAvaOptionHandler::Stop()" ) - // TBD - MUS_LOG( "mus: [MUSAVA] <- CMusAvaOptionHandler::Stop()" ) - } - - -// ----------------------------------------------------------------------------- -// Returns name of *this* availability. -// ----------------------------------------------------------------------------- -// -MMusAvaObserver::TAvailabilityName CMusAvaOptionHandler::Name() - { - return MMusAvaObserver::EMusAvaOptionHandler; - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CMusAvaOptionHandler::CapabilitiesResolved( - const CMusAvaCapabilityQueryBase& aSentQuery ) - { - MUS_LOG( - "mus: [MUSAVA] -> CMusAvaOptionHandler::CapabilitiesResolved()" ) - if ( aSentQuery.Result() == KCapabilityCapabilitesReady ) - { - // tell the upper layer that - // query was succesfull. VS is available - SetState( MMusAvaObserver::EMusAvaStatusAvailable ); - } - else if ( aSentQuery.Result() == KCapabilityCapabilitiesForbidden ) - { - // query returned with response "403 Forbidden". VS is NOT available - SetState( MMusAvaObserver::EMusAvaFailureCode ); - } - else - { - //query failed. VS is NOT available - SetState( MMusAvaObserver::EMusAvaOptionNotAvailable ); - } - - MUS_LOG( - "mus: [MUSAVA] <- CMusAvaOptionHandler::CapabilitiesResolved()" ) - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CMusAvaOptionHandler::CapabilitiesResolvedL( const TDesC& aUri ) - { - MUS_LOG( - "mus: [MUSAVA] -> CMusAvaOptionHandler::CapabilitiesResolvedL()" ) - if ( aUri.Length() > 0 ) - { - // Set the sip address resolved from succesfull OPTIONS response - // Old adress(es) are destroyed - CDesCArrayFlat* sipAddresses = new( ELeave ) CDesCArrayFlat( 1 ); - CleanupStack::PushL( sipAddresses ); - - sipAddresses->AppendL( aUri ); - iSettings.SetSipAddressesL( *sipAddresses ); - - MUS_LOG_TDESC( "mus: [MUSAVA] SIP Address: ", aUri ) - - sipAddresses->Reset(); - CleanupStack::PopAndDestroy( sipAddresses ); - } - - MUS_LOG( - "mus: [MUSAVA] <- CMusAvaOptionHandler::CapabilitiesResolvedL()" ) - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CMusAvaOptionHandler::SetCapabilitiesResolvedForCingular() - { - MUS_LOG( - "mus: [MUSAVA] -> CMusAvaOptionHandler::\ - SetCapabilitiesResolvedForCingular()" ) - iCapabilitiesRequestAnswered = ETrue; - TRAPD( error, DoExecuteL() ); - if ( error ) - { - MUS_LOG1( "mus: [MUSAVA] <- CMusAvaOptionHandler::\ - SetCapabilitiesResolvedForCingular() leave code = %d", error ) - } - else - { - MUS_LOG( "mus: [MUSAVA] <- CMusAvaOptionHandler::\ - SetCapabilitiesResolvedForCingular()" ) - } - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -TBool CMusAvaOptionHandler::CapabilitiesResolvedForCingular() - { - MUS_LOG( - "mus: [MUSAVA] CMusAvaOptionHandler::CapabilitiesResolvedForCingular()" ) - return iCapabilitiesRequestAnswered; - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CMusAvaOptionHandler::SipHeadersL( - const MDesCArray& aHeaders, - SipStrConsts::TStrings aHeaderType) - { - MUS_LOG("mus: [MUSAVA] -> CMusAvaOptionHandler::SipHeadersL()" ) - - // if header type is to then store in iSettings , so then future - // request will be send there. - if(aHeaderType == SipStrConsts::EToHeader) - { - // All addresses received should be valid, so choose just one to avoid - // situation where user has to choose one from equal addresses. - // Prefer SIP URI, but accept also TEL URI. - - TBuf sipUri; - TBuf telUri; - - for ( TInt i = 0; i < aHeaders.MdcaCount(); ++i ) - { - if ( aHeaders.MdcaPoint( i ).FindF( KMusSipPrefix ) != - KErrNotFound ) - { - sipUri.Copy( aHeaders.MdcaPoint( i ) ); - } - else if ( aHeaders.MdcaPoint(i).FindF( KMusTelPrefix ) != - KErrNotFound ) - { - telUri.Copy( aHeaders.MdcaPoint( i ) ); - } - else - { - // NOP - } - } - - CDesCArray* addresses = new( ELeave ) CDesCArrayFlat( 1 ); - CleanupStack::PushL( addresses ); - - if ( telUri.Length() > 0 ) - { - telUri.Trim(); - addresses->AppendL( telUri ); - // Check if TEL URI conforms to phone number currently hold. - // If they do not match, we replace phone number with one parsed - // out of received from P-Asserted-Identity header. Since in this - // scenario we cannot be sure about validity of contact name either, - // we empty the contact name. This is only not to show incorrect - // information, but this solution does not show possibly existing - // contact name. - - // We compare last seven digits, since that is the minimum amount - // that can make up a valid telephone number. - // Variable telUri holds also prefix, but that does not affect the - // righthand comparison. - - MUS_LOG_TDESC( "mus: [MUSUI ] iSettings.TelNumber(): ", - iSettings.TelNumber() ) - MUS_LOG_TDESC( "mus: [MUSUI ] telUri: ", telUri ) - - TPtrC16 telUriWithoutPrefix = - telUri.Right( telUri.Length() - KMusTelPrefix().Length() ); - - TPtrC16 numberPartOfTelUri = - telUriWithoutPrefix.Find( KMusPlusSign ) == 0 ? - telUriWithoutPrefix.Right( telUriWithoutPrefix.Length() - 1 ) : - telUriWithoutPrefix; - - if ( !( iSettings.TelNumber().Length() >= KMusMinDigitCountInTelNumber && - numberPartOfTelUri.Length() >= KMusMinDigitCountInTelNumber && - iSettings.TelNumber().Right( KMusMinDigitCountInTelNumber ) == - telUri.Right( KMusMinDigitCountInTelNumber ) ) ) - { - iSettings.SetTelNumberL( telUriWithoutPrefix ); - iSettings.SetContactNameL( KNullDesC() ); - iSettings.SetContactId( KErrNotFound ); - } - } - - if ( sipUri.Length() > 0 ) - { - // Replace possibly existing TEL URI with SIP URI - addresses->Reset(); - addresses->AppendL( sipUri ); - } - - iSettings.SetSipAddressesL( addresses ); // Transfers ownership - CleanupStack::Pop( addresses ); - } - else - { - // should go for future need if any. - } - MUS_LOG("mus: [MUSAVA] <- CMusAvaOptionHandler::SipHeadersL()" ) - } - - -// ----------------------------------------------------------------------------- -// -// ----------------------------------------------------------------------------- -// -void CMusAvaOptionHandler::VideoCodecsResolvedL( const MDesCArray& aVideoCodecs ) - { - MUS_LOG("mus: [MUSAVA] -> CMusAvaOptionHandler::VideoCodecsResolvedL()" ) - - iSettings.SetVideoCodecsL(aVideoCodecs); - - MUS_LOG("mus: [MUSAVA] <- CMusAvaOptionHandler::VideoCodecsResolvedL()" ) - } -