phonecmdhandler/phonecmdhnlr/src/PhoneHandlerControl.cpp
branchRCL_3
changeset 9 71e7b994dff4
parent 3 a4a774cb6ea7
child 19 7d48bed6ce0c
equal deleted inserted replaced
8:ba42c4bd84dd 9:71e7b994dff4
    36 #include <RemConCallHandlingTarget.h>
    36 #include <RemConCallHandlingTarget.h>
    37 #include <CPbkContactEngine.h>
    37 #include <CPbkContactEngine.h>
    38 #include <ctsydomainpskeys.h>
    38 #include <ctsydomainpskeys.h>
    39 #include <connect/sbdefs.h>
    39 #include <connect/sbdefs.h>
    40 #include <coreapplicationuisdomainpskeys.h>
    40 #include <coreapplicationuisdomainpskeys.h>
       
    41 #include "PhoneHandlerCallArray.h"
       
    42 #include <callinformation.h>
    41 
    43 
    42 // EXTERNAL DATA STRUCTURES
    44 // EXTERNAL DATA STRUCTURES
    43 
    45 
    44 // EXTERNAL FUNCTION PROTOTYPES  
    46 // EXTERNAL FUNCTION PROTOTYPES  
    45 
    47 
    99 		iTarget = CRemConCallHandlingTarget::NewL( *aIfSelector, *this );
   101 		iTarget = CRemConCallHandlingTarget::NewL( *aIfSelector, *this );
   100 		}
   102 		}
   101     	
   103     	
   102 	iResponse = CPhoneHandlerResponse::NewL( *this );
   104 	iResponse = CPhoneHandlerResponse::NewL( *this );
   103 	iCallStateObserver = CPhoneHandlerCallState::NewL( *this );
   105 	iCallStateObserver = CPhoneHandlerCallState::NewL( *this );
   104 			
   106     iCallArray = CPhoneHandlerCallArray::NewL();
       
   107     
   105 	COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::ConstructL() end" );
   108 	COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::ConstructL() end" );
   106 	}
   109 	}
   107 
   110 
   108 // -----------------------------------------------------------------------------
   111 // -----------------------------------------------------------------------------
   109 // CPhoneHandlerControl::NewL
   112 // CPhoneHandlerControl::NewL
   143        	
   146        	
   144     if( iCallStateObserver )
   147     if( iCallStateObserver )
   145     	{
   148     	{
   146     	delete iCallStateObserver;
   149     	delete iCallStateObserver;
   147     	}
   150     	}
   148             
   151     
       
   152     delete iCallArray;
       
   153     
   149     COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::~CPhoneHandlerControl() end" );
   154     COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::~CPhoneHandlerControl() end" );
   150     }
   155     }
   151 
   156 
   152 // -----------------------------------------------------------------------------
   157 // -----------------------------------------------------------------------------
   153 // CPhoneHandlerControl::TelephoneNumber
   158 // CPhoneHandlerControl::TelephoneNumber
   224 // -----------------------------------------------------------------------------
   229 // -----------------------------------------------------------------------------
   225 // CPhoneHandlerControl::NotifyCallState
   230 // CPhoneHandlerControl::NotifyCallState
   226 // (other items were commented in a header).
   231 // (other items were commented in a header).
   227 // -----------------------------------------------------------------------------
   232 // -----------------------------------------------------------------------------
   228 //
   233 //
   229 void CPhoneHandlerControl::NotifyCallState( const TInt aState )
   234 void CPhoneHandlerControl::NotifyCallStateL( const MCall* aCall )
   230     {
   235     {
   231     COM_TRACE_1( "[PHONECMDHANDLER] CPhoneHandlerControl::NotifyCallState() aState=%d", aState );
   236     COM_TRACE_2( "[PHONECMDHANDLER] CPhoneHandlerControl::NotifyCallState() aCall.CallIndex:%d, aCall.CallState:%d",
   232     
   237 				aCall->CallIndex(), aCall->CallState() );
   233 	if( aState == EPSCTsyCallStateConnected && iPrevState != EPSCTsyCallStateHold )
   238     
   234 		{
   239     TCallInfo* call = iCallArray->FindCall( aCall->CallIndex() );
   235 		COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::NotifyCallState(): iActiveCalls++" );
   240    
   236 		
   241     if ( call )
   237 		iActiveCalls++;
   242     	{
   238 		}
   243     	// If the call is in idle or disconnecting state it can be removed from the array
   239 	else if( aState == EPSCTsyCallStateDisconnecting && 
   244     	if ( CCPCall::EStateIdle == aCall->CallState() 
   240 			( iPrevState == EPSCTsyCallStateConnected || iPrevState == EPSCTsyCallStateHold ))
   245     			|| CCPCall::EStateDisconnecting == aCall->CallState() )
   241 		{
   246     		{
   242 		COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::NotifyCallState(): iActiveCalls--" );
   247     		COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::NotifyCallState(): remove call" );
   243 		
   248         	iCallArray->Remove( call );
   244 		iActiveCalls--;
   249     		}
   245 		}
   250     	else
   246 	else if( aState == EPSCTsyCallStateNone )
   251     		{
   247 		{
   252     		COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::NotifyCallState(): update existing call" );
   248 		COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::NotifyCallState(): iActiveCalls = 0" );
   253     		iCallArray->Remove( call );
   249 		iActiveCalls = 0;
   254     		iCallArray->AddL( aCall );
   250 		}
   255     		}
   251 		
   256     	}
   252 	iPrevState = aState;
   257     else
   253 	COM_TRACE_1( "[PHONECMDHANDLER] CPhoneHandlerControl::NotifyCallState() iActiveCalls=%d", iActiveCalls );
   258     	{
       
   259     	COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::NotifyCallState(): new call" );
       
   260     	iCallArray->AddL( aCall );
       
   261     	}
       
   262 	COM_TRACE_3( "[PHONECMDHANDLER] CPhoneHandlerControl::NotifyCallState() connected:%d existing:%d total:%d", 
       
   263 			iCallArray->ConnectedCallCount(), iCallArray->ExistingCallCount(), iCallArray->CallCount() );
   254 	}
   264 	}
   255 
   265 
   256 // -----------------------------------------------------------------------------
   266 // -----------------------------------------------------------------------------
   257 // CPhoneHandlerControl::AnswerCall
   267 // CPhoneHandlerControl::AnswerCall
   258 // (other items were commented in a header).
   268 // (other items were commented in a header).
   529     switch( aOperation )
   539     switch( aOperation )
   530         {
   540         {
   531         case ERemConExtAnswerCall:
   541         case ERemConExtAnswerCall:
   532 		    {
   542 		    {
   533 		    COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() - ERemConExtAnswerCall command" );
   543 		    COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() - ERemConExtAnswerCall command" );
   534 		    COM_TRACE_1( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() - iActiveCalls is %d", iActiveCalls );
   544 		    COM_TRACE_1( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() - iCallArray->ExistingCallCount() is %d", iCallArray->ExistingCallCount() );
   535 
   545 
   536 			/*    	    
   546 			/*    	    
   537     	    if( iActiveCalls > 0 )
   547     	    if( iActiveCalls > 0 )
   538     	    	{
   548     	    	{
   539     	    	// Multiparty call
   549     	    	// Multiparty call
   561 		    }
   571 		    }
   562 		    
   572 		    
   563         case ERemConExtAnswerEnd:
   573         case ERemConExtAnswerEnd:
   564         	{
   574         	{
   565         	COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() - ERemConExtAnswerEnd command" );
   575         	COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() - ERemConExtAnswerEnd command" );
   566     	            	
   576     	       
   567         	TInt callState( EPSCTsyCallStateUninitialized );
   577         	if( iCallArray->ExistingCallCount() )
   568     		iProperty.Get( KPSUidCtsyCallInformation, KCTsyCallState, callState ); 
   578           		{
   569     		
   579           		COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() - call(s) exist" );
   570     		COM_TRACE_1( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() call state = %d", callState );
   580           		// If only one call exists and it's state is CCPCall::EStateQueued,
   571 			   
   581           		// it is actually in ringing state and should be answered.
   572 		    if( callState != EPSCTsyCallStateUninitialized &&
   582           		if ( NULL == iCallArray->CallByState( CCPCall::EStateRinging ) 
   573 		    	callState != EPSCTsyCallStateNone && 
   583 						&& ( iCallArray->ExistingCallCount() == 1 
   574 		    	callState != EPSCTsyCallStateDisconnecting )
   584 							&& NULL == iCallArray->CallByState( CCPCall::EStateQueued ) ) )
   575 		    	{
   585 						{
   576 		    	if( callState == EPSCTsyCallStateAlerting ||
   586 						COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() - no ringing calls" );
   577 		    		callState == EPSCTsyCallStateDialling ||
   587 						pService = CPhoneHandlerEndCall::NewL( *this, 
   578 		    		callState == EPSCTsyCallStateAnswering ||
   588 														   aOperation );
   579 		    		callState == EPSCTsyCallStateConnected ||
   589 						}
   580 		    		callState == EPSCTsyCallStateHold )
   590 				// Ringing call(s) exist
   581 		    		{
   591 				else
   582 		    		pService = CPhoneHandlerEndCall::NewL( *this, 
   592 					{
   583 		    									   	   aOperation );
   593 					if( iCallArray->ExistingCallCount() > 1 )
   584 		    		}
   594 						{
   585 		    	// callState == EPSTelephonyCallStateRinging
   595 						COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() - several ringing calls" );
   586 		    	else
   596 						// multicall case : End call that has existed longer.
   587 		    		{
   597 						// (From UI viewpoint ringing call is in waiting state.)
   588 		    		COM_TRACE_1( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() iActiveCalls = %d", iActiveCalls );
   598 						pService = CPhoneHandlerEndCall::NewL( *this, 
   589 		    		if( iActiveCalls > 0 )
   599 													   aOperation );
   590 		    			{
   600 						}
   591 		    			// multicall case : End call that has existed longer.
   601 					else
   592 		    			// (From UI viewpoint ringing call is in waiting state.)
   602 						{
   593 		    			pService = CPhoneHandlerEndCall::NewL( *this, 
   603 						COM_TRACE_( "[PHONECMDHANDLER] CPhoneHandlerControl::CreateServiceL() - single ringing call" );
   594 		    									   	   aOperation );
   604 						pService = CPhoneHandlerAnswerCall::NewL( 
   595 		    	        if( callState == EPSCTsyCallStateRinging )
   605 										*this, 
   596 		    	            {
   606 										aOperation );
   597 		    	            // In multiparty case the telephony key is not
   607 						}
   598 		    	            // updated. The call amount is updated manually.
   608 					}
   599 		    	            iActiveCalls--;
       
   600 		    	            }
       
   601 		    			}
       
   602 		    		else
       
   603 		    			{
       
   604 		    			pService = CPhoneHandlerAnswerCall::NewL( 
       
   605 		    							*this, 
       
   606 		    							aOperation );
       
   607 		    			}
       
   608 		    		}
       
   609 		    	}
   609 		    	}
   610 		    else
   610 		    else
   611 		    	{
   611 		    	{
   612 		    	// Send / end button was pressed when there were not 
   612 		    	// Send / end button was pressed when there were not 
   613 		    	// any calls active. Response has to be sent back to accessory
   613 		    	// any calls active. Response has to be sent back to accessory