--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneapp/phoneuivoipextension/src/cphonecustomizationvoip.cpp Mon Jan 18 20:18:27 2010 +0200
@@ -0,0 +1,1485 @@
+/*
+* 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 CPhoneCustomizationVoip class.
+*
+*/
+
+
+// INCLUDES
+#include <eikmenup.h>
+#include <spsettings.h>
+#include <spentry.h>
+#include <spproperty.h>
+#include <mpeengineinfo.h>
+#include <bmbubblemanager.h>
+#include <phoneui.rsg>
+#include <avkon.rsg>
+#include <phoneuivoip.rsg>
+#include <StringLoader.h>
+#include <featmgr.h>
+
+#include "cphonecustomizationvoip.h"
+#include "tphonecmdparaminteger.h"
+#include "tphonecmdparamboolean.h"
+#include "tphonecmdparamstring.h"
+#include "cphonemainresourceresolver.h"
+#include "mphonestatemachine.h"
+#include "cphonelogger.h"
+#include "cphonecenrepproxy.h"
+#include "phoneui.pan"
+#include "mphoneviewcommandhandle.h"
+#include "tphonecmdparamdynmenu.h"
+#include "phoneappvoipcommands.hrh"
+#include "phonerssvoip.h"
+#include "tphonecmdparamcallstatedata.h"
+#include "tphonecmdparamquery.h"
+#include "tphonecmdparamcallheaderdata.h"
+#include "cphoneextensionhandler.h"
+#include "cphonestate.h"
+#include "tphonecmdparamglobalnote.h"
+#include "cphonestatemachinevoip.h"
+#include "cphonevoiperrormessageshandler.h"
+#include "cphoneviewcustomizationvoip.h"
+#include "cphonestateutilsvoip.h"
+#include "cphoneunattendedtransfercmdhandler.h"
+#include "tphonecmdparampointer.h"
+#include "cphonenewcallcmdhandler.h"
+#include "cphonevcchandler.h"
+#include "cphonecallforwardqueryhandler.h"
+#include "cphonekeys.h"
+
+// CONSTANTS
+const TInt KMaxLengthForSIPURIFirstLine = 15;
+const TInt KMaxLengthForSIPURITwoLines = 30;
+const TInt KMaxLengthForSIPURI = 256;
+
+_LIT( KVoipAt, "@" );
+
+// ================= MEMBER FUNCTIONS =======================
+
+// C++ default constructor can NOT contain any code, that
+// might leave.
+//
+CPhoneCustomizationVoip::CPhoneCustomizationVoip(
+ MPhoneStateMachine& aStateMachine,
+ MPhoneViewCommandHandle& aViewCommandHandle ) :
+ iCoeEnv( *CCoeEnv::Static() ),
+ iStateMachine( aStateMachine ),
+ iViewCommandHandle( aViewCommandHandle )
+ {
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::~CPhoneCustomizationVoip()
+// Destructor
+// -----------------------------------------------------------
+//
+CPhoneCustomizationVoip::~CPhoneCustomizationVoip()
+ {
+ delete iCallForwardHandler;
+ delete iExtensionHandler;
+ delete iPhoneViewCustomization;
+ delete iTransferCmdHandler;
+ delete iNewCallCmdHandler;
+ delete iVccHandler;
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::ConstructL()
+// Constructor
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::ConstructL()
+ {
+ // Set view customization
+ iPhoneViewCustomization = CPhoneViewCustomizationVoip::NewL( *this );
+ TPhoneCmdParamPointer pointerParam;
+ pointerParam.SetPointer(
+ static_cast<MPhoneViewCustomization*>( iPhoneViewCustomization ) );
+ iViewCommandHandle.ExecuteCommand( EPhoneViewSetViewCustomization,
+ &pointerParam );
+ // Set touch button customization
+ pointerParam.SetPointer(
+ static_cast<MPhoneButtonCustomization*>( this ) );
+ iViewCommandHandle.ExecuteCommand( EPhoneViewSetButtonCustomization,
+ &pointerParam );
+
+ // Set phone customization
+ pointerParam.SetPointer( static_cast<MPhoneCustomization*>( this ) );
+ iViewCommandHandle.ExecuteCommand( EPhoneViewSetPhoneCustomization,
+ &pointerParam );
+
+ iExtensionHandler = CPhoneExtensionHandler::NewL();
+ iTransferCmdHandler = CPhoneUnattendedTransferCmdHandler::NewL(
+ iStateMachine, iViewCommandHandle );
+
+ iNewCallCmdHandler = CPhoneNewCallCmdHandler::NewL(
+ iStateMachine, iViewCommandHandle );
+
+ if ( FeatureManager::FeatureSupported( KFeatureIdFfVoiceCallContinuity ) )
+ {
+ iVccHandler = CPhoneVccHandler::NewL( iStateMachine, iViewCommandHandle );
+ }
+
+ iCallForwardHandler = CPhoneCallForwardQueryHandler::NewL(
+ iStateMachine, iViewCommandHandle );
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::NewL()
+// Constructor
+// -----------------------------------------------------------
+//
+CPhoneCustomizationVoip* CPhoneCustomizationVoip::NewL(
+ MPhoneStateMachine& aStateMachine,
+ MPhoneViewCommandHandle& aViewCommandHandle )
+ {
+ CPhoneCustomizationVoip* self = new (ELeave) CPhoneCustomizationVoip(
+ aStateMachine,
+ aViewCommandHandle );
+
+ CleanupStack::PushL( self );
+ self->ConstructL();
+ CleanupStack::Pop( self );
+
+ return self;
+ }
+
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::CustomizeMenuBarL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::CustomizeMenuBarL(
+ TInt aResourceId, CEikMenuBar* aMenuBar )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CustomizeMenuBarL" );
+
+ if ( 0 == aResourceId || !aMenuBar )
+ {
+ __ASSERT_DEBUG( EFalse, Panic( EPhoneCtrlParameterNotInitialized ) );
+ }
+ }
+
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::CustomizeMenuPaneL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::CustomizeMenuPaneL(
+ TInt aResourceId, CEikMenuPane* aMenuPane)
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CustomizeMenuPaneL" );
+
+ CEikMenuPane* menuPane = aMenuPane;
+ RArray<TInt> menuItemArray;
+ CleanupClosePushL( menuItemArray );
+
+ // Menu items to array
+ TInt menuItemCount = menuPane->NumberOfItemsInPane();
+ for ( TInt i( 0 ); i < menuItemCount; i++ )
+ {
+ menuItemArray.Append( menuPane->MenuItemCommandId( i ) );
+ }
+
+ // Menu items to be deleted
+ for ( TInt i( 0 ); i < menuItemArray.Count(); i++ )
+ {
+ switch( menuItemArray[ i ] )
+ {
+ case EPhoneDialerCmdTouchInput:
+ {
+ if ( !AllowAlphaNumericMode() )
+ {
+ menuPane->DeleteMenuItem( menuItemArray[ i ] );
+ }
+ break;
+ }
+ case EPhoneInCallCmdTransfer:
+ {
+ if ( ! IsFeatureSupported( EFeatureTransfer ) )
+ {
+ menuPane->DeleteMenuItem( menuItemArray[ i ] );
+ }
+ break;
+ }
+ case EPhoneInCallCmdCreateConference:
+ {
+ if ( ! IsFeatureSupported( EFeatureConference ) )
+ {
+ menuPane->DeleteMenuItem( menuItemArray[ i ] );
+ }
+ break;
+ }
+ case EPhoneInCallCmdNewCall:
+ {
+ if ( !FeatureManager::FeatureSupported( KFeatureIdOnScreenDialer ) &&
+ AllowAlphaNumericMode() &&
+ R_PHONEUI_NEW_CALL_MENU_VOIP != aResourceId )
+ {
+
+ menuPane->DeleteMenuItem( menuItemArray[ i ] );
+
+ HBufC* string = StringLoader::LoadLC(
+ CPhoneMainResourceResolver::Instance()->
+ ResolveResourceID( EPhoneVoIPNewCallMenuOption ) );
+
+ CEikMenuPaneItem::SData data;
+ data.iCascadeId=R_PHONEUI_NEW_CALL_MENU_VOIP; //r_phoneui_new_call_menu_voip
+ data.iText = *string;
+ data.iFlags=0;
+ data.iCommandId = 0;
+
+ menuPane->InsertMenuItemL( data, i );
+
+ CleanupStack::PopAndDestroy( string );
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+
+ CleanupStack::PopAndDestroy( &menuItemArray );
+
+ // Added HO menu items if needed
+ AddHandoverMenuItemIfNeededL( aResourceId, *aMenuPane );
+
+ if ( iViewCommandHandle.HandleCommandL(
+ EPhoneViewGetNumberEntryIsVisibleStatus ) !=
+ EPhoneViewResponseSuccess )
+ {
+ // Handle call menu without dialer/number entry
+ TRAP_IGNORE( ModifyInCallMenuL( aResourceId, *aMenuPane ) );
+ }
+ else
+ {
+ // Handle dialer/number entry options menu modification
+ ModifyNumberAcquisitionMenuL( aResourceId, *aMenuPane );
+ }
+ }
+
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::ModifyCallHeaderTexts
+// Formats and fits VoIP address and possible display name into two lines to
+// be shown on a call bubble. These two lines are placed on CLI and CNAP
+// fields of the TPhoneCmdParamCallHeaderData. In a call bubble CLI-field is
+// placed as a first line and CNAP-field is placed as a second line.
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::ModifyCallHeaderTexts( TInt aCallId,
+ TPhoneCmdParamCallHeaderData* aCommandParam,
+ const TDesC& /*aInCallNumberText*/ )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::ModifyCallHeaderTexts" );
+
+ MPEEngineInfo& engineInfo = *iStateMachine.PhoneEngineInfo();
+
+ if ( EPECallTypeVoIP == engineInfo.CallType( aCallId ) )
+ {
+ const TBool contactInfoAvailable =
+ engineInfo.RemoteName( aCallId ).Length() ||
+ engineInfo.RemoteCompanyName( aCallId ).Length();
+
+ if ( EPEStateRinging == aCommandParam->CallState() &&
+ !contactInfoAvailable )
+ {
+ if ( KNullDesC() != engineInfo.RemotePartyName( aCallId ) )
+ {
+ // Telephone UI specification, 4.2.1 Call identification:
+ // display name is used as the CLI if available.
+ aCommandParam->SetCLIText(
+ engineInfo.RemotePartyName( aCallId ),
+ CBubbleManager::ERight );
+ // use line reserved for CNAP to show SIP URI
+ aCommandParam->SetCNAPText(
+ engineInfo.RemotePhoneNumber( aCallId ),
+ CBubbleManager::ERight );
+ }
+ else if( KNullDesC() != engineInfo.RemotePhoneNumber( aCallId ) )
+ {
+ // Fit address to two rows if it doesnt fit to one
+ TBuf<KMaxLengthForSIPURI> sipURI;
+ TBuf<KMaxLengthForSIPURI> sipURIDomainPart;
+ HandleURIFittingToCallBubble(
+ aCommandParam->CLIText(),
+ sipURI,
+ sipURIDomainPart );
+
+ aCommandParam->SetCLIText( sipURI, CBubbleManager::ERight );
+ aCommandParam->SetCNAPText(
+ sipURIDomainPart,
+ CBubbleManager::ERight );
+ }
+ else
+ {
+ // No address or display name specified
+ // Do nothing
+ }
+ }
+ else
+ {
+ // Change clipping direction
+ aCommandParam->SetCLIText(
+ aCommandParam->CLIText(),
+ CBubbleManager::ERight );
+
+ // Change clipping direction
+ aCommandParam->SetCNAPText(
+ aCommandParam->CNAPText(),
+ CBubbleManager::ERight );
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::HandleCommandL
+// -----------------------------------------------------------
+//
+TBool CPhoneCustomizationVoip::HandleCommandL( TInt aCommand )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::HandleCommandL" );
+
+ TBool handled( EFalse );
+ switch( aCommand )
+ {
+ case EPhoneNumberAcqCmdInternetCall:
+ {
+ StateUtils().SelectServiceAndDialL();
+ handled = ETrue;
+ }
+ break;
+ case EPhoneInCallCmdNewInternetCall:
+ case EPhoneCmdNewInternetCallOk:
+ case EPhoneCmdNewInternetCallSearch:
+ case EPhoneCmdNewInternetCallContactFetch:
+ {
+ iNewCallCmdHandler->HandleCommandL( aCommand );
+ handled = ETrue;
+ }
+ break;
+ case EPhoneInCallCmdUnattendedTransfer:
+ case EPhoneCmdTransferDialerOk:
+ case EPhoneCmdTransferDialerExit:
+ case EPhoneCmdTransferDialerSearch:
+ case EPhoneCmdTransferDialerContactFetch:
+ // intended fall-through
+ iTransferCmdHandler->HandleCommandL( aCommand );
+ handled = ETrue;
+ break;
+ case EPhoneCmdCancelServiceEnabling:
+ {
+ iStateMachine.SendPhoneEngineMessage(
+ MPEPhoneModel::EPEMessageDisableService );
+ handled = ETrue;
+ }
+ break;
+ case EPhoneCmdServiceEnablingTimedOut:
+ {
+ iStateMachine.SendPhoneEngineMessage(
+ MPEPhoneModel::EPEMessageDisableService );
+
+ TUint32 serviceId =
+ iStateMachine.PhoneEngineInfo()->ServiceIdCommand();
+ static_cast<CPhoneStateMachineVoIP&>( iStateMachine ).
+ VoipErrorMessageHandler().ShowErrorNoteWithServiceNameL(
+ EPhoneVoIPServiceUnavailable, serviceId );
+
+ handled = ETrue;
+ }
+ break;
+
+ case EPhoneCmdHandoverToGsm:
+ iVccHandler->StartManualHandoverL( EPhoneVoIPWaitHandoverFromWlan );
+ handled = ETrue;
+ break;
+
+
+ case EPhoneCmdHandoverToWlan:
+ iVccHandler->StartManualHandoverL( EPhoneVoIPWaitHandoverFromGsm );
+ handled = ETrue;
+ break;
+
+ default:
+ {
+ RArray<CTelMenuExtension::TCallInfo> array;
+ CleanupClosePushL( array );
+ GetActiveCallArrayL( array );
+
+ // Let extensions handle custom commands
+ TRAP_IGNORE( handled = iExtensionHandler->HandleCommandL(
+ ServiceIdForActivestCallL( array ),
+ aCommand ) );
+
+ CleanupStack::PopAndDestroy( &array );
+ }
+ break;
+ }
+
+ return handled;
+ }
+
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::AllowAlphaNumericMode
+// -----------------------------------------------------------
+//
+TBool CPhoneCustomizationVoip::AllowAlphaNumericMode()
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::AllowAlphaNumericMode" );
+
+ TBool alphaModeSupported( EFalse );
+ TRAP_IGNORE( alphaModeSupported = VoIPSupportedL() );
+
+ return alphaModeSupported;
+ }
+
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::CustomizeSoftKeys
+// -----------------------------------------------------------
+//
+TInt CPhoneCustomizationVoip::CustomizeSoftKeys()
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CustomizeSoftKeys" );
+
+ return CPhoneMainResourceResolver::Instance()->
+ ResolveResourceID( EPhoneVoIPNumberAcqInternetSoftkey );
+ }
+
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::CustomizeCallHeaderText
+// -----------------------------------------------------------
+//
+TInt CPhoneCustomizationVoip::CustomizeCallHeaderText()
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CustomizeCallHeaderText" );
+
+ return EPhoneVoIPPrivateAddress;
+ }
+
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::CustomizeBusyNoteText
+// -----------------------------------------------------------
+//
+TInt CPhoneCustomizationVoip::CustomizeBusyNoteText()
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CustomizeBusyNoteText" );
+
+ TInt resource( EPhoneNumberBusy );
+
+ const TPECallType callType =
+ iStateMachine.PhoneEngineInfo()->CallTypeCommand();
+ if ( callType == EPECallTypeVoIP )
+ {
+ resource = EPhoneVoIPNumberBusy;
+ }
+
+ return resource;
+ }
+
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::HandleCallFromNumberEntryL
+// -----------------------------------------------------------
+//
+TBool CPhoneCustomizationVoip::HandleCallFromNumberEntryL()
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::HandleCallFromNumberEntryL" );
+
+ TBool handled = EFalse;
+
+ if ( StateUtils().IsVoipNumber() )
+ {
+ // Dial voip because invalid string for cs call in number entry/dialer.
+ StateUtils().SelectServiceAndDialL();
+ handled = ETrue;
+ }
+
+ return handled;
+ }
+
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::HandlePhoneEngineMessageL
+// -----------------------------------------------------------
+//
+TBool CPhoneCustomizationVoip::HandlePhoneEngineMessageL(
+ const TInt aMessage,
+ TInt aCallId )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::HandlePhoneEngineMessageL" );
+
+ TBool handled = ETrue;
+ switch ( aMessage )
+ {
+ case MEngineMonitor::EPEMessageServiceEnabled:
+ case MEngineMonitor::EPEMessageServiceDisabled:
+ {
+ iViewCommandHandle.ExecuteCommandL(
+ EPhoneViewRemoveGlobalWaitNote );
+ break;
+ }
+ case MEngineMonitor::EPEMessageServiceEnabling:
+ {
+ LaunchEnablingServiceNoteL();
+ break;
+ }
+ case MEngineMonitor::EPEMessageNoService:
+ {
+ SendGlobalErrorNoteL( EPhoneVoIPNoService );
+ break;
+ }
+ case MEngineMonitor::EPEMessageMovedPermanently:
+ {
+ iCallForwardHandler->
+ ShowMovedPermanentlyQueryL( aCallId );
+ break;
+ }
+ case MEngineMonitor::EPEMessageMultipleChoices:
+ {
+ iCallForwardHandler->
+ ShowMultipleChoicesQueryL( aCallId );
+ break;
+ }
+ case MEngineMonitor::EPEMessageCallSecureStatusChanged:
+ {
+ HandleCallSecureStatusChangeL( aCallId );
+ break;
+ }
+ case MEngineMonitor::EPEMessageTransferring:
+ {
+ iViewCommandHandle.ExecuteCommandL( EPhoneViewRemoveGlobalNote );
+ CPhoneState* phoneState =
+ static_cast< CPhoneState* >( iStateMachine.State() );
+ SendGlobalInfoNoteL( EPhoneInCallTransferred );
+ break;
+ }
+ case MEngineMonitor::EPEMessageRemoteForwarding:
+ {
+ SendGlobalErrorNoteL( EPhoneRemoteForwarding );
+ break;
+ }
+ default:
+ handled = EFalse;
+ break;
+ }
+ return handled;
+ }
+
+// -----------------------------------------------------------
+// From class MPhoneCustomization.
+// CPhoneCustomizationVoip::HandleDialL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::HandleDialL( const TDesC& aNumber )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::HandleDialL" );
+
+ StateUtils().SelectServiceAndDialL( aNumber, NULL );
+ }
+
+// -----------------------------------------------------------
+// From class MPhoneButtonCustomization.
+// CPhoneCustomizationVoip::CustomizeTouchPaneButtons
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::CustomizeTouchPaneButtons(
+ MBubbleTouchPaneInterface& aTouchPane )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CustomizeTouchPaneButtons" );
+
+ TRAPD( err, CustomizeTouchPaneUsingExtensionL( aTouchPane ) );
+
+ if ( KErrNone != err )
+ {
+ // Extension plugin didn't handle touch pane dimming.
+ TInt buttonCount = aTouchPane.NumberOfButtonsInPane();
+
+ for ( TInt i=0; i < buttonCount; i++ )
+ {
+ TInt commandId = aTouchPane.ButtonCommandId( i );
+
+ switch ( commandId )
+ {
+ case EPhoneInCallCmdCreateConference:
+ case EPhoneInCallCmdJoin:
+ {
+ if ( !IsFeatureSupported( EFeatureConference ) )
+ {
+ // Conference not supported -> set item dimmed
+ aTouchPane.SetButtonDimmed( commandId, ETrue );
+ }
+ break;
+ }
+ default:
+ break;
+ } // switch
+ } // for
+ }
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::VoIPSupportedL
+// -----------------------------------------------------------
+//
+TBool CPhoneCustomizationVoip::VoIPSupportedL()
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::VoIPSupportedL" );
+
+ TBool voipSupported( EFalse );
+
+ CSPSettings* serviceProviderSettings = CSPSettings::NewL();
+ voipSupported = serviceProviderSettings->IsFeatureSupported(
+ ESupportInternetCallFeature );
+ delete serviceProviderSettings;
+
+ return voipSupported;
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::ModifyInCallMenuL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::ModifyInCallMenuL( TInt aResourceId, CEikMenuPane& aMenuPane )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::ModifyInCallMenuL" );
+
+ if ( aResourceId != R_AVKON_MENUPANE_FEP_DEFAULT &&
+ aResourceId != R_AVKON_MENUPANE_EDITTEXT_DEFAULT &&
+ aResourceId != R_AVKON_MENUPANE_LANGUAGE_DEFAULT )
+ {
+ RArray<CTelMenuExtension::TCallInfo> array;
+ CleanupClosePushL( array );
+
+ GetActiveCallArrayL( array );
+
+ // Use extensions for menu modifications
+ iExtensionHandler->ModifyInCallMenuL(
+ ServiceIdForActivestCallL( array ),
+ array,
+ aResourceId,
+ aMenuPane );
+
+ __PHONELOG( EBasic, PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::ModifyInCallMenuL() plugin exists" );
+
+ CleanupStack::PopAndDestroy( &array );
+ }
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::ModifyNumberAcquisitionMenuL
+// This function is called when user opens menu from dialler/number entry.
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::ModifyNumberAcquisitionMenuL(
+ TInt aResourceId, CEikMenuPane& aMenuPane )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::ModifyNumberAcquisitionMenuL");
+
+ if ( ( aResourceId == R_PHONEUI_NUMBERACQ_OPTIONS_CALL_MENU ||
+ aResourceId == R_PHONEUI_NUMBERACQ_OPTIONS_MENU ||
+ aResourceId == R_PHONEUIDIALER_OPTIONS_MENU ) &&
+ VoIPSupportedL() )
+ {
+ InsertInternetCallMenuItemL( aResourceId, aMenuPane );
+ }
+
+ if ( ( aResourceId == R_PHONEUI_NUMBERACQ_OPTIONS_MENU ||
+ aResourceId == R_PHONEUI_NUMBERACQ_OPTIONS_MENU_VOIP ||
+ aResourceId == R_PHONEUI_NUMBERACQ_OPTIONS_MENU_VOIP_WITH_SERVICE_NUMBER ) &&
+ VoIPSupportedL() )
+ {
+ InsertTextInputModeChangeMenuItemL( aMenuPane );
+ }
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::InsertInternetCallMenuItemL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::InsertInternetCallMenuItemL(
+ TInt aResourceId, CEikMenuPane& aMenuPane )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::InsertInternetCallMenuItemL" );
+
+ // get VoIP services
+ RIdArray voipServices;
+ CleanupClosePushL( voipServices );
+ GetVoIPServiceIdsL( voipServices );
+
+ CEikMenuPaneItem* voipMenuItem = NULL;
+
+ if ( 1 == voipServices.Count() )
+ {
+ voipMenuItem = CreateMenuPaneItemLC(
+ EPhoneNumberAcqCmdInternetCall,
+ voipServices[0] );
+ }
+ else
+ {
+ voipMenuItem = CreateMenuPaneItemLC(
+ EPhoneNumberAcqCmdInternetCall,
+ CPhoneMainResourceResolver::Instance()->
+ ResolveResourceID( EPhoneVoIPCallTypeInternet ) );
+ }
+
+ HBufC* phoneNumber = PhoneNumberFromEntryLC();
+
+ if ( aResourceId == R_PHONEUI_NUMBERACQ_OPTIONS_CALL_MENU )
+ {
+ if ( !CPhoneKeys::Validate( phoneNumber->Des() ) )
+ {
+ TInt index(KErrNotFound);
+ if ( aMenuPane.MenuItemExists( EPhoneNumberAcqCmdCall, index ) )
+ {
+ aMenuPane.DeleteMenuItem( EPhoneNumberAcqCmdCall );
+ }
+
+ if ( aMenuPane.MenuItemExists( EPhoneNumberAcqCmdVideoCall, index ) )
+ {
+ aMenuPane.DeleteMenuItem( EPhoneNumberAcqCmdVideoCall );
+ }
+ }
+
+ aMenuPane.AddMenuItemL( voipMenuItem->iData );
+ }
+ else if ( iStateMachine.PhoneEngineInfo()->PhoneNumberIsServiceCode() )
+ {
+ // When user writes string recognized as service code (eg.*#31# -> clir off)
+ // call menu is not visible. Internet call must still be possible so
+ // internet call option is added here to the menu.
+
+ // If number entry is empty don't add internet call option
+ if ( phoneNumber->Length() )
+ {
+ // Internet call item must be on the top of the menu
+ aMenuPane.InsertMenuItemL( voipMenuItem->iData, 0 );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( 3, &voipServices );
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::InsertTextInputModeChangeMenuItemL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::InsertTextInputModeChangeMenuItemL(
+ CEikMenuPane& aMenuPane )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::InsertTextInputModeChangeMenuItemL" );
+
+ TInt modeChangeOptionIndex = KErrNotFound;
+ if ( aMenuPane.MenuItemExists(
+ EPhoneNumberAcqCmdToggleNeAlphaMode, modeChangeOptionIndex ) ||
+ aMenuPane.MenuItemExists(
+ EPhoneNumberAcqCmdToggleNeNumericMode, modeChangeOptionIndex ) )
+ {
+ __PHONELOG( EBasic, PhoneUIVoIPExtension,
+ "InsertTextInputModeChangeMenuItemL, MENU ITEM ALREADY EXISTS" );
+ __ASSERT_DEBUG( EFalse, Panic( EPhoneCtrlInvariant ) );
+ }
+
+ CEikMenuPaneItem* menuItem = NULL;
+ TBool numberEntryInNumericMode = iViewCommandHandle.HandleCommandL(
+ EPhoneViewIsNumberEntryNumericMode ) == EPhoneViewResponseSuccess;
+ if ( numberEntryInNumericMode )
+ {
+ menuItem = CreateMenuPaneItemLC(
+ EPhoneNumberAcqCmdToggleNeAlphaMode,
+ R_PHONEUI_NUMBERACQ_OPTIONS_MENU_ITEM_ALPHA_MODE );
+ }
+ else
+ {
+ menuItem = CreateMenuPaneItemLC(
+ EPhoneNumberAcqCmdToggleNeNumericMode,
+ R_PHONEUI_NUMBERACQ_OPTIONS_MENU_ITEM_NUMERIC_MODE );
+ }
+
+ // alpha/numeric mode option is always second item in number entry menu
+ const TInt KTextInputModeChangeMenuItemIndex = 1;
+ aMenuPane.InsertMenuItemL(
+ menuItem->iData, KTextInputModeChangeMenuItemIndex );
+ CleanupStack::PopAndDestroy( menuItem );
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::GetActiveCallArrayL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::GetActiveCallArrayL(
+ RArray<CTelMenuExtension::TCallInfo>& aArray )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::GetActiveCallArrayL");
+
+ MPEEngineInfo* engineInfo = iStateMachine.PhoneEngine()->EngineInfo();
+
+ for( TInt i = 0; i < KPEMaximumNumberOfCalls; i++ )
+ {
+ CTelMenuExtension::TCallInfo callInfo;
+ callInfo.iCallId = i;
+ callInfo.iServiceId = engineInfo->ServiceId( i );
+ callInfo.iCallType = CTelMenuExtension::EUninitialized;
+
+ switch( engineInfo->CallType( i ) )
+ {
+ case EPECallTypeUninitialized:
+ callInfo.iCallType = CTelMenuExtension::EUninitialized;
+ break;
+ case EPECallTypeCSVoice:
+ callInfo.iCallType = CTelMenuExtension::ECsVoice;
+ break;
+ case EPECallTypeVideo:
+ callInfo.iCallType = CTelMenuExtension::ECsVideo;
+ break;
+ case EPECallTypeVoIP:
+ callInfo.iCallType = CTelMenuExtension::EPsVoice;
+ break;
+ default:
+ break;
+ }
+
+ callInfo.iCallState = CTelMenuExtension::ENone;
+
+ // Convert call bubble indications to call states
+ switch( engineInfo->CallState( i ) )
+ {
+ // Call states 0 - 499
+ case EPEStateDialing:
+ case EPEStateEmergencyDialing:
+ case EPEStateConnecting:
+ callInfo.iCallState = CTelMenuExtension::EOutgoing;
+ break;
+ case EPEStateAnswering:
+ case EPEStateRinging:
+ callInfo.iCallState = CTelMenuExtension::EIncoming;
+ break;
+
+ case EPEStateConnectedConference:
+ case EPEStateConnected:
+ callInfo.iCallState = CTelMenuExtension::EActive;
+ break;
+
+ case EPEStateHeldConference:
+ case EPEStateHeld:
+ callInfo.iCallState = CTelMenuExtension::EOnHold;
+ break;
+
+ case EPEStateHangingUpConference:
+ case EPEStateRejecting:
+ case EPEStateHangingUp:
+ case EPEStateDisconnecting:
+ callInfo.iCallState = CTelMenuExtension::EDisconnecting;
+ break;
+
+ case EPEStateUnknown:
+ case EPEStateIdle:
+ case EPEStateConferenceIdle:
+ break;
+
+ // conference
+ case EPEStateCreatingConference:
+ case EPEStateSwappingConference:
+ case EPEStateResumeHoldConference:
+ // misc states.
+ case EPEStateMaximumState:
+ default:
+ User::Leave( KErrNotReady );
+ break;
+ }
+
+ if( callInfo.iCallState != CTelMenuExtension::ENone )
+ {
+ aArray.Append( callInfo );
+ }
+
+ }
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::ResolveMostActiveCallL
+// -----------------------------------------------------------
+//
+TInt CPhoneCustomizationVoip::ResolveMostActiveCallL(
+ const RArray<CTelMenuExtension::TCallInfo>& aArray )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::ResolveMostActiveCallL" );
+
+ TInt incomingCallId( KErrNotFound );
+ TInt activeCallId( KErrNotFound );
+ TInt onholdCallId( KErrNotFound );
+ TInt disconnectingCallId( KErrNotFound );
+
+ for( TInt i = 0; i < aArray.Count(); i++ )
+ {
+ if( aArray[i].iCallState == CTelMenuExtension::EOutgoing )
+ {
+ // Always most active call
+ return aArray[i].iCallId;
+ }
+ else if( aArray[i].iCallState == CTelMenuExtension::EActive )
+ {
+ activeCallId = aArray[i].iCallId;
+ }
+ else if( aArray[i].iCallState == CTelMenuExtension::EIncoming )
+ {
+ incomingCallId = aArray[i].iCallId;
+ }
+ else if( aArray[i].iCallState == CTelMenuExtension::EOnHold )
+ {
+ onholdCallId = aArray[i].iCallId;
+ }
+ else if( aArray[i].iCallState == CTelMenuExtension::EDisconnecting )
+ {
+ disconnectingCallId = aArray[i].iCallId;
+ }
+ }
+
+ if( activeCallId != KErrNotFound )
+ {
+ return activeCallId;
+ }
+ else if( incomingCallId != KErrNotFound )
+ {
+ return incomingCallId;
+ }
+ else if( onholdCallId != KErrNotFound )
+ {
+ return onholdCallId;
+ }
+ else if( disconnectingCallId != KErrNotFound )
+ {
+ return disconnectingCallId;
+ }
+ else
+ {
+ User::Leave( KErrNotFound );
+ }
+
+ return KErrNotFound;
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::ServiceIdForActivestCallL
+// (other items were commented in a header).
+// -----------------------------------------------------------
+//
+TUint CPhoneCustomizationVoip::ServiceIdForActivestCallL(
+ const RArray<CTelMenuExtension::TCallInfo>& aCallArray )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::ServiceIdForActivestCallL" );
+
+ const TInt KActiveCallId = ResolveMostActiveCallL( aCallArray );
+
+ MPEEngineInfo* engineInfo = iStateMachine.PhoneEngine()->EngineInfo();
+
+ // Return service id for activest call
+ return engineInfo->ServiceId( KActiveCallId );
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::IsFeatureSupported()
+// (other items were commented in a header).
+// -----------------------------------------------------------
+//
+TBool CPhoneCustomizationVoip::IsFeatureSupported( TFeature aFeature )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::IsFeatureSupported" );
+
+ TBool ret( EFalse );
+
+ TRAP_IGNORE( ret = CheckFeatureSupportByCallTypeL( aFeature ) );
+
+ __PHONELOG1( EBasic, PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::IsFeatureSupported =%d", ret );
+
+ return ret;
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::CheckFeatureSupportByCallTypeL()
+// (other items were commented in a header).
+// -----------------------------------------------------------
+//
+TBool CPhoneCustomizationVoip::CheckFeatureSupportByCallTypeL(
+ TFeature aFeature )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CheckFeatureSupportByCallTypeL" );
+
+ if ( aFeature != EFeatureConference &&
+ aFeature != EFeatureTransfer )
+ {
+ return ETrue;
+ }
+
+ RArray<CTelMenuExtension::TCallInfo> array;
+ CleanupClosePushL( array );
+ GetActiveCallArrayL( array );
+ __PHONELOG1( EBasic, PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CheckFeatureSupportByCallTypeL CallCount=%d",
+ array.Count() );
+
+ TBool supported( ETrue );
+ TInt firstCallType = CTelMenuExtension::EUninitialized;
+ for( TInt i = 0; i < array.Count(); i++ )
+ {
+ if( array[i].iCallState == CTelMenuExtension::EOutgoing ||
+ array[i].iCallState == CTelMenuExtension::EActive ||
+ array[i].iCallState == CTelMenuExtension::EOnHold )
+ {
+ if( firstCallType == CTelMenuExtension::EUninitialized )
+ {
+ // Memorize first found call type
+ firstCallType = array[i].iCallType;
+ }
+ else if( firstCallType != array[i].iCallType )
+ {
+ // Found different call type
+ supported = EFalse;
+ break;
+ }
+ }
+
+ }
+
+ CleanupStack::PopAndDestroy( &array );
+
+ return supported;
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::CustomizeTouchPaneUsingExtensionL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::CustomizeTouchPaneUsingExtensionL(
+ MBubbleTouchPaneInterface& aTouchPane )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CustomizeTouchPaneUsingExtensionL" );
+
+ RArray<CTelMenuExtension::TCallInfo> array;
+ CleanupClosePushL( array );
+
+ GetActiveCallArrayL( array );
+
+ // Use extensions for touch pane buttons dimming
+ iExtensionHandler->CustomizeTouchPaneButtonsL(
+ ServiceIdForActivestCallL( array ),
+ array,
+ aTouchPane );
+
+ __PHONELOG( EBasic, PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::ModifyInCallMenuL() plugin exists" );
+
+ CleanupStack::PopAndDestroy( &array );
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::LaunchEnablingServiceNoteL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::LaunchEnablingServiceNoteL()
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::LaunchEnablingServiceNoteL" )
+
+ TPhoneCmdParamQuery queryParam;
+ queryParam.SetQueryType( EPhoneGlobalWaitNote );
+ queryParam.SetCommandParamId(
+ TPhoneCommandParam::EPhoneParamIdGlobalWaitNote );
+
+ RBuf serviceName;
+ CleanupClosePushL( serviceName );
+ TUint32 serviceId =
+ iStateMachine.PhoneEngineInfo()->ServiceIdCommand();
+ static_cast<CPhoneStateMachineVoIP&>( iStateMachine ).
+ VoipErrorMessageHandler().GetServiceProviderNameL(
+ serviceName, serviceId );
+
+ RBuf noteText;
+ CleanupClosePushL( noteText );
+ noteText.Assign( StringLoader::LoadL(
+ CPhoneMainResourceResolver::Instance()->ResolveResourceID(
+ EPhoneVoIPEnablingServiceWaitNoteText ), serviceName ) );
+
+ queryParam.SetDataText( ¬eText );
+ queryParam.SetDefaultCba( R_AVKON_SOFTKEYS_CANCEL );
+
+ const TInt KEnableServiceTimeOutInSecs = 60;
+ queryParam.SetTimeOut( KEnableServiceTimeOutInSecs );
+ // configure custom command mappings for user responses
+ queryParam.SetCbaCommandMapping(
+ EAknSoftkeyCancel, EPhoneCmdCancelServiceEnabling );
+ queryParam.SetCbaCommandMapping(
+ KErrCancel, EPhoneCmdCancelServiceEnabling );
+ queryParam.SetCustomCommandForTimeOut( EPhoneCmdServiceEnablingTimedOut );
+ iViewCommandHandle.ExecuteCommandL( EPhoneViewShowQuery, &queryParam );
+
+ CleanupStack::PopAndDestroy( ¬eText );
+ CleanupStack::PopAndDestroy( &serviceName );
+ }
+
+
+// ---------------------------------------------------------
+// CPhoneCustomizationVoip::SendGlobalErrorNoteL
+// ---------------------------------------------------------
+//
+void CPhoneCustomizationVoip::SendGlobalErrorNoteL( TInt aResourceId )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::SendGlobalErrorNoteL" );
+
+ __ASSERT_DEBUG( aResourceId, Panic( EPhoneCtrlParameterNotInitialized ) );
+
+ CPhoneState* phoneState =
+ static_cast< CPhoneState* >( iStateMachine.State() );
+
+ phoneState->SendGlobalErrorNoteL( aResourceId );
+ }
+
+
+// ---------------------------------------------------------
+// CPhoneCustomizationVoip::SendGlobalInfoNoteL
+// ---------------------------------------------------------
+//
+void CPhoneCustomizationVoip::SendGlobalInfoNoteL( TInt aResourceId )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::SendGlobalInfoNoteL" );
+
+ __ASSERT_DEBUG( aResourceId, Panic( EPhoneCtrlParameterNotInitialized ) );
+
+ CPhoneState* phoneState =
+ static_cast< CPhoneState* >( iStateMachine.State() );
+
+ phoneState->SendGlobalInfoNoteL( aResourceId );
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::HandleURIFittingToCallBubble
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::HandleURIFittingToCallBubble(
+ const TDesC& aCLIText, TDes& aSipURI, TDes& aSipURIDomainPart )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::HandleURIFittingToCallBubble" );
+
+ TInt cliLength = aCLIText.Length();
+ if ( KMaxLengthForSIPURIFirstLine > cliLength )
+ {
+ aSipURI.Copy( aCLIText );
+ aSipURIDomainPart.Copy( KNullDesC );
+ }
+ else if ( KMaxLengthForSIPURITwoLines > cliLength )
+ {
+ aSipURI.Copy( aCLIText.Mid( 0, KMaxLengthForSIPURIFirstLine ) );
+ aSipURIDomainPart.Copy( aCLIText.Mid( KMaxLengthForSIPURIFirstLine,
+ cliLength-KMaxLengthForSIPURIFirstLine ) );
+ }
+ else
+ {
+ TInt atPosition = aCLIText.Find( KVoipAt );
+ if ( atPosition == KErrNotFound )
+ {
+ atPosition = KMaxLengthForSIPURIFirstLine;
+ }
+ aSipURI.Copy( aCLIText.Mid( 0, atPosition ) );
+ aSipURIDomainPart.Copy( aCLIText.Mid( atPosition,
+ ( cliLength-atPosition ) ) );
+ }
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::StateUtils
+// -----------------------------------------------------------
+//
+CPhoneStateUtilsVoip& CPhoneCustomizationVoip::StateUtils()
+ {
+ return static_cast<CPhoneStateMachineVoIP&>( iStateMachine ).StateUtils();
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::HandleSecureStatusChangeL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::HandleCallSecureStatusChangeL( TInt aCallId )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::HandleCallSecureStatusChangeL" );
+
+ if ( KErrNotFound < aCallId )
+ {
+ if ( ( EPECallTypeVoIP ==
+ iStateMachine.PhoneEngineInfo()->CallType( aCallId ) ) &&
+ !iStateMachine.PhoneEngineInfo()->IsSecureCall( aCallId ) )
+ {
+ TInt state = iStateMachine.PhoneEngineInfo()->CallState(
+ aCallId );
+ switch ( state )
+ {
+ case EPEStateConnected:
+ {
+ iViewCommandHandle.ExecuteCommand(
+ EPhoneViewCipheringInfoChangePlayTone );
+ break;
+ }
+ case EPEStateDialing:
+ {
+ SendGlobalInfoNoteL(
+ EPhoneSSNotificationTextVoipSipsFailed );
+ break;
+ }
+ default:
+ break;
+
+ }
+ }
+ }
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::CreateMenuPaneItemLC
+// -----------------------------------------------------------
+//
+CEikMenuPaneItem* CPhoneCustomizationVoip::CreateMenuPaneItemLC(
+ TInt aCommandId, TInt aTextResourceId ) const
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CreateMenuPaneItemLC" );
+
+ CEikMenuPaneItem::SData data;
+ data.iCommandId = aCommandId;
+ data.iCascadeId = 0;
+ data.iFlags = 0;
+ iCoeEnv.ReadResourceL( data.iText, aTextResourceId );
+ data.iExtraText = KNullDesC();
+
+ CEikMenuPaneItem* menuItem = new ( ELeave ) CEikMenuPaneItem();
+ CleanupStack::PushL( menuItem );
+ menuItem->iData = data;
+
+ return menuItem;
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::CreateMenuPaneItemLC
+// -----------------------------------------------------------
+//
+CEikMenuPaneItem* CPhoneCustomizationVoip::CreateMenuPaneItemLC(
+ TInt aCommandId, TServiceId aServiceId ) const
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::CreateMenuPaneItemLC" );
+
+ CEikMenuPaneItem::SData data;
+ data.iCommandId = aCommandId;
+ data.iCascadeId = 0;
+ data.iFlags = 0;
+ data.iExtraText = KNullDesC();
+
+ // insert service name
+ TBuf<KMaxVoIPServiceName> serviceName;
+ GetVoipServiceNameL( aServiceId, serviceName );
+
+ HBufC* callText = StringLoader::LoadLC(
+ CPhoneMainResourceResolver::Instance()
+ ->ResolveResourceID( EPhoneVoIPNumberAcqXSPCall ),
+ serviceName );
+
+ data.iText.Append( *callText );
+
+ CleanupStack::PopAndDestroy( callText );
+
+ CEikMenuPaneItem* menuItem = new ( ELeave ) CEikMenuPaneItem();
+ CleanupStack::PushL( menuItem );
+ menuItem->iData = data;
+
+ return menuItem;
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::AddHandoverMenuItemIfNeededL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::AddHandoverMenuItemIfNeededL( TInt aResourceId,
+ CEikMenuPane& aMenuPane )
+ {
+ __LOGMETHODSTARTEND( PhoneUIVoIPExtension,
+ "CPhoneCustomizationVoip::AddHandoverMenuItemIfNeededL" );
+
+ // Menu items to be added
+ if ( iVccHandler && AllowAlphaNumericMode() &&
+ ( aResourceId == R_PHONEUI_CALLHANDLING_INCALL_OPTIONS_MENU ||
+ aResourceId == R_PHONEUI_CALLWAITING_OPTIONS_MENU ||
+ aResourceId == R_PHONEUI_ACTIVEANDHELDCALL_OPTIONS_MENU ||
+ aResourceId == R_PHONEUI_ACTIVEANDHELDCONFCALL_OPTIONS_MENU ||
+ aResourceId == R_PHONEUI_CALLACTIVEHELDANDWAITING_OPTIONS_MENU
+ ))
+ {
+ RArray<CTelMenuExtension::TCallInfo> array;
+ CleanupClosePushL( array );
+ GetActiveCallArrayL( array );
+
+ iVccHandler->AddHandoverMenuItemL( array, aResourceId, aMenuPane );
+ CleanupStack::PopAndDestroy( &array );
+ }
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::GetVoIPServiceIdsL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::GetVoIPServiceIdsL( RIdArray& aVoipServiceIds ) const
+ {
+ aVoipServiceIds.Reset();
+
+ // Fetch the settings api.
+ CSPSettings* settingsApi = CSPSettings::NewLC();
+
+ // read all service ids to array
+ RIdArray idArray;
+ CleanupClosePushL( idArray );
+
+ if ( KErrNone == settingsApi->FindServiceIdsL( idArray ) )
+ {
+ // go throught all the services and check if any
+ // of them supports internet call
+ for ( TInt i = 0; idArray.Count() > i; i++)
+ {
+ // check if the service supports internet call
+ CSPProperty* property = CSPProperty::NewLC();
+
+ // get attribute mask of the service
+ TRAPD( error, error = settingsApi->FindPropertyL( idArray[i],
+ EPropertyServiceAttributeMask, *property ) );
+
+ if ( KErrNone == error )
+ {
+ // read the value of mask property
+ TInt mask = 0;
+ error = property->GetValue( mask );
+ if ( KErrNone == error )
+ {
+ if ( ( mask & ESupportsInternetCall )
+ && ( mask & EIsVisibleInCallMenu ) )
+ {
+ aVoipServiceIds.Append( idArray[i] );
+ }
+ }
+ }
+ CleanupStack::PopAndDestroy( property );
+ }
+ }
+
+ CleanupStack::PopAndDestroy( 2, settingsApi );
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::GetVoIPServiceIdsL
+// -----------------------------------------------------------
+//
+void CPhoneCustomizationVoip::GetVoipServiceNameL( TServiceId aServiceId, TDes& aServiceName ) const
+ {
+ CSPSettings* settingsApi = CSPSettings::NewLC();
+ CSPProperty* property = CSPProperty::NewLC();
+
+ settingsApi->FindPropertyL( aServiceId, EServiceName, *property );
+ property->GetValue( aServiceName );
+
+ CleanupStack::PopAndDestroy( 2, settingsApi );
+ }
+
+
+// -----------------------------------------------------------
+// CPhoneCustomizationVoip::PhoneNumberFromEntryLC
+// -----------------------------------------------------------
+//
+HBufC* CPhoneCustomizationVoip::PhoneNumberFromEntryLC() const
+ {
+ HBufC* phoneNumber = HBufC::NewLC( KPhoneNumberEntryBufferSize );
+
+ TPtr ptr( phoneNumber->Des() );
+ TPhoneCmdParamString stringParam;
+ stringParam.SetString( &ptr );
+ iViewCommandHandle.ExecuteCommand(
+ EPhoneViewGetNumberFromEntry,
+ &stringParam );
+
+ return phoneNumber;
+ }
+
+// End of File