2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.0 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://floralicense.org/license/
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file CallTelephonyManager.cpp
19 * @brief Call log item provider
24 #include <FTelephony.h>
25 #include "ITapiModem.h"
28 #include "CallTelephonyManager.h"
29 #include "CallSettingsManager.h"
30 #include "CallTypes.h"
32 using namespace Tizen::Base;
33 using namespace Tizen::Graphics;
34 using namespace Tizen::Social;
35 using namespace Tizen::System;
36 using namespace Tizen::Base::Collection;
37 using namespace Tizen::Telephony;
39 const char* callEventList[] = {
40 TAPI_NOTI_VOICE_CALL_STATUS_IDLE,
41 TAPI_NOTI_VOICE_CALL_STATUS_ACTIVE,
42 TAPI_NOTI_VOICE_CALL_STATUS_HELD,
43 TAPI_NOTI_VOICE_CALL_STATUS_DIALING,
44 TAPI_NOTI_VOICE_CALL_STATUS_ALERT,
45 TAPI_NOTI_VOICE_CALL_STATUS_WAITING,
46 TAPI_NOTI_CALL_INFO_CALL_CONNECTED_LINE,
47 TAPI_NOTI_CALL_INFO_WAITING,
48 TAPI_NOTI_CALL_INFO_CUG,
49 TAPI_NOTI_CALL_INFO_FORWARDED,
50 TAPI_NOTI_CALL_INFO_BARRED_INCOMING,
51 TAPI_NOTI_CALL_INFO_BARRED_OUTGOING,
52 TAPI_NOTI_CALL_INFO_DEFLECTED,
53 TAPI_NOTI_CALL_INFO_CLIR_SUPPRESSION_REJECT,
54 TAPI_NOTI_CALL_INFO_FORWARD_UNCONDITIONAL,
55 TAPI_NOTI_CALL_INFO_FORWARD_CONDITIONAL,
56 TAPI_NOTI_CALL_INFO_CALL_LINE_IDENTITY,
57 TAPI_NOTI_CALL_INFO_CALL_NAME_INFORMATION,
58 TAPI_NOTI_CALL_INFO_FORWARDED_CALL,
59 TAPI_NOTI_CALL_INFO_CUG_CALL,
60 TAPI_NOTI_CALL_INFO_DEFLECTED_CALL,
61 TAPI_NOTI_CALL_INFO_TRANSFERED_CALL,
62 TAPI_NOTI_CALL_INFO_HELD,
63 TAPI_NOTI_CALL_INFO_ACTIVE,
64 TAPI_NOTI_CALL_INFO_JOINED,
65 TAPI_NOTI_CALL_INFO_RELEASED_ON_HOLD,
66 TAPI_NOTI_CALL_INFO_TRANSFER_ALERT,
67 TAPI_NOTI_CALL_INFO_TRANSFERED,
68 TAPI_NOTI_CALL_INFO_CF_CHECK_MESSAGE,
71 TelephonyManager* TelephonyManager::__pManager = null;
73 TelephonyManager::TelephonyManager(ITelephonyEventListener* pEventListener)
74 : __pEventListener(pEventListener)
77 __pIncomingCall = null;
78 __pActiveCallList = null;
79 __pSettingsManager = null;
81 __pAddressBook = null;
82 __pCachedContact = null;
84 __isSpeakerOn = false;
85 __pSoundManager = null;
87 __pNetworkManager = null;
90 TelephonyManager::~TelephonyManager(void)
92 if (__pActiveCallList != null)
94 delete __pActiveCallList;
97 if (__pDialedCall != null)
100 __pDialedCall = null;
103 if (__pIncomingCall != null)
105 delete __pIncomingCall;
106 __pIncomingCall = null;
109 if (__pAddressBook != null)
111 delete __pAddressBook;
112 __pAddressBook = null;
114 if (__pCachedContact != null)
116 delete __pCachedContact;
117 __pCachedContact = null;
120 //unregister for events from TAPI Lib.
123 //De-initialize the TAPI Library
124 if(__pTapiHandle != null)
126 tel_deinit(__pTapiHandle);
129 if (__pSoundManager != null)
131 delete __pSoundManager;
134 if (__pCalllogMgr != null)
136 __pCalllogMgr = null;
141 TelephonyManager::GetInstance(ITelephonyEventListener* pEventListener)
143 if (__pManager == null)
145 CreateInstance(pEventListener);
151 TelephonyManager::CreateInstance(ITelephonyEventListener* pEventListener)
153 __pManager = new (std::nothrow) TelephonyManager(pEventListener);
154 result r = __pManager->Initialize();
160 atexit(&(TelephonyManager::DestroyInstance));
164 TelephonyManager::DestroyInstance(void)
166 if (__pManager != null)
168 __pManager->EndAllCalls();
175 TelephonyManager::Initialize(void)
177 //Initialize telephony library
178 result r = InitializeTelephonyLibrary();
183 __pActiveCallList = new (std::nothrow) HashMapT<long, AppCallInfo>();
184 __pActiveCallList->Construct(IDI_MAX_ACTIVE_CALLS);
186 //Initialize the Settings Manager to fetch call settings
187 __pSettingsManager = SettingsManager::GetInstance();
189 __pSoundManager = new (std::nothrow) SoundManager();
190 __pCalllogMgr = CallLogManager::GetInstance();
192 //initialize address book to fetch contacts information
193 __pAddressBook = AddressbookManager::GetInstance()->GetAddressbookN();
194 if(__pAddressBook == null)
198 __pNetworkManager = new NetworkManager();
199 if(__pNetworkManager != null)
201 __pNetworkManager->Construct(this);
207 TelephonyManager::InitializeTelephonyLibrary(void)
209 result r = E_FAILURE;
211 __pTapiHandle = tel_init(null);
212 if (__pTapiHandle != null)
214 //register telephony events
215 int errorCode = RegisterEvents();
216 if (errorCode == TAPI_CAUSE_SUCCESS)
221 //TAPI Library is initialized and events registered successfully
226 TelephonyManager::RegisterEvents(void)
229 int eventCount = sizeof(callEventList) / sizeof(char *);
230 for (int index = 0; index < eventCount; index++)
232 errCode = tel_register_noti_event(__pTapiHandle, callEventList[index], &HandleCallback, this);
233 if (errCode != TAPI_API_SUCCESS)
242 TelephonyManager::UnregisterEvents(void)
244 int eventCount = sizeof(callEventList) / sizeof(char *);
245 for (int index = 0; index < eventCount; index++)
247 tel_deregister_noti_event(__pTapiHandle, callEventList[index]);
252 TelephonyManager::SetupMoCall(String& contactNumber, bool isEmergency)
254 result res = E_SUCCESS;
255 //check if valid phone number exist
256 res = CheckValidTelePhoneNumber(contactNumber);
259 return ERROR_INVALID_NUMBER;
262 //if dialing an emergency call and active calls exist
263 //then end all active calls.
264 if (isEmergency && __pActiveCallList->GetCount() > 0)
266 //Get first call handle
267 AppCallInfo endCallInfo;
268 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
269 pCallList->GetAt(0, endCallInfo);
270 int callHandle = endCallInfo.GetCallHandle()->ToLong();
274 //release all active or held calls
275 int tapiRes = tel_end_call(__pTapiHandle, callHandle, TAPI_CALL_END_ALL, &HandleCallbackResponse, this);
276 if (tapiRes == TAPI_CAUSE_SUCCESS)
278 __pActiveCallList->RemoveAll();
286 else if (__pActiveCallList->GetCount() == 1)
288 //Check if there is already an active call,
289 //Put the already active call on hold.
290 AppCallInfo holdCallInfo;
291 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
293 pCallList->GetAt(0, holdCallInfo);
294 //Check if call is active, then put on hold
295 if (holdCallInfo.IsOnHold() == false)
297 res = HoldActiveCall(&holdCallInfo, true);
303 //make the next call, only if any existing active call
304 //is successfully put on hold or is already on hold.
305 if (res == E_SUCCESS)
307 res = DialOutgoingCall(contactNumber, isEmergency);
316 return ERROR_TAPI_ERROR;
321 TelephonyManager::EndAllCalls(void)
323 if(__pDialedCall != null)
325 if(__pDialedCall->GetCallHandle() != null)
327 tel_end_call(__pTapiHandle, __pDialedCall->GetCallHandle()->ToLong(), TAPI_CALL_END, &HandleCallbackResponse, this);
330 tel_end_call(__pTapiHandle, -1, TAPI_CALL_END_HOLD_ALL, &HandleCallbackResponse, this);
331 //end all active calls before terminating application
332 tel_end_call(__pTapiHandle, -1, TAPI_CALL_END_ALL, &HandleCallbackResponse, this);
333 __pSettingsManager->SetCallState(CALL_STATE_CALL_OFF);
337 TelephonyManager::EndActiveCall(Long callHandle)
339 result r = E_FAILURE;
341 //fetch ended callInfo from active call list
343 r = __pActiveCallList->GetValue(callHandle.ToLong(), endCall);
346 r = EndCall(endCall);
352 TelephonyManager::EndDialingCall(String& contactNumber)
354 result r = E_FAILURE;
355 //This is because for a dialing call, call handle is updated with some delay in telephony manager.
356 //And it is not available with outgoing call screen.
357 if (contactNumber.IsEmpty())
362 //Check If Ended call matches Dialed Call.
364 if (__pDialedCall != null && __pDialedCall->GetContactNumber().Equals(contactNumber))
366 endCall = *__pDialedCall;
367 r = EndCall(endCall);
373 TelephonyManager::EndCall(AppCallInfo& endCallInfo)
375 result r = E_FAILURE;
377 if (endCallInfo.GetCallHandle() != null)
379 unsigned int callHandle = endCallInfo.GetCallHandle()->ToLong();
380 //end "dialed but unconnected" call or active call - processing to be handled in HandleIdleCallback().
381 int res = tel_end_call(__pTapiHandle, callHandle, TAPI_CALL_END, &HandleCallbackResponse, this);
382 if (res == TAPI_CAUSE_SUCCESS)
391 TelephonyManager::AnswerAutoRejectCall(int callHandle)
393 //Incoming call automatically blocked is handled here.
394 AppLogDebug("Enter ");
395 result r = E_FAILURE;
396 TelCallAnswerType_t answerType = TAPI_CALL_ANSWER_REJECT;
399 AppLogDebug("tel_answer_call");
401 AppCallInfo rejectedCallInfo;
402 rejectedCallInfo = *(__pIncomingCall);
403 rejectedCallInfo.SetCalllogType(CALL_LOG_TYPE_VOICE_BLOCKED);
404 SaveCallInfoToLogsDb(rejectedCallInfo);
405 delete __pIncomingCall;
406 __pIncomingCall = null;
408 // redirect to reject call back handler as the flow has to be handled
409 res = tel_answer_call(__pTapiHandle, callHandle, answerType, &HandleCallbackResponse, this);
411 if (res == TAPI_CAUSE_SUCCESS)
423 TelephonyManager::AnswerCall(int callHandle, bool acceptCall)
425 AppLogDebug("Enter %d",acceptCall);
426 result r = E_FAILURE;
427 __pSoundManager->StopAlert();
428 TelCallAnswerType_t answerType = TAPI_CALL_ANSWER_ACCEPT;
430 if (acceptCall == true)
432 answerType = TAPI_CALL_ANSWER_ACCEPT;
433 // redirect to dummy call back handler as the flow already handled in registered event callback
434 res = tel_answer_call(__pTapiHandle, callHandle, answerType, &HandleCallbackResponse, this);
438 AppLogDebug("tel_answer_call");
439 answerType = TAPI_CALL_ANSWER_REJECT;
440 // redirect to reject call back handler as the flow has to be handled
441 res = tel_answer_call(__pTapiHandle, callHandle, answerType, &HandleRejectCallbackResponse, this);
444 if (res == TAPI_CAUSE_SUCCESS)
456 TelephonyManager::AcceptCall(CallAnsweringOptions answerOptions,int callHandle)
458 result r = E_FAILURE;
459 __pSoundManager->StopAlert();
460 __pSoundManager->SetSoundMode(SOUND_MODE_VOICE);
462 //Check if this is a new incoming call
463 if(__pIncomingCall == null || (callHandle != (unsigned int)__pIncomingCall->GetCallHandle()->ToLong()))
465 //construct and fetch new Incoming call Info
466 String incomingHandle;
467 incomingHandle.Append(callHandle);
468 AppCallInfo* pDuplicateCallInfo = FetchIncomingCallHandleN(incomingHandle, String(L""));
469 if(pDuplicateCallInfo == null)
474 delete pDuplicateCallInfo;
475 pDuplicateCallInfo = null;
478 switch(answerOptions)
480 case ANSERWING_OPTION_HOLD_SINGLE_CALL:
481 case ANSERWING_OPTION_END_SINGLE_CALL:
483 r = AcceptSecondCall(answerOptions, callHandle);
487 case ANSERWING_OPTION_REPLACE_ACTIVE_CALL:
488 case ANSERWING_OPTION_REPLACE_HELD_CALL:
489 case ANSERWING_OPTION_END_ALL_CALLS:
491 r = AcceptMultipleCall(answerOptions, callHandle);
502 TelephonyManager::AcceptSecondCall(CallAnsweringOptions answerOptions, const int incomingCallHandle)
504 result r = E_FAILURE;
506 switch (answerOptions)
508 case ANSERWING_OPTION_HOLD_SINGLE_CALL:
510 //accept incoming call by putting active call on Hold with 'TAPI_CALL_ANSWER_HOLD_AND_ACCEPT'
511 int res = tel_answer_call(__pTapiHandle, incomingCallHandle, TAPI_CALL_ANSWER_HOLD_AND_ACCEPT, &HandleCallbackResponse, this);
518 //Call connected successfully
520 //update status of first call to "OnHold"
521 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
522 AppCallInfo firstCallInfo;
523 pCallList->GetAt(0, firstCallInfo);
524 //replace old object with update AppCallInfo
525 AppCallInfo* pHeldCallInfo = new (std::nothrow) AppCallInfo();
526 *pHeldCallInfo = firstCallInfo;
527 pHeldCallInfo->SetOnHold(true);
528 __pActiveCallList->Remove(firstCallInfo.GetCallHandle()->ToLong());
529 __pActiveCallList->Add(pHeldCallInfo->GetCallHandle()->ToLong(), *pHeldCallInfo);
535 case ANSERWING_OPTION_END_SINGLE_CALL:
537 //Transfer Old active calls to a separate list to avoid any processing in HandleIdleCallback().
538 HashMapT<long, AppCallInfo>* pEndCallsList = __pActiveCallList;
539 //create a new ActiveCallList
540 __pActiveCallList = new (std::nothrow) HashMapT<long, AppCallInfo>();
541 __pActiveCallList->Construct(IDI_MAX_ACTIVE_CALLS);
543 //accept call and reject all active calls with 'TAPI_CALL_ANSWER_REPLACE'
544 int res = tel_answer_call(__pTapiHandle, incomingCallHandle, TAPI_CALL_ANSWER_REPLACE, &HandleCallbackResponse, this);
548 //delete newly constructed list and gain ownership of old list
549 delete __pActiveCallList;
550 __pActiveCallList = pEndCallsList;
554 //Call connected successfully
556 //Add calls information to call log before deleting from active call list.
557 IListT<AppCallInfo>* pCallList = pEndCallsList->GetValuesN();
558 if(pCallList != null)
560 AppCallInfo endCallInfo;
561 if (pCallList->GetAt(0, endCallInfo) == E_SUCCESS)
563 SaveCallInfoToLogsDb(endCallInfo);
567 pEndCallsList->RemoveAll();
568 delete pEndCallsList;
579 TelephonyManager::AcceptMultipleCall(CallAnsweringOptions answerOptions, const int incomingCallHandle)
581 result r = E_FAILURE;
583 switch (answerOptions)
585 case ANSERWING_OPTION_REPLACE_ACTIVE_CALL:
587 //Replace "Active" call by incoming call and save ended call to call logs db.
588 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
589 AppCallInfo callToBeEnded;
590 pCallList->GetAt(0, callToBeEnded);
591 //Check if the call is on "Hold", then fetch 2nd callInfo
592 if (callToBeEnded.IsOnHold() == true)
594 pCallList->GetAt(1, callToBeEnded);
599 //remove "CallToBeEnded" from Active call list to avoid processing in HandleIdleCallback().
600 __pActiveCallList->Remove(callToBeEnded.GetCallHandle()->ToLong());
602 //Accept incoming call by End Active call with 'TAPI_CALL_ANSWER_REPLACE'
603 int res = tel_answer_call(__pTapiHandle, incomingCallHandle, TAPI_CALL_ANSWER_REPLACE, &HandleCallbackResponse, this);
607 //save the previous call back to active call list
608 __pActiveCallList->Add(callToBeEnded.GetCallHandle()->ToLong(), callToBeEnded);
612 //Incoming Call connected successfully
614 //save to ended call to call logs db.
615 SaveCallInfoToLogsDb(callToBeEnded);
619 case ANSERWING_OPTION_REPLACE_HELD_CALL:
621 //Replace "Held" call by incoming call and save ended call to call logs db.
622 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
623 //"Held" call is to be ended
624 AppCallInfo callToBeEnded;
625 //"Active" call will be put on Hold
626 AppCallInfo callToPutOnHold;
627 pCallList->GetAt(0, callToBeEnded);
628 //Check if the call is NOT "Held", then fetch 2nd callInfo
629 if (callToBeEnded.IsOnHold() == false)
631 callToPutOnHold = callToBeEnded;
632 pCallList->GetAt(1, callToBeEnded);
636 pCallList->GetAt(1, callToPutOnHold);
641 //remove "CallToBeEnded" from Active call list to avoid processing in HandleIdleCallback().
642 __pActiveCallList->Remove(callToBeEnded.GetCallHandle()->ToLong());
644 //End "Held" Call using 'TAPI_CALL_END'.
646 if (callToBeEnded.IsConferenceCall() == false)
648 res = tel_end_call(__pTapiHandle, callToBeEnded.GetCallHandle()->ToLong(), TAPI_CALL_END, &HandleCallbackResponse, this);
652 IListT<AppCallInfo>* pParticipantsInfo = callToBeEnded.GetCallerList();
653 //need to end every participant individually for conference call
654 for (int index = 0; index < pParticipantsInfo->GetCount(); index++)
656 AppCallInfo memberCallInfo;
657 pParticipantsInfo->GetAt(index, memberCallInfo);
658 res = tel_end_call(__pTapiHandle, memberCallInfo.GetCallHandle()->ToLong(), TAPI_CALL_END, &HandleCallbackResponse, this);
665 //save the previous "callToBeEnded" call back to active call list
666 __pActiveCallList->Add(callToBeEnded.GetCallHandle()->ToLong(), callToBeEnded);
669 //"Held" call successfully ended - Add call ended to call log database
670 SaveCallInfoToLogsDb(callToBeEnded);
672 //accept incoming call by Holding "Active" call using "TAPI_CALL_ANSWER_HOLD_AND_ACCEPT".
673 res = tel_answer_call(__pTapiHandle, incomingCallHandle, TAPI_CALL_ANSWER_HOLD_AND_ACCEPT, &HandleCallbackResponse, this);
680 //Call connected successfully and active call is "Onhold"
682 //replace old object with update CallInfo
683 AppCallInfo* pHeldCallInfo = new (std::nothrow) AppCallInfo();
684 *pHeldCallInfo = callToPutOnHold;
685 pHeldCallInfo->SetOnHold(true);
686 __pActiveCallList->Remove(callToPutOnHold.GetCallHandle()->ToLong());
687 __pActiveCallList->Add(pHeldCallInfo->GetCallHandle()->ToLong(), *pHeldCallInfo);
691 case ANSERWING_OPTION_END_ALL_CALLS:
693 //End all active and Held calls after saving to call log. Incoming call is automatically accepted by TAPI engine,
694 // and processing of Incoming call is handled in HandleActiveCallback().
696 //Transfer Old active calls to a separate list to avoid any processing in HandleIdleCallback().
697 HashMapT<long, AppCallInfo>* pEndCallsList = __pActiveCallList;
698 //create a new ActiveCallList
699 __pActiveCallList = new (std::nothrow) HashMapT<long, AppCallInfo>();
700 __pActiveCallList->Construct(IDI_MAX_ACTIVE_CALLS);
702 //End all active calls and all hold calls
703 int res = tel_end_call(__pTapiHandle, -1, TAPI_CALL_END_ACTIVE_ALL, &HandleCallbackResponse, this);
706 res = tel_end_call(__pTapiHandle, -1, TAPI_CALL_END_HOLD_ALL, &HandleCallbackResponse, this);
712 //delete newly constructed list and gain ownership of old list
713 delete __pActiveCallList;
714 __pActiveCallList = pEndCallsList;
718 //all calls ended successfully, Incoming call is automatically accepted.
721 //Add calls information to call log before deleting from active call list.
722 IListT<AppCallInfo>* pCallList = pEndCallsList->GetValuesN();
723 if(pCallList != null)
725 int callCount = pCallList->GetCount();
726 for (int index = 0; index < callCount; index++)
728 AppCallInfo endCallInfo;
729 if (pCallList->GetAt(index, endCallInfo) == E_SUCCESS)
731 SaveCallInfoToLogsDb(endCallInfo);
737 pEndCallsList->RemoveAll();
738 delete pEndCallsList;
739 pEndCallsList = null;
750 TelephonyManager::HoldCall(Tizen::Base::Long callHandle, bool holdCall)
752 result r = E_SUCCESS;
753 //Check if there are any existing active calls
754 if (__pActiveCallList->GetCount())
756 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
757 int callCount = pCallList->GetCount();
758 for (int index = 0; index < callCount; index++)
760 AppCallInfo holdCallInfo;
762 r = pCallList->GetAt(index, holdCallInfo);
763 //check if an active call is found with matching contact no.
764 if ((r == E_SUCCESS) && (holdCallInfo.GetCallHandle()->Equals(callHandle)))
766 r = HoldActiveCall(&holdCallInfo, holdCall);
778 TelephonyManager::EndConferenceCall(void)
780 result r = E_FAILURE;
781 //fetch conference callInfo to end
782 AppCallInfo confCallToEnd;
783 bool isConferenceCallFound = false;
785 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
786 int callCount = pCallList->GetCount();
787 for (int index = 0; index < callCount; index++)
789 pCallList->GetAt(index, confCallToEnd);
790 if (confCallToEnd.IsConferenceCall() == true)
792 isConferenceCallFound = true;
799 if (isConferenceCallFound == true)
801 //End conference call
802 TelCallEndType_t callEndType = TAPI_CALL_END_ACTIVE_ALL;
803 if (confCallToEnd.IsOnHold() == true)
805 callEndType = TAPI_CALL_END_HOLD_ALL;
807 int res = tel_end_call(__pTapiHandle, confCallToEnd.GetCallHandle()->ToLong(), callEndType, &HandleEndConferenceCallbackResponse, this);
808 if (res == TAPI_CAUSE_SUCCESS)
817 TelephonyManager::HoldConferenceCall(bool holdCall)
819 result r = E_FAILURE;
820 int confCallIndex = -1;
821 AppCallInfo confCallToHold;
822 bool isConferenceCallFound = false;
824 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
825 int confCallCount = pCallList->GetCount();
827 for (int index = 0; index < confCallCount; index++)
829 pCallList->GetAt(index, confCallToHold);
830 if (confCallToHold.IsConferenceCall() == true)
832 isConferenceCallFound = true;
833 confCallIndex = index;
834 //Found the Conference call to be ended.
839 if (isConferenceCallFound == false)
846 unsigned int callHandle = confCallToHold.GetCallHandle()->ToLong();
847 int res = TAPI_API_INVALID_INPUT;
848 if (holdCall == true)
850 res = tel_hold_call(__pTapiHandle, callHandle, &HandleCallbackResponse, this);
854 res = tel_active_call(__pTapiHandle, callHandle, &HandleCallbackResponse, this);
856 if (res == TAPI_API_SUCCESS)
859 if (holdCall == true)
861 confCallToHold.SetOnHold(true);
865 confCallToHold.SetOnHold(false);
867 AppCallInfo* pConfCallInfo = new (std::nothrow) AppCallInfo();
868 *pConfCallInfo = confCallToHold;
869 __pActiveCallList->Remove(callHandle);
870 __pActiveCallList->Add(callHandle, *pConfCallInfo);
883 TelephonyManager::JoinCall(void)
885 result r = E_FAILURE;
887 AppCallInfo activeCall;
888 AppCallInfo heldCall;
889 // Use enumerator to access elements in the map
890 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
891 r = pCallList->GetAt(0, activeCall);
895 r = pCallList->GetAt(1, heldCall);
898 unsigned int activeCallHandle = activeCall.GetCallHandle()->ToLong();
899 unsigned int heldCallHandle = heldCall.GetCallHandle()->ToLong();
901 //Check if participants in conference call are under limit.
902 if ((heldCall.IsConferenceCall() == true) && (heldCall.GetCallerListCount() < IDI_MAX_CONF_CALL_PARTICIPANTS))
904 res = tel_join_call(__pTapiHandle, heldCallHandle, activeCallHandle, &HandleJoinCallbackResponse, this);
906 else if (activeCall.GetCallerListCount() < IDI_MAX_CONF_CALL_PARTICIPANTS)
908 res = tel_join_call(__pTapiHandle, activeCallHandle, heldCallHandle, &HandleJoinCallbackResponse, this);
914 if (res == TAPI_API_SUCCESS)
926 TelephonyManager::HoldActiveCall(AppCallInfo* pActiveCallInfo, bool holdCall)
928 unsigned int callHandle = pActiveCallInfo->GetCallHandle()->ToLong();
930 if (holdCall == true)
932 retStatus = tel_hold_call(__pTapiHandle, callHandle, &HandleCallbackResponse, this);
936 retStatus = tel_active_call(__pTapiHandle, callHandle, &HandleCallbackResponse, this);
939 if (retStatus == TAPI_CAUSE_SUCCESS)
941 AppCallInfo* pHeldCallInfo = new (std::nothrow) AppCallInfo();
942 //copy state into new callinfo object
943 *pHeldCallInfo = *pActiveCallInfo;
945 //set call to hold state
946 pHeldCallInfo->SetOnHold(holdCall);
948 __pActiveCallList->Remove(callHandle);
949 //replace old object with new
950 __pActiveCallList->Add(callHandle, *pHeldCallInfo);
960 TelephonyManager::DialOutgoingCall(String& contactNumber, bool isEmergency)
962 TelCallDial_t structDialCall;
964 AppLogDebug("Enter %ls",contactNumber.GetPointer());
965 //Temp String to replace , with P and ; with W
966 String TempContactNum;
967 TempContactNum.Append(contactNumber);
968 TempContactNum.Replace(L",",L"W");
969 TempContactNum.Replace(L";",L",");
970 //conversion "contactNumber" to char*
971 const wchar_t* pContact = TempContactNum.GetPointer();
972 int len = TempContactNum.GetLength()+1;
973 char* pNumber = new (std::nothrow) char[len];
974 wcstombs(pNumber, pContact, len);
977 //initialize request parameter
978 memset(&structDialCall, '\0', sizeof(TelCallDial_t));
979 memcpy(structDialCall.szNumber, pNumber, strlen(pNumber));
980 AppLogDebug("%s",structDialCall.szNumber);
981 if(isEmergency == true)
983 structDialCall.CallType = TAPI_CALL_TYPE_E911;
987 structDialCall.CallType = TAPI_CALL_TYPE_VOICE;
990 int res = tel_dial_call(__pTapiHandle, &structDialCall, &HandleDialCallbackResponse, this);
991 if (__pSoundManager == null)
993 __pSoundManager = new (std::nothrow) SoundManager();
995 __pSoundManager->StartSession();
999 if (res == TAPI_CAUSE_SUCCESS)
1001 if (__pDialedCall != null)
1003 delete __pDialedCall;
1004 __pDialedCall = null;
1006 __pDialedCall = new (std::nothrow) AppCallInfo();
1007 __pDialedCall->SetContactNumber(contactNumber);
1008 __pDialedCall->SetEmergency(isEmergency);
1009 result r = FetchContactInfoForNumber(contactNumber);
1012 __pDialedCall->SetContactInfo(*__pCachedContact);
1023 TelephonyManager::SwapCalls(void)
1025 result r = E_FAILURE;
1027 //check if there are atleast 2 active calls
1028 if (__pActiveCallList->GetCount() == IDI_MAX_ACTIVE_CALLS)
1032 //fetch call handles
1033 IListT<long>* pCallHandleList = __pActiveCallList->GetKeysN();
1034 long callHandle1 = 0;
1035 pCallHandleList->GetAt(0, callHandle1);
1036 long callHandle2 = 0;
1037 pCallHandleList->GetAt(1, callHandle2);
1039 retStatus = tel_swap_call(__pTapiHandle, callHandle1, callHandle2, &HandleSwapCallbackResponse, this);
1041 if (retStatus == TAPI_CAUSE_SUCCESS)
1045 delete pCallHandleList;
1046 pCallHandleList = null;
1053 TelephonyManager::SendCallDTMF(String& textToBeSent)
1055 result r = E_FAILURE;
1056 //check if there is an active Call
1057 if (__pActiveCallList->GetCount() > 0)
1059 //conversion "textToBeSent" to char*
1060 const wchar_t* pTextToBeSent = textToBeSent.GetPointer();
1061 int len = textToBeSent.GetLength() + 1;
1062 char* pNumber = new (std::nothrow) char[len];
1063 wcstombs(pNumber, pTextToBeSent, len);
1064 int retStatus = tel_call_dtmf(__pTapiHandle, pNumber, &HandleCallbackResponse, this);
1067 if (retStatus == TAPI_CAUSE_SUCCESS)
1076 TelephonyManager::EndFromConference(int callHandle)
1078 result r = E_FAILURE;
1079 int confCallIndex = -1;
1080 AppCallInfo endConfCall;
1081 bool isConferenceCallFound = false;
1083 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
1084 int callCount = pCallList->GetCount();
1085 for (int index = 0; index < callCount; index++)
1087 pCallList->GetAt(index, endConfCall);
1088 if (endConfCall.IsConferenceCall() == true)
1090 isConferenceCallFound = true;
1091 confCallIndex = index;
1092 //Found the Conference call to be ended.
1100 if (isConferenceCallFound == false)
1102 //no conference call found
1106 //Identify the call to be ended and remove from list on API success
1107 AppCallInfo callToBeEnded;
1108 IListT<AppCallInfo>* pParticipantList = endConfCall.GetCallerList();
1109 int participantCount = pParticipantList->GetCount();
1110 for (int index = 0; index < participantCount; index++)
1112 pParticipantList->GetAt(index, callToBeEnded);
1113 if (callToBeEnded.GetCallHandle()->ToLong() == callHandle)
1115 //Identify the call to be ended and remove from list on API success
1116 TelCallEndType_t endType = TAPI_CALL_END;
1118 int res = tel_end_call(__pTapiHandle, callHandle, endType, &HandleEndFromConferenceCallbackResponse, this);
1119 if (res == TAPI_CAUSE_SUCCESS)
1135 TelephonyManager::SplitFromConference(int callHandle)
1137 result r = E_FAILURE;
1138 int confCallIndex = -1;
1139 AppCallInfo endConfCall;
1140 bool isConferenceCallFound = false;
1142 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
1143 int callCount = pCallList->GetCount();
1144 for (int index = 0; index < callCount; index++)
1146 pCallList->GetAt(index, endConfCall);
1147 if (endConfCall.IsConferenceCall() == true)
1149 isConferenceCallFound = true;
1150 confCallIndex = index;
1151 //Found the Conference call to be ended.
1157 if (isConferenceCallFound == false)
1159 //no conference call found
1163 //Identify the call to be ended and remove from list on API success
1164 AppCallInfo callToBeEnded;
1165 pCallList = endConfCall.GetCallerList();
1166 callCount = pCallList->GetCount();
1167 for (int index = 0; index < callCount; index++)
1169 pCallList->GetAt(index, callToBeEnded);
1170 if (callToBeEnded.GetCallHandle()->ToLong() == callHandle)
1172 int res = tel_split_call(__pTapiHandle, callHandle, &HandleSplitFromConferenceCallbackResponse, this);
1173 if (res == TAPI_CAUSE_SUCCESS)
1188 TelephonyManager::SetMuteStatus(bool setMute)
1190 TelSoundMuteStatus_t muteStatus;
1191 result r = E_FAILURE;
1192 if (setMute == true)
1194 muteStatus = TAPI_SOUND_MUTE_STATUS_ON;
1198 muteStatus = TAPI_SOUND_MUTE_STATUS_OFF;
1200 int res = tel_set_call_mute_status(__pTapiHandle, muteStatus, &HandleCallbackResponse, this);
1201 if (res == TAPI_CAUSE_SUCCESS)
1203 __isMuted = setMute;
1214 TelephonyManager::IsCallMuted(void)
1220 TelephonyManager::SetSpeakerStatus(bool setSpeaker)
1222 result r = E_FAILURE;
1223 TelCallSoundPathInfo_t callSoundPathInfo;
1224 __pSoundManager->SetSpeakerStatus(setSpeaker);
1225 if (setSpeaker == true)
1227 callSoundPathInfo.path = TAPI_SOUND_PATH_SPK_PHONE;
1231 callSoundPathInfo.path = TAPI_SOUND_PATH_HANDSET;
1233 callSoundPathInfo.ex_volume = TelCallSoundPathInfo_t::TAPI_SOUND_EX_VOLUME_ON;
1235 int res = tel_set_call_sound_path(__pTapiHandle, &callSoundPathInfo, &HandleCallbackResponse, this);
1237 if (res == TAPI_CAUSE_SUCCESS)
1239 __isSpeakerOn = setSpeaker;
1250 TelephonyManager::IsSpeakerOn(void)
1252 return __isSpeakerOn;
1256 TelephonyManager::IsSplitAllowed(void)
1258 // Split functionality is allowed only if a one call is present.
1259 // The call can be a single call or a conference call
1260 if (__pActiveCallList->GetCount() == 1)
1268 TelephonyManager::HandleCallbackResponse(TapiHandle* pHandle, int callBackResult, void* pData, void* pUserData)
1270 //should not do anything here.
1274 TelephonyManager::HandleDialCallbackResponse(TapiHandle* pHandle, int callBackResult, void* pData, void* pUserData)
1276 TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
1277 if (callBackResult != TAPI_CAUSE_SUCCESS)
1279 if (pTelManager->__pDialedCall != null)
1281 delete pTelManager->__pDialedCall;
1282 pTelManager->__pDialedCall = null;
1284 pTelManager->__pEventListener->HandleTelephonyError(ERROR_DIAL_FAILED);
1289 TelephonyManager::HandleRejectCallbackResponse(TapiHandle* pHandle, int callBackResult, void* pData, void* pUserData)
1291 AppLogDebug("ENTER");
1292 // This callback comes only if user has rejected an incoming call from IncomingCallForm.
1293 TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
1294 if (pData != null && callBackResult == TAPI_API_SUCCESS)
1296 unsigned int rejectedCallHandle = 0;
1297 memcpy(&rejectedCallHandle, pData, sizeof(TS_UINT));
1299 //Check if incoming call is rejected
1300 if (pTelManager->__pIncomingCall != null && (rejectedCallHandle == (unsigned int) pTelManager->__pIncomingCall->GetCallHandle()->ToLong()))
1302 AppLogDebug("Call rejected by user");
1303 AppCallInfo rejectedCallInfo;
1304 rejectedCallInfo = *(pTelManager->__pIncomingCall);
1305 delete pTelManager->__pIncomingCall;
1306 pTelManager->__pIncomingCall = null;
1308 //rejected by user from incoming call form
1309 rejectedCallInfo.SetCalllogType(CALL_LOG_TYPE_VOICE_REJECTED);
1310 //Save rejected incoming call to call log db.
1311 pTelManager->SaveCallInfoToLogsDb(rejectedCallInfo);
1313 //check if the ended call was the last call
1314 bool isLastCall = (pTelManager->__pActiveCallList->GetCount() == 0);
1315 //Stop alert - started only for incoming calls which are not blocked.
1316 if(pTelManager->__pSoundManager != null)
1318 pTelManager->__pSoundManager->StopAlert();
1319 //Do not call stop session if there is already a call going on
1320 if(isLastCall == true)
1322 pTelManager->__pSoundManager->StopSession();
1325 //Send notification to user
1326 ArrayListT<AppCallInfo>* pCallList = null;
1329 //save 'RejectedCall' to list to show on EndCallForm
1330 pCallList = new (std::nothrow) ArrayListT<AppCallInfo>();
1331 pCallList->Construct(1);
1332 AppCallInfo* pRejectedCall = new (std::nothrow) AppCallInfo();
1333 *pRejectedCall = rejectedCallInfo;
1334 pCallList->Add(*pRejectedCall);
1338 //fetch active calls to show appropriate scene
1339 pCallList = static_cast<ArrayListT<AppCallInfo>*>(pTelManager->__pActiveCallList->GetValuesN());
1341 pTelManager->__pEventListener->HandleCallDisconnected(isLastCall, *pCallList);
1348 pTelManager->__pEventListener->HandleTelephonyError(ERROR_REJECT_FAILED);
1350 AppLogDebug("EXIT");
1354 TelephonyManager::HandleJoinCallbackResponse(TapiHandle* pHandle, int callBackResult, void* pData, void* pUserData)
1356 TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
1357 if (callBackResult == TAPI_API_SUCCESS && pData != null)
1359 unsigned int tempHandle = 0;
1360 TelCallInfoJoinedNoti_t joinedInfoNotification;
1361 AppCallInfo confCallInfo;
1363 memcpy(&tempHandle, pData, sizeof(TS_UINT));
1364 joinedInfoNotification.id = tempHandle;
1365 AppCallInfo activeCall;
1366 AppCallInfo heldCall;
1367 // Use enumerator to access elements in the map
1368 IListT<AppCallInfo>* pCallList = pTelManager->__pActiveCallList->GetValuesN();
1369 result r = pCallList->GetAt(0, activeCall);
1373 r = pCallList->GetAt(1, heldCall);
1376 AppCallInfo* pConfCallInfo = new (std::nothrow) AppCallInfo();
1377 unsigned int activeCallHandle = activeCall.GetCallHandle()->ToLong();
1378 unsigned int heldCallHandle = heldCall.GetCallHandle()->ToLong();
1379 if (activeCall.IsConferenceCall() == true)
1382 //When joined both become active
1383 activeCall.SetOnHold(false);
1384 heldCall.SetOnHold(false);
1385 *pConfCallInfo = activeCall;
1386 pConfCallInfo->AddCallToCallerList(heldCall);
1387 pConfCallInfo->SetCallHandle(activeCallHandle);
1388 //Set call start time
1389 if (pConfCallInfo->GetCallConnectTime() > heldCall.GetCallConnectTime())
1391 pConfCallInfo->SetCallConnectTime(heldCall.GetCallConnectTime());
1392 pConfCallInfo->SetCallNotificationTime(heldCall.GetCallNotificationTime());
1395 else if (heldCall.IsConferenceCall() == true)
1398 heldCall.SetOnHold(false);
1399 activeCall.SetOnHold(false);
1400 *pConfCallInfo = heldCall;
1401 pConfCallInfo->AddCallToCallerList(activeCall);
1402 pConfCallInfo->SetCallHandle(heldCallHandle);
1403 //Set call start time
1404 if (pConfCallInfo->GetCallConnectTime() > activeCall.GetCallConnectTime())
1406 pConfCallInfo->SetCallConnectTime(activeCall.GetCallConnectTime());
1407 pConfCallInfo->SetCallNotificationTime(activeCall.GetCallNotificationTime());
1413 pConfCallInfo->SetConference(true);
1414 heldCall.SetOnHold(false);
1415 activeCall.SetOnHold(false);
1416 pConfCallInfo->AddCallToCallerList(activeCall);
1417 pConfCallInfo->AddCallToCallerList(heldCall);
1418 pConfCallInfo->SetCallHandle(activeCallHandle);
1419 //Set call start time
1420 if (activeCall.GetCallConnectTime() > heldCall.GetCallConnectTime())
1422 pConfCallInfo->SetCallConnectTime(heldCall.GetCallConnectTime());
1423 pConfCallInfo->SetCallNotificationTime(heldCall.GetCallNotificationTime());
1427 pConfCallInfo->SetCallConnectTime(activeCall.GetCallConnectTime());
1428 pConfCallInfo->SetCallNotificationTime(activeCall.GetCallNotificationTime());
1431 pConfCallInfo->SetCallHandle(joinedInfoNotification.id);
1432 pTelManager->__pActiveCallList->RemoveAll();
1433 //only one call in the list
1434 pTelManager->__pActiveCallList->Add(joinedInfoNotification.id, *pConfCallInfo);
1435 //notify listener that call is connected.
1436 pTelManager->__pEventListener->HandleConferenceCall(*pConfCallInfo);
1444 pTelManager->__pEventListener->HandleTelephonyError(ERROR_JOIN_FAILED);
1449 TelephonyManager::HandleSwapCallbackResponse(TapiHandle* pHandle, int callBackResult, void* pData, void* pUserData)
1451 TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
1452 if (callBackResult == TAPI_CAUSE_SUCCESS)
1454 IListT<AppCallInfo>* pCallList = pTelManager->__pActiveCallList->GetValuesN();
1455 IListT<long>* pKeyList = pTelManager->__pActiveCallList->GetKeysN();
1456 int callCount = pTelManager->__pActiveCallList->GetCount();
1457 for (int index = 0; index < callCount; index++)
1459 AppCallInfo* pTempCallInfo = new (std::nothrow) AppCallInfo();
1460 pCallList->GetAt(index, *pTempCallInfo);
1461 (pTempCallInfo->IsOnHold() == false) ? pTempCallInfo->SetOnHold(true) : pTempCallInfo->SetOnHold(false);
1463 pKeyList->GetAt(index, callHandle);
1464 pTelManager->__pActiveCallList->SetValue(callHandle, *pTempCallInfo);
1470 pCallList = pTelManager->__pActiveCallList->GetValuesN();
1471 pTelManager->__pEventListener->HandleCallSwapOccured(*pCallList);
1475 pTelManager->__pEventListener->HandleTelephonyError(ERROR_SWAP_FAILED);
1480 TelephonyManager::HandleEndFromConferenceCallbackResponse(TapiHandle* pHandle, int callBackResult, void* pData, void* pUserData)
1482 AppLogDebug("ENTER");
1483 //This callback comes if a single call is ended from Conference call.
1484 TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
1485 bool isParticipantCallEnded = false;
1487 if (callBackResult == TAPI_CAUSE_SUCCESS && pData != null)
1489 //fetch end call handle
1490 TelCallEndCnf_t callEndNotification;
1491 memcpy(&callEndNotification, pData, sizeof(TelCallEndCnf_t));
1492 //Fetch conference call
1493 AppCallInfo endConfCall;
1494 bool isConferenceCallFound = false;
1495 IListT<AppCallInfo>* pCallList = pTelManager->__pActiveCallList->GetValuesN();
1496 int callCount = pCallList->GetCount();
1497 for (int index = 0; index < callCount; index++)
1499 pCallList->GetAt(index, endConfCall);
1500 if (endConfCall.IsConferenceCall() == true)
1502 isConferenceCallFound = true;
1503 //Found the Conference call to be changed.
1510 //Identify the call to be ended and remove from list.
1511 if (isConferenceCallFound == true)
1513 isParticipantCallEnded = pTelManager->HandleParticipantEndedFromConference(callEndNotification.id, endConfCall);
1518 AppLog("TAPI Failed - %d", callBackResult);
1521 //Check if participant call or Conference call was not found, then show error
1522 if (isParticipantCallEnded == false)
1524 pTelManager->__pEventListener->HandleTelephonyError(ERROR_END_FROM_CONFERENCE_FAILED);
1526 AppLogDebug("EXIT");
1530 TelephonyManager::HandleParticipantEndedFromConference(unsigned int participantCallHandle, AppCallInfo& conferenceCall)
1532 AppLogDebug("ENTER");
1533 //to check if participant call was found and ended.
1534 bool isParticipantCallEnded = false;
1535 //Identify the call to be ended and remove from list.
1536 AppCallInfo callToBeEnded;
1537 IListT<AppCallInfo>* pCallerList = conferenceCall.GetCallerList();
1538 int callerCount = pCallerList->GetCount();
1539 for (int index = 0; index < callerCount; index++)
1541 pCallerList->GetAt(index, callToBeEnded);
1542 if ((unsigned int)callToBeEnded.GetCallHandle()->ToLong() == participantCallHandle)
1544 //Identify the call to be ended and remove from conference list
1545 conferenceCall.RemoveCallFromCallerList(index);
1546 //update its status to individual call before saving to database
1547 callToBeEnded.SetConference(false);
1548 SaveCallInfoToLogsDb(callToBeEnded);
1549 isParticipantCallEnded = true;
1554 if(isParticipantCallEnded == false)
1556 //participant call not found and not ended
1557 return isParticipantCallEnded;
1560 unsigned int confCallHandle = (unsigned int)conferenceCall.GetCallHandle()->ToLong();
1561 //Check if last participant removed. If yes, switch to single active view
1562 if (conferenceCall.GetCallerListCount() == 1)
1564 AppCallInfo callFromList;
1565 pCallerList = conferenceCall.GetCallerList();
1566 pCallerList->GetAt(0, callFromList);
1567 //construct a new single active call
1568 AppCallInfo* pActiveCall = new (std::nothrow) AppCallInfo();
1569 *pActiveCall = callFromList;
1570 //update conference status and Hold status
1571 pActiveCall->SetConference(false);
1572 pActiveCall->SetOnHold(conferenceCall.IsOnHold());
1574 __pActiveCallList->Remove(confCallHandle);
1575 __pActiveCallList->Add(pActiveCall->GetCallHandle()->ToLong(), *pActiveCall);
1578 //using the callConnected to switch to single active screen
1579 //or update multiple active call screen
1580 IListT<AppCallInfo>* pActiveCallList = __pActiveCallList->GetValuesN();
1581 __pEventListener->HandleCallConnected(*pActiveCallList);
1582 delete pActiveCallList;
1583 pActiveCallList = null;
1587 AppCallInfo callFromList;
1588 pCallerList = conferenceCall.GetCallerList();
1589 pCallerList->GetAt(0, callFromList);
1590 //construct a new conference call
1591 AppCallInfo* pConfCallInfo = new (std::nothrow) AppCallInfo();
1592 *pConfCallInfo = conferenceCall;
1593 if (confCallHandle == participantCallHandle)
1595 //Call Handle is same as conf call handle, so need to change conf call handle
1596 __pActiveCallList->Remove(confCallHandle);
1597 int newConfCallHandle = callFromList.GetCallHandle()->ToLong();
1598 pConfCallInfo->SetCallHandle(newConfCallHandle);
1599 __pActiveCallList->Add(newConfCallHandle, *pConfCallInfo);
1603 __pActiveCallList->SetValue(confCallHandle, *pConfCallInfo);
1605 __pEventListener->HandleConferenceChange();
1607 AppLogDebug("EXIT");
1608 return isParticipantCallEnded;
1612 TelephonyManager::HandleSplitFromConferenceCallbackResponse(TapiHandle* pHandle, int callBackResult, void* pData, void* pUserData)
1614 TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
1615 if (callBackResult == TAPI_CAUSE_SUCCESS && pData != null)
1617 TelCallSplitCnf_t callSplitNotification;
1618 memcpy(&callSplitNotification, pData, sizeof(TelCallSplitCnf_t));
1619 int confCallIndex = -1;
1620 AppCallInfo endConfCall;
1621 bool isConferenceCallFound = false;
1623 IListT<AppCallInfo>* pCallList = pTelManager->__pActiveCallList->GetValuesN();
1624 int callCount = pCallList->GetCount();
1625 for (int index = 0; index < callCount; index++)
1627 pCallList->GetAt(index, endConfCall);
1628 if (endConfCall.IsConferenceCall() == true)
1630 isConferenceCallFound = true;
1631 confCallIndex = index;
1632 //Found the Conference call to be ended.
1637 if (isConferenceCallFound == false)
1645 //Identify the call to be ended and remove from list on API success
1646 AppCallInfo callToBeEnded;
1647 pCallList = endConfCall.GetCallerList();
1648 callCount = pCallList->GetCount();
1649 for (int index = 0; index < callCount; index++)
1651 pCallList->GetAt(index, callToBeEnded);
1652 if ((unsigned int)callToBeEnded.GetCallHandle()->ToLong() == callSplitNotification.id)
1654 //Identified the call to be ended and remove from conference list
1655 //Add this to the active call list
1656 endConfCall.RemoveCallFromCallerList(index);
1660 unsigned int confCallHandle = (unsigned int)endConfCall.GetCallHandle()->ToLong();
1661 //Set the hold flags correctly and make the changes to the active call list
1662 if (endConfCall.GetCallerListCount() == 1)
1664 //Set hold for the other single call
1665 // and add to the list
1666 AppCallInfo callFromList;
1667 pCallList = endConfCall.GetCallerList();
1668 pCallList->GetAt(0, callFromList);
1669 AppCallInfo* pHeldCall = new (std::nothrow) AppCallInfo();
1670 *pHeldCall = callFromList;
1671 pHeldCall->SetConference(false);
1672 pHeldCall->SetOnHold(true);
1673 pTelManager->__pActiveCallList->Remove(confCallHandle);
1674 pTelManager->__pActiveCallList->Add(pHeldCall->GetCallHandle()->ToLong(), *pHeldCall);
1679 //Set hold flag for conference call
1680 endConfCall.SetOnHold(true);
1681 AppCallInfo callFromList;
1682 pCallList = endConfCall.GetCallerList();
1683 pCallList->GetAt(0, callFromList);
1685 AppCallInfo* pConfCallInfo = new (std::nothrow) AppCallInfo();
1686 *pConfCallInfo = endConfCall;
1687 if (confCallHandle == callSplitNotification.id)
1689 //Call Handle is same as conf call handle.
1690 //Change conf call handle
1691 pTelManager->__pActiveCallList->Remove(confCallHandle);
1692 int tmpCallHandle = callFromList.GetCallHandle()->ToLong();
1693 pConfCallInfo->SetCallHandle(tmpCallHandle);
1694 pTelManager->__pActiveCallList->Add(callFromList.GetCallHandle()->ToLong(), *pConfCallInfo);
1698 pTelManager->__pActiveCallList->Remove(confCallHandle);
1699 pTelManager->__pActiveCallList->Add(confCallHandle, *pConfCallInfo);
1702 //Add the new active call to active call list
1703 AppCallInfo* pActiveCall = new (std::nothrow) AppCallInfo();
1704 *pActiveCall = callToBeEnded;
1705 pActiveCall->SetConference(false);
1706 pActiveCall->SetOnHold(false);
1707 pTelManager->__pActiveCallList->Remove(pActiveCall->GetCallHandle()->ToLong());
1708 pTelManager->__pActiveCallList->Add(pActiveCall->GetCallHandle()->ToLong(), *pActiveCall);
1710 //using the callConnected to switch to Multiple active screen
1711 pCallList = pTelManager->__pActiveCallList->GetValuesN();
1712 pTelManager->__pEventListener->HandleCallConnected(*pCallList);
1717 pTelManager->__pEventListener->HandleTelephonyError(ERROR_SPLIT_FROM_CONFERENCE_FAILED);
1722 TelephonyManager::HandleEndConferenceCallbackResponse(TapiHandle* pHandle, int callBackResult, void* pData, void* pUserData)
1725 //This callback comes only if a conference call is ended by user.
1726 TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
1727 if (callBackResult == TAPI_CAUSE_SUCCESS && pData != null)
1729 //fetch ended confCall details
1730 result r = E_FAILURE;
1731 AppCallInfo endConfCallInfo;
1732 IListT<AppCallInfo>* pActiveCallList = pTelManager->__pActiveCallList->GetValuesN();
1733 if(pActiveCallList != null && pActiveCallList->GetCount() > 0)
1735 for (int index = 0; index < pActiveCallList->GetCount(); index++)
1737 r = pActiveCallList->GetAt(index, endConfCallInfo);
1738 if(r == E_SUCCESS && endConfCallInfo.IsConferenceCall() == true)
1740 //conference call found.
1750 delete pActiveCallList;
1751 pActiveCallList = null;
1753 //check if no conference call found, then return.
1758 //remove the conference call handle from active call list to avoid any processing in HandleIdleCallback().
1759 pTelManager->__pActiveCallList->Remove(endConfCallInfo.GetCallHandle()->ToLong());
1760 //Save "End" Conf. call info to call log database
1761 pTelManager->SaveCallInfoToLogsDb(endConfCallInfo);
1763 //check if the ended call was the last call and show notification to user
1764 bool isLastCall = (pTelManager->__pActiveCallList->GetCount() == 0);
1765 ArrayListT<AppCallInfo>* pCallList = null;
1768 pTelManager->__pSoundManager->SetlastEndedConferenceCall();
1769 //stop sound session
1770 pTelManager->__pSoundManager->StopSession();
1771 //send empty call list to show dialer or call log screen
1772 pCallList = new (std::nothrow) ArrayListT<AppCallInfo>();
1776 //fetch active calls to show appropriate scene
1777 pCallList = static_cast<ArrayListT<AppCallInfo>*>(pTelManager->__pActiveCallList->GetValuesN());
1779 //notify listener that call is disconnected.
1780 pTelManager->__pEventListener->HandleCallDisconnected(isLastCall, *pCallList);
1786 pTelManager->__pEventListener->HandleTelephonyError(ERROR_END_CALL_FAILED);
1792 TelephonyManager::HandleIdleCallBack(void* pData)
1794 AppLogDebug("ENTER");
1795 //This callback comes when any type of calls are ended
1796 //We do NOT handle below scenarios here -
1797 //1) In incoming call scenarios, if we end any active calls - handled in "AcceptCall()".
1798 //2) Incoming call automatically blocked is handled in "AnswerAutoRejectCall()" and rejection by user scenarios are handled in "HandleRejectCallbackResponse()".
1799 //3) End conference call is handled in "HandleEndConferenceCallbackResponse()".
1800 //4) End Single Call from Conference call by user is handled in "HandleEndFromConferenceCallbackResponse()".
1801 //5) End Single Call from Conference call using eventInjector is diverted to "HandleParticipantEndedFromConference()".
1802 //BUT, we do handle below scenarios here -
1803 //1) "MISSED" incoming call scenario here i.e incoming call is rejected by other caller.
1804 //2) an "unconnected" dialed call is ended by caller or other party.
1805 //3) Any normal active calls(NOT conference calls) ended by user or by other party.
1807 if(__pSoundManager->GetLastConferenceCall() == false)
1809 __pSoundManager->SetDisconnectTone();
1812 TelCallStatusIdleNoti_t idleNotification;
1813 memcpy(&idleNotification, pData, sizeof(TelCallStatusIdleNoti_t));
1814 //handle end call event, show next screen
1815 unsigned int endCallHandle = idleNotification.id;
1817 //empty active call list or no dialed or incoming calls - ignore this event
1818 IListT<AppCallInfo>* pActiveCallList = __pActiveCallList->GetValuesN();
1819 if((pActiveCallList == null || pActiveCallList->GetCount() <= 0) && __pDialedCall == null && __pIncomingCall == null)
1821 delete pActiveCallList;
1822 AppLogDebug("EXIT - no calls exist");
1826 //Check if ended call was among conference caller list,
1827 //then divert event to "HandleParticipantEndedFromConference()"
1828 AppCallInfo confCallInfo;
1829 bool isConferenceCallChanged = false;
1830 for (int index = 0; (pActiveCallList != null && index < pActiveCallList->GetCount()); index++)
1832 //fetch conference call
1833 result r = pActiveCallList->GetAt(index, confCallInfo);
1834 if (r == E_SUCCESS && confCallInfo.IsConferenceCall() == true)
1836 //Conference call found - check if ended call is a participant
1837 isConferenceCallChanged = HandleParticipantEndedFromConference(endCallHandle, confCallInfo);
1841 delete pActiveCallList;
1842 pActiveCallList = null;
1843 if (isConferenceCallChanged == true)
1845 //end call event handled - conference call will now either remain as conf. call
1846 //or become single active call, if it has only 1 participant left.
1847 __pSoundManager->SetSoundMode(SOUND_MODE_VOICE);
1848 AppLogDebug("isConferenceCallChanged == true");
1852 //check if ended call was among the active call list and not a conference call
1853 AppCallInfo endCallInfo;
1854 result r = __pActiveCallList->GetValue(endCallHandle, endCallInfo);
1857 bool isHandled = HandleEndNormalActiveCall(endCallInfo);
1858 if (isHandled == true)
1860 __pSoundManager->SetSoundMode(SOUND_MODE_VOICE);
1865 //Check if dialed call is rejected by other party
1866 bool isDialedCallEnded = ((__pDialedCall != null) && (__pDialedCall->GetCallHandle() != null) &&(((unsigned int)__pDialedCall->GetCallHandle()->ToLong()) == idleNotification.id));
1867 //Check if "missed" incoming call is ended
1868 bool isMissedIncomingCallEnded = (__pIncomingCall != null && ((unsigned int)__pIncomingCall->GetCallHandle()->ToLong() == idleNotification.id));
1869 if (isDialedCallEnded == true || isMissedIncomingCallEnded == true)
1871 //It comes here only if the ended call was either a "unconnected" dialed call or an "Missed" incoming call.
1872 bool isLastCall = (__pActiveCallList->GetCount() == 0);
1874 ArrayListT<AppCallInfo>* pCallList = null;
1875 //Check if dialed call was ended
1876 if (isDialedCallEnded == true)
1878 AppLogDebug("Dialed Call Ended");
1879 //Call Ended is the dialed call
1880 endCallInfo = *(__pDialedCall);
1881 delete __pDialedCall;
1882 __pDialedCall = null;
1886 //Here, only "Missed" Incoming call ended by other caller is handled.
1887 AppLogDebug("Missed Call Ended");
1888 __pSoundManager->StopAlert();
1889 endCallInfo = *(__pIncomingCall);
1890 delete __pIncomingCall;
1891 __pIncomingCall = null;
1892 //update missed status
1893 endCallInfo.SetCalllogType(CALL_LOG_TYPE_VOICE_MISSED_UNSEEN);
1895 //save ended call to call log db.
1896 SaveCallInfoToLogsDb(endCallInfo);
1898 //notify listener that call is disconnected.
1899 if (isLastCall == true)
1901 __pSoundManager->StopSession();
1902 pCallList = new (std::nothrow) ArrayListT<AppCallInfo>();
1903 pCallList->Construct(1);
1904 if (isMissedIncomingCallEnded == false)
1906 //save to list to show EndCallForm
1907 pCallList->Add(endCallInfo);
1909 __pSoundManager->GetTimer()->Cancel();
1914 pCallList = static_cast<ArrayListT<AppCallInfo>*>(__pActiveCallList->GetValuesN());
1916 __pEventListener->HandleCallDisconnected(isLastCall, *pCallList);
1920 __pSoundManager->SetSoundMode(SOUND_MODE_VOICE);
1921 AppLogDebug("EXIT");
1925 TelephonyManager::HandleEndNormalActiveCall(AppCallInfo& endCallInfo)
1927 AppLogDebug("Enter");
1928 // This function gets called only from HandleIdleCallback(),
1929 // to handle disconnection of normal active calls.
1930 if (endCallInfo.IsConferenceCall() == false)
1932 //remove the call handle from active call list
1933 __pActiveCallList->Remove(endCallInfo.GetCallHandle()->ToLong());
1934 //check if the ended call was the last call and show notification to user
1935 bool isLastCall = (__pActiveCallList->GetCount() == 0);
1936 ArrayListT<AppCallInfo>* pCallList = null;
1939 //stop sound session
1940 __pSoundManager->StopSession();
1941 //save "End" CallInfo to list to show EndCallForm
1942 pCallList = new (std::nothrow) ArrayListT<AppCallInfo>();
1943 pCallList->Construct(1);
1944 pCallList->Add(endCallInfo);
1948 //fetch active calls to show appropriate scene
1949 pCallList = static_cast<ArrayListT<AppCallInfo>*>(__pActiveCallList->GetValuesN());
1952 //Save "End" call info to call log database
1953 SaveCallInfoToLogsDb(endCallInfo);
1954 //notify listener that call is disconnected.
1955 __pEventListener->HandleCallDisconnected(isLastCall, *pCallList);
1964 TelephonyManager::HandleDialingCallBack(void* pData)
1966 AppLogDebug("Enter");
1967 unsigned int tempHandle = 0;
1968 TelCallStatusDialingNoti_t dialingNotification;
1969 memcpy(&tempHandle, pData, sizeof(TS_UINT));
1970 dialingNotification.id = tempHandle;
1971 //check if callback is for different dialed call
1972 //Dont check for call handle, since this is the first time, we get call handle for a dialed call.
1973 if (__pDialedCall == null)
1975 AppLogDebug("__pDialedCall == null");
1976 //construct new dialed call
1977 __pDialedCall = new (std::nothrow) AppCallInfo();
1979 TelCallStatus_t callStatus;
1980 int res = tel_get_call_status(__pTapiHandle, dialingNotification.id, &callStatus);
1981 if (res == TAPI_CAUSE_SUCCESS)
1984 String contactNumber(callStatus.pNumber);
1985 __pDialedCall->SetContactNumber(contactNumber);
1986 //set emergency state
1987 if(callStatus.CallType == TAPI_CALL_TYPE_E911)
1989 __pDialedCall->SetEmergency(true);
1993 __pDialedCall->SetEmergency(false);
1996 FetchContactInfoForNumber(__pDialedCall->GetContactNumber());
1997 if (__pCachedContact != null)
1999 __pDialedCall->SetContactInfo(*(__pCachedContact));
2003 //set call handle for dialed call
2004 __pDialedCall->SetCallHandle(dialingNotification.id);
2005 __pDialedCall->SetCalllogType(CALL_LOG_TYPE_VOICE_OUTGOING);
2007 //set call notification time.
2008 long long startTime = 0;
2009 SystemTime::GetTicks(startTime);
2010 __pDialedCall->SetCallNotificationTime(startTime);
2014 TelephonyManager::HandleActiveCallBack(void* pData)
2016 // This callback comes whenever any new call is connected
2017 // Or, any "Held" call is activated (we ignore activation of "Held" calls).
2018 unsigned int newCallHandle = 0;
2019 TelCallStatusActiveNoti_t activeNotification;
2020 memcpy(&newCallHandle, pData, sizeof(TS_UINT));
2021 activeNotification.id = newCallHandle;
2022 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
2024 //Check if the "Held" call was activated, i.e it is already present in already activated calls list.
2025 bool toHandleEvent = true;
2026 for (int callIndex = 0; (callIndex < pCallList->GetCount() && toHandleEvent == true); callIndex++ )
2028 AppCallInfo tempCallInfo;
2029 pCallList->GetAt(callIndex, tempCallInfo);
2030 unsigned int tempCallHandle = tempCallInfo.GetCallHandle()->ToLong();
2031 //Check if active callback came for "HandleJoinCallbackResponse"
2032 //or for "UnHold Conference Call or normal call".
2033 if(tempCallInfo.IsConferenceCall() == true)
2035 if (tempCallHandle == activeNotification.id)
2037 toHandleEvent = false;
2041 //check individual participants of conf call
2042 IListT<AppCallInfo>* pConfCallList = tempCallInfo.GetCallerList();
2043 int confCallCount = pConfCallList->GetCount();
2044 for (int callIndex = 0; (callIndex < confCallCount && toHandleEvent == true); callIndex++)
2046 AppCallInfo confCallerInfo;
2047 pConfCallList->GetAt(callIndex, confCallerInfo);
2048 unsigned int confCallerHandle = confCallerInfo.GetCallHandle()->ToLong();
2049 if (confCallerHandle == activeNotification.id)
2051 toHandleEvent = false;
2056 else if(tempCallHandle == activeNotification.id)
2058 //If normal call is UnHold
2059 toHandleEvent = false;
2063 //check if we need to handle this event.
2064 if(toHandleEvent == true)
2066 //Here it comes, only if either new dialed or incoming call was connected.
2067 HandleCallConnected( activeNotification.id);
2074 TelephonyManager::HandleCallConnected(unsigned int connectedCallHandle)
2076 //Here it comes, only if either new dialed or incoming call was connected.
2077 //This function should be called only from "HandleActiveCallback()".
2078 AppCallInfo* pConnectedCall = null;
2079 //to check if incoming call was connected
2080 bool isIncomingCallConnected = false;
2082 __pSoundManager->SetConnectTone();
2083 //Check if dialed call is connected.
2084 if ((__pDialedCall != null) && (connectedCallHandle == (unsigned int)__pDialedCall->GetCallHandle()->ToLong()))
2086 pConnectedCall = __pDialedCall;
2087 __pDialedCall = null;
2089 //Check if connected call is incoming call.
2090 else if (__pIncomingCall != null && (connectedCallHandle == (unsigned int)__pIncomingCall->GetCallHandle()->ToLong()))
2092 pConnectedCall = __pIncomingCall;
2093 __pIncomingCall = null;
2094 isIncomingCallConnected = true;
2098 // this is just for safety. This scenario should never come.
2099 // Otherwise Correct the code in some other function, if it comes here.
2100 AppLogDebug("Error - Connected call was neither one of active calls nor it was dialed or incoming call");
2101 //Construct a new CallInfo object for call
2102 pConnectedCall = new (std::nothrow) AppCallInfo();
2103 pConnectedCall->SetCallHandle(connectedCallHandle);
2105 TelCallStatus_t callStatus;
2106 int res = tel_get_call_status(__pTapiHandle, connectedCallHandle, &callStatus);
2107 if (res == TAPI_CAUSE_SUCCESS)
2109 String contactNumber(callStatus.pNumber);
2110 pConnectedCall->SetContactNumber(contactNumber);
2111 //set emergency state
2112 if(callStatus.CallType == TAPI_CALL_TYPE_E911)
2114 pConnectedCall->SetEmergency(true);
2118 pConnectedCall->SetEmergency(false);
2120 //set call notification time
2121 long long startTime = 0;
2122 SystemTime::GetTicks(startTime);
2123 pConnectedCall->SetCallNotificationTime(startTime);
2124 if (callStatus.bMoCall == true)
2126 pConnectedCall->SetCalllogType(CALL_LOG_TYPE_VOICE_OUTGOING);
2130 pConnectedCall->SetCalllogType(CALL_LOG_TYPE_VOICE_INCOMING);
2131 isIncomingCallConnected = true;
2134 //delete any dialed or incoming call objects
2135 delete __pDialedCall;
2136 __pDialedCall = null;
2137 delete __pIncomingCall;
2138 __pIncomingCall = null;
2141 //fetch contact info for connected call & it is not a hidden call
2142 if (pConnectedCall->GetContactInfo() == null && pConnectedCall->GetContactNumber().IsEmpty() == false)
2144 FetchContactInfoForNumber(pConnectedCall->GetContactNumber());
2145 if (__pCachedContact != null)
2147 pConnectedCall->SetContactInfo(*(__pCachedContact));
2150 //set Call connect time for newly connected call
2151 long long startTime = 0;
2152 SystemTime::GetTicks(startTime);
2153 pConnectedCall->SetCallConnectTime(startTime);
2154 if(GetCurrentCallCount() == 0)
2156 __pSoundManager->SetMinuteReminderTone();
2160 //transfer ownership to Active calls list
2161 __pActiveCallList->Add(connectedCallHandle, *(pConnectedCall));
2162 pConnectedCall = null;
2164 //notify listener that call is connected.
2165 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
2166 __pSoundManager->SetSoundMode(SOUND_MODE_VOICE);
2167 __pEventListener->HandleCallConnected(*pCallList);
2168 if (isIncomingCallConnected == true)
2170 __pSoundManager->StopAlert();
2177 TelephonyManager::CheckIncomingCallToBeRejected(AppCallInfo* pIncomingCallInfo)
2179 AppLogDebug("Enter");
2180 int callHandle = pIncomingCallInfo->GetCallHandle()->ToLong();
2181 String contactNumber(L"");
2182 contactNumber.Append(pIncomingCallInfo->GetContactNumber());
2183 //Check if "reject unknown calls" is set and contact number is not present in AddressBook
2184 //or if contact number is blacklisted
2185 if (((__pSettingsManager->GetUnknownRejectStatus() == true) && (pIncomingCallInfo->GetContactInfo() == null))
2186 || (__pSettingsManager->IsCallToBeRejected(contactNumber) == true))
2188 AnswerAutoRejectCall(callHandle);
2195 TelephonyManager::HandleCallback(TapiHandle* pHandle, const char* pNotiId, void* pData, void* pUserData)
2197 AppLogDebug("Enter");
2198 unsigned int tempHandle = 0;
2199 TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
2200 if (pTelManager->__pSoundManager == null)
2202 AppLog("Creating Sound Manager");
2203 pTelManager->__pSoundManager = new (std::nothrow) SoundManager();
2205 //Handle telephony events
2206 if (strcmp(pNotiId, TAPI_NOTI_VOICE_CALL_STATUS_IDLE) == 0)
2208 pTelManager->HandleIdleCallBack(pData);
2210 else if (strcmp(pNotiId, TAPI_NOTI_VOICE_CALL_STATUS_ACTIVE) == 0)
2212 pTelManager->__pSoundManager->StartSession();
2213 pTelManager->HandleActiveCallBack(pData);
2215 else if (strcmp(pNotiId, TAPI_NOTI_VOICE_CALL_STATUS_DIALING) == 0)
2217 pTelManager->HandleDialingCallBack(pData);
2221 memcpy(&tempHandle, pData, sizeof(TS_UINT));
2226 TelephonyManager::GetConferenceCallInfoN(void)
2228 AppCallInfo* pConfCallInfo = null;
2230 IListT<AppCallInfo>* pCallList = __pActiveCallList->GetValuesN();
2231 int callCount = pCallList->GetCount();
2232 for (int index = 0; index < callCount; index++)
2234 AppCallInfo callInfo;
2235 pCallList->GetAt(index, callInfo);
2236 if (callInfo.IsConferenceCall() == true)
2238 pConfCallInfo = new (std::nothrow) AppCallInfo();
2239 *pConfCallInfo = callInfo;
2240 //Found the Conference call
2247 return pConfCallInfo;
2250 IListT<AppCallInfo>*
2251 TelephonyManager::GetCallListN(void)
2253 ArrayListT<AppCallInfo>* pCallList = null;
2254 if (__pActiveCallList != null)
2256 pCallList = static_cast<ArrayListT<AppCallInfo>*>(__pActiveCallList->GetValuesN());
2262 TelephonyManager::GetCurrentCallCount(void)
2264 if (__pActiveCallList != null)
2266 return __pActiveCallList->GetCount();
2272 TelephonyManager::StartAlert(AppCallInfo& incomingCallInfo)
2274 String contactRingTone(L"");
2275 String contactNumber = incomingCallInfo.GetContactNumber();
2276 //check if not hidden call
2277 if(contactNumber.IsEmpty() == false)
2279 //fetch contact info from Db
2280 Contact* foundContact = GetContactN(contactNumber);
2281 if(foundContact != null)
2283 //fetch custom ringtone for contact
2284 result r = foundContact->GetValue(CONTACT_PROPERTY_ID_RINGTONE, contactRingTone);
2285 //Now check if there is a group ring tone
2286 if(contactRingTone.IsEmpty() == true)
2288 IList* pCategoryList = __pAddressBook->GetCategoriesByContactN(foundContact->GetRecordId());
2289 if(pCategoryList != null && pCategoryList->GetCount() > 0)
2291 Category* pCategory = static_cast<Category*>(pCategoryList->GetAt(0));
2292 contactRingTone = pCategory->GetRingtonePath();
2295 AppLog("ringtone fetched - r = %d", r);
2296 delete foundContact;
2297 foundContact = null;
2300 __pSoundManager->StartAlert(contactRingTone);
2304 TelephonyManager::StopAlert(void)
2306 __pSoundManager->StopAlert();
2310 TelephonyManager::CheckValidTelePhoneNumber(const String& contactNumber)
2312 result r = E_SUCCESS;
2313 if (contactNumber.GetLength() > TAPI_CALL_DIALDIGIT_LEN_MAX)
2317 //TODO: check if valid phone number else return error message
2322 TelephonyManager::CheckIfMOCallIsPossible()
2324 result r = E_SUCCESS;
2326 //Check modem power status
2327 int modemStatus = 0;
2328 int errorCode = tel_check_modem_power_status(__pTapiHandle, &modemStatus);
2329 if (errorCode != TAPI_API_SUCCESS || modemStatus == TAPI_PHONE_POWER_STATUS_OFF
2330 || modemStatus == TAPI_PHONE_POWER_STATUS_ERROR)
2336 TelSimCardStatus_t simStatus;
2337 int simChangedStatus;
2338 //fetch sim initialization status
2339 int errorCode = tel_get_sim_init_info(__pTapiHandle, &simStatus, &simChangedStatus);
2340 if (errorCode != TAPI_API_SUCCESS)
2348 case TAPI_SIM_STATUS_SIM_INIT_COMPLETED: // Sim Initialization ok
2352 case TAPI_SIM_STATUS_UNKNOWN: //initial state
2353 case TAPI_SIM_STATUS_CARD_NOT_PRESENT: //Card not present
2354 case TAPI_SIM_STATUS_CARD_REMOVED: //Card removed
2355 case TAPI_SIM_STATUS_CARD_ERROR: // Bad card / On the fly, SIM gone bad
2356 //TODO: might want to set different error code, to give proper message to user
2369 TelephonyManager::CheckIfMOCallIsEmergency(const String& contactNumber, bool isSimInitialized)
2371 //TODO: extract actual telephone number from contactNumber
2372 //by deleting prefix,'P','W', etx.
2374 bool isEmergency = false;
2375 //conversion "contactNumber" to char*
2376 const wchar_t* pContact = contactNumber.GetPointer();
2377 int len = contactNumber.GetLength() + 1;
2378 char* pNumber = new (std::nothrow) char[len];
2379 wcstombs(pNumber, pContact, len);
2381 if(isSimInitialized)
2383 //used to get Ecc information for 2G and 3G.
2384 TelSimEccList_t simEccList;
2385 memset(&simEccList, 0x00, sizeof(TelSimEccList_t));
2386 //Check if given number matches the sim card's emergency numbers
2387 int errorCode = tel_get_sim_ecc(__pTapiHandle, &simEccList);
2388 if (errorCode == TAPI_API_SUCCESS && simEccList.ecc_count > 0)
2390 for (int index = 0; index < simEccList.ecc_count; index++)
2392 if ((strcmp(pNumber, simEccList.list[index].number) == 0))
2401 //TODO: check if we need to also check SOS call numbers, if sim not present.
2410 TelephonyManager::FetchContactInfoForNumber(const String& phoneNumberStr)
2412 result r = E_FAILURE;
2414 //delete previously cached data
2415 if (__pCachedContact != null)
2417 delete __pCachedContact;
2418 __pCachedContact = null;
2421 //Searches contacts by phone number.
2422 IList* pContactList = __pAddressBook->SearchContactsByPhoneNumberN(phoneNumberStr);
2423 if (pContactList == null || IsFailed(GetLastResult()))
2428 //Fetch the contact's info to be displayed
2429 IEnumerator* pContactEnum = pContactList->GetEnumeratorN();
2430 while ((E_SUCCESS == pContactEnum->MoveNext()) && (__pCachedContact == null))
2432 Contact* pContact = static_cast<Contact*>(pContactEnum->GetCurrent());
2434 IList* pPhoneNumberList = pContact->GetValuesN(CONTACT_MPROPERTY_ID_PHONE_NUMBERS);
2435 if (pPhoneNumberList != null)
2437 IEnumerator* pPhoneEnum = pPhoneNumberList->GetEnumeratorN();
2438 while (E_SUCCESS == pPhoneEnum->MoveNext())
2440 PhoneNumber* pPhoneNumber = (PhoneNumber*) pPhoneEnum->GetCurrent();
2441 //Check if this is the correct contact
2442 if (pPhoneNumber->GetPhoneNumber().Equals(phoneNumberStr))
2444 //save newly fetched contact info.
2445 __pCachedContact = new (std::nothrow) Contact(*pContact);
2451 pPhoneNumberList->RemoveAll(true);
2452 delete pPhoneNumberList;
2455 delete pContactEnum;
2456 pContactList->RemoveAll(true);
2457 delete pContactList;
2463 TelephonyManager::GetContactN(const String& phoneNumber)
2465 result r = FetchContactInfoForNumber(phoneNumber);
2468 return new (std::nothrow) Contact(*__pCachedContact);
2474 TelephonyManager::FetchIncomingCallHandleN(const String& callHandle, const String& contactNumber)
2476 if(__pIncomingCall != null)
2478 delete __pIncomingCall;
2479 __pIncomingCall = null;
2482 if(callHandle.IsEmpty() == false)
2485 Integer::Parse(callHandle,incomingHandle);
2486 //This API call is synchronous
2487 TelCallStatus_t callStatus;
2488 int errCode = tel_get_call_status(__pTapiHandle, incomingHandle, &callStatus);
2489 if (errCode != TAPI_API_SUCCESS)
2491 AppLogDebug("tel_get_call_status failed");
2494 //construct incoming call info object
2495 __pIncomingCall = new (std::nothrow) AppCallInfo();
2496 __pIncomingCall->SetCallHandle(incomingHandle);
2499 String phoneNumber(contactNumber);
2500 if(phoneNumber.IsEmpty() == true)
2502 phoneNumber.Append(callStatus.pNumber);
2504 __pIncomingCall->SetContactNumber(phoneNumber);
2505 //set emergency state
2506 if(callStatus.CallType == TAPI_CALL_TYPE_E911)
2508 __pIncomingCall->SetEmergency(true);
2512 __pIncomingCall->SetEmergency(false);
2514 //set start time, when call is connected
2515 long long startTime = 0;
2516 SystemTime::GetTicks(startTime);
2517 __pIncomingCall->SetCallNotificationTime(startTime);
2518 __pIncomingCall->SetCalllogType(CALL_LOG_TYPE_VOICE_INCOMING);
2522 //TODO: This 'else' block can be removed once AppControl request API is stabilized.
2523 //This API call is synchronous and 'HandleIncomingCallStatusCallBack' is called for each active call.
2524 int errCode = tel_get_call_status_all(__pTapiHandle, &HandleIncomingCallStatusCallBack, this);
2525 if (errCode != TAPI_API_SUCCESS)
2531 if(__pIncomingCall != null)
2533 //set call notification time
2534 long long startTime = 0;
2535 SystemTime::GetTicks(startTime);
2536 __pIncomingCall->SetCallNotificationTime(startTime);
2538 if(__pIncomingCall->GetContactNumber().IsEmpty() == false)
2540 //fetch contact info
2541 FetchContactInfoForNumber(__pIncomingCall->GetContactNumber());
2542 if (__pCachedContact != null)
2544 __pIncomingCall->SetContactInfo(*__pCachedContact);
2548 //construct a new callinfo object to pass its ownership to caller.
2549 AppCallInfo* pNewIncomingCall = new (std::nothrow) AppCallInfo();
2550 *pNewIncomingCall = *__pIncomingCall;
2551 return pNewIncomingCall;
2553 //return null, if no incoming call found
2558 TelephonyManager::HandleIncomingCallStatusCallBack(TelCallStatus_t* pCallStatus, void* pUserData)
2560 TelephonyManager* pTelManager = (TelephonyManager*) pUserData;
2561 if (pCallStatus != null && pCallStatus->bMoCall == false
2562 && ((pCallStatus->CallState == TAPI_CALL_STATE_INCOMING)
2563 || (pCallStatus->CallState == TAPI_CALL_STATE_WAITING)))
2565 //construct incoming call details
2566 pTelManager->__pIncomingCall = new (std::nothrow) AppCallInfo();
2567 pTelManager->__pIncomingCall->SetCallHandle(pCallStatus->CallHandle);
2569 String contactNumber(pCallStatus->pNumber);
2570 pTelManager->__pIncomingCall->SetContactNumber(contactNumber);
2571 //set emergency state
2572 if(pCallStatus->CallType == TAPI_CALL_TYPE_E911)
2574 pTelManager->__pIncomingCall->SetEmergency(true);
2578 pTelManager->__pIncomingCall->SetEmergency(false);
2581 pTelManager->__pIncomingCall->SetCalllogType(CALL_LOG_TYPE_VOICE_INCOMING);
2586 TelephonyManager::SaveCallInfoToLogsDb(AppCallInfo& endCallInfo)
2588 if (endCallInfo.IsConferenceCall() == false)
2590 //single active call - Add call ended to call log database
2591 __pCalllogMgr->AddCallogInfoToDatabase(&endCallInfo);
2596 int confCallCount = endCallInfo.GetCallerListCount();
2597 IListT<AppCallInfo>* pParticipantList = endCallInfo.GetCallerList();
2598 for (int index = 0; index < confCallCount; index++)
2600 AppCallInfo participantInfo;
2601 if (pParticipantList->GetAt(index, participantInfo) == E_SUCCESS)
2603 //Add call ended to call log database
2604 __pCalllogMgr->AddCallogInfoToDatabase(&participantInfo);
2611 TelephonyManager::OnTelephonyNetworkStatusChanged(const NetworkStatus& networkStatus)
2613 if(networkStatus.IsCallServiceAvailable() == false)
2620 TelephonyManager::IsIncomingorDialingCallPresent(void)
2622 //returns false, if incoming call or dialed call is present.
2623 return ((__pIncomingCall != null) || (__pDialedCall != null));