phoneapp/phoneuistates/src/cphonestatemachinegsm.cpp
branchRCL_3
changeset 61 41a7f70b3818
parent 58 40a3f856b14d
child 62 5266b1f337bd
equal deleted inserted replaced
58:40a3f856b14d 61:41a7f70b3818
     1 /*
     1 /*
     2 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). 
     2 * Copyright (c) 2005 Nokia Corporation and/or its subsidiary(-ies). 
     3 * All rights reserved.
     3 * All rights reserved.
     4 * This component and the accompanying materials are made available
     4 * This component and the accompanying materials are made available
     5 * under the terms of "Eclipse Public License v1.0"
     5 * under the terms of "Eclipse Public License v1.0"
     6 * which accompanies this distribution, and is available
     6 * which accompanies this distribution, and is available
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
    38 #include "cphonetwosinglesandwaiting.h"
    38 #include "cphonetwosinglesandwaiting.h"
    39 #include "cphoneconferenceandsingleandwaiting.h"
    39 #include "cphoneconferenceandsingleandwaiting.h"
    40 #include "cphoneemergency.h"
    40 #include "cphoneemergency.h"
    41 #include "cphoneconferenceandwaitingandcallsetup.h"
    41 #include "cphoneconferenceandwaitingandcallsetup.h"
    42 #include "cphoneidle.h"
    42 #include "cphoneidle.h"
       
    43 #include "cphoneincoming.h"
    43 #include "cphonestartup.h"
    44 #include "cphonestartup.h"
    44 #include "cphoneincoming.h"
       
    45 #include "cphonestartupsimlockui.h"
       
    46 #include "cphonepubsubproxy.h"
       
    47 #include <startupdomainpskeys.h>
       
    48 #include "phoneconstants.h"
       
    49 #include <featmgr.h>
       
    50 
    45 
    51 // ================= MEMBER FUNCTIONS =======================
    46 // ================= MEMBER FUNCTIONS =======================
    52 
    47 
    53 // -----------------------------------------------------------------------------
    48 // -----------------------------------------------------------------------------
    54 // CPhoneStateMachineGSM::CPhoneStateMachineGSM
    49 // CPhoneStateMachineGSM::CPhoneStateMachineGSM
    70 //
    65 //
    71 EXPORT_C CPhoneStateMachineGSM::~CPhoneStateMachineGSM()
    66 EXPORT_C CPhoneStateMachineGSM::~CPhoneStateMachineGSM()
    72     {
    67     {
    73     __LOGMETHODSTARTEND( EPhoneUIStates, "CPhoneStateMachineGSM::~CPhoneStateMachineGSM() ");
    68     __LOGMETHODSTARTEND( EPhoneUIStates, "CPhoneStateMachineGSM::~CPhoneStateMachineGSM() ");
    74     if( iEmergencyState )
    69     if( iEmergencyState )
    75 	    {
    70         {
    76 	    delete iEmergencyState;
    71         delete iEmergencyState;
    77 	    iEmergencyState = NULL;	    	
    72         iEmergencyState = NULL;         
    78 	    }
    73         }
    79     Dll::FreeTls();
    74     Dll::FreeTls();
    80     }
    75     }
    81 
    76 
    82 // ---------------------------------------------------------
    77 // ---------------------------------------------------------
    83 // CPhoneStateMachineGSM::State
    78 // CPhoneStateMachineGSM::State
   102         if ( deleteOldState )
    97         if ( deleteOldState )
   103             {
    98             {
   104             // Possible that derived class has been deleted iState,
    99             // Possible that derived class has been deleted iState,
   105             // so this delete statement may be useless.
   100             // so this delete statement may be useless.
   106             delete iState;
   101             delete iState;
   107             iState = NULL;	            		
   102             iState = NULL;                      
   108             }
   103             }
   109         
   104         
   110         // State transition need to be made - construct new state and
   105         // State transition need to be made - construct new state and
   111         // destruct old
   106         // destruct old
   112         switch( iNewStateId )
   107         switch( iNewStateId )
   113             {
   108             {
   114             case EPhoneStateCallSetup:
   109             case EPhoneStateCallSetup:
   115                 TRAP( err, iState = CPhoneCallSetup::NewL( 
   110                 TRAP( err, iState = CPhoneCallSetup::NewL( 
   116                 	this, iViewCommandHandle, iCustomization ));
   111                     this, iViewCommandHandle, iCustomization ));
   117                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   112                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   118                 madeStateTransition = ETrue;
   113                 madeStateTransition = ETrue;
   119                 break;
   114                 break;
   120                 
   115                 
   121             case EPhoneStateAlerting:
   116             case EPhoneStateAlerting:
   122                 TRAP( err, iState = CPhoneAlerting::NewL(
   117                 TRAP( err, iState = CPhoneAlerting::NewL(
   123                 	this, iViewCommandHandle, iCustomization ));
   118                     this, iViewCommandHandle, iCustomization ));
   124                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   119                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   125                 madeStateTransition = ETrue;
   120                 madeStateTransition = ETrue;
   126                 break;
   121                 break;
   127                 
   122                 
   128             case EPhoneStateSingle:
   123             case EPhoneStateSingle:
   129                 TRAP( err, iState = CPhoneSingleCall::NewL( 
   124                 TRAP( err, iState = CPhoneSingleCall::NewL( 
   130                 	this, iViewCommandHandle, iCustomization ));
   125                     this, iViewCommandHandle, iCustomization ));
   131                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   126                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   132                 madeStateTransition = ETrue;
   127                 madeStateTransition = ETrue;
   133                 break;
   128                 break;
   134                 
   129                 
   135             case EPhoneStateWaitingInSingle:
   130             case EPhoneStateWaitingInSingle:
   136                 TRAP( err, iState = CPhoneSingleAndWaiting::NewL( 
   131                 TRAP( err, iState = CPhoneSingleAndWaiting::NewL( 
   137                 	this, iViewCommandHandle, iCustomization ));
   132                     this, iViewCommandHandle, iCustomization ));
   138                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   133                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   139                 madeStateTransition = ETrue;
   134                 madeStateTransition = ETrue;
   140                 break;
   135                 break;
   141                 
   136                 
   142             case EPhoneStateTwoSingles:
   137             case EPhoneStateTwoSingles:
   143                 TRAP( err, iState = CPhoneTwoSingles::NewL( 
   138                 TRAP( err, iState = CPhoneTwoSingles::NewL( 
   144                 	this, iViewCommandHandle, iCustomization ));
   139                     this, iViewCommandHandle, iCustomization ));
   145                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   140                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   146                 madeStateTransition = ETrue;
   141                 madeStateTransition = ETrue;
   147                 break;
   142                 break;
   148                 
   143                 
   149             case EPhoneStateCallSetupInSingle:
   144             case EPhoneStateCallSetupInSingle:
   150                 TRAP( err, iState = CPhoneSingleAndCallSetup::NewL( 
   145                 TRAP( err, iState = CPhoneSingleAndCallSetup::NewL( 
   151                 	this, iViewCommandHandle, iCustomization ));
   146                     this, iViewCommandHandle, iCustomization ));
   152                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   147                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   153                 madeStateTransition = ETrue;
   148                 madeStateTransition = ETrue;
   154                 break;
   149                 break;
   155                 
   150                 
   156             case EPhoneStateAlertingInSingle:
   151             case EPhoneStateAlertingInSingle:
   157                 TRAP( err, iState = CPhoneSingleAndAlerting::NewL( 
   152                 TRAP( err, iState = CPhoneSingleAndAlerting::NewL( 
   158                 	this, iViewCommandHandle, iCustomization ));
   153                     this, iViewCommandHandle, iCustomization ));
   159                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   154                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   160                 madeStateTransition = ETrue;
   155                 madeStateTransition = ETrue;
   161                 break;
   156                 break;
   162                 
   157                 
   163             case EPhoneStateConference:
   158             case EPhoneStateConference:
   164                 TRAP( err, iState = CPhoneConference::NewL( 
   159                 TRAP( err, iState = CPhoneConference::NewL( 
   165                 	this, iViewCommandHandle, iCustomization ));
   160                     this, iViewCommandHandle, iCustomization ));
   166                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   161                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   167                 madeStateTransition = ETrue;
   162                 madeStateTransition = ETrue;
   168                 break;
   163                 break;
   169                 
   164                 
   170             case EPhoneStateConferenceAndCallSetup:
   165             case EPhoneStateConferenceAndCallSetup:
   171                 TRAP( err, iState = CPhoneConferenceAndCallSetup::NewL( 
   166                 TRAP( err, iState = CPhoneConferenceAndCallSetup::NewL( 
   172                 	this, iViewCommandHandle, iCustomization ) );
   167                     this, iViewCommandHandle, iCustomization ) );
   173                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   168                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   174                 madeStateTransition = ETrue;
   169                 madeStateTransition = ETrue;
   175                 break;
   170                 break;
   176  
   171  
   177             case EPhoneStateConferenceAndSingle:
   172             case EPhoneStateConferenceAndSingle:
   178                 TRAP( err, iState = CPhoneConferenceAndSingle::NewL( 
   173                 TRAP( err, iState = CPhoneConferenceAndSingle::NewL( 
   179                 	this, iViewCommandHandle, iCustomization ) );
   174                     this, iViewCommandHandle, iCustomization ) );
   180                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   175                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   181                 madeStateTransition = ETrue;
   176                 madeStateTransition = ETrue;
   182                 break;
   177                 break;
   183                 
   178                 
   184             case EPhoneStateConferenceAndWaiting:
   179             case EPhoneStateConferenceAndWaiting:
   185                 TRAP( err, iState = CPhoneConferenceAndWaiting::NewL( 
   180                 TRAP( err, iState = CPhoneConferenceAndWaiting::NewL( 
   186                 	this, iViewCommandHandle, iCustomization ) );
   181                     this, iViewCommandHandle, iCustomization ) );
   187                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   182                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   188                 madeStateTransition = ETrue;
   183                 madeStateTransition = ETrue;
   189                 break;
   184                 break;
   190                 
   185                 
   191             case EPhoneStateSingleAndCallSetupAndWaiting:
   186             case EPhoneStateSingleAndCallSetupAndWaiting:
   192                 TRAP( err, iState = CPhoneSingleAndCallSetupAndWaiting::NewL( 
   187                 TRAP( err, iState = CPhoneSingleAndCallSetupAndWaiting::NewL( 
   193                 	this, iViewCommandHandle, iCustomization ) );
   188                     this, iViewCommandHandle, iCustomization ) );
   194                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   189                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   195                 madeStateTransition = ETrue;
   190                 madeStateTransition = ETrue;
   196                 break;
   191                 break;
   197                 
   192                 
   198             case EPhoneStateCallSetupAndWaiting:
   193             case EPhoneStateCallSetupAndWaiting:
   199                 TRAP( err, iState = CPhoneCallSetupAndWaiting::NewL( 
   194                 TRAP( err, iState = CPhoneCallSetupAndWaiting::NewL( 
   200                 	this, iViewCommandHandle, iCustomization ) );
   195                     this, iViewCommandHandle, iCustomization ) );
   201                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   196                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   202                 madeStateTransition = ETrue;
   197                 madeStateTransition = ETrue;
   203                 break;
   198                 break;
   204 
   199 
   205             case EPhoneStateTwoSinglesAndWaiting:
   200             case EPhoneStateTwoSinglesAndWaiting:
   206                 TRAP( err, iState = CPhoneTwoSinglesAndWaiting::NewL( 
   201                 TRAP( err, iState = CPhoneTwoSinglesAndWaiting::NewL( 
   207                 	this, iViewCommandHandle, iCustomization ) );
   202                     this, iViewCommandHandle, iCustomization ) );
   208                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   203                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   209                 madeStateTransition = ETrue;
   204                 madeStateTransition = ETrue;
   210                 break;
   205                 break;
   211                 
   206                 
   212             case EPhoneStateConferenceAndSingleAndWaiting:
   207             case EPhoneStateConferenceAndSingleAndWaiting:
   213                 TRAP( err, iState = CPhoneConferenceAndSingleAndWaiting::NewL( 
   208                 TRAP( err, iState = CPhoneConferenceAndSingleAndWaiting::NewL( 
   214                 	this, iViewCommandHandle, iCustomization ));
   209                     this, iViewCommandHandle, iCustomization ));
   215                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   210                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   216                 madeStateTransition = ETrue;
   211                 madeStateTransition = ETrue;
   217                 break;
   212                 break;
   218                 
   213                 
   219             case EPhoneStateEmergency:
   214             case EPhoneStateEmergency:
   220                 if( !iEmergencyStateConstructed )
   215                 if( !iEmergencyStateConstructed )
   221 	                {
   216                     {
   222 	                TRAP( err, iEmergencyState = CPhoneEmergency::NewL( 
   217                     TRAP( err, iEmergencyState = CPhoneEmergency::NewL( 
   223 	                	this, iViewCommandHandle, iCustomization ) );
   218                         this, iViewCommandHandle, iCustomization ) );
   224 	                __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );						                	
   219                     __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );                                          
   225 					iEmergencyStateConstructed = ETrue;
   220                     iEmergencyStateConstructed = ETrue;
   226 	                }
   221                     }
   227                 static_cast< CPhoneEmergency* >( iEmergencyState )->
   222                 static_cast< CPhoneEmergency* >( iEmergencyState )->
   228                     SetStartupInterrupted( iOldStateId == EPhoneStateStartup );
   223                     SetStartupInterrupted( iOldStateId == EPhoneStateStartup );
   229 				iState = iEmergencyState;
   224                 iState = iEmergencyState;
   230                 madeStateTransition = ETrue;
   225                 madeStateTransition = ETrue;
   231                 break;
   226                 break;
   232                 
   227                 
   233             case EPhoneStateConferenceAndWaitingAndCallSetup:
   228             case EPhoneStateConferenceAndWaitingAndCallSetup:
   234                 TRAP( err, iState = 
   229                 TRAP( err, iState = 
   235           			CPhoneConferenceAndWaitingAndCallSetup::NewL( 
   230                     CPhoneConferenceAndWaitingAndCallSetup::NewL( 
   236           				this, iViewCommandHandle, iCustomization ) );
   231                         this, iViewCommandHandle, iCustomization ) );
   237                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   232                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   238                 madeStateTransition = ETrue;
   233                 madeStateTransition = ETrue;
   239                 break;
   234                 break;
   240                 
   235                 
   241             case EPhoneStateIdle:
   236             case EPhoneStateIdle:
   242             	if ( iOldStateId != EPhoneStateEmergency )
   237                 if ( iOldStateId != EPhoneStateEmergency )
   243 	            	{
   238                     {
   244                     if( !iEmergencyStateConstructed )
   239                     if( !iEmergencyStateConstructed )
   245 	                    {
   240                         {
   246 	                    TRAP( err, iEmergencyState = CPhoneEmergency::NewL( 
   241                         TRAP( err, iEmergencyState = CPhoneEmergency::NewL( 
   247 	                    	this, iViewCommandHandle, iCustomization ) );
   242                             this, iViewCommandHandle, iCustomization ) );
   248 	                    __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );						                	
   243                         __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );                                          
   249 					    iEmergencyStateConstructed = ETrue;
   244                         iEmergencyStateConstructed = ETrue;
   250 	                    }
   245                         }
   251 	            	}
   246                     }
   252 	            if( iIdleState == NULL )
   247                 if( iIdleState == NULL )
   253 		            {
   248                     {
   254 	                TRAP( err, iIdleState = 
   249                     TRAP( err, iIdleState = 
   255 	          			CPhoneIdle::NewL( this, iViewCommandHandle, iCustomization ) );
   250                         CPhoneIdle::NewL( this, iViewCommandHandle, iCustomization ) );
   256 	                __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   251                     __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   257 		            }
   252                     }
   258 				iState = iIdleState;
   253                 iState = iIdleState;
   259                 madeStateTransition = ETrue;
   254                 madeStateTransition = ETrue;
   260                 break;
   255                 break;
   261                 
   256                 
   262             case EPhoneStateIncoming:
   257             case EPhoneStateIncoming:
   263                 TRAP( err, iState = 
   258                 TRAP( err, iState = 
   264           			CPhoneIncoming::NewL( this, iViewCommandHandle, iCustomization ) );
   259                     CPhoneIncoming::NewL( this, iViewCommandHandle, iCustomization ) );
   265                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   260                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   266                 madeStateTransition = ETrue;
   261                 madeStateTransition = ETrue;
   267                 break;
   262                 break;
   268 
   263 
   269             case EPhoneStateStartup:
   264             case EPhoneStateStartup:
   270             	
   265                 TRAP( err, iState = 
   271                 if( IsSimlockStartupStateCreated() )
   266                     CPhoneStartup::NewL( this, iViewCommandHandle, 
   272                     {
   267                     iOldStateId == EPhoneStateEmergency ) );
   273                     TRAP( err, iState =
       
   274                         CPhoneStartupSimlockUi::NewL( this, iViewCommandHandle,
       
   275                             iOldStateId == EPhoneStateEmergency ) );
       
   276                     }
       
   277                 else
       
   278                     {
       
   279                     TRAP( err, iState =
       
   280                         CPhoneStartup::NewL( this, iViewCommandHandle,
       
   281                             iOldStateId == EPhoneStateEmergency ) );
       
   282                     }
       
   283 
       
   284                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   268                 __ASSERT_ALWAYS( KErrNone == err, User::Invariant() );
   285                 madeStateTransition = ETrue;
   269                 madeStateTransition = ETrue;
   286                 break;
   270                 break;
   287 
   271 
   288             default:
   272             default:
   293 
   277 
   294     if ( madeStateTransition )
   278     if ( madeStateTransition )
   295         {
   279         {
   296         __PHONELOGSTATECHANGE( iOldStateId, iNewStateId );
   280         __PHONELOGSTATECHANGE( iOldStateId, iNewStateId );
   297         iOldStateId = iNewStateId;
   281         iOldStateId = iNewStateId;
   298         
       
   299         // Needs to be set or any attempts to access eikon env handle
       
   300         // will fail
       
   301         iState->SetEikonEnv( EikonEnv() );
       
   302         }
   282         }
   303 
   283 
   304     return iState;
   284     return iState;
   305     }
   285     }
   306 
       
   307 
       
   308 // -----------------------------------------------------------
       
   309 // CPhoneStateMachineGSM::IsSimlockStartupStateCreated
       
   310 // -----------------------------------------------------------
       
   311 //
       
   312 TBool CPhoneStateMachineGSM::IsSimlockStartupStateCreated() const
       
   313     {
       
   314     if ( FeatureManager::FeatureSupported( KFeatureIdFfSimlockUi ) )
       
   315         {
       
   316         TInt securityStatus =
       
   317                 CPhonePubSubProxy::Instance()->Value(
       
   318                         KPSUidStartup, KStartupSimSecurityStatus );
       
   319         if ( securityStatus == ESimUnaccepted )
       
   320             {
       
   321             return ETrue;
       
   322             }
       
   323         }
       
   324 
       
   325     return EFalse;
       
   326     }
       
   327 
       
   328 
   286 
   329 // -----------------------------------------------------------
   287 // -----------------------------------------------------------
   330 // CPhoneStateMachineGSM::NewL()
   288 // CPhoneStateMachineGSM::NewL()
   331 // Constructor
   289 // Constructor
   332 // (other items were commented in a header).
   290 // (other items were commented in a header).