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