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