phoneapp/phoneuivoipextension/src/cphonevcchandler.cpp
changeset 37 ba76fc04e6c2
child 51 f39ed5e045e0
child 53 22cc52eade9b
--- /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 <StringLoader.h>
+#include <avkon.rsg>
+#include <mpeengineinfo.h>
+#include <eikmenup.h>
+#include <vccuipsproperty.h>
+#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 <spproperty.h>
+#include <spsettings.h>
+#include <spentry.h>
+#include <spdefinitions.h>
+
+
+// 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<CTelMenuExtension::TCallInfo>& 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<CPhoneVccHandler*>( 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<TServiceId> 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