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