• 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 
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