1 /*
2  * Copyright (C) 2021 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "call_object_manager.h"
17 
18 #include "call_connect_ability.h"
19 #include "call_control_manager.h"
20 #include "call_manager_errors.h"
21 #include "call_number_utils.h"
22 #include "conference_base.h"
23 #include "ims_conference.h"
24 #include "report_call_info_handler.h"
25 #include "telephony_log_wrapper.h"
26 #include "voip_call.h"
27 #include "fold_status_manager.h"
28 
29 namespace OHOS {
30 namespace Telephony {
31 std::list<sptr<CallBase>> CallObjectManager::callObjectPtrList_;
32 std::mutex CallObjectManager::listMutex_;
33 int32_t CallObjectManager::callId_ = CALL_START_ID;
34 std::condition_variable CallObjectManager::cv_;
35 bool CallObjectManager::isFirstDialCallAdded_ = false;
36 bool CallObjectManager::needWaitHold_ = false;
37 CellularCallInfo CallObjectManager::dialCallInfo_;
38 constexpr int32_t CRS_TYPE = 2;
39 constexpr uint64_t DISCONNECT_DELAY_TIME = 2000000;
40 
CallObjectManager()41 CallObjectManager::CallObjectManager()
42 {
43 }
44 
~CallObjectManager()45 CallObjectManager::~CallObjectManager()
46 {
47     std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin();
48     while (it != callObjectPtrList_.end()) {
49         (*it) = nullptr;
50         callObjectPtrList_.erase(it++);
51     }
52 }
53 
AddOneCallObject(sptr<CallBase> &call)54 int32_t CallObjectManager::AddOneCallObject(sptr<CallBase> &call)
55 {
56     if (call == nullptr) {
57         return TELEPHONY_ERR_LOCAL_PTR_NULL;
58     }
59     std::lock_guard<std::mutex> lock(listMutex_);
60     std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin();
61     for (; it != callObjectPtrList_.end(); ++it) {
62         if ((*it)->GetCallID() == call->GetCallID()) {
63             TELEPHONY_LOGE("this call has existed yet!");
64             return CALL_ERR_PHONE_CALL_ALREADY_EXISTS;
65         }
66     }
67     CallAttributeInfo info;
68     call->GetCallAttributeInfo(info);
69     int32_t state;
70     bool isVoIPCallExists = false;
71     DelayedSingleton<CallControlManager>::GetInstance()->GetVoIPCallState(state);
72     if (state == (int32_t)CallStateToApp::CALL_STATE_RINGING) {
73         isVoIPCallExists = true;
74     }
75     if (callObjectPtrList_.size() == NO_CALL_EXIST && (!isVoIPCallExists || info.isEcc)) {
76         DelayedSingleton<CallConnectAbility>::GetInstance()->ConnectAbility();
77     }
78     callObjectPtrList_.emplace_back(call);
79     if (callObjectPtrList_.size() == ONE_CALL_EXIST &&
80         callObjectPtrList_.front()->GetTelCallState() == TelCallState::CALL_STATUS_DIALING) {
81         isFirstDialCallAdded_ = true;
82         cv_.notify_all();
83     }
84     DelayedSingleton<FoldStatusManager>::GetInstance()->RegisterFoldableListener();
85     TELEPHONY_LOGI("AddOneCallObject success! callId:%{public}d,call list size:%{public}zu", call->GetCallID(),
86         callObjectPtrList_.size());
87     return TELEPHONY_SUCCESS;
88 }
89 
DelayedDisconnectCallConnectAbility()90 void CallObjectManager::DelayedDisconnectCallConnectAbility()
91 {
92     ffrt::submit_h(
93         []() {
94             std::lock_guard<std::mutex> lock(listMutex_);
95             TELEPHONY_LOGI("delayed disconnect callback begin");
96             auto controlManager = DelayedSingleton<CallControlManager>::GetInstance();
97             if (callObjectPtrList_.size() == NO_CALL_EXIST && controlManager->ShouldDisconnectService()) {
98                 auto callConnectAbility = DelayedSingleton<CallConnectAbility>::GetInstance();
99                 callConnectAbility->DisconnectAbility();
100                 TELEPHONY_LOGI("delayed disconnect done");
101             }
102         },
103         {}, {}, ffrt::task_attr().delay(DISCONNECT_DELAY_TIME));
104 }
105 
DeleteOneCallObject(int32_t callId)106 int32_t CallObjectManager::DeleteOneCallObject(int32_t callId)
107 {
108     std::unique_lock<std::mutex> lock(listMutex_);
109     std::list<sptr<CallBase>>::iterator it;
110     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
111         if ((*it)->GetCallID() == callId) {
112             callObjectPtrList_.erase(it);
113             TELEPHONY_LOGI("DeleteOneCallObject success! call list size:%{public}zu", callObjectPtrList_.size());
114             break;
115         }
116     }
117     if (callObjectPtrList_.size() == NO_CALL_EXIST) {
118         DelayedSingleton<FoldStatusManager>::GetInstance()->UnregisterFoldableListener();
119         if (DelayedSingleton<CallControlManager>::GetInstance()->ShouldDisconnectService()) {
120             lock.unlock();
121             DelayedDisconnectCallConnectAbility();
122         }
123     }
124     return TELEPHONY_SUCCESS;
125 }
126 
DeleteOneCallObject(sptr<CallBase> &call)127 void CallObjectManager::DeleteOneCallObject(sptr<CallBase> &call)
128 {
129     if (call == nullptr) {
130         TELEPHONY_LOGE("call is null!");
131         return;
132     }
133     std::unique_lock<std::mutex> lock(listMutex_);
134     callObjectPtrList_.remove(call);
135     if (callObjectPtrList_.size() == NO_CALL_EXIST) {
136         DelayedSingleton<FoldStatusManager>::GetInstance()->UnregisterFoldableListener();
137         if (DelayedSingleton<CallControlManager>::GetInstance()->ShouldDisconnectService()) {
138             lock.unlock();
139             DelayedDisconnectCallConnectAbility();
140         }
141     }
142     TELEPHONY_LOGI("DeleteOneCallObject success! callList size:%{public}zu", callObjectPtrList_.size());
143 }
144 
GetOneCallObject(int32_t callId)145 sptr<CallBase> CallObjectManager::GetOneCallObject(int32_t callId)
146 {
147     sptr<CallBase> retPtr = nullptr;
148     std::lock_guard<std::mutex> lock(listMutex_);
149     std::list<sptr<CallBase>>::iterator it = CallObjectManager::callObjectPtrList_.begin();
150     for (; it != callObjectPtrList_.end(); ++it) {
151         if ((*it)->GetCallID() == callId) {
152             retPtr = *it;
153             break;
154         }
155     }
156     return retPtr;
157 }
158 
GetOneCallObject(std::string &phoneNumber)159 sptr<CallBase> CallObjectManager::GetOneCallObject(std::string &phoneNumber)
160 {
161     if (phoneNumber.empty()) {
162         TELEPHONY_LOGE("call is null!");
163         return nullptr;
164     }
165     sptr<CallBase> retPtr = nullptr;
166     std::lock_guard<std::mutex> lock(listMutex_);
167     std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin();
168     for (; it != callObjectPtrList_.end(); ++it) {
169         std::string networkAddress =
170             DelayedSingleton<CallNumberUtils>::GetInstance()->RemovePostDialPhoneNumber((*it)->GetAccountNumber());
171         if (networkAddress == phoneNumber) {
172             TELEPHONY_LOGI("GetOneCallObject success!");
173             retPtr = *it;
174             break;
175         }
176     }
177     return retPtr;
178 }
179 
HasNewCall()180 int32_t CallObjectManager::HasNewCall()
181 {
182     std::lock_guard<std::mutex> lock(listMutex_);
183     std::list<sptr<CallBase>>::iterator it;
184     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
185         if ((*it)->GetCallType() != CallType::TYPE_VOIP &&
186             ((*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_CREATE ||
187             (*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_CONNECTING ||
188             (*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_DIALING ||
189             (*it)->GetCallType() == CallType::TYPE_SATELLITE)) {
190             TELEPHONY_LOGE("there is already a new call[callId:%{public}d,state:%{public}d], please redial later",
191                 (*it)->GetCallID(), (*it)->GetCallRunningState());
192             return CALL_ERR_CALL_COUNTS_EXCEED_LIMIT;
193         }
194     }
195     return TELEPHONY_SUCCESS;
196 }
197 
IsNewCallAllowedCreate(bool &enabled)198 int32_t CallObjectManager::IsNewCallAllowedCreate(bool &enabled)
199 {
200     enabled = true;
201     std::list<sptr<CallBase>>::iterator it;
202     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
203         if ((*it)->GetCallType() != CallType::TYPE_VOIP &&
204             ((*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_CREATE ||
205             (*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_CONNECTING ||
206             (*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_DIALING ||
207             (*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_RINGING)) {
208             TELEPHONY_LOGE("there is already a new call, please redial later");
209             enabled = false;
210             return TELEPHONY_ERR_SUCCESS;
211         }
212     }
213     int32_t count = 0;
214     int32_t callNum = 2;
215     std::list<int32_t> callIdList;
216     GetCarrierCallList(callIdList);
217     for (int32_t otherCallId : callIdList) {
218         sptr<CallBase> call = GetOneCallObject(otherCallId);
219         if (call != nullptr) {
220             TelConferenceState confState = call->GetTelConferenceState();
221             int32_t conferenceId = DelayedSingleton<ImsConference>::GetInstance()->GetMainCall();
222             if (confState != TelConferenceState::TEL_CONFERENCE_IDLE && conferenceId == otherCallId) {
223                 TELEPHONY_LOGI("there is conference call");
224                 count++;
225             } else if (confState == TelConferenceState::TEL_CONFERENCE_IDLE) {
226                 count++;
227             }
228         }
229     }
230     TELEPHONY_LOGI("the count is:%{public}d", count);
231     if (count >= callNum) {
232         enabled = false;
233     }
234     return TELEPHONY_ERR_SUCCESS;
235 }
236 
GetCurrentCallNum()237 int32_t CallObjectManager::GetCurrentCallNum()
238 {
239     int32_t count = 0;
240     std::list<int32_t> callIdList;
241     GetCarrierCallList(callIdList);
242     for (int32_t otherCallId : callIdList) {
243         sptr<CallBase> call = GetOneCallObject(otherCallId);
244         if (call != nullptr) {
245             TelConferenceState confState = call->GetTelConferenceState();
246             int32_t conferenceId = DelayedSingleton<ImsConference>::GetInstance()->GetMainCall();
247             if (confState != TelConferenceState::TEL_CONFERENCE_IDLE && conferenceId == otherCallId) {
248                 TELEPHONY_LOGI("there is conference call");
249                 count++;
250             } else if (confState == TelConferenceState::TEL_CONFERENCE_IDLE) {
251                 count++;
252             }
253         }
254     }
255     TELEPHONY_LOGI("the count is %{public}d", count);
256     return count;
257 }
258 
GetCarrierCallList(std::list<int32_t> &list)259 int32_t CallObjectManager::GetCarrierCallList(std::list<int32_t> &list)
260 {
261     list.clear();
262     std::lock_guard<std::mutex> lock(listMutex_);
263     std::list<sptr<CallBase>>::iterator it;
264     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
265         if ((*it)->GetCallType() == CallType::TYPE_CS || (*it)->GetCallType() == CallType::TYPE_IMS ||
266             (*it)->GetCallType() == CallType::TYPE_SATELLITE) {
267             list.emplace_back((*it)->GetCallID());
268         }
269     }
270     return TELEPHONY_SUCCESS;
271 }
272 
GetVoipCallNum()273 int32_t CallObjectManager::GetVoipCallNum()
274 {
275     int32_t count = 0;
276     std::lock_guard<std::mutex> lock(listMutex_);
277     std::list<sptr<CallBase>>::iterator it;
278     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
279         if ((*it)->GetCallType() == CallType::TYPE_VOIP) {
280             count++;
281         }
282     }
283     return count;
284 }
285 
GetVoipCallList(std::list<int32_t> &list)286 int32_t CallObjectManager::GetVoipCallList(std::list<int32_t> &list)
287 {
288     list.clear();
289     std::lock_guard<std::mutex> lock(listMutex_);
290     std::list<sptr<CallBase>>::iterator it;
291     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
292         if ((*it)->GetCallType() == CallType::TYPE_VOIP) {
293             list.emplace_back((*it)->GetCallID());
294         }
295     }
296     return TELEPHONY_SUCCESS;
297 }
298 
HasRingingMaximum()299 bool CallObjectManager::HasRingingMaximum()
300 {
301     int32_t ringingCount = 0;
302     std::lock_guard<std::mutex> lock(listMutex_);
303     std::list<sptr<CallBase>>::iterator it;
304     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
305         // Count the number of calls in the ringing state
306         if ((*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_RINGING) {
307             ringingCount++;
308         }
309     }
310     if (ringingCount >= RINGING_CALL_NUMBER_LEN) {
311         return true;
312     }
313     return false;
314 }
315 
HasDialingMaximum()316 bool CallObjectManager::HasDialingMaximum()
317 {
318     int32_t dialingCount = 0;
319     std::lock_guard<std::mutex> lock(listMutex_);
320     std::list<sptr<CallBase>>::iterator it;
321     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
322         // Count the number of calls in the active state
323         if ((*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_ACTIVE) {
324             dialingCount++;
325         }
326     }
327     if (dialingCount >= DIALING_CALL_NUMBER_LEN) {
328         return true;
329     }
330     return false;
331 }
332 
HasEmergencyCall(bool &enabled)333 int32_t CallObjectManager::HasEmergencyCall(bool &enabled)
334 {
335     enabled = false;
336     std::lock_guard<std::mutex> lock(listMutex_);
337     std::list<sptr<CallBase>>::iterator it;
338     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
339         if ((*it)->GetEmergencyState()) {
340             enabled = true;
341         }
342     }
343     return TELEPHONY_ERR_SUCCESS;
344 }
345 
GetNewCallId()346 int32_t CallObjectManager::GetNewCallId()
347 {
348     int32_t ret = 0;
349     std::lock_guard<std::mutex> lock(listMutex_);
350     ret = ++callId_;
351     return ret;
352 }
353 
IsCallExist(int32_t callId)354 bool CallObjectManager::IsCallExist(int32_t callId)
355 {
356     std::lock_guard<std::mutex> lock(listMutex_);
357     std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin();
358     for (; it != callObjectPtrList_.end(); ++it) {
359         if ((*it)->GetCallID() == callId) {
360             TELEPHONY_LOGW("the call is exist.");
361             return true;
362         }
363     }
364     return false;
365 }
366 
IsCallExist(std::string &phoneNumber)367 bool CallObjectManager::IsCallExist(std::string &phoneNumber)
368 {
369     if (phoneNumber.empty()) {
370         return false;
371     }
372     std::lock_guard<std::mutex> lock(listMutex_);
373     std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin();
374     for (; it != callObjectPtrList_.end(); ++it) {
375         std::string networkAddress =
376             DelayedSingleton<CallNumberUtils>::GetInstance()->RemovePostDialPhoneNumber((*it)->GetAccountNumber());
377         if (networkAddress == phoneNumber) {
378             return true;
379         }
380     }
381     TELEPHONY_LOGI("the call is does not exist.");
382     return false;
383 }
384 
HasCallExist()385 bool CallObjectManager::HasCallExist()
386 {
387     std::lock_guard<std::mutex> lock(listMutex_);
388     if (callObjectPtrList_.empty()) {
389         TELEPHONY_LOGI("call list size:%{public}zu", callObjectPtrList_.size());
390         return false;
391     }
392     return true;
393 }
394 
GetAllCallList()395 std::list<sptr<CallBase>> CallObjectManager::GetAllCallList()
396 {
397     std::lock_guard<std::mutex> lock(listMutex_);
398     return callObjectPtrList_;
399 }
400 
HasCellularCallExist()401 bool CallObjectManager::HasCellularCallExist()
402 {
403     std::lock_guard<std::mutex> lock(listMutex_);
404     std::list<sptr<CallBase>>::iterator it;
405     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
406         if ((*it)->GetCallType() == CallType::TYPE_CS || (*it)->GetCallType() == CallType::TYPE_IMS ||
407             (*it)->GetCallType() == CallType::TYPE_SATELLITE) {
408             if ((*it)->GetTelCallState() != TelCallState::CALL_STATUS_DISCONNECTED &&
409                 (*it)->GetTelCallState() != TelCallState::CALL_STATUS_DISCONNECTING) {
410                 return true;
411             }
412         }
413     }
414     return false;
415 }
416 
HasVoipCallExist()417 bool CallObjectManager::HasVoipCallExist()
418 {
419     std::lock_guard<std::mutex> lock(listMutex_);
420     std::list<sptr<CallBase>>::iterator it;
421     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
422         if ((*it)->GetCallType() == CallType::TYPE_VOIP) {
423             return true;
424         }
425     }
426     return false;
427 }
428 
HasIncomingCallCrsType()429 bool CallObjectManager::HasIncomingCallCrsType()
430 {
431     std::lock_guard<std::mutex> lock(listMutex_);
432     std::list<sptr<CallBase>>::iterator it;
433     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
434         if ((*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_RINGING &&
435             (*it)->GetCrsType() == CRS_TYPE) {
436             return true;
437         }
438     }
439     return false;
440 }
441 
HasVideoCall()442 bool CallObjectManager::HasVideoCall()
443 {
444     std::lock_guard<std::mutex> lock(listMutex_);
445     std::list<sptr<CallBase>>::iterator it;
446     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
447         if ((*it)->GetVideoStateType() == VideoStateType::TYPE_VIDEO && (*it)->GetCallType() != CallType::TYPE_VOIP) {
448             return true;
449         }
450     }
451     return false;
452 }
453 
HasSatelliteCallExist()454 bool CallObjectManager::HasSatelliteCallExist()
455 {
456     std::lock_guard<std::mutex> lock(listMutex_);
457     std::list<sptr<CallBase>>::iterator it;
458     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
459         if ((*it)->GetCallType() == CallType::TYPE_SATELLITE) {
460             return true;
461         }
462     }
463     return false;
464 }
465 
GetSatelliteCallList(std::list<int32_t> &list)466 int32_t CallObjectManager::GetSatelliteCallList(std::list<int32_t> &list)
467 {
468     list.clear();
469     std::lock_guard<std::mutex> lock(listMutex_);
470     std::list<sptr<CallBase>>::iterator it;
471     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
472         if ((*it)->GetCallType() == CallType::TYPE_SATELLITE) {
473             list.emplace_back((*it)->GetCallID());
474         }
475     }
476     return TELEPHONY_SUCCESS;
477 }
478 
HasRingingCall(bool &hasRingingCall)479 int32_t CallObjectManager::HasRingingCall(bool &hasRingingCall)
480 {
481     hasRingingCall = false;
482     std::lock_guard<std::mutex> lock(listMutex_);
483     std::list<sptr<CallBase>>::iterator it;
484     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
485         // Count the number of calls in the ringing state
486         if ((*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_RINGING) {
487             hasRingingCall = true;
488             break;
489         }
490     }
491     return TELEPHONY_ERR_SUCCESS;
492 }
493 
HasHoldCall(bool &hasHoldCall)494 int32_t CallObjectManager::HasHoldCall(bool &hasHoldCall)
495 {
496     hasHoldCall = false;
497     std::lock_guard<std::mutex> lock(listMutex_);
498     std::list<sptr<CallBase>>::iterator it;
499     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
500         // Count the number of calls in the hold state
501         if ((*it)->GetCallRunningState() == CallRunningState::CALL_RUNNING_STATE_HOLD) {
502             hasHoldCall = true;
503             break;
504         }
505     }
506     return TELEPHONY_ERR_SUCCESS;
507 }
508 
GetCallState(int32_t callId)509 TelCallState CallObjectManager::GetCallState(int32_t callId)
510 {
511     TelCallState retState = TelCallState::CALL_STATUS_IDLE;
512     std::lock_guard<std::mutex> lock(listMutex_);
513     std::list<sptr<CallBase>>::iterator it = CallObjectManager::callObjectPtrList_.begin();
514     for (; it != callObjectPtrList_.end(); ++it) {
515         if ((*it)->GetCallID() == callId) {
516             retState = (*it)->GetTelCallState();
517             break;
518         }
519     }
520     return retState;
521 }
522 
GetOneCallObject(CallRunningState callState)523 sptr<CallBase> CallObjectManager::GetOneCallObject(CallRunningState callState)
524 {
525     std::lock_guard<std::mutex> lock(listMutex_);
526     std::list<sptr<CallBase>>::reverse_iterator it;
527     for (it = callObjectPtrList_.rbegin(); it != callObjectPtrList_.rend(); ++it) {
528         if ((*it)->GetCallRunningState() == callState) {
529             return (*it);
530         }
531     }
532     return nullptr;
533 }
534 
GetOneCallObjectByIndex(int32_t index)535 sptr<CallBase> CallObjectManager::GetOneCallObjectByIndex(int32_t index)
536 {
537     std::lock_guard<std::mutex> lock(listMutex_);
538     std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin();
539     for (; it != callObjectPtrList_.end(); ++it) {
540         if ((*it)->GetCallIndex() == index && (*it)->GetCallType() != CallType::TYPE_VOIP) {
541             return (*it);
542         }
543     }
544     return nullptr;
545 }
546 
GetOneCallObjectByIndexAndSlotId(int32_t index, int32_t slotId)547 sptr<CallBase> CallObjectManager::GetOneCallObjectByIndexAndSlotId(int32_t index, int32_t slotId)
548 {
549     std::lock_guard<std::mutex> lock(listMutex_);
550     std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin();
551     for (; it != callObjectPtrList_.end(); ++it) {
552         if ((*it)->GetCallIndex() == index) {
553             if ((*it)->GetSlotId() == slotId && (*it)->GetCallType() != CallType::TYPE_VOIP) {
554                 return (*it);
555             }
556         }
557     }
558     return nullptr;
559 }
560 
GetOneCallObjectByVoipCallId( std::string voipCallId, std::string bundleName, int32_t uid)561 sptr<CallBase> CallObjectManager::GetOneCallObjectByVoipCallId(
562     std::string voipCallId, std::string bundleName, int32_t uid)
563 {
564     std::lock_guard<std::mutex> lock(listMutex_);
565     std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin();
566     for (; it != callObjectPtrList_.end(); ++it) {
567         if ((*it)->GetCallType() == CallType::TYPE_VOIP) {
568             sptr<VoIPCall> voipCall = reinterpret_cast<VoIPCall *>((*it).GetRefPtr());
569             if (voipCall->GetVoipCallId() == voipCallId && voipCall->GetVoipBundleName() == bundleName &&
570                 voipCall->GetVoipUid() == uid) {
571                 return (*it);
572             }
573         }
574     }
575     return nullptr;
576 }
577 
IsCallExist(CallType callType, TelCallState callState)578 bool CallObjectManager::IsCallExist(CallType callType, TelCallState callState)
579 {
580     std::lock_guard<std::mutex> lock(listMutex_);
581     std::list<sptr<CallBase>>::iterator it;
582     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
583         if ((*it)->GetCallType() == callType && (*it)->GetTelCallState() == callState) {
584             return true;
585         }
586     }
587     TELEPHONY_LOGI("the call is does not exist.");
588     return false;
589 }
590 
IsCallExist(TelCallState callState)591 bool CallObjectManager::IsCallExist(TelCallState callState)
592 {
593     std::lock_guard<std::mutex> lock(listMutex_);
594     std::list<sptr<CallBase>>::iterator it;
595     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
596         if ((*it)->GetTelCallState() == callState) {
597             return true;
598         }
599     }
600     TELEPHONY_LOGI("the call is does not exist.");
601     return false;
602 }
603 
IsCallExist(TelCallState callState, int32_t &callId)604 bool CallObjectManager::IsCallExist(TelCallState callState, int32_t &callId)
605 {
606     std::lock_guard<std::mutex> lock(listMutex_);
607     std::list<sptr<CallBase>>::iterator it;
608     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
609         if ((*it)->GetTelCallState() == callState) {
610             callId = (*it)->GetCallID();
611             return true;
612         }
613     }
614     TELEPHONY_LOGI("the call is does not exist.");
615     return false;
616 }
617 
IsConferenceCallExist(TelConferenceState state, int32_t &callId)618 bool CallObjectManager::IsConferenceCallExist(TelConferenceState state, int32_t &callId)
619 {
620     std::lock_guard<std::mutex> lock(listMutex_);
621     std::list<sptr<CallBase>>::iterator it;
622     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
623         if ((*it)->GetTelConferenceState() == state) {
624             callId = (*it)->GetCallID();
625             return true;
626         }
627     }
628     TELEPHONY_LOGI("the call is does not exist.");
629     return false;
630 }
631 
GetCallNum(TelCallState callState, bool isIncludeVoipCall)632 int32_t CallObjectManager::GetCallNum(TelCallState callState, bool isIncludeVoipCall)
633 {
634     int32_t num = 0;
635     std::lock_guard<std::mutex> lock(listMutex_);
636     std::list<sptr<CallBase>>::iterator it;
637     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
638         if ((*it)->GetTelCallState() == callState) {
639             if (!isIncludeVoipCall && (*it)->GetCallType() == CallType::TYPE_VOIP) {
640                 continue;
641             } else {
642                 ++num;
643             }
644         }
645     }
646     TELEPHONY_LOGI("callState:%{public}d, num:%{public}d", callState, num);
647     return num;
648 }
649 
GetCallNumber(TelCallState callState, bool isIncludeVoipCall)650 std::string CallObjectManager::GetCallNumber(TelCallState callState, bool isIncludeVoipCall)
651 {
652     std::string number = "";
653     std::lock_guard<std::mutex> lock(listMutex_);
654     std::list<sptr<CallBase>>::iterator it;
655     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
656         if ((*it)->GetTelCallState() == callState) {
657             if (!isIncludeVoipCall && (*it)->GetCallType() == CallType::TYPE_VOIP) {
658                 continue;
659             } else {
660                 number = (*it)->GetAccountNumber();
661                 break;
662             }
663         }
664     }
665     return number;
666 }
667 
GetCallInfoList(int32_t slotId)668 std::vector<CallAttributeInfo> CallObjectManager::GetCallInfoList(int32_t slotId)
669 {
670     std::vector<CallAttributeInfo> callVec;
671     CallAttributeInfo info;
672     callVec.clear();
673     std::lock_guard<std::mutex> lock(listMutex_);
674     std::list<sptr<CallBase>>::iterator it;
675     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
676         (void)memset_s(&info, sizeof(CallAttributeInfo), 0, sizeof(CallAttributeInfo));
677         (*it)->GetCallAttributeInfo(info);
678         if (info.accountId == slotId && info.callType != CallType::TYPE_OTT) {
679             callVec.emplace_back(info);
680         }
681     }
682     return callVec;
683 }
684 
UpdateOneCallObjectByCallId(int32_t callId, TelCallState nextCallState)685 void CallObjectManager::UpdateOneCallObjectByCallId(int32_t callId, TelCallState nextCallState)
686 {
687     std::lock_guard<std::mutex> lock(listMutex_);
688     std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin();
689     for (; it != callObjectPtrList_.end(); ++it) {
690         if ((*it)->GetCallID() == callId) {
691             (*it)->SetTelCallState(nextCallState);
692         }
693     }
694 }
695 
GetForegroundCall(bool isIncludeVoipCall)696 sptr<CallBase> CallObjectManager::GetForegroundCall(bool isIncludeVoipCall)
697 {
698     std::lock_guard<std::mutex> lock(listMutex_);
699     sptr<CallBase> liveCall = nullptr;
700     for (std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
701         if (!isIncludeVoipCall && (*it)->GetCallType() == CallType::TYPE_VOIP) {
702             continue;
703         }
704         TelCallState telCallState = (*it)->GetTelCallState();
705         if (telCallState == TelCallState::CALL_STATUS_WAITING ||
706             telCallState == TelCallState::CALL_STATUS_INCOMING) {
707             liveCall = (*it);
708             break;
709         }
710         if (telCallState == TelCallState::CALL_STATUS_ALERTING ||
711             telCallState == TelCallState::CALL_STATUS_DIALING) {
712             liveCall = (*it);
713             continue;
714         }
715         if (telCallState == TelCallState::CALL_STATUS_ACTIVE) {
716             liveCall = (*it);
717             continue;
718         }
719         if (telCallState == TelCallState::CALL_STATUS_HOLDING) {
720             liveCall = (*it);
721             continue;
722         }
723     }
724     return liveCall;
725 }
726 
GetForegroundLiveCall()727 sptr<CallBase> CallObjectManager::GetForegroundLiveCall()
728 {
729     std::lock_guard<std::mutex> lock(listMutex_);
730     sptr<CallBase> liveCall = nullptr;
731     for (std::list<sptr<CallBase>>::iterator it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
732         TelCallState telCallState = (*it)->GetTelCallState();
733         if (telCallState == TelCallState::CALL_STATUS_ACTIVE) {
734             liveCall = (*it);
735             break;
736         }
737         if (telCallState == TelCallState::CALL_STATUS_ALERTING ||
738             telCallState == TelCallState::CALL_STATUS_DIALING) {
739             liveCall = (*it);
740             break;
741         }
742         if (telCallState == TelCallState::CALL_STATUS_WAITING ||
743             telCallState == TelCallState::CALL_STATUS_INCOMING) {
744             liveCall = (*it);
745             continue;
746         }
747     }
748     return liveCall;
749 }
750 
GetDialCallInfo()751 CellularCallInfo CallObjectManager::GetDialCallInfo()
752 {
753     return dialCallInfo_;
754 }
755 
DealFailDial(sptr<CallBase> call)756 int32_t CallObjectManager::DealFailDial(sptr<CallBase> call)
757 {
758     CallDetailInfo callDetatilInfo;
759     if (memset_s(&callDetatilInfo, sizeof(CallDetailInfo), 0, sizeof(CallDetailInfo)) != EOK) {
760         TELEPHONY_LOGE("memset_s callDetatilInfo fail");
761         return TELEPHONY_ERR_MEMSET_FAIL;
762     }
763     std::string number = call->GetAccountNumber();
764     callDetatilInfo.callType = call->GetCallType();
765     callDetatilInfo.accountId = call->GetSlotId();
766     callDetatilInfo.state = TelCallState::CALL_STATUS_DISCONNECTED;
767     callDetatilInfo.callMode = call->GetVideoStateType();
768     callDetatilInfo.voiceDomain = static_cast<int32_t>(call->GetCallType());
769     if (number.length() > kMaxNumberLen) {
770         TELEPHONY_LOGE("numbser length out of range");
771         return CALL_ERR_NUMBER_OUT_OF_RANGE;
772     }
773     if (memcpy_s(&callDetatilInfo.phoneNum, kMaxNumberLen, number.c_str(), number.length()) != EOK) {
774         TELEPHONY_LOGE("memcpy_s number failed!");
775         return TELEPHONY_ERR_MEMCPY_FAIL;
776     }
777 
778     return DelayedSingleton<ReportCallInfoHandler>::GetInstance()->UpdateCallReportInfo(callDetatilInfo);
779 }
780 
GetAllCallInfoList()781 std::vector<CallAttributeInfo> CallObjectManager::GetAllCallInfoList()
782 {
783     std::vector<CallAttributeInfo> callVec;
784     callVec.clear();
785     std::lock_guard<std::mutex> lock(listMutex_);
786     std::list<sptr<CallBase>>::iterator it;
787     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
788         CallAttributeInfo info;
789         if ((*it) == nullptr) {
790             TELEPHONY_LOGE("call is nullptr");
791             continue;
792         }
793         (*it)->GetCallAttributeInfo(info);
794         callVec.emplace_back(info);
795     }
796     return callVec;
797 }
798 
GetCallNumByRunningState(CallRunningState callState)799 int32_t CallObjectManager::GetCallNumByRunningState(CallRunningState callState)
800 {
801     int32_t count = 0;
802     std::lock_guard<std::mutex> lock(listMutex_);
803     std::list<sptr<CallBase>>::iterator it;
804     for (it = callObjectPtrList_.begin(); it != callObjectPtrList_.end(); ++it) {
805         if ((*it)->GetCallRunningState() == callState) {
806             count++;
807             continue;
808         }
809     }
810     TELEPHONY_LOGI("callState:%{public}d, count:%{public}d", callState, count);
811     return count;
812 }
813 } // namespace Telephony
814 } // namespace OHOS
815