phoneapp/phoneuivoipextension/src/cphonestatesinglevoip.cpp
changeset 0 5f000ab63145
child 9 8871b09be73b
child 21 92ab7f8d0eab
--- /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 <StringLoader.h>
+#include <avkon.rsg>
+#include <mpeengineinfo.h>
+#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<CPhoneStateMachineVoIP&>( 
+        *iStateMachine ).StateUtils();
+    }
+
+// End of File