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 "carrier_call.h"
17 
18 #include <securec.h>
19 
20 #include "call_manager_errors.h"
21 #include "call_manager_hisysevent.h"
22 #include "telephony_log_wrapper.h"
23 
24 #include "call_number_utils.h"
25 
26 namespace OHOS {
27 namespace Telephony {
CarrierCall(DialParaInfo & info)28 CarrierCall::CarrierCall(DialParaInfo &info)
29     : CallBase(info), dialScene_(DialScene::CALL_NORMAL), slotId_(info.accountId), index_(info.index),
30     isEcc_(info.isEcc), cellularCallConnectionPtr_(DelayedSingleton<CellularCallConnection>::GetInstance())
31 {}
32 
CarrierCall(DialParaInfo & info,AppExecFwk::PacMap & extras)33 CarrierCall::CarrierCall(DialParaInfo &info, AppExecFwk::PacMap &extras)
34     : CallBase(info, extras), dialScene_((DialScene)extras.GetIntValue("dialScene")), slotId_(info.accountId),
35     index_(info.index), isEcc_(info.isEcc),
36     cellularCallConnectionPtr_(DelayedSingleton<CellularCallConnection>::GetInstance())
37 {}
38 
~CarrierCall()39 CarrierCall::~CarrierCall() {}
40 
CarrierDialingProcess()41 int32_t CarrierCall::CarrierDialingProcess()
42 {
43     TELEPHONY_LOGI("CarrierDialingProcess start");
44     int32_t ret = DialCallBase();
45     if (ret != TELEPHONY_SUCCESS) {
46         CarrierHangUpCall();
47     }
48     return ret;
49 }
50 
CarrierAnswerCall(int32_t videoState)51 int32_t CarrierCall::CarrierAnswerCall(int32_t videoState)
52 {
53     CellularCallInfo callInfo;
54     int32_t ret = AnswerCallBase();
55     if (ret != TELEPHONY_SUCCESS) {
56         TELEPHONY_LOGE("answer call failed!");
57         CallManagerHisysevent::WriteAnswerCallFaultEvent(
58             slotId_, INVALID_PARAMETER, videoState, ret, "the device is currently not ringing");
59         return CALL_ERR_ANSWER_FAILED;
60     }
61     ret = PackCellularCallInfo(callInfo);
62     callInfo.videoState = videoState;
63     if (ret != TELEPHONY_SUCCESS) {
64         TELEPHONY_LOGW("PackCellularCallInfo failed!");
65         CallManagerHisysevent::WriteAnswerCallFaultEvent(
66             slotId_, INVALID_PARAMETER, videoState, ret, "PackCellularCallInfo failed");
67     }
68     if (cellularCallConnectionPtr_ == nullptr) {
69         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
70         return TELEPHONY_ERR_LOCAL_PTR_NULL;
71     }
72     ret = cellularCallConnectionPtr_->Answer(callInfo);
73     if (ret != TELEPHONY_SUCCESS) {
74         TELEPHONY_LOGE("answer call failed!");
75         return CALL_ERR_ANSWER_FAILED;
76     }
77     return TELEPHONY_SUCCESS;
78 }
79 
CarrierRejectCall()80 int32_t CarrierCall::CarrierRejectCall()
81 {
82     CellularCallInfo callInfo;
83     int32_t ret = RejectCallBase();
84     if (ret != TELEPHONY_SUCCESS) {
85         return ret;
86     }
87     ret = PackCellularCallInfo(callInfo);
88     if (ret != TELEPHONY_SUCCESS) {
89         TELEPHONY_LOGW("PackCellularCallInfo failed!");
90         CallManagerHisysevent::WriteHangUpFaultEvent(
91             slotId_, callInfo.callId, ret, "Reject PackCellularCallInfo failed");
92     }
93     if (cellularCallConnectionPtr_ == nullptr) {
94         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
95         return TELEPHONY_ERR_LOCAL_PTR_NULL;
96     }
97     ret = cellularCallConnectionPtr_->HangUp(callInfo, CallSupplementType::TYPE_DEFAULT);
98     if (ret != TELEPHONY_SUCCESS) {
99         TELEPHONY_LOGE("Reject failed!");
100         return CALL_ERR_REJECT_FAILED;
101     }
102     return TELEPHONY_SUCCESS;
103 }
104 
CarrierHangUpCall()105 int32_t CarrierCall::CarrierHangUpCall()
106 {
107     int32_t ret = CALL_ERR_HANGUP_FAILED;
108     CellularCallInfo callInfo;
109     ret = PackCellularCallInfo(callInfo);
110     if (ret != TELEPHONY_SUCCESS) {
111         TELEPHONY_LOGW("PackCellularCallInfo failed!");
112         CallManagerHisysevent::WriteHangUpFaultEvent(
113             callInfo.accountId, callInfo.callId, ret, "HangUp PackCellularCallInfo failed");
114     }
115     uint64_t policyFlag = GetPolicyFlag();
116     if (cellularCallConnectionPtr_ == nullptr) {
117         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
118         return TELEPHONY_ERR_LOCAL_PTR_NULL;
119     }
120     if (policyFlag & POLICY_FLAG_HANG_UP_ACTIVE) {
121         ret = cellularCallConnectionPtr_->HangUp(callInfo, CallSupplementType::TYPE_HANG_UP_ACTIVE);
122     } else if (policyFlag & POLICY_FLAG_HANG_UP_HOLD_WAIT) {
123         ret = cellularCallConnectionPtr_->HangUp(callInfo, CallSupplementType::TYPE_HANG_UP_HOLD_WAIT);
124     } else {
125         ret = cellularCallConnectionPtr_->HangUp(callInfo, CallSupplementType::TYPE_DEFAULT);
126     }
127     if (ret != TELEPHONY_SUCCESS) {
128         TELEPHONY_LOGE("End failed!");
129         return CALL_ERR_HANGUP_FAILED;
130     }
131     return TELEPHONY_SUCCESS;
132 }
133 
CarrierHoldCall()134 int32_t CarrierCall::CarrierHoldCall()
135 {
136     CellularCallInfo callInfo;
137     int32_t ret = PackCellularCallInfo(callInfo);
138     if (ret != TELEPHONY_SUCCESS) {
139         TELEPHONY_LOGW("PackCellularCallInfo failed!");
140     }
141     if (cellularCallConnectionPtr_ == nullptr) {
142         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
143         return TELEPHONY_ERR_LOCAL_PTR_NULL;
144     }
145     ret = cellularCallConnectionPtr_->HoldCall(callInfo);
146     if (ret != TELEPHONY_SUCCESS) {
147         TELEPHONY_LOGE("Hold failed!");
148         return CALL_ERR_HOLD_FAILED;
149     }
150     return TELEPHONY_SUCCESS;
151 }
152 
CarrierUnHoldCall()153 int32_t CarrierCall::CarrierUnHoldCall()
154 {
155     CellularCallInfo callInfo;
156     int32_t ret = PackCellularCallInfo(callInfo);
157     if (ret != TELEPHONY_SUCCESS) {
158         TELEPHONY_LOGW("PackCellularCallInfo failed!");
159     }
160     if (cellularCallConnectionPtr_ == nullptr) {
161         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
162         return TELEPHONY_ERR_LOCAL_PTR_NULL;
163     }
164     ret = cellularCallConnectionPtr_->UnHoldCall(callInfo);
165     if (ret != TELEPHONY_SUCCESS) {
166         TELEPHONY_LOGE("UnHold failed!");
167         return CALL_ERR_UNHOLD_FAILED;
168     }
169     return TELEPHONY_SUCCESS;
170 }
171 
CarrierSetMute(int32_t mute,int32_t slotId)172 int32_t CarrierCall::CarrierSetMute(int32_t mute, int32_t slotId)
173 {
174     if (cellularCallConnectionPtr_ == nullptr) {
175         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
176         return TELEPHONY_ERR_LOCAL_PTR_NULL;
177     }
178     int32_t ret = cellularCallConnectionPtr_->SetMute(mute, slotId);
179     if (ret != TELEPHONY_SUCCESS) {
180         TELEPHONY_LOGE("SetMute failed!");
181         return CALL_ERR_UNHOLD_FAILED;
182     }
183     return TELEPHONY_SUCCESS;
184 }
185 
GetCallAttributeCarrierInfo(CallAttributeInfo & info)186 void CarrierCall::GetCallAttributeCarrierInfo(CallAttributeInfo &info)
187 {
188     std::lock_guard<std::mutex> lock(mutex_);
189     info.isEcc = isEcc_;
190     info.accountId = slotId_;
191     info.index = index_;
192     GetCallAttributeBaseInfo(info);
193 }
194 
GetEmergencyState()195 bool CarrierCall::GetEmergencyState()
196 {
197     std::lock_guard<std::mutex> lock(mutex_);
198     return isEcc_;
199 }
200 
CarrierSwitchCall()201 int32_t CarrierCall::CarrierSwitchCall()
202 {
203     CellularCallInfo callInfo;
204     int32_t ret = PackCellularCallInfo(callInfo);
205     if (ret != TELEPHONY_SUCCESS) {
206         TELEPHONY_LOGW("PackCellularCallInfo failed!");
207     }
208     if (cellularCallConnectionPtr_ == nullptr) {
209         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
210         return TELEPHONY_ERR_LOCAL_PTR_NULL;
211     }
212     ret = cellularCallConnectionPtr_->SwitchCall(callInfo);
213     if (ret != TELEPHONY_SUCCESS) {
214         TELEPHONY_LOGE("SwitchCall failed!");
215         return CALL_ERR_UNHOLD_FAILED;
216     }
217     return TELEPHONY_SUCCESS;
218 }
219 
GetSlotId()220 int32_t CarrierCall::GetSlotId()
221 {
222     return slotId_;
223 }
224 
CarrierCombineConference()225 int32_t CarrierCall::CarrierCombineConference()
226 {
227     CellularCallInfo callInfo;
228     int32_t ret = PackCellularCallInfo(callInfo);
229     if (ret != TELEPHONY_SUCCESS) {
230         TELEPHONY_LOGW("PackCellularCallInfo failed!");
231     }
232     if (cellularCallConnectionPtr_ == nullptr) {
233         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
234         return TELEPHONY_ERR_LOCAL_PTR_NULL;
235     }
236     return cellularCallConnectionPtr_->CombineConference(callInfo);
237 }
238 
CarrierSeparateConference()239 int32_t CarrierCall::CarrierSeparateConference()
240 {
241     CellularCallInfo callInfo;
242     int32_t ret = PackCellularCallInfo(callInfo);
243     if (ret != TELEPHONY_SUCCESS) {
244         TELEPHONY_LOGW("PackCellularCallInfo failed!");
245     }
246     if (cellularCallConnectionPtr_ == nullptr) {
247         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
248         return TELEPHONY_ERR_LOCAL_PTR_NULL;
249     }
250     return cellularCallConnectionPtr_->SeparateConference(callInfo);
251 }
252 
CarrierKickOutFromConference()253 int32_t CarrierCall::CarrierKickOutFromConference()
254 {
255     CellularCallInfo callInfo;
256     int32_t ret = PackCellularCallInfo(callInfo);
257     if (ret != TELEPHONY_SUCCESS) {
258         TELEPHONY_LOGW("PackCellularCallInfo failed!");
259     }
260     if (cellularCallConnectionPtr_ == nullptr) {
261         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
262         return TELEPHONY_ERR_LOCAL_PTR_NULL;
263     }
264     return cellularCallConnectionPtr_->KickOutFromConference(callInfo);
265 }
266 
IsSupportConferenceable()267 int32_t CarrierCall::IsSupportConferenceable()
268 {
269     // emergency call not allowed to join conference
270     return GetEmergencyState() != true ? TELEPHONY_SUCCESS : CALL_ERR_EMERGENCY_UNSUPPORT_CONFERENCEABLE;
271 }
272 
PackCellularCallInfo(CellularCallInfo & callInfo)273 int32_t CarrierCall::PackCellularCallInfo(CellularCallInfo &callInfo)
274 {
275     callInfo.callId = callId_;
276     callInfo.callType = callType_;
277     callInfo.videoState = static_cast<int32_t>(videoState_);
278     callInfo.index = index_;
279     callInfo.slotId = slotId_;
280     callInfo.accountId = slotId_;
281     if (memset_s(callInfo.phoneNum, kMaxNumberLen, 0, kMaxNumberLen) != EOK) {
282         TELEPHONY_LOGW("memset_s failed!");
283         return TELEPHONY_ERR_MEMSET_FAIL;
284     }
285     if (accountNumber_.length() > static_cast<size_t>(kMaxNumberLen)) {
286         TELEPHONY_LOGE("Number out of limit!");
287         return CALL_ERR_NUMBER_OUT_OF_RANGE;
288     }
289     if (memcpy_s(callInfo.phoneNum, kMaxNumberLen, accountNumber_.c_str(), accountNumber_.length()) != EOK) {
290         TELEPHONY_LOGW("memcpy_s failed!");
291         return TELEPHONY_ERR_MEMCPY_FAIL;
292     }
293     return TELEPHONY_SUCCESS;
294 }
295 
StartDtmf(char str)296 int32_t CarrierCall::StartDtmf(char str)
297 {
298     CellularCallInfo callInfo;
299     int32_t ret = PackCellularCallInfo(callInfo);
300     if (ret != TELEPHONY_SUCCESS) {
301         TELEPHONY_LOGW("PackCellularCallInfo failed!");
302     }
303     if (cellularCallConnectionPtr_ == nullptr) {
304         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
305         return TELEPHONY_ERR_LOCAL_PTR_NULL;
306     }
307     return cellularCallConnectionPtr_->StartDtmf(str, callInfo);
308 }
309 
StopDtmf()310 int32_t CarrierCall::StopDtmf()
311 {
312     CellularCallInfo callInfo;
313     int32_t ret = PackCellularCallInfo(callInfo);
314     if (ret != TELEPHONY_SUCCESS) {
315         TELEPHONY_LOGW("PackCellularCallInfo failed!");
316     }
317     if (cellularCallConnectionPtr_ == nullptr) {
318         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
319         return TELEPHONY_ERR_LOCAL_PTR_NULL;
320     }
321     return cellularCallConnectionPtr_->StopDtmf(callInfo);
322 }
323 
PostDialProceed(bool proceed)324 int32_t CarrierCall::PostDialProceed(bool proceed)
325 {
326     CellularCallInfo callInfo;
327     int32_t ret = PackCellularCallInfo(callInfo);
328     if (ret != TELEPHONY_SUCCESS) {
329         TELEPHONY_LOGW("PackCellularCallInfo failed!");
330     }
331     if (cellularCallConnectionPtr_ == nullptr) {
332         TELEPHONY_LOGE("cellularCallConnectionPtr_ is nullptr!");
333         return TELEPHONY_ERR_LOCAL_PTR_NULL;
334     }
335     return cellularCallConnectionPtr_->PostDialProceed(callInfo, proceed);
336 }
337 
SetSlotId(int32_t slotId)338 void CarrierCall::SetSlotId(int32_t slotId)
339 {
340     slotId_ = slotId;
341 }
342 
SetCallIndex(int32_t index)343 void CarrierCall::SetCallIndex(int32_t index)
344 {
345     index_ = index;
346 }
347 
GetCallIndex()348 int32_t CarrierCall::GetCallIndex()
349 {
350     return index_;
351 }
352 } // namespace Telephony
353 } // namespace OHOS
354