• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 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_sim.h"
17 
18 #include "hril_notification.h"
19 #include "hril_request.h"
20 namespace OHOS {
21 namespace Telephony {
HRilSim(int32_t slotId)22 HRilSim::HRilSim(int32_t slotId) : HRilBase(slotId)
23 {
24     AddNotificationHandlerToMap();
25     AddBasicHandlerToMap();
26     AddSimLockHandlerToMap();
27     AddStkHandlerToMap();
28 }
29 
IsSimRespOrNotify(uint32_t code)30 bool HRilSim::IsSimRespOrNotify(uint32_t code)
31 {
32     return IsSimResponse(code) || IsSimNotification(code);
33 }
34 
RegisterSimFuncs(const HRilSimReq * simFuncs)35 void HRilSim::RegisterSimFuncs(const HRilSimReq *simFuncs)
36 {
37     simFuncs_ = simFuncs;
38 }
39 
AddBasicHandlerToMap()40 void HRilSim::AddBasicHandlerToMap()
41 {
42     // response
43     respMemberFuncMap_[HREQ_SIM_GET_SIM_IO] =
44         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
45         size_t responseLen) { return GetSimIOResponse(requestNum, responseInfo, response, responseLen); };
46     respMemberFuncMap_[HREQ_SIM_GET_SIM_STATUS] =
47         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
48         size_t responseLen) { return GetSimCardStatusResponse(requestNum, responseInfo, response, responseLen); };
49     respMemberFuncMap_[HREQ_SIM_GET_IMSI] =
50         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
51         size_t responseLen) { return GetImsiResponse(requestNum, responseInfo, response, responseLen); };
52     respMemberFuncMap_[HREQ_SIM_SET_ACTIVE_SIM] =
53         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
54         size_t responseLen) { return SetActiveSimResponse(requestNum, responseInfo, response, responseLen); };
55     respMemberFuncMap_[HREQ_SIM_GET_RADIO_PROTOCOL] =
56         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
57         size_t responseLen) { return GetRadioProtocolResponse(requestNum, responseInfo, response, responseLen); };
58     respMemberFuncMap_[HREQ_SIM_SET_RADIO_PROTOCOL] =
59         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
60         size_t responseLen) { return SetRadioProtocolResponse(requestNum, responseInfo, response, responseLen); };
61     respMemberFuncMap_[HREQ_SIM_OPEN_LOGICAL_CHANNEL] =
62         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
63         size_t responseLen) { return SimOpenLogicalChannelResponse(requestNum, responseInfo, response, responseLen); };
64     respMemberFuncMap_[HREQ_SIM_CLOSE_LOGICAL_CHANNEL] =
65         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
66         size_t responseLen) { return SimCloseLogicalChannelResponse(requestNum, responseInfo, response, responseLen); };
67     respMemberFuncMap_[HREQ_SIM_TRANSMIT_APDU_LOGICAL_CHANNEL] = [this](int32_t requestNum,
68         HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen) {
69         return SimTransmitApduLogicalChannelResponse(requestNum, responseInfo, response, responseLen);
70     };
71     respMemberFuncMap_[HREQ_SIM_TRANSMIT_APDU_BASIC_CHANNEL] = [this](int32_t requestNum,
72         HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen) {
73         return SimTransmitApduBasicChannelResponse(requestNum, responseInfo, response, responseLen);
74     };
75     respMemberFuncMap_[HREQ_SIM_SEND_NCFG_OPER_INFO] = [this](int32_t requestNum,
76         HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen) {
77         return SendSimMatchedOperatorInfoResponse(requestNum, responseInfo, response, responseLen);
78     };
79 }
80 
AddSimLockHandlerToMap()81 void HRilSim::AddSimLockHandlerToMap()
82 {
83     respMemberFuncMap_[HREQ_SIM_GET_SIM_LOCK_STATUS] =
84         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
85         size_t responseLen) { return GetSimLockStatusResponse(requestNum, responseInfo, response, responseLen); };
86     respMemberFuncMap_[HREQ_SIM_SET_SIM_LOCK] =
87         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
88         size_t responseLen) { return SetSimLockResponse(requestNum, responseInfo, response, responseLen); };
89     respMemberFuncMap_[HREQ_SIM_CHANGE_SIM_PASSWORD] =
90         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
91         size_t responseLen) { return ChangeSimPasswordResponse(requestNum, responseInfo, response, responseLen); };
92     respMemberFuncMap_[HREQ_SIM_UNLOCK_PIN] =
93         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
94         size_t responseLen) { return UnlockPinResponse(requestNum, responseInfo, response, responseLen); };
95     respMemberFuncMap_[HREQ_SIM_UNLOCK_PUK] =
96         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
97         size_t responseLen) { return UnlockPukResponse(requestNum, responseInfo, response, responseLen); };
98     respMemberFuncMap_[HREQ_SIM_UNLOCK_PIN2] =
99         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
100         size_t responseLen) { return UnlockPin2Response(requestNum, responseInfo, response, responseLen); };
101     respMemberFuncMap_[HREQ_SIM_UNLOCK_PUK2] =
102         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
103         size_t responseLen) { return UnlockPuk2Response(requestNum, responseInfo, response, responseLen); };
104     respMemberFuncMap_[HREQ_SIM_AUTHENTICATION] =
105         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
106         size_t responseLen) { return SimAuthenticationResponse(requestNum, responseInfo, response, responseLen); };
107     respMemberFuncMap_[HREQ_SIM_UNLOCK_SIM_LOCK] =
108         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
109         size_t responseLen) { return UnlockSimLockResponse(requestNum, responseInfo, response, responseLen); };
110 }
111 
AddStkHandlerToMap()112 void HRilSim::AddStkHandlerToMap()
113 {
114     respMemberFuncMap_[HREQ_SIM_STK_SEND_TERMINAL_RESPONSE] = [this](int32_t requestNum,
115         HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen) {
116         return SimStkSendTerminalResponseResponse(requestNum, responseInfo, response, responseLen);
117     };
118     respMemberFuncMap_[HREQ_SIM_STK_SEND_ENVELOPE] =
119         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
120         size_t responseLen) { return SimStkSendEnvelopeResponse(requestNum, responseInfo, response, responseLen); };
121     respMemberFuncMap_[HREQ_SIM_STK_SEND_CALL_SETUP_REQUEST_RESULT] = [this](int32_t requestNum,
122         HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen) {
123         return SimStkSendCallSetupRequestResultResponse(requestNum, responseInfo, response, responseLen);
124     };
125     respMemberFuncMap_[HREQ_SIM_STK_IS_READY] =
126         [this](int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response,
127         size_t responseLen) { return SimStkIsReadyResponse(requestNum, responseInfo, response, responseLen); };
128 }
129 
AddNotificationHandlerToMap()130 void HRilSim::AddNotificationHandlerToMap()
131 {
132     // Notification
133     notiMemberFuncMap_[HNOTI_SIM_STATUS_CHANGED] =
134         [this](int32_t notifyType, HRilErrNumber error, const void *response,
135         size_t responseLen) { return SimStateUpdated(notifyType, error, response, responseLen); };
136     notiMemberFuncMap_[HNOTI_SIM_STK_SESSION_END_NOTIFY] =
137         [this](int32_t notifyType, HRilErrNumber error, const void *response,
138         size_t responseLen) { return SimStkSessionEndNotify(notifyType, error, response, responseLen); };
139     notiMemberFuncMap_[HNOTI_SIM_STK_PROACTIVE_NOTIFY] =
140         [this](int32_t notifyType, HRilErrNumber error, const void *response,
141         size_t responseLen) { return SimStkProactiveNotify(notifyType, error, response, responseLen); };
142     notiMemberFuncMap_[HNOTI_SIM_STK_ALPHA_NOTIFY] =
143         [this](int32_t notifyType, HRilErrNumber error, const void *response,
144         size_t responseLen) { return SimStkAlphaNotify(notifyType, error, response, responseLen); };
145     notiMemberFuncMap_[HNOTI_SIM_STK_EVENT_NOTIFY] =
146         [this](int32_t notifyType, HRilErrNumber error, const void *response,
147         size_t responseLen) { return SimStkEventNotify(notifyType, error, response, responseLen); };
148     notiMemberFuncMap_[HNOTI_SIM_STK_CALL_SETUP_NOTIFY] =
149         [this](int32_t notifyType, HRilErrNumber error, const void *response,
150         size_t responseLen) { return SimStkCallSetupNotify(notifyType, error, response, responseLen); };
151     notiMemberFuncMap_[HNOTI_SIM_REFRESH_NOTIFY] =
152         [this](int32_t notifyType, HRilErrNumber error, const void *response,
153         size_t responseLen) { return SimRefreshNotify(notifyType, error, response, responseLen); };
154     notiMemberFuncMap_[HNOTI_SIM_RADIO_PROTOCOL_UPDATED] =
155         [this](int32_t notifyType, HRilErrNumber error, const void *response,
156         size_t responseLen) { return SimRadioProtocolUpdated(notifyType, error, response, responseLen); };
157 }
158 
GetSimIO(int32_t serialId,const OHOS::HDI::Ril::V1_1::SimIoRequestInfo & simIO)159 int32_t HRilSim::GetSimIO(int32_t serialId, const OHOS::HDI::Ril::V1_1::SimIoRequestInfo &simIO)
160 {
161     std::unique_ptr<HRilSimIO> rilSimIO = std::make_unique<HRilSimIO>();
162     CopyToHRilSimIO(rilSimIO, simIO);
163     int32_t ret = RequestVendor(
164         serialId, HREQ_SIM_GET_SIM_IO, simFuncs_, &HRilSimReq::GetSimIO, rilSimIO.get(), sizeof(*rilSimIO));
165     SafeFrees(rilSimIO->data);
166     SafeFrees(rilSimIO->pathid);
167     SafeFrees(rilSimIO->pin2);
168     return ret;
169 }
170 
GetSimStatus(int32_t serialId)171 int32_t HRilSim::GetSimStatus(int32_t serialId)
172 {
173     return RequestVendor(serialId, HREQ_SIM_GET_SIM_STATUS, simFuncs_, &HRilSimReq::GetSimStatus);
174 }
175 
GetImsi(int32_t serialId)176 int32_t HRilSim::GetImsi(int32_t serialId)
177 {
178     return RequestVendor(serialId, HREQ_SIM_GET_IMSI, simFuncs_, &HRilSimReq::GetSimImsi);
179 }
180 
GetSimLockStatus(int32_t serialId,const OHOS::HDI::Ril::V1_1::SimLockInfo & simLockInfo)181 int32_t HRilSim::GetSimLockStatus(int32_t serialId, const OHOS::HDI::Ril::V1_1::SimLockInfo &simLockInfo)
182 {
183     std::unique_ptr<HRilSimClock> rilSimLock = std::make_unique<HRilSimClock>();
184     CopyToHRilSimLock(rilSimLock, simLockInfo);
185     int32_t ret = RequestVendor(serialId, HREQ_SIM_GET_SIM_LOCK_STATUS, simFuncs_, &HRilSimReq::GetSimLockStatus,
186         rilSimLock.get(), sizeof(*rilSimLock));
187     SafeFrees(rilSimLock->fac);
188     SafeFrees(rilSimLock->passwd);
189     return ret;
190 }
191 
SetSimLock(int32_t serialId,const OHOS::HDI::Ril::V1_1::SimLockInfo & simLockInfo)192 int32_t HRilSim::SetSimLock(int32_t serialId, const OHOS::HDI::Ril::V1_1::SimLockInfo &simLockInfo)
193 {
194     std::unique_ptr<HRilSimClock> rilSimLock = std::make_unique<HRilSimClock>();
195     CopyToHRilSimLock(rilSimLock, simLockInfo);
196     int32_t ret = RequestVendor(
197         serialId, HREQ_SIM_SET_SIM_LOCK, simFuncs_, &HRilSimReq::SetSimLock, rilSimLock.get(), sizeof(*rilSimLock));
198     SafeFrees(rilSimLock->fac);
199     SafeFrees(rilSimLock->passwd);
200     return ret;
201 }
202 
ChangeSimPassword(int32_t serialId,const OHOS::HDI::Ril::V1_1::SimPasswordInfo & simPassword)203 int32_t HRilSim::ChangeSimPassword(int32_t serialId, const OHOS::HDI::Ril::V1_1::SimPasswordInfo &simPassword)
204 {
205     std::unique_ptr<HRilSimPassword> rilSimPassword = std::make_unique<HRilSimPassword>();
206     CopyToHRilSimPassword(rilSimPassword, simPassword);
207     int32_t ret = RequestVendor(serialId, HREQ_SIM_CHANGE_SIM_PASSWORD, simFuncs_, &HRilSimReq::ChangeSimPassword,
208         rilSimPassword.get(), sizeof(*rilSimPassword));
209     SafeFrees(rilSimPassword->fac);
210     SafeFrees(rilSimPassword->oldPassword);
211     SafeFrees(rilSimPassword->newPassword);
212     return ret;
213 }
214 
UnlockPin(int32_t serialId,const std::string & pin)215 int32_t HRilSim::UnlockPin(int32_t serialId, const std::string &pin)
216 {
217     char *pinPoint = nullptr;
218     CopyToCharPoint(&pinPoint, pin);
219     int32_t ret = RequestVendor(serialId, HREQ_SIM_UNLOCK_PIN, simFuncs_, &HRilSimReq::UnlockPin, pinPoint);
220     SafeFrees(pinPoint);
221     return ret;
222 }
223 
UnlockPuk(int32_t serialId,const std::string & puk,const std::string & pin)224 int32_t HRilSim::UnlockPuk(int32_t serialId, const std::string &puk, const std::string &pin)
225 {
226     char *pukPoint = nullptr;
227     CopyToCharPoint(&pukPoint, puk);
228     char *pinPoint = nullptr;
229     CopyToCharPoint(&pinPoint, pin);
230     int32_t ret = RequestVendor(serialId, HREQ_SIM_UNLOCK_PUK, simFuncs_, &HRilSimReq::UnlockPuk, pukPoint, pinPoint);
231     SafeFrees(pukPoint);
232     SafeFrees(pinPoint);
233     return ret;
234 }
235 
UnlockPin2(int32_t serialId,const std::string & pin2)236 int32_t HRilSim::UnlockPin2(int32_t serialId, const std::string &pin2)
237 {
238     char *pin2Point = nullptr;
239     CopyToCharPoint(&pin2Point, pin2);
240     int32_t ret = RequestVendor(serialId, HREQ_SIM_UNLOCK_PIN2, simFuncs_, &HRilSimReq::UnlockPin2, pin2Point);
241     SafeFrees(pin2Point);
242     return ret;
243 }
244 
UnlockPuk2(int32_t serialId,const std::string & puk2,const std::string & pin2)245 int32_t HRilSim::UnlockPuk2(int32_t serialId, const std::string &puk2, const std::string &pin2)
246 {
247     char *puk2Point = nullptr;
248     CopyToCharPoint(&puk2Point, puk2);
249     char *pin2Point = nullptr;
250     CopyToCharPoint(&pin2Point, pin2);
251     int32_t ret =
252         RequestVendor(serialId, HREQ_SIM_UNLOCK_PUK2, simFuncs_, &HRilSimReq::UnlockPuk2, puk2Point, pin2Point);
253     SafeFrees(puk2Point);
254     SafeFrees(pin2Point);
255     return ret;
256 }
257 
SetActiveSim(int32_t serialId,int32_t index,int32_t enable)258 int32_t HRilSim::SetActiveSim(int32_t serialId, int32_t index, int32_t enable)
259 {
260     return RequestVendor(serialId, HREQ_SIM_SET_ACTIVE_SIM, simFuncs_, &HRilSimReq::SetActiveSim, index, enable);
261 }
262 
SimStkSendTerminalResponse(int32_t serialId,const std::string & strCmd)263 int32_t HRilSim::SimStkSendTerminalResponse(int32_t serialId, const std::string &strCmd)
264 {
265     char *strCmdPoint = nullptr;
266     CopyToCharPoint(&strCmdPoint, strCmd);
267     int32_t ret = RequestVendor(
268         serialId, HREQ_SIM_STK_SEND_TERMINAL_RESPONSE, simFuncs_, &HRilSimReq::SimStkSendTerminalResponse, strCmdPoint);
269     SafeFrees(strCmdPoint);
270     return ret;
271 }
272 
SimStkSendEnvelope(int32_t serialId,const std::string & strCmd)273 int32_t HRilSim::SimStkSendEnvelope(int32_t serialId, const std::string &strCmd)
274 {
275     char *strCmdPoint = nullptr;
276     CopyToCharPoint(&strCmdPoint, strCmd);
277     int32_t ret =
278         RequestVendor(serialId, HREQ_SIM_STK_SEND_ENVELOPE, simFuncs_, &HRilSimReq::SimStkSendEnvelope, strCmdPoint);
279     SafeFrees(strCmdPoint);
280     return ret;
281 }
282 
SimStkSendCallSetupRequestResult(int32_t serialId,int32_t accept)283 int32_t HRilSim::SimStkSendCallSetupRequestResult(int32_t serialId, int32_t accept)
284 {
285     return RequestVendor(serialId, HREQ_SIM_STK_SEND_CALL_SETUP_REQUEST_RESULT, simFuncs_,
286         &HRilSimReq::SimStkSendCallSetupRequestResult, accept);
287 }
288 
SimStkIsReady(int32_t serialId)289 int32_t HRilSim::SimStkIsReady(int32_t serialId)
290 {
291     return RequestVendor(serialId, HREQ_SIM_STK_IS_READY, simFuncs_, &HRilSimReq::SimStkIsReady);
292 }
293 
GetRadioProtocol(int32_t serialId)294 int32_t HRilSim::GetRadioProtocol(int32_t serialId)
295 {
296     TELEPHONY_LOGI("HRilSim::GetRadioProtocol slotId:%{public}d", GetSlotId());
297     return RequestVendor(serialId, HREQ_SIM_GET_RADIO_PROTOCOL, simFuncs_, &HRilSimReq::GetRadioProtocol);
298 }
299 
SetRadioProtocol(int32_t serialId,const HDI::Ril::V1_1::RadioProtocol & radioProtocol)300 int32_t HRilSim::SetRadioProtocol(int32_t serialId, const HDI::Ril::V1_1::RadioProtocol &radioProtocol)
301 {
302     HRilRadioProtocol hrilRadioProtocol = {};
303     hrilRadioProtocol.sessionId = radioProtocol.sessionId;
304     hrilRadioProtocol.phase = static_cast<HRilRadioProtocolPhase>(radioProtocol.phase);
305     hrilRadioProtocol.technology = radioProtocol.technology;
306     hrilRadioProtocol.modemId = radioProtocol.modemId;
307     hrilRadioProtocol.status = static_cast<HRilRadioProtocolStatus>(radioProtocol.status);
308     TELEPHONY_LOGI("HRilSim::SetRadioProtocol slotId:%{public}d, serialId:%{public}d"
309         "sessionId:%{public}d, phase:%{public}d, technology:%{public}d, modemId:%{public}d, status:%{public}d",
310         GetSlotId(), serialId, hrilRadioProtocol.sessionId, hrilRadioProtocol.phase, hrilRadioProtocol.technology,
311         hrilRadioProtocol.modemId, hrilRadioProtocol.status);
312     return RequestVendor(serialId, HREQ_SIM_SET_RADIO_PROTOCOL, simFuncs_,
313         &HRilSimReq::SetRadioProtocol, &hrilRadioProtocol);
314 }
315 
SimOpenLogicalChannel(int32_t serialId,const std::string & appID,int32_t p2)316 int32_t HRilSim::SimOpenLogicalChannel(int32_t serialId, const std::string &appID, int32_t p2)
317 {
318     char *appIDPoint = nullptr;
319     CopyToCharPoint(&appIDPoint, appID);
320     int32_t ret = RequestVendor(
321         serialId, HREQ_SIM_OPEN_LOGICAL_CHANNEL, simFuncs_, &HRilSimReq::SimOpenLogicalChannel, appIDPoint, p2);
322     SafeFrees(appIDPoint);
323     return ret;
324 }
325 
SimCloseLogicalChannel(int32_t serialId,int32_t channelId)326 int32_t HRilSim::SimCloseLogicalChannel(int32_t serialId, int32_t channelId)
327 {
328     return RequestVendor(
329         serialId, HREQ_SIM_CLOSE_LOGICAL_CHANNEL, simFuncs_, &HRilSimReq::SimCloseLogicalChannel, channelId);
330 }
331 
SimTransmitApduLogicalChannel(int32_t serialId,const OHOS::HDI::Ril::V1_1::ApduSimIORequestInfo & apduSimIO)332 int32_t HRilSim::SimTransmitApduLogicalChannel(
333     int32_t serialId, const OHOS::HDI::Ril::V1_1::ApduSimIORequestInfo &apduSimIO)
334 {
335     std::unique_ptr<HRilApduSimIO> rilApduSimIO = std::make_unique<HRilApduSimIO>();
336     CopyToHRilApduSimIO(rilApduSimIO, apduSimIO);
337     int32_t ret = RequestVendor(serialId, HREQ_SIM_TRANSMIT_APDU_LOGICAL_CHANNEL, simFuncs_,
338         &HRilSimReq::SimTransmitApduLogicalChannel, rilApduSimIO.get(), sizeof(*rilApduSimIO));
339     SafeFrees(rilApduSimIO->data);
340     return ret;
341 }
342 
SimTransmitApduBasicChannel(int32_t serialId,const OHOS::HDI::Ril::V1_1::ApduSimIORequestInfo & apduSimIO)343 int32_t HRilSim::SimTransmitApduBasicChannel(
344     int32_t serialId, const OHOS::HDI::Ril::V1_1::ApduSimIORequestInfo &apduSimIO)
345 {
346     std::unique_ptr<HRilApduSimIO> rilApduSimIO = std::make_unique<HRilApduSimIO>();
347     CopyToHRilApduSimIO(rilApduSimIO, apduSimIO);
348     int32_t ret = RequestVendor(serialId, HREQ_SIM_TRANSMIT_APDU_BASIC_CHANNEL, simFuncs_,
349         &HRilSimReq::SimTransmitApduBasicChannel, rilApduSimIO.get(), sizeof(*rilApduSimIO));
350     SafeFrees(rilApduSimIO->data);
351     return ret;
352 }
353 
SimAuthentication(int32_t serialId,const OHOS::HDI::Ril::V1_1::SimAuthenticationRequestInfo & simAuthInfo)354 int32_t HRilSim::SimAuthentication(
355     int32_t serialId, const OHOS::HDI::Ril::V1_1::SimAuthenticationRequestInfo &simAuthInfo)
356 {
357     std::unique_ptr<HRilSimAuthenticationRequestInfo> rilSimAuthInfo =
358         std::make_unique<HRilSimAuthenticationRequestInfo>();
359     CopyToHRilSimAuthentication(rilSimAuthInfo, simAuthInfo);
360     int32_t ret = RequestVendor(serialId, HREQ_SIM_AUTHENTICATION, simFuncs_, &HRilSimReq::SimAuthentication,
361         rilSimAuthInfo.get(), sizeof(*rilSimAuthInfo));
362     SafeFrees(rilSimAuthInfo->aid);
363     SafeFrees(rilSimAuthInfo->data);
364     return ret;
365 }
366 
UnlockSimLock(int32_t serialId,int32_t lockType,const std::string & key)367 int32_t HRilSim::UnlockSimLock(int32_t serialId, int32_t lockType, const std::string &key)
368 {
369     char *keyPoint = nullptr;
370     CopyToCharPoint(&keyPoint, key);
371     int32_t ret =
372         RequestVendor(serialId, HREQ_SIM_UNLOCK_SIM_LOCK, simFuncs_, &HRilSimReq::UnlockSimLock, lockType, keyPoint);
373     SafeFrees(keyPoint);
374     return ret;
375 }
376 
SendSimMatchedOperatorInfo(int32_t serialId,const OHOS::HDI::Ril::V1_2::NcfgOperatorInfo & ncfgOperatorInfo)377 int32_t HRilSim::SendSimMatchedOperatorInfo(
378     int32_t serialId, const OHOS::HDI::Ril::V1_2::NcfgOperatorInfo &ncfgOperatorInfo)
379 {
380     std::unique_ptr<HRilNcfgOperatorInfo> rilNcfgOperatorInfo =
381         std::make_unique<HRilNcfgOperatorInfo>();
382     CopyToHRilNcfgOperatorInfo(rilNcfgOperatorInfo, ncfgOperatorInfo);
383     int32_t ret = RequestVendor(serialId, HREQ_SIM_SEND_NCFG_OPER_INFO, simFuncs_,
384         &HRilSimReq::SendSimMatchedOperatorInfo, rilNcfgOperatorInfo.get(), sizeof(*rilNcfgOperatorInfo));
385     SafeFrees(rilNcfgOperatorInfo->operName);
386     SafeFrees(rilNcfgOperatorInfo->operKey);
387     SafeFrees(rilNcfgOperatorInfo->reserve);
388     return ret;
389 }
390 
GetSimIOResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)391 int32_t HRilSim::GetSimIOResponse(
392     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
393 {
394     HDI::Ril::V1_1::IccIoResultInfo result = {};
395     int32_t ret = BuildSimIOResp(result, responseInfo, response, responseLen);
396     if (ret != HRIL_ERR_SUCCESS) {
397         return ret;
398     }
399     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetSimIOResponse, result);
400 }
401 
GetSimCardStatusResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)402 int32_t HRilSim::GetSimCardStatusResponse(
403     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
404 {
405     HDI::Ril::V1_3::SimCardStatusInfo rilCardStatus = {};
406     if ((response == nullptr && responseLen != 0) ||
407         (response != nullptr && responseLen != sizeof(HRilCardState))) {
408         TELEPHONY_LOGE("Invalid response: Vendor exception!");
409         return HRIL_ERR_INVALID_PARAMETER;
410     }
411     if (response == nullptr && responseLen == 0) {
412         TELEPHONY_LOGE("response is null");
413         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
414             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
415         }
416         return Response(responseInfo, &HDI::Ril::V1_3::IRilCallback::GetSimCardStatusResponse, rilCardStatus);
417     }
418     const HRilCardState *curPtr = static_cast<const HRilCardState *>(response);
419     if (curPtr != nullptr) {
420         rilCardStatus.index = curPtr->index;
421         rilCardStatus.simType = curPtr->simType;
422         rilCardStatus.simState = curPtr->simState;
423         rilCardStatus.iccid = (curPtr->iccid == nullptr) ? "" :  curPtr->iccid;
424     }
425     return Response(responseInfo, &HDI::Ril::V1_3::IRilCallback::GetSimCardStatusResponse, rilCardStatus);
426 }
427 
GetImsiResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)428 int32_t HRilSim::GetImsiResponse(
429     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
430 {
431     int32_t ret = CheckCharData(response, responseLen);
432     if (ret != HRIL_ERR_SUCCESS) {
433         return ret;
434     }
435     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetImsiResponse, (const char *)response);
436 }
437 
GetSimLockStatusResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)438 int32_t HRilSim::GetSimLockStatusResponse(
439     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
440 {
441     int32_t simLockStatus = 0;
442     if (response == nullptr || responseLen != sizeof(int32_t)) {
443         TELEPHONY_LOGE("GetSimStatusResponse: Invalid response");
444         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
445             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
446         }
447         return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetSimLockStatusResponse, simLockStatus);
448     }
449     simLockStatus = *(static_cast<const int32_t *>(response));
450     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetSimLockStatusResponse, simLockStatus);
451 }
452 
SetSimLockResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)453 int32_t HRilSim::SetSimLockResponse(
454     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
455 {
456     HDI::Ril::V1_1::LockStatusResp result = {};
457     ResponseLockStatus(result, responseInfo, response, responseLen);
458     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetSimLockResponse, result);
459 }
460 
ChangeSimPasswordResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)461 int32_t HRilSim::ChangeSimPasswordResponse(
462     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
463 {
464     HDI::Ril::V1_1::LockStatusResp result = {};
465     ResponseLockStatus(result, responseInfo, response, responseLen);
466     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::ChangeSimPasswordResponse, result);
467 }
468 
UnlockPinResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)469 int32_t HRilSim::UnlockPinResponse(
470     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
471 {
472     HDI::Ril::V1_1::LockStatusResp result = {};
473     ResponseLockStatus(result, responseInfo, response, responseLen);
474     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::UnlockPinResponse, result);
475 }
476 
UnlockPukResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)477 int32_t HRilSim::UnlockPukResponse(
478     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
479 {
480     HDI::Ril::V1_1::LockStatusResp result = {};
481     ResponseLockStatus(result, responseInfo, response, responseLen);
482     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::UnlockPukResponse, result);
483 }
484 
UnlockPin2Response(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)485 int32_t HRilSim::UnlockPin2Response(
486     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
487 {
488     HDI::Ril::V1_1::LockStatusResp result = {};
489     ResponseLockStatus(result, responseInfo, response, responseLen);
490     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::UnlockPin2Response, result);
491 }
492 
UnlockPuk2Response(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)493 int32_t HRilSim::UnlockPuk2Response(
494     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
495 {
496     HDI::Ril::V1_1::LockStatusResp result = {};
497     ResponseLockStatus(result, responseInfo, response, responseLen);
498     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::UnlockPuk2Response, result);
499 }
500 
SetActiveSimResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)501 int32_t HRilSim::SetActiveSimResponse(
502     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
503 {
504     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetActiveSimResponse);
505 }
506 
SimStkSendTerminalResponseResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)507 int32_t HRilSim::SimStkSendTerminalResponseResponse(
508     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
509 {
510     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SimStkSendTerminalResponseResponse);
511 }
512 
SimStkSendEnvelopeResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)513 int32_t HRilSim::SimStkSendEnvelopeResponse(
514     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
515 {
516     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SimStkSendEnvelopeResponse);
517 }
518 
SimStkSendCallSetupRequestResultResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)519 int32_t HRilSim::SimStkSendCallSetupRequestResultResponse(
520     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
521 {
522     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SimStkSendCallSetupRequestResultResponse);
523 }
524 
SimStkIsReadyResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)525 int32_t HRilSim::SimStkIsReadyResponse(
526     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
527 {
528     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SimStkIsReadyResponse);
529 }
530 
GetRadioProtocolResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)531 int32_t HRilSim::GetRadioProtocolResponse(
532     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
533 {
534     HDI::Ril::V1_1::RadioProtocol radioProtocol = {};
535     if (response == nullptr || responseLen != sizeof(HRilRadioProtocol)) {
536         TELEPHONY_LOGE("GetRadioProtocolResponse response is invalid");
537         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
538             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
539         }
540     } else {
541         BuildRadioProtocol(radioProtocol, response);
542         TELEPHONY_LOGI("HRilSim::GetRadioProtocolResponse slotId:%{public}d, serial:%{public}d"
543             "sessionId:%{public}d, phase:%{public}d, technology:%{public}d, modemId:%{public}d, status:%{public}d",
544             GetSlotId(), responseInfo.serial, radioProtocol.sessionId, radioProtocol.phase, radioProtocol.technology,
545             radioProtocol.modemId, radioProtocol.status);
546     }
547     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::GetRadioProtocolResponse, radioProtocol);
548 }
549 
SetRadioProtocolResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)550 int32_t HRilSim::SetRadioProtocolResponse(
551     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
552 {
553     HDI::Ril::V1_1::RadioProtocol radioProtocol = {};
554     if (response == nullptr || responseLen != sizeof(HRilRadioProtocol)) {
555         TELEPHONY_LOGE("SetRadioProtocolResponse response is invalid");
556         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
557             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
558         }
559     } else {
560         BuildRadioProtocol(radioProtocol, response);
561         TELEPHONY_LOGI("HRilSim::SetRadioProtocolResponse slotId:%{public}d, serial:%{public}d"
562             "sessionId:%{public}d, phase:%{public}d, technology:%{public}d, modemId:%{public}d, status:%{public}d",
563             GetSlotId(), responseInfo.serial, radioProtocol.sessionId, radioProtocol.phase, radioProtocol.technology,
564             radioProtocol.modemId, radioProtocol.status);
565     }
566     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SetRadioProtocolResponse, radioProtocol);
567 }
568 
SimOpenLogicalChannelResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)569 int32_t HRilSim::SimOpenLogicalChannelResponse(
570     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
571 {
572     HDI::Ril::V1_1::OpenLogicalChannelResponse pOpenLogicalChannelResponse = {};
573     if (response == nullptr || responseLen != sizeof(HRilOpenLogicalChannelResponse)) {
574         TELEPHONY_LOGE("Invalid response: response is nullptr");
575         return HRIL_ERR_INVALID_PARAMETER;
576     }
577     const HRilOpenLogicalChannelResponse *pRilResponse = static_cast<const HRilOpenLogicalChannelResponse *>(response);
578     pOpenLogicalChannelResponse.sw1 = pRilResponse->sw1;
579     pOpenLogicalChannelResponse.sw2 = pRilResponse->sw2;
580     pOpenLogicalChannelResponse.channelId = pRilResponse->channelId;
581     pOpenLogicalChannelResponse.response = (pRilResponse->response == nullptr) ? "" :  pRilResponse->response;
582     return Response(
583         responseInfo, &HDI::Ril::V1_1::IRilCallback::SimOpenLogicalChannelResponse, pOpenLogicalChannelResponse);
584 }
585 
SimCloseLogicalChannelResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)586 int32_t HRilSim::SimCloseLogicalChannelResponse(
587     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
588 {
589     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SimCloseLogicalChannelResponse);
590 }
591 
SimTransmitApduLogicalChannelResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)592 int32_t HRilSim::SimTransmitApduLogicalChannelResponse(
593     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
594 {
595     HDI::Ril::V1_1::IccIoResultInfo result = {};
596     int32_t ret = BuildSimIOResp(result, responseInfo, response, responseLen);
597     if (ret != HRIL_ERR_SUCCESS) {
598         return ret;
599     }
600     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SimTransmitApduLogicalChannelResponse, result);
601 }
602 
SimTransmitApduBasicChannelResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)603 int32_t HRilSim::SimTransmitApduBasicChannelResponse(
604     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
605 {
606     HDI::Ril::V1_1::IccIoResultInfo result = {};
607     int32_t ret = BuildSimIOResp(result, responseInfo, response, responseLen);
608     if (ret != HRIL_ERR_SUCCESS) {
609         return ret;
610     }
611     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SimTransmitApduBasicChannelResponse, result);
612 }
613 
SimAuthenticationResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)614 int32_t HRilSim::SimAuthenticationResponse(
615     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
616 {
617     HDI::Ril::V1_1::IccIoResultInfo result = {};
618     int32_t ret = BuildSimIOResp(result, responseInfo, response, responseLen);
619     if (ret != HRIL_ERR_SUCCESS) {
620         return ret;
621     }
622     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::SimAuthenticationResponse, result);
623 }
624 
UnlockSimLockResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)625 int32_t HRilSim::UnlockSimLockResponse(
626     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
627 {
628     HDI::Ril::V1_1::LockStatusResp result = {};
629     ResponseLockStatus(result, responseInfo, response, responseLen);
630     return Response(responseInfo, &HDI::Ril::V1_1::IRilCallback::UnlockSimLockResponse, result);
631 }
632 
ProcessIccIoResponse(HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)633 HDI::Ril::V1_1::IccIoResultInfo HRilSim::ProcessIccIoResponse(
634     HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
635 {
636     HDI::Ril::V1_1::IccIoResultInfo result = {};
637     if (response == nullptr || responseLen != sizeof(HRilSimIOResponse)) {
638         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
639             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
640         }
641         result.response = std::string("");
642         return result;
643     }
644     const HRilSimIOResponse *resp = static_cast<const HRilSimIOResponse *>(response);
645     result.sw1 = resp->sw1;
646     result.sw2 = resp->sw2;
647     result.response = (resp->response == nullptr) ? "" : std::string(resp->response);
648     return result;
649 }
650 
SendSimMatchedOperatorInfoResponse(int32_t requestNum,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)651 int32_t HRilSim::SendSimMatchedOperatorInfoResponse(
652     int32_t requestNum, HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
653 {
654     return Response(responseInfo, &HDI::Ril::V1_2::IRilCallback::SendSimMatchedOperatorInfoResponse);
655 }
656 
SimStateUpdated(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)657 int32_t HRilSim::SimStateUpdated(
658     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
659 {
660     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::SimStateUpdated);
661 }
662 
SimStkSessionEndNotify(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)663 int32_t HRilSim::SimStkSessionEndNotify(
664     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
665 {
666     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::SimStkSessionEndNotify);
667 }
668 
SimStkProactiveNotify(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)669 int32_t HRilSim::SimStkProactiveNotify(
670     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
671 {
672     int32_t ret = CheckCharData(response, responseLen);
673     if (ret != HRIL_ERR_SUCCESS) {
674         return ret;
675     }
676     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::SimStkProactiveNotify, (const char *)response);
677 }
678 
SimStkAlphaNotify(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)679 int32_t HRilSim::SimStkAlphaNotify(
680     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
681 {
682     int32_t ret = CheckCharData(response, responseLen);
683     if (ret != HRIL_ERR_SUCCESS) {
684         return ret;
685     }
686     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::SimStkAlphaNotify, (const char *)response);
687 }
688 
SimStkEventNotify(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)689 int32_t HRilSim::SimStkEventNotify(
690     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
691 {
692     int32_t ret = CheckCharData(response, responseLen);
693     if (ret != HRIL_ERR_SUCCESS) {
694         return ret;
695     }
696     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::SimStkEventNotify, (const char *)response);
697 }
698 
SimStkCallSetupNotify(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)699 int32_t HRilSim::SimStkCallSetupNotify(
700     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
701 {
702     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::SimStkCallSetupNotify);
703 }
704 
SimRefreshNotify(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)705 int32_t HRilSim::SimRefreshNotify(
706     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
707 {
708     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::SimRefreshNotify);
709 }
710 
SimRadioProtocolUpdated(int32_t notifyType,const HRilErrNumber error,const void * response,size_t responseLen)711 int32_t HRilSim::SimRadioProtocolUpdated(
712     int32_t notifyType, const HRilErrNumber error, const void *response, size_t responseLen)
713 {
714     if (response == nullptr || responseLen != sizeof(HRilRadioProtocol)) {
715         TELEPHONY_LOGE("SimRadioProtocolUpdated response is invalid");
716         return HRIL_ERR_INVALID_PARAMETER;
717     }
718     HDI::Ril::V1_1::RadioProtocol radioProtocol = {};
719     BuildRadioProtocol(radioProtocol, response);
720     TELEPHONY_LOGI("SimRadioProtocolUpdated slotId:%{public}d, sessionId:%{public}d, phase:%{public}d, "
721         "technology:%{public}d, modemId:%{public}d, status:%{public}d",
722         radioProtocol.slotId, radioProtocol.sessionId, static_cast<int32_t>(radioProtocol.phase),
723         radioProtocol.technology, radioProtocol.modemId, static_cast<int32_t>(radioProtocol.status));
724     return Notify(notifyType, error, &HDI::Ril::V1_1::IRilCallback::SimRadioProtocolUpdated, radioProtocol);
725 }
726 
IsSimResponse(uint32_t code)727 bool HRilSim::IsSimResponse(uint32_t code)
728 {
729     return ((code >= HREQ_SIM_BASE) && (code < HREQ_DATA_BASE));
730 }
731 
IsSimNotification(uint32_t code)732 bool HRilSim::IsSimNotification(uint32_t code)
733 {
734     return ((code >= HNOTI_SIM_BASE) && (code < HNOTI_DATA_BASE));
735 }
736 
CopyToHRilSimIO(std::unique_ptr<HRilSimIO> & rilSimIO,const OHOS::HDI::Ril::V1_1::SimIoRequestInfo & simIO)737 void HRilSim::CopyToHRilSimIO(std::unique_ptr<HRilSimIO> &rilSimIO, const OHOS::HDI::Ril::V1_1::SimIoRequestInfo &simIO)
738 {
739     rilSimIO->command = simIO.command;
740     rilSimIO->fileid = simIO.fileId;
741     rilSimIO->p1 = simIO.p1;
742     rilSimIO->p2 = simIO.p2;
743     rilSimIO->p3 = simIO.p3;
744     TELEPHONY_LOGD("CopyToHRilSimIO.data: %{public}zu, path: %{public}zu, pin2: %{public}zu", simIO.data.length(),
745         simIO.path.length(), simIO.pin2.length());
746     CopyToCharPoint(&(rilSimIO->data), simIO.data);
747     CopyToCharPoint(&(rilSimIO->pathid), simIO.path);
748     CopyToCharPoint(&(rilSimIO->pin2), simIO.pin2);
749 }
750 
CopyToHRilSimLock(std::unique_ptr<HRilSimClock> & rilSimLock,const OHOS::HDI::Ril::V1_1::SimLockInfo & simLockInfo)751 void HRilSim::CopyToHRilSimLock(
752     std::unique_ptr<HRilSimClock> &rilSimLock, const OHOS::HDI::Ril::V1_1::SimLockInfo &simLockInfo)
753 {
754     rilSimLock->mode = simLockInfo.mode;
755     rilSimLock->status = simLockInfo.status;
756     rilSimLock->classx = simLockInfo.classx;
757     CopyToCharPoint(&(rilSimLock->fac), simLockInfo.fac);
758     CopyToCharPoint(&(rilSimLock->passwd), simLockInfo.passwd);
759 }
760 
CopyToHRilSimPassword(std::unique_ptr<HRilSimPassword> & rilSimPassword,const OHOS::HDI::Ril::V1_1::SimPasswordInfo & simPassword)761 void HRilSim::CopyToHRilSimPassword(
762     std::unique_ptr<HRilSimPassword> &rilSimPassword, const OHOS::HDI::Ril::V1_1::SimPasswordInfo &simPassword)
763 {
764     CopyToCharPoint(&(rilSimPassword->fac), simPassword.fac);
765     CopyToCharPoint(&(rilSimPassword->oldPassword), simPassword.oldPassword);
766     CopyToCharPoint(&(rilSimPassword->newPassword), simPassword.newPassword);
767     rilSimPassword->passwordLength = simPassword.passwordLength;
768 }
769 
CopyToHRilApduSimIO(std::unique_ptr<HRilApduSimIO> & rilApduSimIO,const OHOS::HDI::Ril::V1_1::ApduSimIORequestInfo & apduSimIO)770 void HRilSim::CopyToHRilApduSimIO(
771     std::unique_ptr<HRilApduSimIO> &rilApduSimIO, const OHOS::HDI::Ril::V1_1::ApduSimIORequestInfo &apduSimIO)
772 {
773     rilApduSimIO->channelId = apduSimIO.channelId;
774     rilApduSimIO->type = apduSimIO.type;
775     rilApduSimIO->instruction = apduSimIO.instruction;
776     rilApduSimIO->p1 = apduSimIO.p1;
777     rilApduSimIO->p2 = apduSimIO.p2;
778     rilApduSimIO->p3 = apduSimIO.p3;
779     CopyToCharPoint(&(rilApduSimIO->data), apduSimIO.data);
780 }
781 
CopyToHRilSimAuthentication(std::unique_ptr<HRilSimAuthenticationRequestInfo> & rilSimAuthInfo,const OHOS::HDI::Ril::V1_1::SimAuthenticationRequestInfo & simAuthInfo)782 void HRilSim::CopyToHRilSimAuthentication(std::unique_ptr<HRilSimAuthenticationRequestInfo> &rilSimAuthInfo,
783     const OHOS::HDI::Ril::V1_1::SimAuthenticationRequestInfo &simAuthInfo)
784 {
785     rilSimAuthInfo->serial = simAuthInfo.serial;
786     CopyToCharPoint(&(rilSimAuthInfo->aid), simAuthInfo.aid);
787     CopyToCharPoint(&(rilSimAuthInfo->data), simAuthInfo.authData);
788 }
789 
CopyToHRilNcfgOperatorInfo(std::unique_ptr<HRilNcfgOperatorInfo> & rilNcfgOperatorInfo,const OHOS::HDI::Ril::V1_2::NcfgOperatorInfo & ncfgOperatorInfo)790 void HRilSim::CopyToHRilNcfgOperatorInfo(std::unique_ptr<HRilNcfgOperatorInfo> &rilNcfgOperatorInfo,
791     const OHOS::HDI::Ril::V1_2::NcfgOperatorInfo &ncfgOperatorInfo)
792 {
793     CopyToCharPoint(&(rilNcfgOperatorInfo->operName), ncfgOperatorInfo.operName);
794     CopyToCharPoint(&(rilNcfgOperatorInfo->operKey), ncfgOperatorInfo.operKey);
795     rilNcfgOperatorInfo->state = ncfgOperatorInfo.state;
796     CopyToCharPoint(&(rilNcfgOperatorInfo->reserve), ncfgOperatorInfo.reserve);
797 }
798 
BuildLockStatusResp(const void * response,size_t responseLen,HDI::Ril::V1_1::LockStatusResp & lockStatus)799 bool HRilSim::BuildLockStatusResp(const void *response, size_t responseLen, HDI::Ril::V1_1::LockStatusResp &lockStatus)
800 {
801     if (response == nullptr || responseLen != sizeof(HRilLockStatus)) {
802         return false;
803     }
804     const HRilLockStatus *resp = static_cast<const HRilLockStatus *>(response);
805     lockStatus.result = resp->result;
806     lockStatus.remain = resp->remain;
807     return true;
808 }
809 
ResponseLockStatus(HDI::Ril::V1_1::LockStatusResp & lockStatus,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)810 void HRilSim::ResponseLockStatus(HDI::Ril::V1_1::LockStatusResp &lockStatus,
811     HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
812 {
813     if (!BuildLockStatusResp(response, responseLen, lockStatus)) {
814         TELEPHONY_LOGE("Invalid ResponseLockStatus: response is error");
815         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
816             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
817         }
818     }
819 }
820 
BuildSimIOResp(HDI::Ril::V1_1::IccIoResultInfo & result,HDI::Ril::V1_1::RilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)821 int32_t HRilSim::BuildSimIOResp(HDI::Ril::V1_1::IccIoResultInfo &result,
822     HDI::Ril::V1_1::RilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
823 {
824     if ((response == nullptr && responseLen != 0) ||
825         (response != nullptr && responseLen != sizeof(HRilSimIOResponse))) {
826         TELEPHONY_LOGE("Invalid BuildSimIOResp: Vendor exception!");
827         return HRIL_ERR_INVALID_PARAMETER;
828     }
829     if (response == nullptr && responseLen == 0) {
830         TELEPHONY_LOGE("BuildSimIOResp response is null");
831         if (responseInfo.error == HDI::Ril::V1_1::RilErrType::NONE) {
832             responseInfo.error = HDI::Ril::V1_1::RilErrType::RIL_ERR_INVALID_RESPONSE;
833         }
834     }
835     result = ProcessIccIoResponse(responseInfo, response, responseLen);
836     return HRIL_ERR_SUCCESS;
837 }
838 
CheckCharData(const void * response,size_t responseLen)839 int32_t HRilSim::CheckCharData(const void *response, size_t responseLen)
840 {
841     if ((response == nullptr && responseLen != 0) || (responseLen % sizeof(char)) != 0) {
842         TELEPHONY_LOGE("Invalid parameter, responseLen:%{public}zu", responseLen);
843         return HRIL_ERR_INVALID_PARAMETER;
844     }
845     if (response == nullptr && responseLen == 0) {
846         TELEPHONY_LOGE("response is null");
847         return HRIL_ERR_NULL_POINT;
848     }
849     return HRIL_ERR_SUCCESS;
850 }
851 
BuildRadioProtocol(HDI::Ril::V1_1::RadioProtocol & radioProtocol,const void * response)852 void HRilSim::BuildRadioProtocol(HDI::Ril::V1_1::RadioProtocol &radioProtocol, const void *response)
853 {
854     const HRilRadioProtocol *hrilRadioProtocol = static_cast<const HRilRadioProtocol *>(response);
855     radioProtocol.slotId = GetSlotId();
856     radioProtocol.sessionId = hrilRadioProtocol->sessionId;
857     radioProtocol.phase = static_cast<HDI::Ril::V1_1::RadioProtocolPhase>(hrilRadioProtocol->phase);
858     radioProtocol.technology = ConvertRadioProtocolTech(hrilRadioProtocol->technology);
859     radioProtocol.modemId = hrilRadioProtocol->modemId;
860     radioProtocol.status = static_cast<HDI::Ril::V1_1::RadioProtocolStatus>(hrilRadioProtocol->status);
861 }
862 
ConvertRadioProtocolTech(int32_t tech)863 int32_t HRilSim::ConvertRadioProtocolTech(int32_t tech)
864 {
865     uint32_t radioProtocolTech = HRIL_RADIO_PROTOCOL_TECH_UNKNOWN;
866     for (uint32_t radioTech = RADIO_TECHNOLOGY_GSM; radioTech <= RADIO_TECHNOLOGY_NR; radioTech++) {
867         uint32_t protocolTech = 1 << radioTech;
868         if ((static_cast<uint32_t>(tech) & protocolTech) != 0) {
869             radioProtocolTech |= protocolTech;
870         }
871     }
872     return static_cast<int32_t>(radioProtocolTech);
873 }
874 } // namespace Telephony
875 } // namespace OHOS
876