1 /*
2 * Copyright (C) 2021-2022 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 "cellular_call_connection_ims.h"
17
18 #include "cellular_call_hisysevent.h"
19 #include "cellular_call_service.h"
20 #include "ims_call_client.h"
21 #include "radio_event.h"
22 #include "securec.h"
23 #include "standardize_utils.h"
24
25 namespace OHOS {
26 namespace Telephony {
DialRequest(int32_t slotId,const ImsDialInfoStruct & dialRequest)27 int32_t CellularCallConnectionIMS::DialRequest(int32_t slotId, const ImsDialInfoStruct &dialRequest)
28 {
29 TELEPHONY_LOGI("call ims service");
30 ImsCallInfo callInfo;
31 if (memset_s(&callInfo, sizeof(callInfo), 0, sizeof(callInfo)) != EOK) {
32 TELEPHONY_LOGE("return, memset_s error.");
33 CellularCallHiSysEvent::WriteDialCallFaultEvent(
34 slotId, INVALID_PARAMETER, dialRequest.videoState, TELEPHONY_ERR_MEMSET_FAIL, "memset_s error");
35 return TELEPHONY_ERR_MEMSET_FAIL;
36 }
37 UpdateCallNumber(dialRequest.phoneNum);
38 size_t cpyLen = strlen(phoneNumber_.c_str()) + 1;
39 if (cpyLen > static_cast<size_t>(kMaxNumberLength)) {
40 phoneNumber_.clear();
41 return TELEPHONY_ERR_STRCPY_FAIL;
42 }
43 if (strcpy_s(callInfo.phoneNum, cpyLen, phoneNumber_.c_str()) != EOK) {
44 TELEPHONY_LOGE("return, strcpy_s fail.");
45 phoneNumber_.clear();
46 CellularCallHiSysEvent::WriteDialCallFaultEvent(
47 slotId, INVALID_PARAMETER, dialRequest.videoState, TELEPHONY_ERR_STRCPY_FAIL, "strcpy_s fail");
48 return TELEPHONY_ERR_STRCPY_FAIL;
49 }
50 phoneNumber_.clear();
51 callInfo.videoState = dialRequest.videoState;
52 callInfo.slotId = slotId;
53 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
54 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
55 CellularCallHiSysEvent::WriteDialCallFaultEvent(slotId, INVALID_PARAMETER, dialRequest.videoState,
56 CALL_ERR_RESOURCE_UNAVAILABLE, "ims vendor service does not exist");
57 return CALL_ERR_RESOURCE_UNAVAILABLE;
58 }
59 return DelayedSingleton<ImsCallClient>::GetInstance()->Dial(callInfo, dialRequest.clirMode);
60 }
61
HangUpRequest(int32_t slotId,const std::string & phoneNum,int32_t index)62 int32_t CellularCallConnectionIMS::HangUpRequest(int32_t slotId, const std::string &phoneNum, int32_t index)
63 {
64 if (moduleUtils_.NeedCallImsService()) {
65 TELEPHONY_LOGI("call ims service");
66 ImsCallInfo hangUpCallInfo;
67 if (memset_s(&hangUpCallInfo, sizeof(hangUpCallInfo), 0, sizeof(hangUpCallInfo)) != EOK) {
68 TELEPHONY_LOGE("return, memset_s error.");
69 return TELEPHONY_ERR_MEMSET_FAIL;
70 }
71 if (static_cast<int32_t>(phoneNum.length() + 1) > kMaxNumberLength) {
72 return TELEPHONY_ERR_STRCPY_FAIL;
73 }
74 if (strcpy_s(hangUpCallInfo.phoneNum, strlen(phoneNum.c_str()) + 1, phoneNum.c_str()) != EOK) {
75 TELEPHONY_LOGE("return, strcpy_s fail.");
76 return TELEPHONY_ERR_STRCPY_FAIL;
77 }
78 hangUpCallInfo.slotId = slotId;
79 hangUpCallInfo.index = index;
80 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
81 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
82 return CALL_ERR_RESOURCE_UNAVAILABLE;
83 }
84 return DelayedSingleton<ImsCallClient>::GetInstance()->HangUp(hangUpCallInfo);
85 }
86 TELEPHONY_LOGE("ims vendor service does not exist.");
87 CellularCallHiSysEvent::WriteHangUpFaultEvent(slotId, INVALID_PARAMETER,
88 static_cast<int32_t>(CallErrorCode::CALL_ERROR_IMS_SERVICE_NOT_EXIST),
89 "HangUpRequest ims vendor service does not exist");
90 return TELEPHONY_ERROR;
91 }
92
AnswerRequest(int32_t slotId,const std::string & phoneNum,int32_t videoState,int32_t index)93 int32_t CellularCallConnectionIMS::AnswerRequest(
94 int32_t slotId, const std::string &phoneNum, int32_t videoState, int32_t index)
95 {
96 if (moduleUtils_.NeedCallImsService()) {
97 TELEPHONY_LOGI("call ims service");
98 ImsCallInfo answerCallInfo;
99 if (memset_s(&answerCallInfo, sizeof(answerCallInfo), 0, sizeof(answerCallInfo)) != EOK) {
100 TELEPHONY_LOGE("return, memset_s error.");
101 return TELEPHONY_ERR_MEMSET_FAIL;
102 }
103 if (static_cast<int32_t>(phoneNum.length() + 1) > kMaxNumberLength) {
104 return TELEPHONY_ERR_STRCPY_FAIL;
105 }
106 if (strcpy_s(answerCallInfo.phoneNum, strlen(phoneNum.c_str()) + 1, phoneNum.c_str()) != EOK) {
107 TELEPHONY_LOGE("return, strcpy_s fail.");
108 return TELEPHONY_ERR_STRCPY_FAIL;
109 }
110 answerCallInfo.videoState = videoState;
111 answerCallInfo.slotId = slotId;
112 answerCallInfo.index = index;
113 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
114 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
115 return CALL_ERR_RESOURCE_UNAVAILABLE;
116 }
117 return DelayedSingleton<ImsCallClient>::GetInstance()->Answer(answerCallInfo);
118 }
119 TELEPHONY_LOGE("ims vendor service does not exist.");
120 CellularCallHiSysEvent::WriteAnswerCallFaultEvent(slotId, INVALID_PARAMETER, INVALID_PARAMETER,
121 static_cast<int32_t>(CallErrorCode::CALL_ERROR_IMS_SERVICE_NOT_EXIST), "ims vendor service does not exist");
122 return TELEPHONY_ERROR;
123 }
124
RejectRequest(int32_t slotId,const std::string & phoneNum,int32_t index)125 int32_t CellularCallConnectionIMS::RejectRequest(int32_t slotId, const std::string &phoneNum, int32_t index)
126 {
127 if (moduleUtils_.NeedCallImsService()) {
128 TELEPHONY_LOGI("call ims service");
129 ImsCallInfo rejectCallInfo;
130 if (memset_s(&rejectCallInfo, sizeof(rejectCallInfo), 0, sizeof(rejectCallInfo)) != EOK) {
131 TELEPHONY_LOGE("return, memset_s error.");
132 return TELEPHONY_ERR_MEMSET_FAIL;
133 }
134 if (static_cast<int32_t>(phoneNum.length() + 1) > kMaxNumberLength) {
135 return TELEPHONY_ERR_STRCPY_FAIL;
136 }
137 if (strcpy_s(rejectCallInfo.phoneNum, strlen(phoneNum.c_str()) + 1, phoneNum.c_str()) != EOK) {
138 TELEPHONY_LOGE("return, strcpy_s fail.");
139 return TELEPHONY_ERR_STRCPY_FAIL;
140 }
141 rejectCallInfo.slotId = slotId;
142 rejectCallInfo.index = index;
143 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
144 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
145 return CALL_ERR_RESOURCE_UNAVAILABLE;
146 }
147 return DelayedSingleton<ImsCallClient>::GetInstance()->Reject(rejectCallInfo);
148 }
149 TELEPHONY_LOGE("ims vendor service does not exist.");
150 CellularCallHiSysEvent::WriteHangUpFaultEvent(slotId, INVALID_PARAMETER,
151 static_cast<int32_t>(CallErrorCode::CALL_ERROR_IMS_SERVICE_NOT_EXIST),
152 "RejectRequest ims vendor service does not exist");
153 return TELEPHONY_ERROR;
154 }
155
HoldCallRequest(int32_t slotId)156 int32_t CellularCallConnectionIMS::HoldCallRequest(int32_t slotId)
157 {
158 if (moduleUtils_.NeedCallImsService()) {
159 TELEPHONY_LOGI("call ims service");
160 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
161 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
162 return CALL_ERR_RESOURCE_UNAVAILABLE;
163 }
164 int32_t callType = static_cast<int32_t>(GetCallReportInfo().callMode);
165 return DelayedSingleton<ImsCallClient>::GetInstance()->HoldCall(slotId, callType);
166 }
167 TELEPHONY_LOGE("ims vendor service does not exist.");
168 return TELEPHONY_ERROR;
169 }
170
UnHoldCallRequest(int32_t slotId)171 int32_t CellularCallConnectionIMS::UnHoldCallRequest(int32_t slotId)
172 {
173 if (moduleUtils_.NeedCallImsService()) {
174 TELEPHONY_LOGI("call ims service");
175 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
176 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
177 return CALL_ERR_RESOURCE_UNAVAILABLE;
178 }
179 int32_t callType = static_cast<int32_t>(GetCallReportInfo().callMode);
180 return DelayedSingleton<ImsCallClient>::GetInstance()->UnHoldCall(slotId, callType);
181 }
182 TELEPHONY_LOGE("ims vendor service does not exist.");
183 return TELEPHONY_ERROR;
184 }
185
SwitchCallRequest(int32_t slotId)186 int32_t CellularCallConnectionIMS::SwitchCallRequest(int32_t slotId)
187 {
188 if (moduleUtils_.NeedCallImsService()) {
189 TELEPHONY_LOGI("call ims service");
190 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
191 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
192 return CALL_ERR_RESOURCE_UNAVAILABLE;
193 }
194 int32_t callType = static_cast<int32_t>(GetCallReportInfo().callMode);
195 return DelayedSingleton<ImsCallClient>::GetInstance()->SwitchCall(slotId, callType);
196 }
197 TELEPHONY_LOGE("ims vendor service does not exist.");
198 return TELEPHONY_ERROR;
199 }
200
CombineConferenceRequest(int32_t slotId,int32_t voiceCall)201 int32_t CellularCallConnectionIMS::CombineConferenceRequest(int32_t slotId, int32_t voiceCall)
202 {
203 if (moduleUtils_.NeedCallImsService()) {
204 TELEPHONY_LOGI("call ims service");
205 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
206 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
207 return CALL_ERR_RESOURCE_UNAVAILABLE;
208 }
209 return DelayedSingleton<ImsCallClient>::GetInstance()->CombineConference(slotId);
210 }
211 TELEPHONY_LOGE("ims vendor service does not exist.");
212 return TELEPHONY_ERROR;
213 }
214
InviteToConferenceRequest(int32_t slotId,const std::vector<std::string> & numberList)215 int32_t CellularCallConnectionIMS::InviteToConferenceRequest(
216 int32_t slotId, const std::vector<std::string> &numberList)
217 {
218 if (moduleUtils_.NeedCallImsService()) {
219 TELEPHONY_LOGI("call ims service");
220 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
221 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
222 return CALL_ERR_RESOURCE_UNAVAILABLE;
223 }
224 return DelayedSingleton<ImsCallClient>::GetInstance()->InviteToConference(slotId, numberList);
225 }
226 TELEPHONY_LOGE("ims vendor service does not exist.");
227 return TELEPHONY_ERROR;
228 }
229
KickOutFromConferenceRequest(int32_t slotId,int32_t index)230 int32_t CellularCallConnectionIMS::KickOutFromConferenceRequest(int32_t slotId, int32_t index)
231 {
232 if (moduleUtils_.NeedCallImsService()) {
233 TELEPHONY_LOGI("call ims service");
234 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
235 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
236 return CALL_ERR_RESOURCE_UNAVAILABLE;
237 }
238 return DelayedSingleton<ImsCallClient>::GetInstance()->KickOutFromConference(slotId, index);
239 }
240 TELEPHONY_LOGE("ims vendor service does not exist.");
241 return TELEPHONY_ERROR;
242 }
243
CallSupplementRequest(int32_t slotId,CallSupplementType type)244 int32_t CellularCallConnectionIMS::CallSupplementRequest(int32_t slotId, CallSupplementType type)
245 {
246 TELEPHONY_LOGD("start");
247 if (DelayedSingleton<CellularCallService>::GetInstance() == nullptr) {
248 TELEPHONY_LOGE("return, error type: GetInstance() is nullptr.");
249 return CALL_ERR_RESOURCE_UNAVAILABLE;
250 }
251 auto handle = DelayedSingleton<CellularCallService>::GetInstance()->GetHandler(slotId);
252 if (handle == nullptr) {
253 TELEPHONY_LOGE("return, error type: handle is nullptr.");
254 return CALL_ERR_RESOURCE_UNAVAILABLE;
255 }
256 CoreManagerInner::GetInstance().CallSupplement(slotId, RadioEvent::RADIO_CALL_SUPPLEMENT, type, handle);
257 return TELEPHONY_SUCCESS;
258 }
259
GetImsCallsDataRequest(int32_t slotId,int64_t lastCallsDataFlag)260 int32_t CellularCallConnectionIMS::GetImsCallsDataRequest(int32_t slotId, int64_t lastCallsDataFlag)
261 {
262 if (moduleUtils_.NeedCallImsService()) {
263 TELEPHONY_LOGI("call ims service");
264 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
265 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
266 return CALL_ERR_RESOURCE_UNAVAILABLE;
267 }
268 return DelayedSingleton<ImsCallClient>::GetInstance()->GetImsCallsDataRequest(slotId, lastCallsDataFlag);
269 }
270 TELEPHONY_LOGE("ims vendor service does not exist.");
271 return TELEPHONY_ERROR;
272 }
273
SendDtmfRequest(int32_t slotId,char cDtmfCode,int32_t index) const274 int32_t CellularCallConnectionIMS::SendDtmfRequest(int32_t slotId, char cDtmfCode, int32_t index) const
275 {
276 if (moduleUtils_.NeedCallImsService()) {
277 TELEPHONY_LOGD("call ims service");
278 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
279 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
280 return CALL_ERR_RESOURCE_UNAVAILABLE;
281 }
282 return DelayedSingleton<ImsCallClient>::GetInstance()->SendDtmf(slotId, cDtmfCode, index);
283 }
284 TELEPHONY_LOGE("ims vendor service does not exist.");
285 return TELEPHONY_ERROR;
286 }
287
StartDtmfRequest(int32_t slotId,char cDtmfCode,int32_t index) const288 int32_t CellularCallConnectionIMS::StartDtmfRequest(int32_t slotId, char cDtmfCode, int32_t index) const
289 {
290 if (moduleUtils_.NeedCallImsService()) {
291 TELEPHONY_LOGI("call ims service");
292 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
293 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
294 return CALL_ERR_RESOURCE_UNAVAILABLE;
295 }
296 return DelayedSingleton<ImsCallClient>::GetInstance()->StartDtmf(slotId, cDtmfCode, index);
297 }
298 TELEPHONY_LOGE("ims vendor service does not exist.");
299 return TELEPHONY_ERROR;
300 }
301
StopDtmfRequest(int32_t slotId,int32_t index) const302 int32_t CellularCallConnectionIMS::StopDtmfRequest(int32_t slotId, int32_t index) const
303 {
304 if (moduleUtils_.NeedCallImsService()) {
305 TELEPHONY_LOGI("call ims service");
306 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
307 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
308 return CALL_ERR_RESOURCE_UNAVAILABLE;
309 }
310 return DelayedSingleton<ImsCallClient>::GetInstance()->StopDtmf(slotId, index);
311 }
312 TELEPHONY_LOGE("ims vendor service does not exist.");
313 return TELEPHONY_ERROR;
314 }
315
StartRttRequest(int32_t slotId,const std::string & msg)316 int32_t CellularCallConnectionIMS::StartRttRequest(int32_t slotId, const std::string &msg)
317 {
318 if (moduleUtils_.NeedCallImsService()) {
319 TELEPHONY_LOGI("call ims service");
320 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
321 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
322 return CALL_ERR_RESOURCE_UNAVAILABLE;
323 }
324 return DelayedSingleton<ImsCallClient>::GetInstance()->StartRtt(slotId, msg);
325 }
326 TELEPHONY_LOGE("ims vendor service does not exist.");
327 return TELEPHONY_ERROR;
328 }
329
StopRttRequest(int32_t slotId)330 int32_t CellularCallConnectionIMS::StopRttRequest(int32_t slotId)
331 {
332 if (moduleUtils_.NeedCallImsService()) {
333 TELEPHONY_LOGI("call ims service");
334 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
335 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
336 return CALL_ERR_RESOURCE_UNAVAILABLE;
337 }
338 return DelayedSingleton<ImsCallClient>::GetInstance()->StopRtt(slotId);
339 }
340 TELEPHONY_LOGE("ims vendor service does not exist.");
341 return TELEPHONY_ERROR;
342 }
343
GetCallFailReasonRequest(int32_t slotId) const344 int32_t CellularCallConnectionIMS::GetCallFailReasonRequest(int32_t slotId) const
345 {
346 if (moduleUtils_.NeedCallImsService()) {
347 TELEPHONY_LOGD("call ims service");
348 if (DelayedSingleton<ImsCallClient>::GetInstance() == nullptr) {
349 TELEPHONY_LOGE("return, ImsCallClient is nullptr.");
350 return CALL_ERR_RESOURCE_UNAVAILABLE;
351 }
352 return DelayedSingleton<ImsCallClient>::GetInstance()->GetLastCallFailReason(slotId);
353 }
354 TELEPHONY_LOGE("ims vendor service does not exist.");
355 return TELEPHONY_ERROR;
356 }
357
ProcessPostDialCallChar(int32_t slotId,char c)358 int32_t CellularCallConnectionIMS::ProcessPostDialCallChar(int32_t slotId, char c)
359 {
360 if (StandardizeUtils::IsDtmfKey(c)) {
361 SendDtmfRequest(slotId, c, GetIndex());
362 } else if (StandardizeUtils::IsPauseKey(c)) {
363 SetPostDialCallState(PostDialCallState::POST_DIAL_CALL_PAUSE);
364 auto handle = DelayedSingleton<CellularCallService>::GetInstance()->GetHandler(slotId);
365 if (handle == nullptr) {
366 TELEPHONY_LOGE("SendDtmfRequest return, error type: handle is nullptr.");
367 return CALL_ERR_RESOURCE_UNAVAILABLE;
368 }
369 std::shared_ptr<PostDialData> postDial = std::make_shared<PostDialData>();
370 postDial->callId = GetIndex();
371 postDial->isIms = true;
372 handle->SendEvent(EVENT_EXECUTE_POST_DIAL, postDial, PAUSE_DELAY_TIME);
373 } else if (StandardizeUtils::IsWaitKey(c)) {
374 SetPostDialCallState(PostDialCallState::POST_DIAL_CALL_DELAY);
375 }
376 return TELEPHONY_SUCCESS;
377 }
378
SetHoldToDialInfo(std::string holdToDialNum,CLIRMode holdToDialClirMode,int32_t holdToDialVideoState,bool isEmergency)379 void CellularCallConnectionIMS::SetHoldToDialInfo(std::string holdToDialNum, CLIRMode holdToDialClirMode,
380 int32_t holdToDialVideoState, bool isEmergency)
381 {
382 holdToDialInfo_.phoneNum = holdToDialNum;
383 holdToDialInfo_.clirMode = holdToDialClirMode;
384 holdToDialInfo_.videoState = holdToDialVideoState;
385 holdToDialInfo_.bEmergencyCall = isEmergency;
386 }
387
IsNeedToDial()388 bool CellularCallConnectionIMS::IsNeedToDial()
389 {
390 return isNeedToDial_;
391 }
392
SetDialFlag(bool isNeedToDial)393 void CellularCallConnectionIMS::SetDialFlag(bool isNeedToDial)
394 {
395 isNeedToDial_ = isNeedToDial;
396 }
397
GetHoldToDialInfo()398 ImsDialInfoStruct CellularCallConnectionIMS::GetHoldToDialInfo()
399 {
400 return holdToDialInfo_;
401 }
402 } // namespace Telephony
403 } // namespace OHOS
404