phoneuis/TelephonyDeviceMode/src/CTelDMCommandHandler.cpp
changeset 37 ba76fc04e6c2
child 51 f39ed5e045e0
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/phoneuis/TelephonyDeviceMode/src/CTelDMCommandHandler.cpp	Fri Jun 04 10:19:18 2010 +0100
@@ -0,0 +1,266 @@
+/*
+* Copyright (c) 2006 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 the CTelDMCommandHandler class.
+*
+*/
+
+
+
+// INCLUDE FILES
+
+#include    <mphonedevicemodeobserver.h>
+#include    <PSVariables.h>
+#include    <ctsydomainpskeys.h>
+
+#include    "cteldmcommandhandler.h"
+#include    "cteldmcallstatelistener.h"
+#include    "mteldmaccessory.h"
+#include    "cteldmdebug.h"
+#include     <coreapplicationuisdomainpskeys.h>
+
+// MODULE DATA STRUCTURES
+ 
+// ============================ MEMBER FUNCTIONS ===============================
+ 
+// -----------------------------------------------------------------------------
+// CTelDMCommandHandler::NewL
+// 
+// -----------------------------------------------------------------------------
+//  
+CTelDMCommandHandler* CTelDMCommandHandler::NewL( 
+                                    MPhoneDeviceModeObserver& aCallHandler, 
+                                    MTelDMAccessory& aAccessory ) 
+    {
+    CTelDMCommandHandler* self =
+        new ( ELeave ) CTelDMCommandHandler( aCallHandler, 
+                                                aAccessory );
+    CleanupStack::PushL( self );
+    self->ConstructL();
+    CleanupStack::Pop( self );
+    return self;
+    }
+
+
+// -----------------------------------------------------------------------------
+// CTelDMCommandHandler::CTelDMCommandHandler
+// 
+// -----------------------------------------------------------------------------
+//
+CTelDMCommandHandler::CTelDMCommandHandler( 
+                                    MPhoneDeviceModeObserver& aCallHandler, 
+                                    MTelDMAccessory& aAccessory ):
+    iCallHandler( aCallHandler ),
+    iAccessory ( aAccessory ),
+    iGripOpen ( EFalse ),
+    iGripOpenOnRingingState ( EFalse )
+    {
+    }
+
+// -----------------------------------------------------------------------------
+// CTelDMCommandHandler::~CTelDMCommandHandler
+// 
+// -----------------------------------------------------------------------------
+//
+CTelDMCommandHandler::~CTelDMCommandHandler()
+    {
+    iKeyLock.Close();
+    }
+
+// -----------------------------------------------------------------------------
+// CTelDMCommandHandler::ConstructL
+// 
+// -----------------------------------------------------------------------------
+//    
+void CTelDMCommandHandler::ConstructL()
+    { 
+    User::LeaveIfError( iKeyLock.Connect() );                             
+    }
+
+// -----------------------------------------------------------------------------
+// CTelDMCommandHandler::CallStateChanged()
+// 
+// -----------------------------------------------------------------------------
+//    
+void CTelDMCommandHandler::CallStateChangedL( TInt aCallState )
+    {
+    FLOG( _L( "CTelDMCommandHandler::CallStateChanged<" ) )
+    FTRACE( FPrint( _L( "CTelDMCommandHandler::CallStateChangedL.aCallState=%d"), 
+                                                                aCallState ))
+    iCallState = aCallState;                                                            
+    switch( aCallState )
+        {  
+        // Arriving call                    
+        case EPSCTsyCallStateRinging: 
+            FLOG( _L( "CTelDMCommandHandler::CallStateChanged.Ringing" ) )
+            RProperty::Set( KPSUidCoreApplicationUIs,
+                            KCoreAppUIsSoftReject,
+                            ECoreAppUIsSoftRejectUninitialized );
+            iGripOpenOnRingingState = iGripOpen;
+            break;
+        // Answered
+        case EPSCTsyCallStateConnected:  
+            {   
+            FLOG( _L( "CTelDMCommandHandler::CallStateChanged.Connected" ) )
+            if ( iGripOpenOnRingingState )
+                {
+                OfferKeyLock(); 
+                }
+            
+            // Clear the flag.
+            iGripOpenOnRingingState = EFalse;
+            }
+            break;
+        // Disconnected 
+        case EPSCTsyCallStateNone:
+            {
+            FLOG( _L( "CTelDMCommandHandler::CallStateChanged.None" ) )
+            if ( iGripOpenOnRingingState )
+                {
+                OfferKeyLock(); 
+                }           
+            }
+            break; 
+        default:
+            break;
+        }     
+    FLOG( _L( "CTelDMCommandHandler::CallStateChanged>" ) )  
+    }
+// -----------------------------------------------------------------------------
+// CTelDMCommandHandler::HandleEvent
+// 
+// -----------------------------------------------------------------------------
+//    
+void CTelDMCommandHandler::HandleCommand( TCommands aCommand )
+    {           
+    FLOG( _L( "CTelDMCommandHandler::HandleCommand<" ) ) 
+    switch( aCommand )
+        {                      
+        case EGripOpen:
+            {
+            FLOG( _L( "CTelDMCommandHandler::HandleCommand.Open" ) ) 
+            iGripOpen = ETrue;
+            if ( !IsSoftRejectOngoing() )
+                {
+                iCallHandler.Answer();
+                }
+            }
+            break;
+        // Do not end calls if accessory is connected. 
+        case EGripClose:
+            {
+            FLOG( _L( "CTelDMCommandHandler::HandleCommand.Close" ) ) 
+            iGripOpen = EFalse;
+            EndCalls();
+            break;
+            }
+        default:
+            break;
+        }  
+    FLOG( _L( "CTelDMCommandHandler::HandleCommand>" ) )      
+    }
+    
+// -----------------------------------------------------------------------------
+// CTelDMCommandHandler::EndCalls
+// 
+// -----------------------------------------------------------------------------
+//    
+void CTelDMCommandHandler::EndCalls()
+
+    {
+    if ( IsEmergencyCall() )
+        {
+        // None
+        }
+    else if ( iAccessory.IsAccessoryAttached()  &&
+              !iAccessory.IsAnyActiveAccessory() &&
+              iCallState == EPSCTsyCallStateConnected )
+        {
+        FLOG( _L( "CTelDMCommandHandler::EndCalls#1" ) )
+        iCallHandler.EndVoiceCalls();
+        }
+    else if ( !iAccessory.IsAccessoryAttached() )
+        {
+        FLOG( _L( "CTelDMCommandHandler::EndCalls#2" ) )
+        iCallHandler.EndVoiceCalls();
+        }
+    }
+// -----------------------------------------------------------------------------
+// CTelDMCommandHandler::OfferKeyLock
+//
+// -----------------------------------------------------------------------------
+//
+void CTelDMCommandHandler::OfferKeyLock()
+
+    {
+    //- AudioAccessory attached (BT headset, Wired headset etc.)
+    //- Arriving call and grip open.  
+    //- Call terminated or answered  
+    //-> KeyLock query is shown if not locked       
+    if ( iAccessory.IsAccessoryAttached() && 
+                                       !iGripOpen && 
+                                       !iKeyLock.IsKeyLockEnabled() )
+        {
+        FLOG( _L( "CTelDMCommandHandler::CallStateChanged -lock?" ) ) 
+        //Lock keypad ?
+        iKeyLock.OfferKeyLock();
+        }  
+    }
+
+// ---------------------------------------------------------
+// CTelDMCommandHandler::IsEmergencyCall
+// ---------------------------------------------------------
+//
+TBool CTelDMCommandHandler::IsEmergencyCall() const
+    {
+    FLOG( _L( "CTelDMCommandHandler::IsEmergencyCall" ) ) 
+    TBool retVal( EFalse );
+    TInt err( KErrNone );
+    TInt state( 0 );
+    
+    err = RProperty::Get(
+            KPSUidCtsyEmergencyCallInfo,
+            KCTSYEmergencyCallInfo,
+            state );
+    
+    if ( err == KErrNone && state )
+        {
+        retVal = ETrue;            
+        }
+    return retVal;
+    }
+
+// ---------------------------------------------------------
+// CTelDMCommandHandler::IsSoftRejectOngoing
+// ---------------------------------------------------------
+//
+TBool CTelDMCommandHandler::IsSoftRejectOngoing() const
+    {
+    FLOG( _L( "CTelDMCommandHandler::IsSoftRejectOngoing" ) )
+    TBool retVal( EFalse );
+    TInt err( KErrNone );
+    TInt state( 0 );
+        
+    err = RProperty::Get(
+            KPSUidCoreApplicationUIs,
+            KCoreAppUIsSoftReject,
+            state );
+    
+    if ( err == KErrNone && state == ECoreAppUIsSoftReject )
+        {
+        retVal = ETrue;            
+        }
+    return retVal;
+    }
+
+// End of File