diff -r 2eacb6118286 -r ba76fc04e6c2 phoneapp/phoneuivoipextension/src/cphonevcchandler.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuivoipextension/src/cphonevcchandler.cpp Fri Jun 04 10:19:18 2010 +0100 @@ -0,0 +1,553 @@ +/* +* Copyright (c) 2008-2009 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: Implementation of CPhoneVccHandler class. +* +*/ + +// INCLUDES +#include "phoneresourceids.h" +#include +#include +#include +#include +#include +#include "cphonevcchandler.h" +#include "cphonetimer.h" +#include "cphonestate.h" +#include "cphonemainresourceresolver.h" +#include "phonelogger.h" +#include "cphonelogger.h" +#include "mphoneviewcommandhandle.h" +#include "mphonestatemachine.h" +#include "phonerssvoip.h" +#include "phoneappvoipcommands.hrh" +#include "tphonecmdparamglobalnote.h" + +// For HO notification tone setting read +#include +#include +#include +#include + + +// CONSTANTS +// 1,5 Second in microseconds +const TInt KPhoneShowNoteTime = 1500000; + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPhoneVccHandler::CPhoneVccHandler( + MPhoneStateMachine& aStateMachine, + MPhoneViewCommandHandle& aViewCommandHandle ) : + iStateMachine( aStateMachine ), + iViewCommandHandle( aViewCommandHandle ), iVccHoReady( ETrue ) + { + } + +// ----------------------------------------------------------- +// CPhoneVccHandler::~CPhoneStateIdleVoIP() +// Destructor +// ----------------------------------------------------------- +// +CPhoneVccHandler::~CPhoneVccHandler() + { + delete iPropListener; + TRAPD( err, CancelHandoverNoteTimerL() ); + if ( err != KErrNone ) + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::~CPhoneVccHandler, leave" ); + } + } + +// ----------------------------------------------------------- +// CPhoneVccHandler::ConstructL() +// Constructor +// ----------------------------------------------------------- +// +void CPhoneVccHandler::ConstructL() + { + iPropListener = CVccUiPsPropertyListener::NewL( KVccPropKeyHoStatus ); + iPropListener->AddObserverL( *this ); + iPropListener->Start(); + } + +// ----------------------------------------------------------- +// CPhoneVccHandler::NewL() +// Constructor +// ----------------------------------------------------------- +// +CPhoneVccHandler* CPhoneVccHandler::NewL( + MPhoneStateMachine& aStateMachine, + MPhoneViewCommandHandle& aViewCommandHandle ) + { + CPhoneVccHandler* self = new (ELeave) CPhoneVccHandler( + aStateMachine, + aViewCommandHandle ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------- +// CPhoneVccHandler::StartManualHandover +// ----------------------------------------------------------- +// +void CPhoneVccHandler::StartManualHandoverL( TInt aCommand ) + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneVccHandler::StartManualHandoverL()" ) + + HandoverInProgressNoteL( aCommand ); + + CVccUiPsProperty* prop = CVccUiPsProperty::NewL(); + CleanupStack::PushL( prop ); + + if ( aCommand == EPhoneVoIPWaitHandoverFromGsm ) + { + prop->NotifySubscriberL( EVccManualStartCsToPsHoRequest ); + } + else + { + prop->NotifySubscriberL( EVccManualStartPsToCsHoRequest ); + } + + CleanupStack::PopAndDestroy(prop); + iVccHoReady = EFalse; + } + +// ----------------------------------------------------------- +// CPhoneVccHandler::AddHandoverMenuItem +// ----------------------------------------------------------- +// +void CPhoneVccHandler::AddHandoverMenuItemL( + RArray& aArray, + TInt /*aResourceId*/, + CEikMenuPane& aMenuPane ) + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneVccHandler::AddHandoverMenuItemL()"); + TInt activeCallId( KErrNotFound ); + + for( TInt i = 0; i < aArray.Count(); i++ ) + { + if( aArray[i].iCallState == CTelMenuExtension::EActive ) + { + activeCallId = aArray[i].iCallId; + } + } + + if ( activeCallId != KErrNotFound ) + { + // Vcc not available or Multicall not available + if ( iVccUnavailable || aArray.Count() > 1 && iNoHoIfMultiCall ) + { + return; + } + + TPECallType callType = + iStateMachine.PhoneEngineInfo()->CallType( activeCallId ); + + CEikMenuPaneItem::SData data; + data.iCascadeId=0; + data.iFlags=0; + HBufC* string = NULL; + + if ( callType == EPECallTypeVoIP && iVccHoAllowedToGsm ) + { + string = StringLoader::LoadLC( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneVoIPHandoverToGsmOption ) ); + + data.iCommandId = EPhoneCmdHandoverToGsm; + + } + else if ( callType == EPECallTypeCSVoice && iVccHoAllowedToWlan ) + { + string = StringLoader::LoadLC( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( EPhoneVoIPHandoverToWlanOption ) ); + + data.iCommandId = EPhoneCmdHandoverToWlan; + } + else + { + // Not add menu item + return; + } + + data.iText = *string; + // Try to find index of EPhoneInCallCmdGoToIdle command + // handover item will be placed above it if found + + TInt index( KErrNotFound ); + + if ( aMenuPane.MenuItemExists( EPhoneInCallCmdGoToIdle, index) ) + { + aMenuPane.InsertMenuItemL( data, index ); + } + else + { + aMenuPane.AddMenuItemL( data ); + } + + CleanupStack::PopAndDestroy( string ); + } + } + +// --------------------------------------------------------- +// CPhoneVccHandler::StartHandoverNoteTimerL +// --------------------------------------------------------- +// +void CPhoneVccHandler::StartHandoverNoteTimerL() + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneVccHandler::StartHandoverNoteTimerL()"); + + if( !iHandoverNoteTimer ) + { + iHandoverNoteTimer = CPhoneTimer::NewL(); + } + + iHandoverNoteTimer->After( KPhoneShowNoteTime, + TCallBack( HandoverNoteTimerCallbackL, this ) ); + } + +// --------------------------------------------------------- +// CPhoneVccHandler::CancelHandoverNoteTimerL +// --------------------------------------------------------- +// +void CPhoneVccHandler::CancelHandoverNoteTimerL() + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneVccHandler::CancelHandoverNoteTimerL()"); + if ( iHandoverNoteTimer ) + { + delete iHandoverNoteTimer; + iHandoverNoteTimer = NULL; + } + RemoveHandoverNoteL(); + } + +// --------------------------------------------------------- +// CPhoneVccHandler::HandoverNoteTimerCallbackL +// --------------------------------------------------------- +// +TInt CPhoneVccHandler::HandoverNoteTimerCallbackL( TAny* aAny ) + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneVccHandler::HandoverNoteTimerCallbackL()"); + + reinterpret_cast( aAny )-> + CancelHandoverNoteTimerL(); + + return KErrNone; + } + +// --------------------------------------------------------- +// CPhoneVccHandler::RemoveHandoverNoteL +// --------------------------------------------------------- +// +void CPhoneVccHandler::RemoveHandoverNoteL() + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneVccHandler::RemoveHandoverNoteL()"); + + if ( iVccHoReady && !iHandoverNoteTimer ) + { + iViewCommandHandle.ExecuteCommandL( EPhoneViewRemoveGlobalNote ); + } + } + +// ----------------------------------------------------------- +// CPhoneVccHandler::HandoverInProgressNoteL +// ----------------------------------------------------------- +// +void CPhoneVccHandler::HandoverInProgressNoteL( TInt aCommand ) + { + TPhoneCmdParamGlobalNote globalNoteParam; + +// Check notification tone user setting + TInt tone = GetHoNotifToneModeL(); + + if ( tone == 1 ) + { + globalNoteParam.SetTone( EAvkonSIDConfirmationTone ); + } + else + { + globalNoteParam.SetTone( EAvkonSIDNoSound ); + } + + globalNoteParam.SetType( EAknGlobalWaitNote ); + globalNoteParam.SetSoftkeys( R_AVKON_SOFTKEYS_EMPTY ); + globalNoteParam.SetTextResourceId( + CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( aCommand ) ); + + iViewCommandHandle.ExecuteCommandL( + EPhoneViewShowGlobalNote, &globalNoteParam ); + + StartHandoverNoteTimerL(); + } + +// ----------------------------------------------------------------------------- +// CPhoneVccHandler::VccPropertyChangedL +// Gets called when PS key is changed +// ----------------------------------------------------------------------------- +// +void CPhoneVccHandler::VccPropertyChangedL( const TUint aKeyId, + const TInt aValue ) + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL() "); + + __PHONELOG1( EBasic, EPhoneControl, + "CPhoneVccHandler::VccPropertyChangedL - key: %d", aValue ); + + + if( aKeyId == KVccPropKeyHoStatus ) + { + switch( aValue ) + { + case EVccCsToPsHoFailure: + case EVccPsToCsHoFailure: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- HO fail" ); + // Remove handover note if handover is in progress + if( !iVccHoReady ) + { + iVccHoReady = ETrue; + CPhoneState* phoneState = + static_cast< CPhoneState* >( iStateMachine.State() ); + CancelHandoverNoteTimerL(); + phoneState->SendGlobalInfoNoteL( EPhoneVoIPHandoverFail ); + } + } + break; + case EVccCsToPsHoSuccessful: + case EVccPsToCsHoSuccessful: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- HO Success" ); + iVccHoReady = ETrue; + RemoveHandoverNoteL(); + } + break; + case EVccCsToPsHoStarted: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- CsToPsHoStarted" ); + // Do not show if manually started since the wait note is + // already visible + if ( iVccHoReady ) + { + iVccHoReady = EFalse; + HandoverInProgressNoteL( EPhoneVoIPWaitHandoverFromGsm ); + } + } + break; + case EVccPsToCsHoStarted: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- PsToCsHoStarted" ); + // Do not show if manually started since the wait note is + // already visible + if ( iVccHoReady ) + { + iVccHoReady = EFalse; + HandoverInProgressNoteL( EPhoneVoIPWaitHandoverFromWlan); + } + } + break; + case EVccPsToCsHoInprogress: + case EVccCsToPsHoInprogress: + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- HoInprogress" ); + // Do nothing + break; + case EVccHoUnavailable: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- HO Unavailable" ); + iVccUnavailable = ETrue; + break; + } + case EVccHoStateIdle: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- HO IDLE" ); + iVccHoAllowedToGsm = ETrue; + iVccHoAllowedToWlan = ETrue; + iNoHoIfMultiCall = EFalse; + iVccUnavailable = EFalse; + break; + } + case EVccCsToPsNotAllowed: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- EVccCsToPsNotAllowed" ); + iVccHoAllowedToWlan = EFalse; + iVccHoAllowedToGsm = ETrue; + iNoHoIfMultiCall = EFalse; + iVccUnavailable = EFalse; + break; + } + + case EVccPsToCsNotAllowed: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- EVccPsToCsNotAllowed" ); + iVccHoAllowedToGsm = EFalse; + iVccHoAllowedToWlan = ETrue; + iNoHoIfMultiCall = EFalse; + iVccUnavailable = EFalse; + break; + } + + case EVccHoStateIdleIfSingleCall: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- EVccHoStateIdleIfSingleCall" ); + iNoHoIfMultiCall = ETrue; + iVccHoAllowedToGsm = ETrue; + iVccHoAllowedToWlan = ETrue; + iVccUnavailable = EFalse; + break; + } + case EVccHoAllowedToCsIfSingleCall: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- EVccHoAllowedToCsIfSingleCall" ); + iNoHoIfMultiCall = ETrue; + iVccHoAllowedToWlan = EFalse; + iVccHoAllowedToGsm = ETrue; + iVccUnavailable = EFalse; + break; + } + case EVccHoAllowedToPsIfSingleCall: + { + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- EVccHoAllowedToPsIfSingleCall" ); + iNoHoIfMultiCall = ETrue; + iVccHoAllowedToGsm = EFalse; + iVccHoAllowedToWlan = ETrue; + iVccUnavailable = EFalse; + break; + } + + default: + + __PHONELOG( EBasic, PhoneUIVoIPExtension, + "CPhoneVccHandler::VccPropertyChangedL VccPropertyChangedL -- default" ); + break; + } + } + } +// --------------------------------------------------------------------------- +// Gets HO notification tone setting value +// --------------------------------------------------------------------------- +// +TInt CPhoneVccHandler::GetHoNotifToneModeL() + { + // Find out VCC service id + CSPProperty* property = CSPProperty::NewLC(); + + CSPSettings* settings = CSPSettings::NewLC(); + + TInt vccServiceId = GetVccServiceIdL(); + + //get the VCC enabled VoIP service id. + TInt err = settings->FindPropertyL( + vccServiceId, ESubPropertyVccDtVoipServiceId, *property ); + + TInt voipId; + TInt error = property->GetValue( voipId ); + + // Find and get the HO notification tone property + TInt tone = 0; + RBuf value; + value.CreateL( 1 ); + + err = settings->FindPropertyL( + voipId, ESubPropertyVccHoNotificationToneMode, *property ); + + if ( !err ) + { + HBufC* temp; + property->GetValue( value ); + temp = value.AllocL(); + TLex temp2( *temp ); + temp2.Val( tone ); + delete temp; + } + value.Close(); + + // Set to default (0 = off) in case of invalid value + if ( !( tone == 0 || tone == 1 )) + { + tone = 0; + } + + CleanupStack::PopAndDestroy( settings ); + CleanupStack::PopAndDestroy( property ); + + + + return tone; + } + +// --------------------------------------------------------------------------- +// For finding out VCC service id. +// --------------------------------------------------------------------------- +// +TInt CPhoneVccHandler::GetVccServiceIdL() + { + TInt vccServiceId( KErrNotFound ); + // Array of service provider IDs + // is defined as: typedef RArray RIdArray + // in spdefinitions.h + RIdArray serviceIdArray; + CleanupClosePushL( serviceIdArray ); + + CSPSettings* settings = CSPSettings::NewLC(); + settings->FindServiceIdsL( serviceIdArray ); + + TBool foundEntry( EFalse ); + + for ( TInt i( 0 ); i < serviceIdArray.Count() && !foundEntry; i++ ) + { + CSPProperty* property = CSPProperty::NewLC(); + TInt error = settings->FindPropertyL( serviceIdArray[i], ESubPropertyVccVDI, *property ); + + if( error == KErrNone ) + { + vccServiceId = serviceIdArray[i]; + foundEntry = ETrue; + } + CleanupStack::PopAndDestroy( property ); + } + CleanupStack::PopAndDestroy( settings ); + CleanupStack::PopAndDestroy( &serviceIdArray ); + + return vccServiceId; + } +// End of File