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 "hfp_hf_call_manager.h"
17
18 #include "hfp_hf_defines.h"
19 #include "hfp_hf_service.h"
20
21 namespace OHOS {
22 namespace bluetooth {
HfpHfCallManager(const std::string & address)23 HfpHfCallManager::HfpHfCallManager(const std::string &address) : address_(address)
24 {}
25
~HfpHfCallManager()26 HfpHfCallManager::~HfpHfCallManager()
27 {
28 calls_.clear();
29 updateCalls_.clear();
30 }
31
GetCallById(int id)32 HandsFreeUnitCalls *HfpHfCallManager::GetCallById(int id)
33 {
34 std::map<int, HandsFreeUnitCalls>::iterator it = calls_.find(id);
35 if (it == calls_.end()) {
36 return nullptr;
37 }
38 return &calls_[id];
39 }
40
GetCallByState(int state)41 HandsFreeUnitCalls *HfpHfCallManager::GetCallByState(int state)
42 {
43 std::map<int, HandsFreeUnitCalls>::iterator it;
44 for (it = calls_.begin(); it != calls_.end(); ++it) {
45 if (it->second.GetState() == state) {
46 return &(it->second);
47 }
48 }
49 return nullptr;
50 }
51
GetCurrentCalls()52 std::vector<HandsFreeUnitCalls> HfpHfCallManager::GetCurrentCalls()
53 {
54 std::vector<HandsFreeUnitCalls> calls;
55 std::map<int, HandsFreeUnitCalls>::iterator it;
56 for (it = calls_.begin(); it != calls_.end(); ++it) {
57 calls.push_back(it->second);
58 }
59 return calls;
60 }
61
UpdateCall(HandsFreeUnitCalls & call)62 void HfpHfCallManager::UpdateCall(HandsFreeUnitCalls &call)
63 {
64 updateCalls_[call.GetId()] = call;
65 }
66
UpdateCallDone()67 void HfpHfCallManager::UpdateCallDone()
68 {
69 std::map<int, HandsFreeUnitCalls>::iterator iter;
70 std::map<int, HandsFreeUnitCalls>::iterator updateiter;
71 for (iter = calls_.begin(); iter != calls_.end();) {
72 updateiter = updateCalls_.find(iter->first);
73 if (updateiter == updateCalls_.end()) {
74 iter->second.SetState(HFP_HF_CALL_STATE_FINISHED);
75 NotifyCallChanged(iter->second);
76 calls_.erase(iter++);
77 } else {
78 if ((iter->second.GetState() != updateiter->second.GetState()) ||
79 (iter->second.GetNumber() != updateiter->second.GetNumber()) ||
80 (iter->second.IsMultiParty() != updateiter->second.IsMultiParty())) {
81 iter->second.SetState(updateiter->second.GetState());
82 iter->second.SetNumber(updateiter->second.GetNumber());
83 iter->second.SetMultiParty(updateiter->second.IsMultiParty());
84 NotifyCallChanged(iter->second);
85 }
86 ++iter;
87 }
88 }
89
90 for (updateiter = updateCalls_.begin(); updateiter != updateCalls_.end(); updateiter++) {
91 iter = calls_.find(updateiter->first);
92 if (iter == calls_.end()) {
93 calls_[updateiter->first] = updateiter->second;
94 NotifyCallChanged(updateiter->second);
95 }
96 }
97 updateCalls_.clear();
98 return;
99 }
100
GetCallNumberByState(int state)101 int HfpHfCallManager::GetCallNumberByState(int state)
102 {
103 int number = 0;
104 std::map<int, HandsFreeUnitCalls>::iterator it;
105 for (it = calls_.begin(); it != calls_.end(); ++it) {
106 if (it->second.GetState() == state) {
107 number++;
108 }
109 }
110 return number;
111 }
112
NotifyCallChanged(const HandsFreeUnitCalls & call)113 void HfpHfCallManager::NotifyCallChanged(const HandsFreeUnitCalls &call)
114 {
115 RawAddress rawAddress(address_);
116 HfpHfService *service = HfpHfService::GetService();
117 if (service != nullptr) {
118 service->NotifyCallChanged(rawAddress, call);
119 } else {
120 LOG_ERROR("[HFP HF]%{public}s():service is null.", __FUNCTION__);
121 }
122 return;
123 }
124 } // namespace bluetooth
125 } // namespace OHOS