diff -r 000000000000 -r 5f000ab63145 phoneapp/phoneuivoipextension/src/cphonestatesinglevoip.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/phoneapp/phoneuivoipextension/src/cphonestatesinglevoip.cpp Mon Jan 18 20:18:27 2010 +0200 @@ -0,0 +1,387 @@ +/* +* Copyright (c) 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: Implementation of CPhoneStateSingleVoIP class. +* +*/ + + +// INCLUDES +#include +#include +#include +#include "cphonestatesinglevoip.h" +#include "phonelogger.h" +#include "cphonecustomizationvoip.h" + +#include "phoneappvoipcommands.hrh" +#include "tphonecmdparaminteger.h" +#include "tphonecmdparamboolean.h" +#include "tphonecmdparamstring.h" +#include "cphonemainresourceresolver.h" +#include "phonerssvoip.h" + +#include "tphonecmdparamselector.h" +#include "mphonestatemachine.h" +#include "tphonecmdparamcustomdialer.h" +#include "cphonetransferdialercontroller.h" +#include "tphonecmdparamquery.h" +#include "tphonecmdparamglobalnote.h" +#include "cphonestateutilsvoip.h" +#include "cphonestatemachinevoip.h" + +// ================= MEMBER FUNCTIONS ======================= + +// C++ default constructor can NOT contain any code, that +// might leave. +// +CPhoneStateSingleVoIP::CPhoneStateSingleVoIP( + MPhoneStateMachine& aStateMachine, + MPhoneViewCommandHandle& aViewCommandHandle, + MPhoneCustomization& aCustomization ) : + CPhoneSingleCall( &aStateMachine, &aViewCommandHandle, &aCustomization ) + { + } + +// ----------------------------------------------------------- +// CPhoneStateSingleVoIP::~CPhoneStateSingleVoIP() +// Destructor +// (other items were commented in a header). +// ----------------------------------------------------------- + +CPhoneStateSingleVoIP::~CPhoneStateSingleVoIP() + { + } + +// ----------------------------------------------------------- +// CPhoneStateSingleVoIP::ConstructL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +void CPhoneStateSingleVoIP::ConstructL() + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneStateSingleVoIP::ConstructL()" ) + CPhoneSingleCall::ConstructL(); + } + +// ----------------------------------------------------------- +// CPhoneStateSingleVoIP::NewL() +// Constructor +// (other items were commented in a header). +// ----------------------------------------------------------- +// +CPhoneStateSingleVoIP* CPhoneStateSingleVoIP::NewL( + MPhoneStateMachine& aStateMachine, + MPhoneViewCommandHandle& aViewCommandHandle, + MPhoneCustomization& aCustomization ) + { + CPhoneStateSingleVoIP* self = new (ELeave) + CPhoneStateSingleVoIP( aStateMachine, aViewCommandHandle, aCustomization ); + + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop( self ); + + return self; + } + +// ----------------------------------------------------------- +// CPhoneStateSingleVoIP::HandlePhoneEngineMessageL +// ----------------------------------------------------------- +// +void CPhoneStateSingleVoIP::HandlePhoneEngineMessageL( + const TInt aMessage, + TInt aCallId ) + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneStateSingleVoIP::HandlePhoneEngineMessageL() ") + switch ( aMessage ) + { + case MEngineMonitor::EPEMessageUnattendedTransferRequest: + LaunchUnattendedTransferAcceptanceQueryL(); + break; + default: + CPhoneSingleCall::HandlePhoneEngineMessageL( + aMessage, aCallId ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneStateSingleVoIP::HandleCommandL +// ----------------------------------------------------------- +// +TBool CPhoneStateSingleVoIP::HandleCommandL( TInt aCommand ) + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneStateSingleVoIP::HandleCommandL()" ) + + TBool commandStatus( ETrue ); + + switch( aCommand ) + { + case EPhoneNumberAcqCmdInternetCall: + StateUtils().SelectServiceAndDialL(); + break; + + case EPhoneNumberAcqCmdSendCommand: + StartCallingL(); + break; + + case EPhoneCmdAcceptUnattendedTransfer: + HandleUnattendedTransferRequestResponseL( ETrue ); + break; + + case EPhoneCmdRejectUnattendedTransfer: + HandleUnattendedTransferRequestResponseL( EFalse ); + break; + default: + commandStatus = CPhoneSingleCall::HandleCommandL( aCommand ); + break; + } + + return commandStatus; + } + +// ----------------------------------------------------------- +// CPhoneStateIdleVoIP::HandleKeyMessageL +// ----------------------------------------------------------- +// +void CPhoneStateSingleVoIP::HandleKeyMessageL( + TPhoneKeyEventMessages aMessage, + TKeyCode aKeyCode ) + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneStateSingleVoIP::HandleKeyMessageL()" ) + switch ( aKeyCode ) + { + // send-key + case EKeyYes: + { + TPhoneCmdParamInteger numberEntryCountParam; + iViewCommandHandle->ExecuteCommandL( EPhoneViewGetNumberEntryCount, + &numberEntryCountParam ); + TInt neLength( numberEntryCountParam.Integer() ); + + if( IsNumberEntryVisibleL() && neLength ) + { + if ( IsOnScreenDialerSupported() && + ( IsDTMFEditorVisibleL() || + IsCustomizedDialerVisibleL() ) ) + { + return; + } + + StartCallingL(); + } + else + { + //Calls ToggleHoldL, if number entry isn't used. + CPhoneSingleCall::HandleKeyMessageL( aMessage, aKeyCode ); + } + } + break; + + default: + CPhoneSingleCall::HandleKeyMessageL( aMessage, aKeyCode ); + break; + } + } + +// ----------------------------------------------------------- +// CPhoneStateSingleVoIP::StartCallingL +// ----------------------------------------------------------- +// +void CPhoneStateSingleVoIP::StartCallingL() + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneStateSingleVoIP::StartCallingL()" ) + + TUint serviceId( 0 ); + CPhoneStateUtilsVoip& utililty = StateUtils(); + if ( utililty.IsVoipPreferredCall( serviceId ) ) + { + utililty.SelectServiceAndDialL( KNullDesC, serviceId ); + } + else + { + if ( utililty.IsVoipNumber() ) + { + utililty.SelectServiceAndDialL(); + } + else + { + if ( IsNumberEntryUsedL() ) + { + // handle send key short press + HBufC* phoneNumber = PhoneNumberFromEntryLC(); + + if ( !IsSimOk() ) + { + iStateMachine->PhoneEngineInfo()->SetPhoneNumber( + *phoneNumber ) ; + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageCheckEmergencyNumber ); + CleanupStack::PopAndDestroy( phoneNumber ); + return; + } + + // call the number + iStateMachine->PhoneEngineInfo()->SetPhoneNumber( + *phoneNumber ); + DialVoiceCallL(); + + CleanupStack::PopAndDestroy( phoneNumber ); + } + } + } + } + +// ----------------------------------------------------------- +// CPhoneStateSingleVoIP::LaunchUnattendedTransferAcceptanceQueryL +// Dialog is constructed based on S60 In-Call Operations UI Specification, +// Section 2.26. +// ----------------------------------------------------------- +// +void CPhoneStateSingleVoIP::LaunchUnattendedTransferAcceptanceQueryL() + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneStateSingleVoIP::LaunchUnattendedTransferAcceptanceQueryL() ") + + TPhoneCmdParamQuery queryParam; + queryParam.SetQueryType( EPhoneGlobalMsgQuery ); + queryParam.SetCommandParamId( + TPhoneCommandParam::EPhoneParamIdUnattendedTransferAcceptanceQuery ); + + HBufC* msgHeader = + StringLoader::LoadLC( CPhoneMainResourceResolver::Instance()-> + ResolveResourceID( + EPhoneVoIPUnattendedTransferAcceptanceQueryHeader ) ); + queryParam.SetQueryPrompt( *msgHeader ); + + RBuf queryText; + CleanupClosePushL( queryText ); + ResolveUnattendedTransferAcceptanceQueryDialogTextL( queryText ); + queryParam.SetDataText( &queryText ); + + queryParam.SetDefaultCba( R_AVKON_SOFTKEYS_ACCEPT_REJECT ); + + const TInt KAcceptTransferQueryTimeoutInSec = 7; + queryParam.SetTimeOut( KAcceptTransferQueryTimeoutInSec ); + + queryParam.SetTone( EAvkonSIDDefaultSound ); + + // configure custom command mappings for user responses + queryParam.SetCbaCommandMapping( + EAknSoftkeyYes, EPhoneCmdAcceptUnattendedTransfer ); + queryParam.SetCbaCommandMapping( + EAknSoftkeyOk, EPhoneCmdAcceptUnattendedTransfer ); + queryParam.SetCbaCommandMapping( + EAknSoftkeyNo, EPhoneCmdRejectUnattendedTransfer ); + queryParam.SetCbaCommandMapping( + EAknSoftkeyCancel, EPhoneCmdRejectUnattendedTransfer ); + queryParam.SetCustomCommandForTimeOut( EPhoneCmdRejectUnattendedTransfer ); + + iViewCommandHandle->ExecuteCommandL( EPhoneViewShowQuery, &queryParam ); + + CleanupStack::PopAndDestroy( &queryText ); + CleanupStack::PopAndDestroy( msgHeader ); + } + + +// ----------------------------------------------------------- +// CPhoneStateSingleVoIP::ResolveUnattendedTransferAcceptanceQueryDialogTextL +// ----------------------------------------------------------- +// +void CPhoneStateSingleVoIP::ResolveUnattendedTransferAcceptanceQueryDialogTextL( + RBuf& aQueryText ) const + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneStateSingleVoIP::ResolveUnattendedTransferAcceptanceQueryDialogTextL") + + aQueryText.Close(); + + MPEEngineInfo* info = iStateMachine->PhoneEngineInfo(); + const TPEPhoneNumber& transferorAddr = info->RemotePhoneNumber( CallId() ); + const TPEPhoneNumber& transferTarget = + info->UnattendedTransferTarget( CallId() ); + + if ( KNullDesC() == transferorAddr ) + { + // transfer initiator is anonymous + aQueryText.Assign( StringLoader::LoadL( + CPhoneMainResourceResolver::Instance()->ResolveResourceID( + EPhoneVoIPUnattendedTransferAcceptanceQueryAnonymous ), + transferTarget ) ); + } + else + { + const TInt KGranularity = 2; + CDesCArrayFlat* array = new ( ELeave ) CDesCArrayFlat( KGranularity ); + CleanupStack::PushL( array ); + array->AppendL( transferorAddr ); + array->AppendL( transferTarget ); + aQueryText.Assign( StringLoader::LoadL( + CPhoneMainResourceResolver::Instance()->ResolveResourceID( + EPhoneVoIPUnattendedTransferAcceptanceQueryIdentified ), + *array ) ); + CleanupStack::PopAndDestroy( array ); + } + } + + +// ----------------------------------------------------------- +// CPhoneStateSingleVoIP::HandleUnattendedTransferRequestResponseL +// ----------------------------------------------------------- +// +void CPhoneStateSingleVoIP::HandleUnattendedTransferRequestResponseL( + TBool aRequestAccepted ) + { + __LOGMETHODSTARTEND( PhoneUIVoIPExtension, + "CPhoneStateSingleVoIP::HandleUnattendedTransferRequestResponseL" ) + + iStateMachine->SetCallId( CallId() ); + + if ( aRequestAccepted ) + { + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageAcceptUnattendedTransfer ); + MPEEngineInfo* info = iStateMachine->PhoneEngineInfo(); + const TPEPhoneNumber& transferTarget = + info->UnattendedTransferTarget( CallId() ); + + TUint32 serviceId = iStateMachine->PhoneEngineInfo()-> + ServiceId( CallId() ); + StateUtils().SelectServiceAndDialL( transferTarget, serviceId ); + } + else + { + iStateMachine->SendPhoneEngineMessage( + MPEPhoneModel::EPEMessageRejectUnattendedTransfer ); + } + } + + +// ----------------------------------------------------------- +// CPhoneStateSingleVoIP::StateUtils +// ----------------------------------------------------------- +// +CPhoneStateUtilsVoip& CPhoneStateSingleVoIP::StateUtils() + { + return static_cast( + *iStateMachine ).StateUtils(); + } + +// End of File