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