• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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