convergedcallengine/cce/src/ccceemergencycall.cpp
changeset 0 ff3b6d0fd310
equal deleted inserted replaced
-1:000000000000 0:ff3b6d0fd310
       
     1 /*
       
     2 * Copyright (c) 2006-2008 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Base class of emergency call object
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 //  INCLUDE FILES
       
    20 #include <mccpcall.h>
       
    21 #include "cconvergedcallprovider.h"
       
    22 #include "mccecallobserver.h"
       
    23 #include "ccceemergencycall.h"
       
    24 #include "cccecallcontainer.h"
       
    25 #include "ccce.h"
       
    26 #include "cccelogger.h"
       
    27 #include "ccceutility.h"
       
    28 #include "mccpcscall.h"
       
    29 #include "cccedurationtimer.h"
       
    30 #include "tccecallindex.h"
       
    31 
       
    32 
       
    33 // ======== MEMBER FUNCTIONS ========
       
    34 // ---------------------------------------------------------------------------
       
    35 // Constructor
       
    36 // ---------------------------------------------------------------------------
       
    37 //
       
    38 
       
    39 CCCEEmergencyCall::CCCEEmergencyCall(CCCECallContainer& aCallContainer, 
       
    40                                      CCCEPluginManager& aPluginManager ):
       
    41                                      CActive(EPriorityNormal), iCallContainer(aCallContainer), 
       
    42                                      iPluginManager(aPluginManager),
       
    43                                      iCallIndex( KInvalidCallIndex )
       
    44     {
       
    45     }
       
    46     
       
    47 // ---------------------------------------------------------------------------
       
    48 // Construct object
       
    49 // ---------------------------------------------------------------------------
       
    50 //
       
    51 void CCCEEmergencyCall::ConstructL()
       
    52     {
       
    53     CActiveScheduler::Add(this);
       
    54     iIsInProgress = EFalse;
       
    55     
       
    56     iExitCode = KErrNone;
       
    57     iCallParameters = CCCECallParameters::NewL();
       
    58     iCallParameters->SetCallType( CCPCall::ECallTypeCSVoice );
       
    59     iCallParameters->SetServiceId(0);
       
    60     
       
    61     iCCEDurationTimer = CCCEDurationTimer::NewL();
       
    62     iObserver = CCCECallObserverAsynchroniser::NewL();
       
    63     
       
    64     // TODO iStartTime = set starting time ...
       
    65     }
       
    66 
       
    67 
       
    68 // ---------------------------------------------------------------------------
       
    69 // Default Symbian constructor
       
    70 // ---------------------------------------------------------------------------
       
    71 //
       
    72 CCCEEmergencyCall* CCCEEmergencyCall::NewL(CCCECallContainer& aCallContainer,
       
    73                                            CCCEPluginManager& aPluginManager )
       
    74     {
       
    75     CCCEEmergencyCall* self = CCCEEmergencyCall::NewLC(aCallContainer, aPluginManager);
       
    76     CleanupStack::Pop( self );
       
    77     return self;
       
    78     }
       
    79 
       
    80 
       
    81 // ---------------------------------------------------------------------------
       
    82 // Default Symbian constructor (object is left into cleanupstack)
       
    83 // ---------------------------------------------------------------------------
       
    84 //
       
    85 CCCEEmergencyCall* CCCEEmergencyCall::NewLC(CCCECallContainer& aCallContainer, 
       
    86                                             CCCEPluginManager& aPluginManager )
       
    87     {
       
    88     CCCEEmergencyCall* self = new( ELeave ) CCCEEmergencyCall(aCallContainer, aPluginManager);
       
    89     CleanupStack::PushL( self );
       
    90     self->ConstructL();
       
    91     return self;
       
    92     }
       
    93     
       
    94     
       
    95 // ---------------------------------------------------------------------------
       
    96 // Destructor
       
    97 // ---------------------------------------------------------------------------
       
    98 //
       
    99 CCCEEmergencyCall::~CCCEEmergencyCall()
       
   100     {
       
   101     Cancel();
       
   102     delete iCCEDurationTimer;
       
   103     delete iObserver;
       
   104     delete iCallParameters;
       
   105     }
       
   106     
       
   107     
       
   108 // ---------------------------------------------------------------------------
       
   109 // Return ETrue if emergency call is in progress
       
   110 // ---------------------------------------------------------------------------
       
   111 //
       
   112 TBool CCCEEmergencyCall::IsInProgress()
       
   113     {
       
   114     return iIsInProgress;
       
   115     }
       
   116 
       
   117 // ---------------------------------------------------------------------------
       
   118 // SetObserver( MCCECallObserver& aObserver )
       
   119 // ---------------------------------------------------------------------------
       
   120 //
       
   121 void CCCEEmergencyCall::SetObserver( const MCCECallObserver& aObserver )
       
   122     {
       
   123     CCELOGSTRING("CCCEEmergencyCall::SetObserver()");
       
   124     iObserver->SetMCCECallObserver( const_cast<MCCECallObserver*>( &aObserver ));
       
   125     
       
   126     if ( iCCEDurationTimer )
       
   127         {
       
   128         iCCEDurationTimer->SetObserver( iObserver );
       
   129         }
       
   130     }
       
   131 
       
   132 
       
   133 // ---------------------------------------------------------------------------
       
   134 // Notify observers about call status change
       
   135 // ---------------------------------------------------------------------------
       
   136 //
       
   137 void CCCEEmergencyCall::NotifyCallStatusChange( 
       
   138     CCPCall::TCallState aCallState, 
       
   139     TBool aInband, 
       
   140     CCECallEnums::TNotifyType aNotify )
       
   141     {
       
   142     CCELOGSTRING2("CCCEEmergencyCall::NotifyCallStatusChange: Status = %d", aCallState );
       
   143   
       
   144     iCallState = aCallState;
       
   145     
       
   146     if ( CCPCall::EStateConnected == aCallState )
       
   147         {
       
   148         // Start airtime duration timer
       
   149         iCallContainer.AirTimeDurationStart( NULL );
       
   150         }
       
   151     else if ( CCPCall::EStateIdle == aCallState )
       
   152         {
       
   153         // Stop airtime duration timer
       
   154         iCallContainer.AirTimeDurationStop( NULL );
       
   155         iIsInProgress = EFalse;
       
   156         iCallIndex = KInvalidCallIndex;
       
   157         }
       
   158     
       
   159     if ( aNotify != CCECallEnums::ENoNotify )
       
   160         {
       
   161         if ( CCPCall::EStateDialling == aCallState )
       
   162             {
       
   163             TCCECallIndex callIndex( iCallContainer );
       
   164             iCallIndex = callIndex.CurrentCallIndex();
       
   165             }
       
   166          // Notify observer immediately
       
   167         if ( aInband )
       
   168             {
       
   169             iObserver->CallStateChangedWithInband( aCallState );
       
   170             }
       
   171         else
       
   172             {
       
   173             iObserver->CallStateChanged( aCallState );
       
   174             }
       
   175         }
       
   176     iCallContainer.HandleEmergencyCallStatusChange( aNotify );
       
   177     }
       
   178     
       
   179 
       
   180 // ---------------------------------------------------------------------------
       
   181 // CActive RunL
       
   182 // ---------------------------------------------------------------------------
       
   183 //
       
   184 void CCCEEmergencyCall::RunL()
       
   185     {
       
   186     if( iState == ETerminated )
       
   187         {
       
   188         CCELOGSTRING("CCCEEmergencyCall::RunL -> Emergency Terminated" );
       
   189         ReleasePlugin();
       
   190         return;
       
   191         }
       
   192         
       
   193     // is success?    
       
   194     if ( iStatus == KErrNone )
       
   195         {
       
   196         CCELOGSTRING("CCCEEmergencyCall::RunL -> Emergency Connected" );
       
   197         return;
       
   198         }
       
   199     else
       
   200         {
       
   201         // is retry needed or is plugin done?
       
   202         if ( iStatus != ECCPEmergencyFailed ) // error 2, retry needed:
       
   203             {
       
   204             CCELOGSTRING("CCCEEmergencyCall::RunL ->Error !ECCPEmergencyFailed -> Retry plugin!" );
       
   205             switch( iState )
       
   206                 {
       
   207                 case EOther:                
       
   208                     CCELOGSTRING("CCCEEmergencyCall::RunL Other Recoverable failure,trying again");
       
   209                     // release call from plugin
       
   210                     iPluginManager.GetPluginL( iEmergencyProvider )->
       
   211                         ReleaseEmergencyCall( *iEmergencyCallInUse );
       
   212 
       
   213                     iEmergencyCallInUse = NULL;
       
   214                     TRAP_IGNORE( iEmergencyCallInUse = iPluginManager.GetPluginL( iEmergencyProvider )->
       
   215                         NewEmergencyCallL( 0, iEmergencyNumber, *this ) );
       
   216                     
       
   217                     if( !iEmergencyCallInUse )
       
   218                         {
       
   219                         CCELOGSTRING("CCCEEmergencyCall::RunL Recovering failled, try next plugin");
       
   220                         NextPluginL();
       
   221                         }
       
   222 
       
   223                     break;
       
   224                 case EPrimary:
       
   225                     CCELOGSTRING("CCCEEmergencyCall::RunL Primary Recoverable failure, retrying" );
       
   226                     // in case of primary recoverable error we just ry again.     
       
   227                     break;
       
   228                 }
       
   229                      
       
   230             }
       
   231         else    // error 1, plugin done
       
   232             {
       
   233             CCELOGSTRING("CCCEEmergencyCall::RunL-> ECCPEmergencyFailed -> Try load new plugin" );
       
   234             switch( iState )
       
   235                 {
       
   236                 case EOther:
       
   237                     // Fallthru is intentional
       
   238                 case EPrimary: 
       
   239                     iState = EOther;
       
   240                     // Find "other" plugin to be used
       
   241                     NextPluginL();
       
   242                     iCallParameters->SetCallType( CCPCall::ECallTypePS );
       
   243                     break;
       
   244                 }
       
   245             }
       
   246           
       
   247         if ( iEmergencyCallInUse )    
       
   248             {
       
   249             SetActive();
       
   250             iStatus = KRequestPending;
       
   251             iInitializing = &iStatus;
       
   252             CCELOGSTRING("CCCEEmergencyCall::RunL Dialing.." );
       
   253             
       
   254             if ( !iPrimaryEmergencyCall )
       
   255                 {
       
   256                 // not notifed earlier
       
   257                 NotifyCallStatusChange( 
       
   258                     CCPCall::EStateDialling, 
       
   259                     EFalse, CCECallEnums::ENotifyAsynchronously );
       
   260                 }
       
   261             
       
   262             iEmergencyCallInUse->Dial( iEmergencyNumber );  
       
   263             }
       
   264         else
       
   265             {
       
   266             CCELOGSTRING("CCCEEmergencyCall::RunL Failed..." );
       
   267             // Emergency call failed. report error
       
   268             CCELOGSTRING("CCCEEmergencyCall::Inform UI..." );
       
   269             iExitCode = KErrCouldNotConnect;
       
   270             
       
   271             iObserver->ErrorOccurred( ECCPEmergencyFailed );
       
   272             NotifyCallStatusChange( CCPCall::EStateIdle, 
       
   273                 EFalse, CCECallEnums::ENotifyAsynchronously );
       
   274             }
       
   275         }    
       
   276     }
       
   277     
       
   278 // ---------------------------------------------------------------------------
       
   279 // CActive RunError
       
   280 // ---------------------------------------------------------------------------
       
   281 //
       
   282 
       
   283 TInt CCCEEmergencyCall::RunError(TInt /*aError*/)
       
   284     {
       
   285     // Emergency call failed. report error
       
   286     CCELOGSTRING("CCCEEmergencyCall::RunError" );
       
   287 
       
   288     iObserver->ErrorOccurred( ECCPEmergencyFailed );
       
   289     return KErrNone;
       
   290     }
       
   291     
       
   292  // ---------------------------------------------------------------------------
       
   293 // CActive DoCancel
       
   294 // ---------------------------------------------------------------------------
       
   295 //   
       
   296 void CCCEEmergencyCall::DoCancel()
       
   297     {
       
   298     if( iInitializing )
       
   299         {
       
   300         User::RequestComplete( iInitializing, KErrCancel );
       
   301         }
       
   302     }
       
   303     
       
   304 // ---------------------------------------------------------------------------
       
   305 // Load next available plugin providing emergency support
       
   306 // ---------------------------------------------------------------------------
       
   307 //
       
   308 void CCCEEmergencyCall::NextPluginL()
       
   309     { 
       
   310     TInt err = KErrNone;
       
   311     
       
   312     CCELOGSTRING("CCCEEmergencyCall::NextPluginL, checking plugin availability" );
       
   313     iAltEmergencyCallPlugins = iPluginManager.AlternativeEmergencyPlugins();
       
   314     // Primary plugin = -1
       
   315     TInt index = iAltEmergencyCallPlugins.Find( iEmergencyProvider );
       
   316     
       
   317      // Try next other plugin, or if out of plugins primary plugin again
       
   318     if ( iAltEmergencyCallPlugins.Count() > index+1 )
       
   319         {
       
   320         CCELOGSTRING("CCCEEmergencyCall::NextPluginL,  More plugins available!" );
       
   321         // loop plugins to find one really returning emergency object
       
   322         do
       
   323             {
       
   324             ReleasePlugin();
       
   325 
       
   326             index++;
       
   327             iEmergencyProvider = iAltEmergencyCallPlugins[index];
       
   328             
       
   329             iEmergencyCallInUse = NULL;
       
   330             TRAP( err, iEmergencyCallInUse = 
       
   331                 iPluginManager.GetPluginL( iEmergencyProvider )->
       
   332                     NewEmergencyCallL( 0, iEmergencyNumber, *this ) );
       
   333                 
       
   334             CCELOGSTRING2(
       
   335                 "CCCEEmergencyCall:: Emergency call loaded err = %i", err );
       
   336             
       
   337 
       
   338             }
       
   339         while( !iEmergencyCallInUse && 
       
   340             iAltEmergencyCallPlugins.Count() > index+1 );
       
   341     
       
   342         }
       
   343     else
       
   344         {
       
   345         CCELOGSTRING("CCCEEmergencyCall::NextPluginL,  No more plugins available" );
       
   346         
       
   347         ReleasePlugin();
       
   348         }
       
   349     }
       
   350     
       
   351 // ---------------------------------------------------------------------------
       
   352 // Removes old plugin if was other than primary
       
   353 // ---------------------------------------------------------------------------
       
   354 //
       
   355 void CCCEEmergencyCall::ReleasePlugin()
       
   356     {
       
   357     if( iEmergencyCallInUse && 
       
   358         ( iAltEmergencyCallPlugins.Find( iEmergencyProvider ) != KErrNotFound ) )
       
   359         {
       
   360         CCELOGSTRING("CCCEEmergencyCall:: Deleting previous emergency call" );
       
   361         TRAP_IGNORE( iPluginManager.GetPluginL( iEmergencyProvider )->
       
   362             ReleaseEmergencyCall( *iEmergencyCallInUse ); );
       
   363         iEmergencyCallInUse = NULL;
       
   364         }
       
   365     else if( iEmergencyCallInUse && 
       
   366         ( iEmergencyProvider == iPluginManager.PrimaryEmergencyCallUid() ) )
       
   367         {
       
   368         CCELOGSTRING("CCCEEmergencyCall:: Null emergency call" );
       
   369         iEmergencyCallInUse = NULL;
       
   370         }
       
   371     
       
   372     if ( iAltEmergencyCallPlugins.Find( iEmergencyProvider ) != KErrNotFound )
       
   373         {
       
   374         CCELOGSTRING("CCCEEmergencyCall:: Deleting previous emergency plugin" );
       
   375         iPluginManager.RemovePlugin( iEmergencyProvider );
       
   376         }
       
   377     }
       
   378 
       
   379 // ---------------------------------------------------------------------------
       
   380 // From class MCCECall.
       
   381 // ?implementation_description
       
   382 // ---------------------------------------------------------------------------
       
   383 //
       
   384 TInt CCCEEmergencyCall::HangUp()
       
   385     {
       
   386     CCELOGSTRING("CCCEEmergencyCall::HangUp()" );
       
   387     iAllowDisconnect = ETrue;
       
   388     TInt ret = KErrNone;
       
   389     
       
   390     // Inform of cancel if active request
       
   391     if( iActiveRequest != ECCENone )
       
   392         {
       
   393         iObserver->ErrorOccurred( ECCPErrorCancel );
       
   394         iActiveRequest = ECCENone;
       
   395         }
       
   396     
       
   397     // Cancel active object
       
   398     Cancel();
       
   399     
       
   400     switch( iCallState )
       
   401         {
       
   402         case  CCPCall::EStateDialling: 
       
   403             if ( iEmergencyCallInUse )
       
   404                 {
       
   405                 iEmergencyCallInUse->Cancel();
       
   406                 }
       
   407            
       
   408             HandleCallStateChanged( MCCPCallObserver::ECCPStateIdle, EFalse );
       
   409             break;            
       
   410         case CCPCall::EStateConnecting:
       
   411         case CCPCall::EStateConnected:
       
   412             NotifyCallStatusChange( 
       
   413                     CCPCall::EStateDisconnecting, EFalse, CCECallEnums::ENoNotify );
       
   414             iActiveRequest = ECCEReleaseActive;
       
   415             iEmergencyCallInUse->HangUp();
       
   416             
       
   417             break;    
       
   418         case CCPCall::EStateDisconnecting:
       
   419             ret = KErrAlreadyExists;
       
   420             break;
       
   421         case CCPCall::EStateIdle:
       
   422             ret = KErrNotFound;
       
   423             break;
       
   424         default:
       
   425             break;
       
   426         }
       
   427     
       
   428     return ret;
       
   429     }
       
   430 
       
   431 
       
   432 // ---------------------------------------------------------------------------
       
   433 // From class MCCECall.
       
   434 // ?implementation_description
       
   435 // ---------------------------------------------------------------------------
       
   436 //
       
   437 TInt CCCEEmergencyCall::Answer()
       
   438     {
       
   439     CCELOGSTRING("CCCEEmergencyCall::Answer()");
       
   440     return KErrNotSupported;
       
   441     }
       
   442 
       
   443 
       
   444 // ---------------------------------------------------------------------------
       
   445 // Return if call is an emergency call or not.
       
   446 // ---------------------------------------------------------------------------
       
   447 //
       
   448 TBool CCCEEmergencyCall::IsEmergency() const
       
   449     {
       
   450     return ETrue;
       
   451     }
       
   452 
       
   453 
       
   454 // ---------------------------------------------------------------------------
       
   455 // DialEmergencyCall( const TDesC16& /*aNumber*/ )
       
   456 // ---------------------------------------------------------------------------
       
   457 //
       
   458 void CCCEEmergencyCall::DialEmergencyCall( const TDesC16& aNumber )
       
   459     {
       
   460     CCELOGSTRING("CCCEEmergencyCall::DialEmergencyCall()");
       
   461     if ( !iIsInProgress && !IsActive() )
       
   462         {
       
   463         iIsInProgress = ETrue;
       
   464         iEmergencyNumber.Zero();
       
   465         iEmergencyNumber.Copy(aNumber);
       
   466         iActiveRequest = ECCEDial;
       
   467         iAllowDisconnect = EFalse;
       
   468         iExitCode = KErrNone;
       
   469         iCallParameters->SetCallType( CCPCall::ECallTypeCSVoice );
       
   470         iCallParameters->SetServiceId(0);
       
   471         iPrimaryEmergencyCall = iPluginManager.PrimaryEmergencyCall();
       
   472         iEmergencyCallInUse = NULL;
       
   473         iEmergencyProvider = iPluginManager.PrimaryEmergencyCallUid();
       
   474         
       
   475         // disconnect all VoIP calls
       
   476         iCallContainer.TerminateAllVoIPCalls();
       
   477                 
       
   478         iEmergencyCallInUse = iPrimaryEmergencyCall;
       
   479         iState = EPrimary;
       
   480         
       
   481         SetActive();
       
   482         iInitializing = &iStatus;
       
   483         iStatus = KRequestPending; 
       
   484                
       
   485         if ( iEmergencyCallInUse )
       
   486             {
       
   487             CCELOGSTRING("CCCEEmergencyCall::DialEmergencyCall() Using primary call");
       
   488             NotifyCallStatusChange( 
       
   489                     CCPCall::EStateDialling, 
       
   490                 EFalse, CCECallEnums::ENotifyAsynchronously );
       
   491             iEmergencyCallInUse->Dial( iEmergencyNumber );
       
   492             }
       
   493         else // no can do
       
   494             {
       
   495             CCELOGSTRING("CCCEEmergencyCall::DialEmergencyCall() No primary call available...");
       
   496     
       
   497             User::RequestComplete( iInitializing, ECCPEmergencyFailed );
       
   498             }
       
   499         }
       
   500     else
       
   501         {
       
   502         CCELOGSTRING("CCCEEmergencyCall::DialEmergencyCall() Already in call!!");
       
   503         return;
       
   504         }
       
   505     }
       
   506 
       
   507 
       
   508 // ---------------------------------------------------------------------------
       
   509 // From class MCCECall.
       
   510 // Close call object
       
   511 // ---------------------------------------------------------------------------
       
   512 //
       
   513 TInt CCCEEmergencyCall::Release()
       
   514     {
       
   515     CCELOGSTRING("CCCEEmergencyCall::Release" );
       
   516 
       
   517     if( iCCEDurationTimer )
       
   518         {
       
   519         iCCEDurationTimer->Reset();     
       
   520         }
       
   521     
       
   522     iObserver->SetMCCECallObserver( NULL );
       
   523     
       
   524     return KErrNone;
       
   525     }
       
   526 
       
   527 
       
   528 // ---------------------------------------------------------------------------
       
   529 // ErrorOccured( TCCPCallError aError )
       
   530 // ---------------------------------------------------------------------------
       
   531 //
       
   532 void CCCEEmergencyCall::ErrorOccurred( TCCPError aError, MCCPCall* /*aCall*/ ) 
       
   533     {
       
   534     CCELOGSTRING2("CCCEEmergencyCall::ErrorOccurred: Error = %d", aError );
       
   535     if ( iInitializing && IsActive() )
       
   536         {
       
   537         User::RequestComplete( iInitializing, aError );
       
   538         }
       
   539     else
       
   540         {
       
   541         iObserver->ErrorOccurred( aError );
       
   542         }
       
   543     }
       
   544 
       
   545 // ---------------------------------------------------------------------------
       
   546 // CallStateChanged( TCCPCallState aState )
       
   547 // ---------------------------------------------------------------------------
       
   548 //
       
   549 void CCCEEmergencyCall::CallStateChanged( TCCPCallState aState, 
       
   550                                           MCCPCall* /*aCall*/ )
       
   551     {
       
   552     CCELOGSTRING("CCCEEmergencyCall::CallStateChanged()");
       
   553     HandleCallStateChanged( aState, EFalse );
       
   554     }
       
   555     
       
   556 // ---------------------------------------------------------------------------
       
   557 // CallStateChangedWithInband( TCCPCallState aState )
       
   558 // ---------------------------------------------------------------------------
       
   559 //
       
   560 void CCCEEmergencyCall::CallStateChangedWithInband( TCCPCallState aState, 
       
   561                                                     MCCPCall* /*aCall*/ ) 
       
   562     {
       
   563     CCELOGSTRING("CCCEEmergencyCall::CallStateChangedWithInband()");
       
   564     HandleCallStateChanged( aState, ETrue );
       
   565     }
       
   566     
       
   567 // ---------------------------------------------------------------------------
       
   568 // HandleCallStateChanged( TCCPCallEvent aEvent )
       
   569 // ---------------------------------------------------------------------------
       
   570 //
       
   571 void CCCEEmergencyCall::HandleCallStateChanged( TCCPCallState aState, TBool aInband )
       
   572     {
       
   573     CCELOGSTRING2("CCCEEmergencyCall::HandleCallStateChanged() State = %d", aState);
       
   574     TInt notify = EFalse;
       
   575     CCPCall::TCallState state( CCPCall::EStateIdle );
       
   576     
       
   577     if( !iIsInProgress )
       
   578         {
       
   579         CCELOGSTRING("CCCEEmergencyCall:: Not in progress; return");
       
   580         return;
       
   581         }
       
   582     
       
   583     switch ( aState )
       
   584         {
       
   585         
       
   586         case ECCPStateDialling:
       
   587             CCELOGSTRING("CCCEEmergencyCall::CallStateChanged: Dialling");
       
   588             state = CCPCall::EStateDialling;
       
   589             notify = EFalse;
       
   590                 
       
   591             break;   
       
   592             
       
   593         case ECCPStateAnswering:
       
   594             CCELOGSTRING("CCCEEmergencyCall::CallStateChanged: Dialling");
       
   595             state = CCPCall::EStateAnswering;
       
   596             notify = ETrue;
       
   597                 
       
   598             break;    
       
   599    
       
   600         case ECCPStateConnecting:
       
   601             CCELOGSTRING("CCCEEmergencyCall::CallStateChanged: Connecting"); 
       
   602             if( iActiveRequest == ECCEDial )
       
   603                 {
       
   604                 CCELOGSTRING("CCCEEmergencyCall::CallStateChanged: Ending Dial phase");
       
   605                 iObserver->ErrorOccurred( ECCPErrorNone );
       
   606                 iActiveRequest = ECCENone;
       
   607                 }
       
   608               
       
   609             if ( iInitializing && IsActive() )
       
   610                 {
       
   611                 User::RequestComplete( iInitializing, KErrNone );
       
   612                 }
       
   613             
       
   614             notify = ETrue;
       
   615             state = CCPCall::EStateConnecting;
       
   616                 
       
   617             iAllowDisconnect = ETrue;
       
   618             break;
       
   619             
       
   620         case ECCPStateConnected:
       
   621             CCELOGSTRING("CCCEEmergencyCall::CallStateChanged: Connected");
       
   622             notify = ETrue;
       
   623             state = CCPCall::EStateConnected;
       
   624             
       
   625             // Start duration timer
       
   626             iCCEDurationTimer->Start();
       
   627             
       
   628             if( iActiveRequest == ECCEDial )
       
   629                 {
       
   630                 CCELOGSTRING("CCCEEmergencyCall::CallStateChanged: Ending Dial phase");
       
   631                 iObserver->ErrorOccurred( ECCPErrorNone );
       
   632                 iActiveRequest = ECCENone;
       
   633                 
       
   634                 if ( iInitializing && IsActive() )
       
   635                     {
       
   636                     User::RequestComplete( iInitializing, KErrNone );
       
   637                     } 
       
   638                 } 
       
   639             iAllowDisconnect = ETrue;
       
   640             break;
       
   641             
       
   642         case ECCPStateDisconnecting:
       
   643             if ( iAllowDisconnect )
       
   644                 { 
       
   645                 CCELOGSTRING("CCCEEmergencyCall::CallStateChanged: ECCPStatusDisconnecting");
       
   646                 // Stop duration timer
       
   647                 iCCEDurationTimer->Stop();
       
   648                 
       
   649                 state = CCPCall::EStateDisconnecting;
       
   650                 notify = ETrue;       
       
   651                 }
       
   652             
       
   653             break;
       
   654             
       
   655         case ECCPStateIdle:
       
   656            
       
   657             if ( iActiveRequest )
       
   658                 {
       
   659                 iObserver->ErrorOccurred( ECCPErrorNone );
       
   660                 iActiveRequest = ECCENone;
       
   661                 }
       
   662                 
       
   663             if ( iAllowDisconnect )
       
   664                 {
       
   665                  // Stop duration timer
       
   666                 iCCEDurationTimer->Stop();   
       
   667                 
       
   668                 if ( EOther == iState )
       
   669                     {
       
   670                     iState = ETerminated;
       
   671                     
       
   672                     if ( !IsActive() )
       
   673                         {
       
   674                         SetActive();
       
   675                         }
       
   676                     
       
   677                     iInitializing = &iStatus;
       
   678                     iStatus = KRequestPending; 
       
   679                     User::RequestComplete( iInitializing, KErrNone );
       
   680                     }
       
   681                 
       
   682                 CCELOGSTRING("CCCEEmergencyCall::CallStateChanged: Disconnected/Idle");
       
   683                 notify = ETrue;
       
   684                 state = CCPCall::EStateIdle;         
       
   685                 }
       
   686             break;
       
   687 
       
   688         default:
       
   689             CCELOGSTRING2("CCCEEmergencyCall::CallStateChanged: Unhandled state = %d",
       
   690                 aState );
       
   691             break;
       
   692         }
       
   693         
       
   694     if ( notify )
       
   695         {
       
   696         NotifyCallStatusChange( state, aInband, 
       
   697             CCECallEnums::ENotifyAsynchronously );
       
   698         }
       
   699     }
       
   700     
       
   701 // ---------------------------------------------------------------------------
       
   702 // CallEventOccurred( TCCPCallEvent aEvent )
       
   703 // ---------------------------------------------------------------------------
       
   704 //
       
   705 void CCCEEmergencyCall::CallEventOccurred( TCCPCallEvent aEvent, 
       
   706                                            MCCPCall* /*aCall*/ ) 
       
   707     {
       
   708     CCELOGSTRING2("CCCEEmergencyCall::CallEventOccurred(%d)", aEvent);
       
   709 
       
   710     switch ( aEvent )
       
   711         {
       
   712         case ECCPRemoteTerminated:
       
   713             iObserver->CallEventOccurred( MCCECallObserver::ERemoteTerminated);
       
   714             break;
       
   715 
       
   716         case ECCPQueued:
       
   717             iObserver->CallEventOccurred( MCCECallObserver::ERemoteWaiting );
       
   718             break;
       
   719 
       
   720         case ECCPLocalHold:
       
   721             iObserver->CallEventOccurred( MCCECallObserver::ELocalHold );
       
   722             break;
       
   723 
       
   724         case ECCPLocalResume:
       
   725             iObserver->CallEventOccurred( MCCECallObserver::ELocalResume );
       
   726             break;
       
   727 
       
   728         case ECCPRemoteHold:
       
   729             iObserver->CallEventOccurred( MCCECallObserver::ERemoteHold );
       
   730             break;
       
   731 
       
   732         case ECCPRemoteResume:
       
   733             iObserver->CallEventOccurred( MCCECallObserver::ERemoteResume );
       
   734             break;
       
   735 
       
   736         case ECCCSPEarlyMediaStarted:
       
   737             iObserver->CallEventOccurred( MCCECallObserver::EVoIPEventEarlyMediaStarted );
       
   738             break;
       
   739             
       
   740         default:
       
   741             CCELOGSTRING2("CCCEEmergencyCallll::SessionEventOccurred: Unhandled event = %d",
       
   742                 aEvent );
       
   743             break;
       
   744         }
       
   745     }
       
   746 
       
   747 // ---------------------------------------------------------------------------
       
   748 // CallCapsChanged( TUint32 aCapsFlags )
       
   749 // ---------------------------------------------------------------------------
       
   750 //
       
   751 void CCCEEmergencyCall::CallCapsChanged( TUint32 aCapsFlags, MCCPCall* /*aCall*/ ) 
       
   752     {
       
   753     CCELOGSTRING("CCCEEmergencyCall::CallCapsChanged()");
       
   754   
       
   755     iObserver->CallCapsChanged(
       
   756         ( MCCECallObserver::TCCECallControlCaps ) aCapsFlags );
       
   757     }
       
   758   
       
   759 // ---------------------------------------------------------------------------
       
   760 // GetMobileCallInfo
       
   761 // ---------------------------------------------------------------------------
       
   762 //
       
   763 void CCCEEmergencyCall::GetMobileCallInfo( TDes8& aCallInfo ) const
       
   764     {
       
   765     RMobileCall::TMobileCallInfoV3Pckg& pckg =
       
   766         reinterpret_cast<RMobileCall::TMobileCallInfoV3Pckg&>( aCallInfo );
       
   767     pckg().iEmergency = ETrue;
       
   768     pckg().iExitCode = iExitCode;    
       
   769     }
       
   770     
       
   771 // ---------------------------------------------------------------------------
       
   772 // State()
       
   773 // ---------------------------------------------------------------------------
       
   774 //
       
   775 CCPCall::TCallState CCCEEmergencyCall::State() const
       
   776     {
       
   777     CCELOGSTRING2("CCCEEmergencyCall::State() = %d", iCallState );
       
   778     return iCallState;
       
   779     }
       
   780 
       
   781 // ---------------------------------------------------------------------------
       
   782 // CallDuration()
       
   783 // ---------------------------------------------------------------------------
       
   784 //
       
   785 TTimeIntervalSeconds CCCEEmergencyCall::CallDuration() const
       
   786     {
       
   787     return iCCEDurationTimer->NumberOfBeats();
       
   788     }
       
   789 
       
   790 // ---------------------------------------------------------------------------
       
   791 // StartTime()
       
   792 // ---------------------------------------------------------------------------
       
   793 //
       
   794 TDateTime CCCEEmergencyCall::StartTime() const
       
   795     {
       
   796     return iStartTime;
       
   797     }
       
   798 
       
   799 // ---------------------------------------------------------------------------
       
   800 // ImplementationUid()
       
   801 // ---------------------------------------------------------------------------
       
   802 //
       
   803 const TUid CCCEEmergencyCall::ImplementationUid() const
       
   804     {
       
   805     return iEmergencyProvider;
       
   806     }
       
   807 
       
   808 // ---------------------------------------------------------------------------
       
   809 // Tone()
       
   810 // ---------------------------------------------------------------------------
       
   811 //
       
   812 TCCPTone CCCEEmergencyCall::Tone() const
       
   813     {
       
   814     TCCPTone tone = ECCPNoSoundSequence;
       
   815     
       
   816     if( iActiveRequest != ECCEReleaseActive )
       
   817         {
       
   818         tone = ECCPToneUserBusy;
       
   819         }
       
   820 
       
   821     return tone;
       
   822     }
       
   823 
       
   824 
       
   825 // ---------------------------------------------------------------------------
       
   826 // From base class MCCECallInfo
       
   827 // Returns direction of the call
       
   828 // ---------------------------------------------------------------------------
       
   829 //
       
   830 CCPCall::TCallDirection CCCEEmergencyCall::Direction() const
       
   831     {
       
   832     return CCPCall::EMobileOriginated;
       
   833     }
       
   834 
       
   835 // ---------------------------------------------------------------------------
       
   836 // From base class MCCECallInfo
       
   837 // Returns the type of the call
       
   838 // ---------------------------------------------------------------------------
       
   839 //
       
   840 CCPCall::TCallType CCCEEmergencyCall::CallType() const
       
   841     {
       
   842     if ( iCallParameters )
       
   843         {
       
   844         return iCallParameters->CallType();
       
   845         }
       
   846     return CCPCall::ECallTypeCSVoice;
       
   847     }
       
   848 
       
   849 // ---------------------------------------------------------------------------
       
   850 // From base class MCCECallInfo, MCCECall
       
   851 // Returns the index of the call
       
   852 // ---------------------------------------------------------------------------
       
   853 //
       
   854 TInt CCCEEmergencyCall::CallIndex() const
       
   855     {
       
   856     return iCallIndex;
       
   857     }
       
   858     
       
   859 // Stub part
       
   860 TBool CCCEEmergencyCall::SecureSpecified() const
       
   861     {
       
   862     return ETrue;
       
   863     }
       
   864    
       
   865 TBool CCCEEmergencyCall::IsSecured() const
       
   866     {
       
   867     return EFalse;
       
   868     }
       
   869     
       
   870 void CCCEEmergencyCall::SetParameters( const CCCECallParameters& aNewParams )
       
   871     {
       
   872     iCallParameters->SetServiceId(aNewParams.ServiceId());
       
   873     iCallParameters->SetCallType(aNewParams.CallType());
       
   874     }
       
   875 
       
   876 const CCCECallParameters& CCCEEmergencyCall::Parameters() const
       
   877     {
       
   878     return *iCallParameters;
       
   879     }
       
   880  
       
   881 TInt CCCEEmergencyCall::Hold()
       
   882     {
       
   883     return KErrNotSupported;
       
   884     }
       
   885     
       
   886 TInt CCCEEmergencyCall::Resume()
       
   887     {
       
   888     return KErrNotSupported;
       
   889     }
       
   890 
       
   891 TInt CCCEEmergencyCall::Swap()
       
   892     {
       
   893     return KErrNotSupported;
       
   894     }
       
   895 
       
   896 TInt CCCEEmergencyCall::Dial( const TDesC8& /*aCallParams*/ )
       
   897     {
       
   898     return KErrNotSupported;
       
   899     }
       
   900 
       
   901 void CCCEEmergencyCall::NoFDNCheck()
       
   902     {
       
   903     // void functionality
       
   904     }
       
   905 
       
   906 void CCCEEmergencyCall::HoldNoNotifyL()
       
   907     {   
       
   908     }
       
   909 
       
   910 void CCCEEmergencyCall::ResumeNoNotifyL()
       
   911     {
       
   912     }
       
   913 
       
   914 void CCCEEmergencyCall::ForwardToAddressL( TInt /*aIndex*/ )
       
   915     {
       
   916     }
       
   917     
       
   918 TUint32 CCCEEmergencyCall::ServiceId() const
       
   919     {
       
   920     return iCallParameters->ServiceId();
       
   921     }
       
   922 
       
   923 MCCECallObserver::TCCECallControlCaps CCCEEmergencyCall::Caps() const
       
   924     {
       
   925     return (MCCECallObserver::TCCECallControlCaps)0;
       
   926     }
       
   927 
       
   928 TInt CCCEEmergencyCall::GetMobileDataCallCaps( TDes8& /*aCaps*/ ) const
       
   929     {
       
   930     return KErrNotSupported;
       
   931     }
       
   932 
       
   933 TBool CCCEEmergencyCall::LogDialedNumber() const
       
   934     {
       
   935     return ETrue;
       
   936     }
       
   937 
       
   938 TInt CCCEEmergencyCall::AttendedTransfer( const TDesC& /*aTransferTarget*/ )
       
   939     {
       
   940     return KErrNotSupported;
       
   941     }
       
   942 
       
   943 TInt CCCEEmergencyCall::UnattendedTransfer( const TDesC& /*aTarget*/ )
       
   944     {
       
   945     return KErrNotSupported;
       
   946     }
       
   947 
       
   948 TInt CCCEEmergencyCall::AcceptTransfer( TBool /*aAccept*/ )
       
   949     {
       
   950     return KErrNotSupported;
       
   951     }
       
   952 
       
   953 const TDesC& CCCEEmergencyCall::TransferTarget() const
       
   954     {
       
   955     return KNullDesC();
       
   956     }
       
   957 
       
   958 const CDesC8Array& CCCEEmergencyCall::GetForwardAddressChoicesL()
       
   959     {   
       
   960     User::Leave( KErrNotSupported );
       
   961     
       
   962     // No return value can be defined
       
   963     // never executed. just to remove warning
       
   964     CDesC8Array* dummy;
       
   965     dummy = NULL;
       
   966     return *dummy;   
       
   967     }
       
   968 
       
   969 TInt CCCEEmergencyCall::SwitchAlternatingCall()
       
   970     {
       
   971     return KErrNotSupported;
       
   972     }
       
   973 
       
   974 const TDesC& CCCEEmergencyCall::RemoteParty() const
       
   975     {
       
   976     return KNullDesC;
       
   977     }
       
   978 
       
   979 const TDesC& CCCEEmergencyCall::RemotePartyName() const
       
   980     {
       
   981     return KNullDesC;
       
   982     }
       
   983 
       
   984 const TDesC& CCCEEmergencyCall::DialledParty() const
       
   985     {
       
   986     return KNullDesC;
       
   987     }
       
   988 
       
   989 TInt CCCEEmergencyCall::ReplaceActive()
       
   990     {
       
   991     return KErrNotSupported;
       
   992     }
       
   993 
       
   994 // End of file