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