• 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 "hril_call.h"
17 
18 #include "hril_notification.h"
19 #include "hril_request.h"
20 
21 namespace OHOS {
22 namespace Telephony {
HRilCall(int32_t slotId)23 HRilCall::HRilCall(int32_t slotId) : HRilBase(slotId)
24 {
25     AddCallNotificationToMap();
26     AddCallBasicResponseToMap();
27     AddCallSupplementResponseToMap();
28     AddCallAdditionalResponseToMap();
29 }
30 
~HRilCall()31 HRilCall::~HRilCall()
32 {
33     callFuncs_ = nullptr;
34 }
35 
IsCallResponse(uint32_t code)36 bool HRilCall::IsCallResponse(uint32_t code)
37 {
38     return ((code >= HREQ_CALL_BASE) && (code < HREQ_SMS_BASE));
39 }
40 
IsCallNotification(uint32_t code)41 bool HRilCall::IsCallNotification(uint32_t code)
42 {
43     return ((code >= HNOTI_CALL_BASE) && (code < HNOTI_SMS_BASE));
44 }
45 
IsCallRespOrNotify(uint32_t code)46 bool HRilCall::IsCallRespOrNotify(uint32_t code)
47 {
48     return IsCallResponse(code) || IsCallNotification(code);
49 }
50 
AddCallNotificationToMap()51 void HRilCall::AddCallNotificationToMap()
52 {
53     // Notification
54     notiMemberFuncMap_[HNOTI_CALL_STATE_UPDATED] =
55         [this](int32_t notifyType, HRilErrNumber error, const void *response,
56         size_t responseLen) { return CallStateUpdated(notifyType, error, response, responseLen); };
57     notiMemberFuncMap_[HNOTI_CALL_USSD_REPORT] =
58         [this](int32_t notifyType, HRilErrNumber error, const void *response,
59         size_t responseLen) { return CallUssdNotice(notifyType, error, response, responseLen); };
60     notiMemberFuncMap_[HNOTI_CALL_SRVCC_STATUS_REPORT] =
61         [this](int32_t notifyType, HRilErrNumber error, const void *response,
62         size_t responseLen) { return CallSrvccStatusNotice(notifyType, error, response, responseLen); };
63     notiMemberFuncMap_[HNOTI_CALL_RINGBACK_VOICE_REPORT] =
64         [this](int32_t notifyType, HRilErrNumber error, const void *response,
65         size_t responseLen) { return CallRingbackVoiceNotice(notifyType, error, response, responseLen); };
66     notiMemberFuncMap_[HNOTI_CALL_EMERGENCY_NUMBER_REPORT] =
67         [this](int32_t notifyType, HRilErrNumber error, const void *response,
68         size_t responseLen) { return CallEmergencyNotice(notifyType, error, response, responseLen); };
69     notiMemberFuncMap_[HNOTI_CALL_SS_REPORT] =
70         [this](int32_t notifyType, HRilErrNumber error, const void *response,
71         size_t responseLen) { return CallSsNotice(notifyType, error, response, responseLen); };
72     notiMemberFuncMap_[HNOTI_CALL_RSRVCC_STATUS_REPORT] =
73         [this](int32_t notifyType, HRilErrNumber error, const void *response,
74         size_t responseLen) { return CallRsrvccStatusNotify(notifyType, error, response, responseLen); };
75 }
76 
AddCallBasicResponseToMap()77 void HRilCall::AddCallBasicResponseToMap()
78 {
79     // Response
80     respMemberFuncMap_[HREQ_CALL_GET_CALL_LIST] =
81         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
82         size_t responseLen) { return GetCallListResponseExt(requestNum, responseInfo, response, responseLen); };
83     respMemberFuncMap_[HREQ_CALL_DIAL] =
84         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
85         size_t responseLen) { return DialResponse(requestNum, responseInfo, response, responseLen); };
86     respMemberFuncMap_[HREQ_CALL_HANGUP] =
87         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
88         size_t responseLen) { return HangupResponse(requestNum, responseInfo, response, responseLen); };
89     respMemberFuncMap_[HREQ_CALL_REJECT] =
90         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
91         size_t responseLen) { return RejectResponse(requestNum, responseInfo, response, responseLen); };
92     respMemberFuncMap_[HREQ_CALL_ANSWER] =
93         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
94         size_t responseLen) { return AnswerResponse(requestNum, responseInfo, response, responseLen); };
95     respMemberFuncMap_[HREQ_CALL_HOLD_CALL] =
96         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
97         size_t responseLen) { return HoldCallResponse(requestNum, responseInfo, response, responseLen); };
98     respMemberFuncMap_[HREQ_CALL_UNHOLD_CALL] =
99         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
100         size_t responseLen) { return UnHoldCallResponse(requestNum, responseInfo, response, responseLen); };
101     respMemberFuncMap_[HREQ_CALL_SWITCH_CALL] =
102         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
103         size_t responseLen) { return SwitchCallResponse(requestNum, responseInfo, response, responseLen); };
104     respMemberFuncMap_[HREQ_CALL_COMBINE_CONFERENCE] =
105         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
106         size_t responseLen) { return CombineConferenceResponse(requestNum, responseInfo, response, responseLen); };
107     respMemberFuncMap_[HREQ_CALL_SEPARATE_CONFERENCE] =
108         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
109         size_t responseLen) { return SeparateConferenceResponse(requestNum, responseInfo, response, responseLen); };
110     respMemberFuncMap_[HREQ_CALL_GET_EMERGENCY_LIST] =
111         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
112         size_t responseLen) { return GetEmergencyCallListResponse(requestNum, responseInfo, response, responseLen); };
113     respMemberFuncMap_[HREQ_CALL_SET_EMERGENCY_LIST] =
114         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
115         size_t responseLen) { return SetEmergencyCallListResponse(requestNum, responseInfo, response, responseLen); };
116     respMemberFuncMap_[HREQ_CALL_GET_FAIL_REASON] =
117         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
118         size_t responseLen) { return GetCallFailReasonResponse(requestNum, responseInfo, response, responseLen); };
119     respMemberFuncMap_[HREQ_CALL_SET_BARRING_PASSWORD] =
120         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
121         size_t responseLen) { return SetBarringPasswordResponse(requestNum, responseInfo, response, responseLen); };
122     respMemberFuncMap_[HREQ_CALL_CLOSE_UNFINISHED_USSD] =
123         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
124         size_t responseLen) { return CloseUnFinishedUssdResponse(requestNum, responseInfo, response, responseLen); };
125 }
126 
AddCallSupplementResponseToMap()127 void HRilCall::AddCallSupplementResponseToMap()
128 {
129     respMemberFuncMap_[HREQ_CALL_GET_CLIP] =
130         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
131         size_t responseLen) { return GetClipResponse(requestNum, responseInfo, response, responseLen); };
132     respMemberFuncMap_[HREQ_CALL_SET_CLIP] =
133         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
134         size_t responseLen) { return SetClipResponse(requestNum, responseInfo, response, responseLen); };
135     respMemberFuncMap_[HREQ_CALL_CALL_SUPPLEMENT] =
136         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
137         size_t responseLen) { return CallSupplementResponse(requestNum, responseInfo, response, responseLen); };
138     respMemberFuncMap_[HREQ_CALL_GET_CALL_WAITING] =
139         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
140         size_t responseLen) { return GetCallWaitingResponse(requestNum, responseInfo, response, responseLen); };
141     respMemberFuncMap_[HREQ_CALL_SET_CALL_WAITING] =
142         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
143         size_t responseLen) { return SetCallWaitingResponse(requestNum, responseInfo, response, responseLen); };
144     respMemberFuncMap_[HREQ_CALL_GET_CALL_TRANSFER_INFO] =
145         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
146         size_t responseLen) { return GetCallTransferInfoResponse(requestNum, responseInfo, response, responseLen); };
147     respMemberFuncMap_[HREQ_CALL_SET_CALL_TRANSFER_INFO] =
148         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
149         size_t responseLen) { return SetCallTransferInfoResponse(requestNum, responseInfo, response, responseLen); };
150     respMemberFuncMap_[HREQ_CALL_GET_CALL_RESTRICTION] =
151         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
152         size_t responseLen) { return GetCallRestrictionResponse(requestNum, responseInfo, response, responseLen); };
153     respMemberFuncMap_[HREQ_CALL_SET_CALL_RESTRICTION] =
154         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
155         size_t responseLen) { return SetCallRestrictionResponse(requestNum, responseInfo, response, responseLen); };
156     respMemberFuncMap_[HREQ_CALL_GET_CLIR] =
157         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
158         size_t responseLen) { return GetClirResponse(requestNum, responseInfo, response, responseLen); };
159     respMemberFuncMap_[HREQ_CALL_SET_CLIR] =
160         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
161         size_t responseLen) { return SetClirResponse(requestNum, responseInfo, response, responseLen); };
162     respMemberFuncMap_[HREQ_CALL_GET_CALL_PREFERENCE] =
163         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
164         size_t responseLen) { return GetCallPreferenceModeResponse(requestNum, responseInfo, response, responseLen); };
165     respMemberFuncMap_[HREQ_CALL_SET_CALL_PREFERENCE] =
166         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
167         size_t responseLen) { return SetCallPreferenceModeResponse(requestNum, responseInfo, response, responseLen); };
168     respMemberFuncMap_[HREQ_CALL_SET_USSD] =
169         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
170         size_t responseLen) { return SetUssdResponse(requestNum, responseInfo, response, responseLen); };
171     respMemberFuncMap_[HREQ_CALL_GET_USSD] =
172         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
173         size_t responseLen) { return GetUssdResponse(requestNum, responseInfo, response, responseLen); };
174 }
175 
AddCallAdditionalResponseToMap()176 void HRilCall::AddCallAdditionalResponseToMap()
177 {
178     respMemberFuncMap_[HREQ_CALL_START_DTMF] =
179         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
180         size_t responseLen) { return StartDtmfResponse(requestNum, responseInfo, response, responseLen); };
181     respMemberFuncMap_[HREQ_CALL_SEND_DTMF] =
182         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
183         size_t responseLen) { return SendDtmfResponse(requestNum, responseInfo, response, responseLen); };
184     respMemberFuncMap_[HREQ_CALL_STOP_DTMF] =
185         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
186         size_t responseLen) { return StopDtmfResponse(requestNum, responseInfo, response, responseLen); };
187     respMemberFuncMap_[HREQ_CALL_SET_MUTE] =
188         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
189         size_t responseLen) { return SetMuteResponse(requestNum, responseInfo, response, responseLen); };
190     respMemberFuncMap_[HREQ_CALL_GET_MUTE] =
191         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
192         size_t responseLen) { return GetMuteResponse(requestNum, responseInfo, response, responseLen); };
193     respMemberFuncMap_[HREQ_SET_VONR_SWITCH] =
194         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
195         size_t responseLen) { return SetVonrSwitchResponse(requestNum, responseInfo, response, responseLen); };
196 }
197 
GetCallList(int32_t serialId)198 int32_t HRilCall::GetCallList(int32_t serialId)
199 {
200     return RequestVendor(serialId, HREQ_CALL_GET_CALL_LIST, callFuncs_, &HRilCallReq::GetCallList);
201 }
202 
Dial(int32_t serialId,const OHOS::HDI::Ril::V1_1::DialInfo & dialInfo)203 int32_t HRilCall::Dial(int32_t serialId, const OHOS::HDI::Ril::V1_1::DialInfo &dialInfo)
204 {
205     HRilDial dial = {};
206     dial.address = StringToCString(dialInfo.address);
207     dial.clir = dialInfo.clir;
208     return RequestVendor(serialId, HREQ_CALL_DIAL, callFuncs_, &HRilCallReq::Dial, &dial, sizeof(HRilDial));
209 }
210 
Hangup(int32_t serialId,int32_t gsmIndex)211 int32_t HRilCall::Hangup(int32_t serialId, int32_t gsmIndex)
212 {
213     uint32_t data = gsmIndex;
214     return RequestVendor(serialId, HREQ_CALL_HANGUP, callFuncs_, &HRilCallReq::Hangup, &data, sizeof(uint32_t));
215 }
216 
Reject(int32_t serialId)217 int32_t HRilCall::Reject(int32_t serialId)
218 {
219     return RequestVendor(serialId, HREQ_CALL_REJECT, callFuncs_, &HRilCallReq::Reject);
220 }
221 
Answer(int32_t serialId)222 int32_t HRilCall::Answer(int32_t serialId)
223 {
224     return RequestVendor(serialId, HREQ_CALL_ANSWER, callFuncs_, &HRilCallReq::Answer);
225 }
226 
HoldCall(int32_t serialId)227 int32_t HRilCall::HoldCall(int32_t serialId)
228 {
229     return RequestVendor(serialId, HREQ_CALL_HOLD_CALL, callFuncs_, &HRilCallReq::HoldCall);
230 }
231 
UnHoldCall(int32_t serialId)232 int32_t HRilCall::UnHoldCall(int32_t serialId)
233 {
234     return RequestVendor(serialId, HREQ_CALL_UNHOLD_CALL, callFuncs_, &HRilCallReq::UnHoldCall);
235 }
236 
SwitchCall(int32_t serialId)237 int32_t HRilCall::SwitchCall(int32_t serialId)
238 {
239     return RequestVendor(serialId, HREQ_CALL_SWITCH_CALL, callFuncs_, &HRilCallReq::SwitchCall);
240 }
241 
CombineConference(int32_t serialId,int32_t callType)242 int32_t HRilCall::CombineConference(int32_t serialId, int32_t callType)
243 {
244     return RequestVendor(
245         serialId, HREQ_CALL_COMBINE_CONFERENCE, callFuncs_, &HRilCallReq::CombineConference, callType);
246 }
247 
SeparateConference(int32_t serialId,int32_t callIndex,int32_t callType)248 int32_t HRilCall::SeparateConference(int32_t serialId, int32_t callIndex, int32_t callType)
249 {
250     return RequestVendor(
251         serialId, HREQ_CALL_SEPARATE_CONFERENCE, callFuncs_, &HRilCallReq::SeparateConference, callIndex, callType);
252 }
253 
CallSupplement(int32_t serialId,int32_t type)254 int32_t HRilCall::CallSupplement(int32_t serialId, int32_t type)
255 {
256     return RequestVendor(serialId, HREQ_CALL_CALL_SUPPLEMENT, callFuncs_, &HRilCallReq::CallSupplement, type);
257 }
258 
GetClip(int32_t serialId)259 int32_t HRilCall::GetClip(int32_t serialId)
260 {
261     return RequestVendor(serialId, HREQ_CALL_GET_CLIP, callFuncs_, &HRilCallReq::GetClip);
262 }
263 
SetClip(int32_t serialId,int32_t action)264 int32_t HRilCall::SetClip(int32_t serialId, int32_t action)
265 {
266     return RequestVendor(serialId, HREQ_CALL_SET_CLIP, callFuncs_, &HRilCallReq::SetClip, action);
267 }
268 
GetClir(int32_t serialId)269 int32_t HRilCall::GetClir(int32_t serialId)
270 {
271     return RequestVendor(serialId, HREQ_CALL_GET_CLIR, callFuncs_, &HRilCallReq::GetClir);
272 }
273 
SetClir(int32_t serialId,int32_t action)274 int32_t HRilCall::SetClir(int32_t serialId, int32_t action)
275 {
276     return RequestVendor(serialId, HREQ_CALL_SET_CLIR, callFuncs_, &HRilCallReq::SetClir, action);
277 }
278 
GetCallRestriction(int32_t serialId,const std::string & fac)279 int32_t HRilCall::GetCallRestriction(int32_t serialId, const std::string &fac)
280 {
281     return RequestVendor(
282         serialId, HREQ_CALL_GET_CALL_RESTRICTION, callFuncs_, &HRilCallReq::GetCallRestriction, StringToCString(fac));
283 }
284 
SetCallRestriction(int32_t serialId,const OHOS::HDI::Ril::V1_1::CallRestrictionInfo & callRestrictionInfo)285 int32_t HRilCall::SetCallRestriction(
286     int32_t serialId, const OHOS::HDI::Ril::V1_1::CallRestrictionInfo &callRestrictionInfo)
287 {
288     CallRestrictionInfo info = {};
289     info.fac = StringToCString(callRestrictionInfo.fac);
290     info.mode = callRestrictionInfo.mode;
291     info.password = StringToCString(callRestrictionInfo.password);
292     return RequestVendor(serialId, HREQ_CALL_SET_CALL_RESTRICTION, callFuncs_, &HRilCallReq::SetCallRestriction, info);
293 }
294 
GetCallWaiting(int32_t serialId)295 int32_t HRilCall::GetCallWaiting(int32_t serialId)
296 {
297     return RequestVendor(serialId, HREQ_CALL_GET_CALL_WAITING, callFuncs_, &HRilCallReq::GetCallWaiting);
298 }
299 
SetCallWaiting(int32_t serialId,int32_t activate)300 int32_t HRilCall::SetCallWaiting(int32_t serialId, int32_t activate)
301 {
302     return RequestVendor(serialId, HREQ_CALL_SET_CALL_WAITING, callFuncs_, &HRilCallReq::SetCallWaiting, activate);
303 }
304 
GetCallTransferInfo(int32_t serialId,int32_t reason)305 int32_t HRilCall::GetCallTransferInfo(int32_t serialId, int32_t reason)
306 {
307     return RequestVendor(
308         serialId, HREQ_CALL_GET_CALL_TRANSFER_INFO, callFuncs_, &HRilCallReq::GetCallTransferInfo, reason);
309 }
310 
SetCallTransferInfo(int32_t serialId,const OHOS::HDI::Ril::V1_1::CallForwardSetInfo & callForwardSetInfo)311 int32_t HRilCall::SetCallTransferInfo(
312     int32_t serialId, const OHOS::HDI::Ril::V1_1::CallForwardSetInfo &callForwardSetInfo)
313 {
314     HRilCFInfo cFInfo = {};
315     cFInfo.number = StringToCString(callForwardSetInfo.number);
316     cFInfo.reason = callForwardSetInfo.reason;
317     cFInfo.mode = callForwardSetInfo.mode;
318     cFInfo.classx = callForwardSetInfo.classx;
319     return RequestVendor(
320         serialId, HREQ_CALL_SET_CALL_TRANSFER_INFO, callFuncs_, &HRilCallReq::SetCallTransferInfo, cFInfo);
321 }
322 
GetCallPreferenceMode(int32_t serialId)323 int32_t HRilCall::GetCallPreferenceMode(int32_t serialId)
324 {
325     return RequestVendor(
326         serialId, HREQ_CALL_GET_CALL_PREFERENCE, callFuncs_, &HRilCallReq::GetCallPreferenceMode);
327 }
328 
SetCallPreferenceMode(int32_t serialId,int32_t mode)329 int32_t HRilCall::SetCallPreferenceMode(int32_t serialId, int32_t mode)
330 {
331     return RequestVendor(
332         serialId, HREQ_CALL_SET_CALL_PREFERENCE, callFuncs_, &HRilCallReq::SetCallPreferenceMode, mode);
333 }
334 
SetUssd(int32_t serialId,const std::string & str)335 int32_t HRilCall::SetUssd(int32_t serialId, const std::string &str)
336 {
337     return RequestVendor(
338         serialId, HREQ_CALL_SET_USSD, callFuncs_, &HRilCallReq::SetUssd, StringToCString(str));
339 }
340 
GetUssd(int32_t serialId)341 int32_t HRilCall::GetUssd(int32_t serialId)
342 {
343     return RequestVendor(serialId, HREQ_CALL_GET_USSD, callFuncs_, &HRilCallReq::GetUssd);
344 }
345 
SetMute(int32_t serialId,int32_t mute)346 int32_t HRilCall::SetMute(int32_t serialId, int32_t mute)
347 {
348     return RequestVendor(serialId, HREQ_CALL_SET_MUTE, callFuncs_, &HRilCallReq::SetMute, mute);
349 }
350 
GetMute(int32_t serialId)351 int32_t HRilCall::GetMute(int32_t serialId)
352 {
353     return RequestVendor(serialId, HREQ_CALL_GET_MUTE, callFuncs_, &HRilCallReq::GetMute);
354 }
355 
GetCallFailReason(int32_t serialId)356 int32_t HRilCall::GetCallFailReason(int32_t serialId)
357 {
358     return RequestVendor(serialId, HREQ_CALL_GET_FAIL_REASON, callFuncs_, &HRilCallReq::GetCallFailReason);
359 }
360 
GetEmergencyCallList(int32_t serialId)361 int32_t HRilCall::GetEmergencyCallList(int32_t serialId)
362 {
363     return RequestVendor(serialId, HREQ_CALL_GET_EMERGENCY_LIST, callFuncs_, &HRilCallReq::GetEmergencyCallList);
364 }
365 
SetBarringPassword(int32_t serialId,const OHOS::HDI::Ril::V1_1::SetBarringInfo & setBarringInfo)366 int32_t HRilCall::SetBarringPassword(int32_t serialId, const OHOS::HDI::Ril::V1_1::SetBarringInfo &setBarringInfo)
367 {
368     HRilSetBarringInfo info = {};
369     info.fac = StringToCString(setBarringInfo.fac);
370     info.oldPassword = StringToCString(setBarringInfo.oldPassword);
371     info.newPassword = StringToCString(setBarringInfo.newPassword);
372     return RequestVendor(
373         serialId, HREQ_CALL_SET_BARRING_PASSWORD, callFuncs_, &HRilCallReq::SetBarringPassword, info);
374 }
375 
StartDtmf(int32_t serialId,const OHOS::HDI::Ril::V1_1::DtmfInfo & dtmfInfo)376 int32_t HRilCall::StartDtmf(int32_t serialId, const OHOS::HDI::Ril::V1_1::DtmfInfo &dtmfInfo)
377 {
378     CallDtmfInfo info = {};
379     info.callId = dtmfInfo.callId;
380     info.dtmfKey = StringToCString(dtmfInfo.dtmfKey);
381     return RequestVendor(serialId, HREQ_CALL_START_DTMF, callFuncs_, &HRilCallReq::StartDtmf, info);
382 }
383 
SendDtmf(int32_t serialId,const OHOS::HDI::Ril::V1_1::DtmfInfo & dtmfInfo)384 int32_t HRilCall::SendDtmf(int32_t serialId, const OHOS::HDI::Ril::V1_1::DtmfInfo &dtmfInfo)
385 {
386     CallDtmfInfo info = {};
387     info.callId = dtmfInfo.callId;
388     info.dtmfKey = StringToCString(dtmfInfo.dtmfKey);
389     info.onLength = dtmfInfo.onLength;
390     info.offLength = dtmfInfo.offLength;
391     info.stringLength = dtmfInfo.stringLength;
392     return RequestVendor(serialId, HREQ_CALL_SEND_DTMF, callFuncs_, &HRilCallReq::SendDtmf, info);
393 }
394 
StopDtmf(int32_t serialId,const OHOS::HDI::Ril::V1_1::DtmfInfo & dtmfInfo)395 int32_t HRilCall::StopDtmf(int32_t serialId, const OHOS::HDI::Ril::V1_1::DtmfInfo &dtmfInfo)
396 {
397     CallDtmfInfo info = {};
398     info.callId = dtmfInfo.callId;
399     info.dtmfKey = StringToCString(dtmfInfo.dtmfKey);
400     return RequestVendor(serialId, HREQ_CALL_STOP_DTMF, callFuncs_, &HRilCallReq::StopDtmf, info);
401 }
402 
CloseUnFinishedUssd(int32_t serialId)403 int32_t HRilCall::CloseUnFinishedUssd(int32_t serialId)
404 {
405     return RequestVendor(serialId, HREQ_CALL_CLOSE_UNFINISHED_USSD, callFuncs_, &HRilCallReq::CloseUnFinishedUssd);
406 }
407 
SetVonrSwitch(int32_t serialId,int32_t status)408 int32_t HRilCall::SetVonrSwitch(int32_t serialId, int32_t status)
409 {
410     return RequestVendor(serialId, HREQ_SET_VONR_SWITCH, callFuncs_, &HRilCallReq::SetVonrSwitch, status);
411 }
412 
BuildICallList(HDI::Ril::V1_1::CallInfoList & callInfoList,const void * response,size_t responseLen)413 void HRilCall::BuildICallList(
414     HDI::Ril::V1_1::CallInfoList &callInfoList, const void *response, size_t responseLen)
415 {
416     size_t num = responseLen / sizeof(HRilCallInfo);
417     HDI::Ril::V1_1::CallInfo callInfo;
418     callInfoList.callSize = num;
419     for (size_t i = 0; i < num; i++) {
420         HRilCallInfo *curPtr = ((HRilCallInfo *)response + i);
421         if (curPtr != nullptr) {
422             callInfo.index = curPtr->index;
423             callInfo.dir = curPtr->dir;
424             callInfo.state = curPtr->state;
425             callInfo.mode = curPtr->mode;
426             callInfo.mpty = curPtr->mpty;
427             callInfo.voiceDomain = curPtr->voiceDomain;
428             callInfo.callType = curPtr->callType;
429             callInfo.number = (curPtr->number == nullptr) ? "" : curPtr->number;
430             callInfo.type = curPtr->type;
431             callInfo.alpha = (curPtr->alpha == nullptr) ? "" : curPtr->alpha;
432             callInfoList.calls.push_back(callInfo);
433         } else {
434             TELEPHONY_LOGE("BuildCallList: Invalid curPtr");
435             break;
436         }
437     }
438 }
439 
BuildICallList(HDI::Ril::V1_4::CallInfoExtList & callInfoList,const void * response,size_t responseLen)440 void HRilCall::BuildICallList(
441     HDI::Ril::V1_4::CallInfoExtList &callInfoList, const void *response, size_t responseLen)
442 {
443     size_t num = responseLen / sizeof(HRilCallInfo);
444     HDI::Ril::V1_4::CallInfoExt callInfoExt;
445     callInfoList.callSize = num;
446     for (size_t i = 0; i < num; i++) {
447         HRilCallInfo *curPtr = ((HRilCallInfo *)response + i);
448         if (curPtr != nullptr) {
449             callInfoExt.index = curPtr->index;
450             callInfoExt.dir = curPtr->dir;
451             callInfoExt.state = curPtr->state;
452             callInfoExt.mode = curPtr->mode;
453             callInfoExt.mpty = curPtr->mpty;
454             callInfoExt.voiceDomain = curPtr->voiceDomain;
455             callInfoExt.callType = curPtr->callType;
456             callInfoExt.number = (curPtr->number == nullptr) ? "" : curPtr->number;
457             callInfoExt.type = curPtr->type;
458             callInfoExt.alpha = (curPtr->alpha == nullptr) ? "" : curPtr->alpha;
459             callInfoExt.name = curPtr->name;
460             callInfoExt.namePresentation = curPtr->namePresentation;
461             callInfoList.calls.push_back(callInfoExt);
462         } else {
463             TELEPHONY_LOGE("BuildCallList: Invalid curPtr");
464             break;
465         }
466     }
467 }
468 
GetCallListResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)469 int32_t HRilCall::GetCallListResponse(
470     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
471 {
472     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(HRilCallInfo)) != 0) {
473         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
474         return HRIL_ERR_INVALID_PARAMETER;
475     }
476     HDI::Ril::V1_1::CallInfoList callList = {};
477     if (response != nullptr) {
478         BuildICallList(callList, response, responseLen);
479     }
480     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetCallListResponse, callList);
481 }
482 
GetCallListResponseExt(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)483 int32_t HRilCall::GetCallListResponseExt(
484     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
485 {
486     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(HRilCallInfo)) != 0) {
487         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
488         return HRIL_ERR_INVALID_PARAMETER;
489     }
490     HDI::Ril::V1_4::CallInfoExtList callList = {};
491     if (response != nullptr) {
492         BuildICallList(callList, response, responseLen);
493     }
494     return Response(responseInfo, &HDI::Ril::V1_4::IRilCallback::GetCallListResponseExt, callList);
495 }
496 
DialResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)497 int32_t HRilCall::DialResponse(
498     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
499 {
500     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::DialResponse);
501 }
502 
HangupResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)503 int32_t HRilCall::HangupResponse(
504     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
505 {
506     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::HangupResponse);
507 }
508 
RejectResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)509 int32_t HRilCall::RejectResponse(
510     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
511 {
512     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::RejectResponse);
513 }
514 
AnswerResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)515 int32_t HRilCall::AnswerResponse(
516     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
517 {
518     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::AnswerResponse);
519 }
520 
HoldCallResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)521 int32_t HRilCall::HoldCallResponse(
522     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
523 {
524     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::HoldCallResponse);
525 }
526 
GetClipResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)527 int32_t HRilCall::GetClipResponse(
528     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
529 {
530     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(HRilGetClipResult)) != 0) {
531         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
532         return HRIL_ERR_INVALID_PARAMETER;
533     }
534     HDI::Ril::V1_1::GetClipResult getClipResult = {};
535     getClipResult.result = static_cast<int32_t>(responseInfo.error);
536     if (response != nullptr) {
537         const HRilGetClipResult *pGetClip = static_cast<const HRilGetClipResult *>(response);
538         getClipResult.action = pGetClip->action;
539         getClipResult.clipStat = pGetClip->clipStat;
540     }
541     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetClipResponse, getClipResult);
542 }
543 
SetClipResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)544 int32_t HRilCall::SetClipResponse(
545     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
546 {
547     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetClipResponse);
548 }
549 
UnHoldCallResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)550 int32_t HRilCall::UnHoldCallResponse(
551     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
552 {
553     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::UnHoldCallResponse);
554 }
555 
SwitchCallResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)556 int32_t HRilCall::SwitchCallResponse(
557     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
558 {
559     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SwitchCallResponse);
560 }
561 
CombineConferenceResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)562 int32_t HRilCall::CombineConferenceResponse(
563     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
564 {
565     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::CombineConferenceResponse);
566 }
567 
SeparateConferenceResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)568 int32_t HRilCall::SeparateConferenceResponse(
569     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
570 {
571     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SeparateConferenceResponse);
572 }
573 
CallSupplementResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)574 int32_t HRilCall::CallSupplementResponse(
575     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
576 {
577     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::CallSupplementResponse);
578 }
579 
GetCallWaitingResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)580 int32_t HRilCall::GetCallWaitingResponse(
581     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
582 {
583     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(HRilCallWaitResult)) != 0) {
584         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
585         return HRIL_ERR_INVALID_PARAMETER;
586     }
587     HDI::Ril::V1_1::CallWaitResult callWaitResult = {};
588     callWaitResult.result = static_cast<int32_t>(responseInfo.error);
589     if (response != nullptr) {
590         const HRilCallWaitResult *result = static_cast<const HRilCallWaitResult *>(response);
591         callWaitResult.status = result->status;
592         callWaitResult.classCw = result->classCw;
593     }
594     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetCallWaitingResponse, callWaitResult);
595 }
596 
SetCallWaitingResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)597 int32_t HRilCall::SetCallWaitingResponse(
598     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
599 {
600     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetCallWaitingResponse);
601 }
602 
GetCallTransferInfoResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)603 int32_t HRilCall::GetCallTransferInfoResponse(
604     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
605 {
606     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(HRilCFQueryInfo)) != 0) {
607         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
608         return HRIL_ERR_INVALID_PARAMETER;
609     }
610     HDI::Ril::V1_1::CallForwardQueryInfoList cFQueryList = {};
611     if (response != nullptr) {
612         BuildICallForwardQueryInfoList(cFQueryList, responseInfo, response, responseLen);
613     }
614     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetCallTransferInfoResponse, cFQueryList);
615 }
616 
BuildICallForwardQueryInfoList(HDI::Ril::V1_1::CallForwardQueryInfoList & cFQueryList,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)617 void HRilCall::BuildICallForwardQueryInfoList(HDI::Ril::V1_1::CallForwardQueryInfoList &cFQueryList,
618     HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
619 {
620     size_t num = responseLen / sizeof(HRilCFQueryInfo);
621     HDI::Ril::V1_1::CallForwardQueryResult cFQueryResult;
622     cFQueryList.callSize = num;
623     for (size_t i = 0; i < num; i++) {
624         HRilCFQueryInfo *curPtr = ((HRilCFQueryInfo *)response + i);
625         if (curPtr != nullptr) {
626             cFQueryResult.result = static_cast<int32_t>(responseInfo.error);
627             cFQueryResult.serial = responseInfo.serial;
628             cFQueryResult.status = curPtr->status;
629             cFQueryResult.classx = curPtr->classx;
630             cFQueryResult.type = curPtr->type;
631             cFQueryResult.number = ((curPtr->number == nullptr) ? "" : curPtr->number);
632             cFQueryResult.reason = curPtr->reason;
633             cFQueryResult.time = curPtr->time;
634             cFQueryList.calls.push_back(cFQueryResult);
635         } else {
636             TELEPHONY_LOGE("BuildICallForwardQueryInfoList: Invalid curPtr");
637             break;
638         }
639     }
640 }
641 
SetCallTransferInfoResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)642 int32_t HRilCall::SetCallTransferInfoResponse(
643     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
644 {
645     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetCallTransferInfoResponse);
646 }
647 
GetClirResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)648 int32_t HRilCall::GetClirResponse(
649     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
650 {
651     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(HRilGetCallClirResult)) != 0) {
652         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
653         return HRIL_ERR_INVALID_PARAMETER;
654     }
655     HDI::Ril::V1_1::GetClirResult getClirResult = {};
656     getClirResult.result = static_cast<int32_t>(responseInfo.error);
657     if (response != nullptr) {
658         const HRilGetCallClirResult *pGetClir = static_cast<const HRilGetCallClirResult *>(response);
659         getClirResult.action = pGetClir->action;
660         getClirResult.clirStat = pGetClir->clirStat;
661     }
662     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetClirResponse, getClirResult);
663 }
664 
SetClirResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)665 int32_t HRilCall::SetClirResponse(
666     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
667 {
668     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetClirResponse);
669 }
670 
GetCallRestrictionResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)671 int32_t HRilCall::GetCallRestrictionResponse(
672     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
673 {
674     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(HRilCallRestrictionResult)) != 0) {
675         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
676         return HRIL_ERR_INVALID_PARAMETER;
677     }
678     HDI::Ril::V1_1::CallRestrictionResult resultT = {};
679     resultT.result = static_cast<int32_t>(responseInfo.error);
680     if (response != nullptr) {
681         const HRilCallRestrictionResult *result = static_cast<const HRilCallRestrictionResult *>(response);
682         resultT.status = result->status;
683         resultT.classCw = result->classCw;
684     }
685     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetCallRestrictionResponse, resultT);
686 }
687 
SetCallRestrictionResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)688 int32_t HRilCall::SetCallRestrictionResponse(
689     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
690 {
691     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetCallRestrictionResponse);
692 }
693 
SetBarringPasswordResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)694 int32_t HRilCall::SetBarringPasswordResponse(
695     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
696 {
697     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetBarringPasswordResponse);
698 }
699 
StartDtmfResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)700 int32_t HRilCall::StartDtmfResponse(
701     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
702 {
703     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::StartDtmfResponse);
704 }
705 
SendDtmfResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)706 int32_t HRilCall::SendDtmfResponse(
707     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
708 {
709     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SendDtmfResponse);
710 }
711 
StopDtmfResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)712 int32_t HRilCall::StopDtmfResponse(
713     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
714 {
715     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::StopDtmfResponse);
716 }
717 
GetCallPreferenceModeResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)718 int32_t HRilCall::GetCallPreferenceModeResponse(
719     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
720 {
721     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
722         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
723         return HRIL_ERR_INVALID_PARAMETER;
724     }
725     int32_t mode = 0;
726     if (response != nullptr) {
727         mode = *((int32_t *)response);
728     }
729     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetCallPreferenceModeResponse, mode);
730 }
731 
SetCallPreferenceModeResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)732 int32_t HRilCall::SetCallPreferenceModeResponse(
733     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
734 {
735     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetCallPreferenceModeResponse);
736 }
737 
SetUssdResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)738 int32_t HRilCall::SetUssdResponse(
739     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
740 {
741     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetUssdResponse);
742 }
743 
GetMuteResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)744 int32_t HRilCall::GetMuteResponse(
745     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
746 {
747     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
748         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
749         return HRIL_ERR_INVALID_PARAMETER;
750     }
751     int32_t mute = 0;
752     if (response != nullptr) {
753         mute = *((int32_t *)response);
754     }
755     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetMuteResponse, mute);
756 }
757 
SetMuteResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)758 int32_t HRilCall::SetMuteResponse(
759     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
760 {
761     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetMuteResponse);
762 }
763 
GetUssdResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)764 int32_t HRilCall::GetUssdResponse(
765     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
766 {
767     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
768         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
769         return HRIL_ERR_INVALID_PARAMETER;
770     }
771     int32_t cusd = 0;
772     if (response != nullptr) {
773         cusd = *((int32_t *)response);
774     }
775     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetUssdResponse, cusd);
776 }
777 
GetCallFailReasonResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)778 int32_t HRilCall::GetCallFailReasonResponse(
779     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
780 {
781     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(int32_t)) != 0) {
782         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
783         return HRIL_ERR_INVALID_PARAMETER;
784     }
785     int32_t callFail = HRIL_ERR_CALL_CAUSE;
786     if (response != nullptr) {
787         callFail = *((int32_t *)response);
788     }
789     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetCallFailReasonResponse, callFail);
790 }
791 
BuildIEmergencyCallList(HDI::Ril::V1_1::EmergencyInfoList & emergencyCallInfoList,const void * response,size_t responseLen)792 void HRilCall::BuildIEmergencyCallList(
793     HDI::Ril::V1_1::EmergencyInfoList &emergencyCallInfoList, const void *response, size_t responseLen)
794 {
795     size_t num = responseLen / sizeof(HRilEmergencyInfo);
796     HDI::Ril::V1_1::EmergencyCall callInfo;
797     emergencyCallInfoList.callSize = num;
798     for (size_t i = 0; i < num; i++) {
799         HRilEmergencyInfo *curPtr = ((HRilEmergencyInfo *)response + i);
800         if (curPtr != nullptr) {
801             callInfo.index = curPtr->index;
802             callInfo.total = curPtr->total;
803             callInfo.eccNum = (curPtr->eccNum == nullptr) ? "" : curPtr->eccNum;
804             callInfo.eccType = static_cast<OHOS::HDI::Ril::V1_1::EccType>(curPtr->category);
805             callInfo.simpresent = static_cast<OHOS::HDI::Ril::V1_1::SimpresentType>(curPtr->simpresent);
806             callInfo.mcc = (curPtr->mcc == nullptr) ? "" : curPtr->mcc;
807             callInfo.abnormalService = static_cast<OHOS::HDI::Ril::V1_1::AbnormalServiceType>(curPtr->abnormalService);
808             emergencyCallInfoList.calls.push_back(callInfo);
809         } else {
810             TELEPHONY_LOGE("BuildIEmergencyCallList: Invalid curPtr");
811             break;
812         }
813     }
814 }
815 
GetEmergencyCallListResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)816 int32_t HRilCall::GetEmergencyCallListResponse(
817     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
818 {
819     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(HRilEmergencyInfo)) != 0) {
820         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
821         return HRIL_ERR_INVALID_PARAMETER;
822     }
823     HDI::Ril::V1_1::EmergencyInfoList callList = {};
824     if (response != nullptr) {
825         BuildIEmergencyCallList(callList, response, responseLen);
826     }
827     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetEmergencyCallListResponse, callList);
828 }
829 
SetEmergencyCallList(int32_t serialId,const OHOS::HDI::Ril::V1_1::EmergencyInfoList & emergencyInfoList)830 int32_t HRilCall::SetEmergencyCallList(
831     int32_t serialId, const OHOS::HDI::Ril::V1_1::EmergencyInfoList &emergencyInfoList)
832 {
833     auto size = emergencyInfoList.calls.size();
834     std::unique_ptr<HRilEmergencyInfo[]> emergencyInfoCalls = std::make_unique<HRilEmergencyInfo[]>(size);
835     CopyToHRilEmergencyInfoArray(emergencyInfoCalls.get(), emergencyInfoList.calls);
836     return RequestVendor(serialId, HREQ_CALL_SET_EMERGENCY_LIST, callFuncs_, &HRilCallReq::SetEmergencyCallList,
837         emergencyInfoCalls.get(), size);
838 }
839 
CopyToHRilEmergencyInfoArray(HRilEmergencyInfo * emergencyInfoCalls,std::vector<HDI::Ril::V1_1::EmergencyCall> calls)840 void HRilCall::CopyToHRilEmergencyInfoArray(
841     HRilEmergencyInfo *emergencyInfoCalls, std::vector<HDI::Ril::V1_1::EmergencyCall> calls)
842 {
843     for (unsigned int i = 0; i < calls.size(); i++) {
844         auto call = calls.at(i);
845         emergencyInfoCalls[i].index = call.index;
846         emergencyInfoCalls[i].total = call.total;
847         char *eccNum = new char[call.eccNum.size() + 1];
848         if (strcpy_s(eccNum, call.eccNum.size() + 1, call.eccNum.c_str()) == EOK) {
849             emergencyInfoCalls[i].eccNum = eccNum;
850         } else {
851             delete[] eccNum;
852             eccNum = nullptr;
853         }
854         emergencyInfoCalls[i].category = static_cast<int32_t>(call.eccType);
855         emergencyInfoCalls[i].simpresent = call.simpresent;
856         char *mcc = new char[call.mcc.size() + 1];
857         if (strcpy_s(mcc, call.mcc.size() + 1, call.mcc.c_str()) == EOK) {
858             emergencyInfoCalls[i].mcc = mcc;
859         } else {
860             delete[] mcc;
861             mcc = nullptr;
862         }
863         emergencyInfoCalls[i].abnormalService = call.abnormalService;
864     }
865 }
866 
SetEmergencyCallListResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)867 int32_t HRilCall::SetEmergencyCallListResponse(
868     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
869 {
870     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetEmergencyCallListResponse);
871 }
872 
CloseUnFinishedUssdResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)873 int32_t HRilCall::CloseUnFinishedUssdResponse(
874     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
875 {
876     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::CloseUnFinishedUssdResponse);
877 }
878 
SetVonrSwitchResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)879 int32_t HRilCall::SetVonrSwitchResponse(
880     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
881 {
882     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetVonrSwitchResponse);
883 }
884 
CallStateUpdated(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)885 int32_t HRilCall::CallStateUpdated(
886     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
887 {
888     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::CallStateUpdated);
889 }
890 
CallUssdNotice(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)891 int32_t HRilCall::CallUssdNotice(
892     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
893 {
894     if ((response == nullptr) || (responseLen % sizeof(HRilUssdNoticeInfo)) != 0) {
895         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
896         return HRIL_ERR_INVALID_PARAMETER;
897     }
898     HDI::Ril::V1_1::UssdNoticeInfo ussdNoticeInfo = {};
899     const HRilUssdNoticeInfo *hUssdNoticeInfo = reinterpret_cast<const HRilUssdNoticeInfo *>(response);
900     ussdNoticeInfo.type = hUssdNoticeInfo->m;
901     ussdNoticeInfo.message = hUssdNoticeInfo->str == nullptr ? "" : hUssdNoticeInfo->str;
902     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::CallUssdNotice, ussdNoticeInfo);
903 }
904 
CallSsNotice(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)905 int32_t HRilCall::CallSsNotice(int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
906 {
907     if ((response == nullptr) || (responseLen % sizeof(HRilSsNoticeInfo)) != 0) {
908         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
909         return HRIL_ERR_INVALID_PARAMETER;
910     }
911     HDI::Ril::V1_1::SsNoticeInfo ssNoticeInfo = {};
912     const HRilSsNoticeInfo *hSsNoticeInfo = reinterpret_cast<const HRilSsNoticeInfo *>(response);
913     ssNoticeInfo.serviceType = hSsNoticeInfo->serviceType;
914     ssNoticeInfo.requestType = hSsNoticeInfo->requestType;
915     ssNoticeInfo.serviceClass = hSsNoticeInfo->serviceClass;
916     ssNoticeInfo.result = hSsNoticeInfo->result;
917     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::CallSsNotice, ssNoticeInfo);
918 }
919 
CallSrvccStatusNotice(int32_t notifyType,HRilErrNumber error,const void * response,size_t responseLen)920 int32_t HRilCall::CallSrvccStatusNotice(
921     int32_t notifyType, HRilErrNumber error, const void *response, size_t responseLen)
922 {
923     if ((response == nullptr) || (responseLen % sizeof(HRilCallSrvccStatus)) != 0) {
924         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
925         return HRIL_ERR_INVALID_PARAMETER;
926     }
927     HDI::Ril::V1_1::SrvccStatus srvccStatus = {};
928     const HRilCallSrvccStatus *hSrvccStatus = reinterpret_cast<const HRilCallSrvccStatus *>(response);
929     srvccStatus.status = hSrvccStatus->status;
930     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::CallSrvccStatusNotice, srvccStatus);
931 }
932 
CallRingbackVoiceNotice(int32_t notifyType,HRilErrNumber error,const void * response,size_t responseLen)933 int32_t HRilCall::CallRingbackVoiceNotice(
934     int32_t notifyType, HRilErrNumber error, const void *response, size_t responseLen)
935 {
936     if ((response == nullptr) || (responseLen % sizeof(int32_t)) != 0) {
937         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
938         return HRIL_ERR_INVALID_PARAMETER;
939     }
940     HDI::Ril::V1_1::RingbackVoice ringbackVoice = {};
941     const int32_t *ringbackVoiceFlag = reinterpret_cast<const int32_t *>(response);
942     ringbackVoice.status = *ringbackVoiceFlag;
943     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::CallRingbackVoiceNotice, ringbackVoice);
944 }
945 
CallEmergencyNotice(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)946 int32_t HRilCall::CallEmergencyNotice(
947     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
948 {
949     if (response == nullptr || responseLen == 0 || (responseLen % sizeof(HRilEmergencyInfo)) != 0) {
950         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
951         return HRIL_ERR_INVALID_PARAMETER;
952     }
953     HDI::Ril::V1_1::EmergencyInfoList callList = {};
954     BuildIEmergencyCallList(callList, response, responseLen);
955     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::CallEmergencyNotice, callList);
956 }
957 
CallRsrvccStatusNotify(int32_t notifyType,HRilErrNumber error,const void * response,size_t responseLen)958 int32_t HRilCall::CallRsrvccStatusNotify(
959     int32_t notifyType, HRilErrNumber error, const void *response, size_t responseLen)
960 {
961     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::CallRsrvccStatusNotify);
962 }
963 
RegisterCallFuncs(const HRilCallReq * callFuncs)964 void HRilCall::RegisterCallFuncs(const HRilCallReq *callFuncs)
965 {
966     callFuncs_ = callFuncs;
967 }
968 } // namespace Telephony
969 } // namespace OHOS
970