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 |
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). |
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 |