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,IHRilReporter & hrilReporter)22 HRilSim::HRilSim(int32_t slotId, IHRilReporter &hrilReporter) : HRilBase(slotId, hrilReporter)
23 {
24 AddHandlerToMap();
25 }
26
IsSimRespOrNotify(uint32_t code)27 bool HRilSim::IsSimRespOrNotify(uint32_t code)
28 {
29 return IsSimResponse(code) || IsSimNotification(code);
30 }
31
RegisterSimFuncs(const HRilSimReq * simFuncs)32 void HRilSim::RegisterSimFuncs(const HRilSimReq *simFuncs)
33 {
34 simFuncs_ = simFuncs;
35 }
36
AddHandlerToMap()37 void HRilSim::AddHandlerToMap()
38 {
39 // Notification
40 notiMemberFuncMap_[HNOTI_SIM_STATUS_CHANGED] = &HRilSim::SimStateUpdated;
41 notiMemberFuncMap_[HNOTI_SIM_STK_SESSION_END_NOTIFY] = &HRilSim::SimStkSessionEndNotify;
42 notiMemberFuncMap_[HNOTI_SIM_STK_PROACTIVE_NOTIFY] = &HRilSim::SimStkProactiveNotify;
43 notiMemberFuncMap_[HNOTI_SIM_STK_ALPHA_NOTIFY] = &HRilSim::SimStkAlphaNotify;
44
45 // response
46 respMemberFuncMap_[HREQ_SIM_GET_SIM_IO] = &HRilSim::GetSimIOResponse;
47 respMemberFuncMap_[HREQ_SIM_GET_SIM_STATUS] = &HRilSim::GetSimStatusResponse;
48 respMemberFuncMap_[HREQ_SIM_GET_IMSI] = &HRilSim::GetImsiResponse;
49 respMemberFuncMap_[HREQ_SIM_GET_SIM_LOCK_STATUS] = &HRilSim::GetSimLockStatusResponse;
50 respMemberFuncMap_[HREQ_SIM_SET_SIM_LOCK] = &HRilSim::SetSimLockResponse;
51 respMemberFuncMap_[HREQ_SIM_CHANGE_SIM_PASSWORD] = &HRilSim::ChangeSimPasswordResponse;
52 respMemberFuncMap_[HREQ_SIM_UNLOCK_PIN] = &HRilSim::UnlockPinResponse;
53 respMemberFuncMap_[HREQ_SIM_UNLOCK_PUK] = &HRilSim::UnlockPukResponse;
54 respMemberFuncMap_[HREQ_SIM_GET_SIM_PIN_INPUT_TIMES] = &HRilSim::GetSimPinInputTimesResponse;
55 respMemberFuncMap_[HREQ_SIM_UNLOCK_PIN2] = &HRilSim::UnlockPin2Response;
56 respMemberFuncMap_[HREQ_SIM_UNLOCK_PUK2] = &HRilSim::UnlockPuk2Response;
57 respMemberFuncMap_[HREQ_SIM_GET_SIM_PIN2_INPUT_TIMES] = &HRilSim::GetSimPin2InputTimesResponse;
58 respMemberFuncMap_[HREQ_SIM_SET_ACTIVE_SIM] = &HRilSim::SetActiveSimResponse;
59 respMemberFuncMap_[HREQ_SIM_STK_SEND_TERMINAL_RESPONSE] = &HRilSim::SimStkSendTerminalResponseResponse;
60 respMemberFuncMap_[HREQ_SIM_STK_SEND_ENVELOPE] = &HRilSim::SimStkSendEnvelopeResponse;
61 respMemberFuncMap_[HREQ_SIM_STK_IS_READY] = &HRilSim::SimStkIsReadyResponse;
62 respMemberFuncMap_[HREQ_SIM_RADIO_PROTOCOL] = &HRilSim::SetRadioProtocolResponse;
63 respMemberFuncMap_[HREQ_SIM_OPEN_LOGICAL_CHANNEL] = &HRilSim::SimOpenLogicalChannelResponse;
64 respMemberFuncMap_[HREQ_SIM_CLOSE_LOGICAL_CHANNEL] = &HRilSim::SimCloseLogicalChannelResponse;
65 respMemberFuncMap_[HREQ_SIM_TRANSMIT_APDU_LOGICAL_CHANNEL] = &HRilSim::SimTransmitApduLogicalChannelResponse;
66 respMemberFuncMap_[HREQ_SIM_UNLOCK_SIM_LOCK] = &HRilSim::UnlockSimLockResponse;
67
68 // request
69 reqMemberFuncMap_[HREQ_SIM_GET_SIM_IO] = &HRilSim::GetSimIO;
70 reqMemberFuncMap_[HREQ_SIM_GET_SIM_STATUS] = &HRilSim::GetSimStatus;
71 reqMemberFuncMap_[HREQ_SIM_GET_IMSI] = &HRilSim::GetImsi;
72 reqMemberFuncMap_[HREQ_SIM_GET_SIM_LOCK_STATUS] = &HRilSim::GetSimLockStatus;
73 reqMemberFuncMap_[HREQ_SIM_SET_SIM_LOCK] = &HRilSim::SetSimLock;
74 reqMemberFuncMap_[HREQ_SIM_CHANGE_SIM_PASSWORD] = &HRilSim::ChangeSimPassword;
75 reqMemberFuncMap_[HREQ_SIM_UNLOCK_PIN] = &HRilSim::UnlockPin;
76 reqMemberFuncMap_[HREQ_SIM_UNLOCK_PUK] = &HRilSim::UnlockPuk;
77 reqMemberFuncMap_[HREQ_SIM_GET_SIM_PIN_INPUT_TIMES] = &HRilSim::GetSimPinInputTimes;
78 reqMemberFuncMap_[HREQ_SIM_UNLOCK_PIN2] = &HRilSim::UnlockPin2;
79 reqMemberFuncMap_[HREQ_SIM_UNLOCK_PUK2] = &HRilSim::UnlockPuk2;
80 reqMemberFuncMap_[HREQ_SIM_GET_SIM_PIN2_INPUT_TIMES] = &HRilSim::GetSimPin2InputTimes;
81 reqMemberFuncMap_[HREQ_SIM_SET_ACTIVE_SIM] = &HRilSim::SetActiveSim;
82 reqMemberFuncMap_[HREQ_SIM_STK_SEND_TERMINAL_RESPONSE] = &HRilSim::SimStkSendTerminalResponse;
83 reqMemberFuncMap_[HREQ_SIM_STK_SEND_ENVELOPE] = &HRilSim::SimStkSendEnvelope;
84 reqMemberFuncMap_[HREQ_SIM_STK_IS_READY] = &HRilSim::SimStkIsReady;
85 reqMemberFuncMap_[HREQ_SIM_RADIO_PROTOCOL] = &HRilSim::SetRadioProtocol;
86 reqMemberFuncMap_[HREQ_SIM_OPEN_LOGICAL_CHANNEL] = &HRilSim::SimOpenLogicalChannel;
87 reqMemberFuncMap_[HREQ_SIM_CLOSE_LOGICAL_CHANNEL] = &HRilSim::SimCloseLogicalChannel;
88 reqMemberFuncMap_[HREQ_SIM_TRANSMIT_APDU_LOGICAL_CHANNEL] = &HRilSim::SimTransmitApduLogicalChannel;
89 reqMemberFuncMap_[HREQ_SIM_UNLOCK_SIM_LOCK] = &HRilSim::UnlockSimLock;
90 }
91
GetSimIO(struct HdfSBuf * data)92 int32_t HRilSim::GetSimIO(struct HdfSBuf *data)
93 {
94 if ((simFuncs_ == nullptr) || (simFuncs_->GetSimIO == nullptr)) {
95 TELEPHONY_LOGE("GetSimIO::simFuncs_:%{public}p", simFuncs_);
96 return HRIL_ERR_NULL_POINT;
97 }
98 SimIoRequestInfo SimIO = SimIoRequestInfo();
99 MessageParcel *parcel = nullptr;
100 if (SbufToParcel(data, &parcel)) {
101 TELEPHONY_LOGE("RilAdapter failed to do SbufToParcel");
102 return HRIL_ERR_INVALID_PARAMETER;
103 }
104 if (parcel == nullptr) {
105 TELEPHONY_LOGE("parcel in GetSimIO is nullptr!");
106 return HRIL_ERR_NULL_POINT;
107 }
108 if (!SimIO.ReadFromParcel(*parcel)) {
109 TELEPHONY_LOGE("RilAdapter failed to do ReadFromParcel!");
110 return HRIL_ERR_INVALID_PARAMETER;
111 }
112 int32_t serial = SimIO.serial;
113 HRilSimIO rilSimIO = {};
114 rilSimIO.command = SimIO.command;
115 rilSimIO.fileid = SimIO.fileId;
116 rilSimIO.p1 = SimIO.p1;
117 rilSimIO.p2 = SimIO.p2;
118 rilSimIO.p3 = SimIO.p3;
119 rilSimIO.data = static_cast<char *>(const_cast<char *>(SimIO.data.c_str()));
120 rilSimIO.pathid = static_cast<char *>(const_cast<char *>(SimIO.path.c_str()));
121 rilSimIO.pin2 = static_cast<char *>(const_cast<char *>(SimIO.pin2.c_str()));
122 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_GET_SIM_IO);
123 if (requestInfo == nullptr) {
124 TELEPHONY_LOGE("RilAdapter failed to do Create GetSimIO HRilRequest!");
125 return HRIL_ERR_NULL_POINT;
126 }
127 simFuncs_->GetSimIO(requestInfo, &rilSimIO, sizeof(rilSimIO));
128 return HRIL_ERR_SUCCESS;
129 }
130
GetSimStatus(struct HdfSBuf * data)131 int32_t HRilSim::GetSimStatus(struct HdfSBuf *data)
132 {
133 if ((simFuncs_ == nullptr) || (simFuncs_->GetSimStatus == nullptr)) {
134 TELEPHONY_LOGE("GetSimStatus::simFuncs_:%{public}p", simFuncs_);
135 return HRIL_ERR_NULL_POINT;
136 }
137 int32_t serial = 0;
138 if (!HdfSbufReadInt32(data, &serial)) {
139 TELEPHONY_LOGE("miss serial parameter");
140 return HRIL_ERR_INVALID_PARAMETER;
141 }
142 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_GET_SIM_STATUS);
143 if (requestInfo == nullptr) {
144 TELEPHONY_LOGE("RilAdapter failed to do Create GetSimStatus HRilRequest!");
145 return HRIL_ERR_NULL_POINT;
146 }
147 simFuncs_->GetSimStatus(requestInfo);
148 return HRIL_ERR_SUCCESS;
149 }
150
GetImsi(struct HdfSBuf * data)151 int32_t HRilSim::GetImsi(struct HdfSBuf *data)
152 {
153 if ((simFuncs_ == nullptr) || (simFuncs_->GetSimImsi == nullptr)) {
154 TELEPHONY_LOGE("GetSimImsi::simFuncs_:%{public}p", simFuncs_);
155 return HRIL_ERR_NULL_POINT;
156 }
157 int32_t serial = 0;
158 if (!HdfSbufReadInt32(data, &serial)) {
159 TELEPHONY_LOGE("miss serial parameter");
160 return HRIL_ERR_INVALID_PARAMETER;
161 }
162
163 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_GET_IMSI);
164 if (requestInfo == nullptr) {
165 TELEPHONY_LOGE("RilAdapter failed to do Create GetImsi HRilRequest!");
166 return HRIL_ERR_NULL_POINT;
167 }
168 simFuncs_->GetSimImsi(requestInfo);
169 return HRIL_ERR_SUCCESS;
170 }
171
GetSimLockStatus(struct HdfSBuf * data)172 int32_t HRilSim::GetSimLockStatus(struct HdfSBuf *data)
173 {
174 if ((simFuncs_ == nullptr) || (simFuncs_->GetSimLockStatus == nullptr)) {
175 TELEPHONY_LOGE("GetSimLockStatus::simFuncs_:%{public}p", simFuncs_);
176 return HRIL_ERR_NULL_POINT;
177 }
178 SimLockInfo simClock = SimLockInfo();
179 MessageParcel *parcel = nullptr;
180 if (SbufToParcel(data, &parcel)) {
181 TELEPHONY_LOGE("RilAdapter failed to do SbufToParcel");
182 return HRIL_ERR_INVALID_PARAMETER;
183 }
184 if (parcel == nullptr) {
185 TELEPHONY_LOGE("parcel in GetSimLockStatus is nullptr!");
186 return HRIL_ERR_NULL_POINT;
187 }
188 if (!simClock.ReadFromParcel(*parcel)) {
189 TELEPHONY_LOGE("RilAdapter failed to do ReadFromParcel!");
190 return HRIL_ERR_INVALID_PARAMETER;
191 }
192 HRilSimClock rilSimClock = {};
193 rilSimClock.mode = simClock.mode;
194 rilSimClock.status = simClock.status;
195 rilSimClock.classx = simClock.classx;
196 rilSimClock.fac = static_cast<char *>(const_cast<char *>(simClock.fac.c_str()));
197 rilSimClock.passwd = static_cast<char *>(const_cast<char *>(simClock.passwd.c_str()));
198 int32_t serial = simClock.serial;
199 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_GET_SIM_LOCK_STATUS);
200 if (requestInfo == nullptr) {
201 TELEPHONY_LOGE("RilAdapter failed to do Create GetSimLockStatus HRilRequest!");
202 return HRIL_ERR_NULL_POINT;
203 }
204 simFuncs_->GetSimLockStatus(requestInfo, &rilSimClock, sizeof(rilSimClock));
205 return HRIL_ERR_SUCCESS;
206 }
207
SetSimLock(struct HdfSBuf * data)208 int32_t HRilSim::SetSimLock(struct HdfSBuf *data)
209 {
210 if ((simFuncs_ == nullptr) || (simFuncs_->SetSimLock == nullptr)) {
211 TELEPHONY_LOGE("SetSimLock::simFuncs_:%{public}p", simFuncs_);
212 return HRIL_ERR_NULL_POINT;
213 }
214 SimLockInfo simClock = SimLockInfo();
215 MessageParcel *parcel = nullptr;
216 if (SbufToParcel(data, &parcel)) {
217 TELEPHONY_LOGE("RilAdapter failed to do SbufToParcel");
218 return HRIL_ERR_INVALID_PARAMETER;
219 }
220 if (parcel == nullptr) {
221 TELEPHONY_LOGE("parcel in SetSimLock is nullptr!");
222 return HRIL_ERR_NULL_POINT;
223 }
224 if (!simClock.ReadFromParcel(*parcel)) {
225 TELEPHONY_LOGE("RilAdapter failed to do ReadFromParcel!");
226 return HRIL_ERR_INVALID_PARAMETER;
227 }
228 HRilSimClock rilSimClock = {};
229 rilSimClock.fac = static_cast<char *>(const_cast<char *>(simClock.fac.c_str()));
230 rilSimClock.mode = simClock.mode;
231 rilSimClock.status = simClock.status;
232 rilSimClock.passwd = static_cast<char *>(const_cast<char *>(simClock.passwd.c_str()));
233 rilSimClock.classx = simClock.classx;
234 int32_t serial = simClock.serial;
235 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_SET_SIM_LOCK);
236 if (requestInfo == nullptr) {
237 TELEPHONY_LOGE("RilAdapter failed to do Create SetSimLock HRilRequest!");
238 return HRIL_ERR_NULL_POINT;
239 }
240 simFuncs_->SetSimLock(requestInfo, &rilSimClock, sizeof(rilSimClock));
241 return HRIL_ERR_SUCCESS;
242 }
243
ChangeSimPassword(struct HdfSBuf * data)244 int32_t HRilSim::ChangeSimPassword(struct HdfSBuf *data)
245 {
246 if ((simFuncs_ == nullptr) || (simFuncs_->ChangeSimPassword == nullptr)) {
247 TELEPHONY_LOGE("ChangeSimPassword::simFuncs_:%{public}p", simFuncs_);
248 return HRIL_ERR_NULL_POINT;
249 }
250 SimPasswordInfo simPassword = SimPasswordInfo();
251 MessageParcel *parcel = nullptr;
252 if (SbufToParcel(data, &parcel)) {
253 TELEPHONY_LOGE("RilAdapter failed to do SbufToParcel");
254 return HRIL_ERR_INVALID_PARAMETER;
255 }
256 if (parcel == nullptr || simFuncs_ == nullptr) {
257 TELEPHONY_LOGE("ChangeSimPassword failed : nullptr!");
258 return HRIL_ERR_NULL_POINT;
259 }
260 if (!simPassword.ReadFromParcel(*parcel)) {
261 TELEPHONY_LOGE("RilAdapter failed to do ReadFromParcel!");
262 return HRIL_ERR_INVALID_PARAMETER;
263 }
264 HRilSimPassword rilSimPassword = {};
265 rilSimPassword.fac = static_cast<char *>(const_cast<char *>(simPassword.fac.c_str()));
266 rilSimPassword.oldPassword = static_cast<char *>(const_cast<char *>(simPassword.oldPassword.c_str()));
267 rilSimPassword.newPassword = static_cast<char *>(const_cast<char *>(simPassword.newPassword.c_str()));
268 rilSimPassword.passwordLength = simPassword.passwordLength;
269 int32_t serial = simPassword.serial;
270 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_CHANGE_SIM_PASSWORD);
271 if (requestInfo == nullptr) {
272 TELEPHONY_LOGE("RilAdapter failed to do Create ChangeSimPassword HRilRequest!");
273 return HRIL_ERR_NULL_POINT;
274 }
275 simFuncs_->ChangeSimPassword(requestInfo, &rilSimPassword, sizeof(rilSimPassword));
276 return HRIL_ERR_SUCCESS;
277 }
278
UnlockPin(struct HdfSBuf * data)279 int32_t HRilSim::UnlockPin(struct HdfSBuf *data)
280 {
281 if ((simFuncs_ == nullptr) || (simFuncs_->UnlockPin == nullptr)) {
282 TELEPHONY_LOGE("UnlockPin::simFuncs_:%{public}p", simFuncs_);
283 return HRIL_ERR_NULL_POINT;
284 }
285 int32_t serial = 0;
286 const char *pin = nullptr;
287 if (!HdfSbufReadInt32(data, &serial)) {
288 TELEPHONY_LOGE("miss serial parameter");
289 return HRIL_ERR_INVALID_PARAMETER;
290 }
291 MessageParcel *parcel = nullptr;
292 if (SbufToParcel(data, &parcel)) {
293 TELEPHONY_LOGE("RilAdapter failed to do SbufToParcel");
294 return HRIL_ERR_INVALID_PARAMETER;
295 }
296 if (parcel == nullptr) {
297 TELEPHONY_LOGE("parcel in EnterSimPin is nullptr!");
298 return HRIL_ERR_NULL_POINT;
299 }
300 pin = parcel->ReadCString();
301 if (pin == nullptr) {
302 TELEPHONY_LOGE("miss pin parameter");
303 return HRIL_ERR_NULL_POINT;
304 }
305 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_UNLOCK_PIN);
306 if (requestInfo == nullptr) {
307 TELEPHONY_LOGE("RilAdapter failed to do Create EnterSimPin HRilRequest!");
308 return HRIL_ERR_NULL_POINT;
309 }
310 simFuncs_->UnlockPin(requestInfo, pin);
311 return HRIL_ERR_SUCCESS;
312 }
313
UnlockPuk(struct HdfSBuf * data)314 int32_t HRilSim::UnlockPuk(struct HdfSBuf *data)
315 {
316 if ((simFuncs_ == nullptr) || (simFuncs_->UnlockPuk == nullptr)) {
317 TELEPHONY_LOGE("UnlockPuk::simFuncs_:%{public}p", simFuncs_);
318 return HRIL_ERR_NULL_POINT;
319 }
320 int32_t serial = 0;
321 const char *puk = nullptr;
322 const char *pin = nullptr;
323 if (!HdfSbufReadInt32(data, &serial)) {
324 TELEPHONY_LOGE("miss serial parameter");
325 return HRIL_ERR_INVALID_PARAMETER;
326 }
327 puk = HdfSbufReadString(data);
328 if (puk == nullptr) {
329 TELEPHONY_LOGE("miss puk parameter");
330 return HRIL_ERR_NULL_POINT;
331 }
332 pin = HdfSbufReadString(data);
333 if (pin == nullptr) {
334 TELEPHONY_LOGE("miss pin parameter");
335 return HRIL_ERR_NULL_POINT;
336 }
337 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_UNLOCK_PUK);
338 if (requestInfo == nullptr) {
339 TELEPHONY_LOGE("RilAdapter failed to do Create UnlockSimPin HRilRequest!");
340 return HRIL_ERR_NULL_POINT;
341 }
342 simFuncs_->UnlockPuk(requestInfo, puk, pin);
343 return HRIL_ERR_SUCCESS;
344 }
345
GetSimPinInputTimes(struct HdfSBuf * data)346 int32_t HRilSim::GetSimPinInputTimes(struct HdfSBuf *data)
347 {
348 if ((simFuncs_ == nullptr) || (simFuncs_->GetSimPinInputTimes == nullptr)) {
349 TELEPHONY_LOGE("GetSimPinInputTimes::simFuncs_:%{public}p", simFuncs_);
350 return HRIL_ERR_NULL_POINT;
351 }
352 int32_t serial = 0;
353 if (!HdfSbufReadInt32(data, &serial)) {
354 TELEPHONY_LOGE("miss serial parameter");
355 return HRIL_ERR_INVALID_PARAMETER;
356 }
357 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_GET_SIM_PIN_INPUT_TIMES);
358 if (requestInfo == nullptr) {
359 TELEPHONY_LOGE("RilAdapter failed to do Create GetSimPinInputTimes HRilRequest!");
360 return HRIL_ERR_NULL_POINT;
361 }
362 simFuncs_->GetSimPinInputTimes(requestInfo);
363 return HRIL_ERR_SUCCESS;
364 }
365
UnlockPin2(struct HdfSBuf * data)366 int32_t HRilSim::UnlockPin2(struct HdfSBuf *data)
367 {
368 if ((simFuncs_ == nullptr) || (simFuncs_->UnlockPin2 == nullptr)) {
369 TELEPHONY_LOGE("UnlockPin2::simFuncs_:%{public}p", simFuncs_);
370 return HRIL_ERR_NULL_POINT;
371 }
372 int32_t serial = 0;
373 const char *pin2 = nullptr;
374 if (!HdfSbufReadInt32(data, &serial)) {
375 TELEPHONY_LOGE("miss serial parameter");
376 return HRIL_ERR_INVALID_PARAMETER;
377 }
378 MessageParcel *parcel = nullptr;
379 if (SbufToParcel(data, &parcel)) {
380 TELEPHONY_LOGE("RilAdapter failed to do SbufToParcel");
381 return HRIL_ERR_INVALID_PARAMETER;
382 }
383 pin2 = parcel->ReadCString();
384 if (pin2 == nullptr) {
385 TELEPHONY_LOGE("miss pin parameter");
386 return HRIL_ERR_NULL_POINT;
387 }
388 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_UNLOCK_PIN2);
389 if (requestInfo == nullptr) {
390 TELEPHONY_LOGE("RilAdapter failed to do Create EnterSimPin HRilRequest!");
391 return HRIL_ERR_NULL_POINT;
392 }
393 simFuncs_->UnlockPin2(requestInfo, pin2);
394 return HRIL_ERR_SUCCESS;
395 }
396
UnlockPuk2(struct HdfSBuf * data)397 int32_t HRilSim::UnlockPuk2(struct HdfSBuf *data)
398 {
399 if ((simFuncs_ == nullptr) || (simFuncs_->UnlockPuk2 == nullptr)) {
400 TELEPHONY_LOGE("UnlockPuk2::simFuncs_:%{public}p", simFuncs_);
401 return HRIL_ERR_NULL_POINT;
402 }
403 int32_t serial = 0;
404 const char *puk2 = nullptr;
405 const char *pin2 = nullptr;
406 if (!HdfSbufReadInt32(data, &serial)) {
407 TELEPHONY_LOGE("miss serial parameter");
408 return HRIL_ERR_INVALID_PARAMETER;
409 }
410 puk2 = HdfSbufReadString(data);
411 if (puk2 == nullptr) {
412 TELEPHONY_LOGE("miss puk2 parameter");
413 return HRIL_ERR_NULL_POINT;
414 }
415 pin2 = HdfSbufReadString(data);
416 if (pin2 == nullptr) {
417 TELEPHONY_LOGE("miss pin2 parameter");
418 return HRIL_ERR_NULL_POINT;
419 }
420 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_UNLOCK_PUK2);
421 if (requestInfo == nullptr) {
422 TELEPHONY_LOGE("RilAdapter failed to do Create UnlockSimPin2 HRilRequest!");
423 return HRIL_ERR_NULL_POINT;
424 }
425 simFuncs_->UnlockPuk2(requestInfo, puk2, pin2);
426 return HRIL_ERR_SUCCESS;
427 }
428
GetSimPin2InputTimes(struct HdfSBuf * data)429 int32_t HRilSim::GetSimPin2InputTimes(struct HdfSBuf *data)
430 {
431 if ((simFuncs_ == nullptr) || (simFuncs_->GetSimPin2InputTimes == nullptr)) {
432 TELEPHONY_LOGE("GetSimPin2InputTimes::simFuncs_:%{public}p", simFuncs_);
433 return HRIL_ERR_NULL_POINT;
434 }
435 int32_t serial = 0;
436 if (!HdfSbufReadInt32(data, &serial)) {
437 TELEPHONY_LOGE("miss serial parameter");
438 return HRIL_ERR_INVALID_PARAMETER;
439 }
440 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_GET_SIM_PIN2_INPUT_TIMES);
441 if (requestInfo == nullptr) {
442 TELEPHONY_LOGE("RilAdapter failed to do Create GetSimPin2InputTimes HRilRequest!");
443 return HRIL_ERR_NULL_POINT;
444 }
445 simFuncs_->GetSimPin2InputTimes(requestInfo);
446 return HRIL_ERR_SUCCESS;
447 }
448
SetActiveSim(struct HdfSBuf * data)449 int32_t HRilSim::SetActiveSim(struct HdfSBuf *data)
450 {
451 if ((simFuncs_ == nullptr) || (simFuncs_->SetActiveSim == nullptr)) {
452 TELEPHONY_LOGE("SetActiveSim::simFuncs_:%{public}p", simFuncs_);
453 return HRIL_ERR_NULL_POINT;
454 }
455 int32_t serial = 0;
456 int32_t index = 0;
457 int32_t enable = 0;
458 if (!HdfSbufReadInt32(data, &serial)) {
459 TELEPHONY_LOGE("miss serial parameter");
460 return HRIL_ERR_INVALID_PARAMETER;
461 }
462 if (!HdfSbufReadInt32(data, &index)) {
463 TELEPHONY_LOGE("miss index parameter");
464 return HRIL_ERR_INVALID_PARAMETER;
465 }
466 if (!HdfSbufReadInt32(data, &enable)) {
467 TELEPHONY_LOGE("miss enable parameter");
468 return HRIL_ERR_INVALID_PARAMETER;
469 }
470 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_SET_ACTIVE_SIM);
471 if (requestInfo == nullptr) {
472 TELEPHONY_LOGE("RilAdapter failed to do Create EnterSimPin HRilRequest!");
473 return HRIL_ERR_NULL_POINT;
474 }
475 simFuncs_->SetActiveSim(requestInfo, index, enable);
476 return HRIL_ERR_SUCCESS;
477 }
478
SimStkSendTerminalResponse(struct HdfSBuf * data)479 int32_t HRilSim::SimStkSendTerminalResponse(struct HdfSBuf *data)
480 {
481 if ((simFuncs_ == nullptr) || (simFuncs_->SimStkSendTerminalResponse == nullptr)) {
482 TELEPHONY_LOGE("SimStkSendTerminalResponse::simFuncs_:%{public}p", simFuncs_);
483 return HRIL_ERR_NULL_POINT;
484 }
485 int32_t serial = 0;
486 const char *strCmd = nullptr;
487 if (!HdfSbufReadInt32(data, &serial)) {
488 TELEPHONY_LOGE("miss serial parameter");
489 return HRIL_ERR_INVALID_PARAMETER;
490 }
491 MessageParcel *parcel = nullptr;
492 if (SbufToParcel(data, &parcel)) {
493 TELEPHONY_LOGE("RilAdapter failed to do SbufToParcel");
494 return HRIL_ERR_INVALID_PARAMETER;
495 }
496 strCmd = parcel->ReadCString();
497 if (strCmd == nullptr) {
498 TELEPHONY_LOGE("miss pin parameter");
499 return HRIL_ERR_NULL_POINT;
500 }
501 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_STK_SEND_TERMINAL_RESPONSE);
502 if (requestInfo == nullptr) {
503 TELEPHONY_LOGE("RilAdapter failed to do Create SimStkSendTerminalResponse HRilRequest!");
504 return HRIL_ERR_NULL_POINT;
505 }
506 simFuncs_->SimStkSendTerminalResponse(requestInfo, strCmd);
507 return HRIL_ERR_SUCCESS;
508 }
509
SimStkSendEnvelope(struct HdfSBuf * data)510 int32_t HRilSim::SimStkSendEnvelope(struct HdfSBuf *data)
511 {
512 if ((simFuncs_ == nullptr) || (simFuncs_->SimStkSendEnvelope == nullptr)) {
513 TELEPHONY_LOGE("SimStkSendEnvelope::simFuncs_:%{public}p", simFuncs_);
514 return HRIL_ERR_NULL_POINT;
515 }
516 int32_t serial = 0;
517 const char *strCmd = nullptr;
518 if (!HdfSbufReadInt32(data, &serial)) {
519 TELEPHONY_LOGE("miss serial parameter");
520 return HRIL_ERR_INVALID_PARAMETER;
521 }
522 MessageParcel *parcel = nullptr;
523 if (SbufToParcel(data, &parcel)) {
524 TELEPHONY_LOGE("RilAdapter failed to do SbufToParcel");
525 return HRIL_ERR_INVALID_PARAMETER;
526 }
527 strCmd = parcel->ReadCString();
528 if (strCmd == nullptr) {
529 TELEPHONY_LOGE("miss pin parameter");
530 return HRIL_ERR_NULL_POINT;
531 }
532 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_STK_SEND_ENVELOPE);
533 if (requestInfo == nullptr) {
534 TELEPHONY_LOGE("RilAdapter failed to do Create SimStkSendEnvelope HRilRequest!");
535 return HRIL_ERR_NULL_POINT;
536 }
537 simFuncs_->SimStkSendEnvelope(requestInfo, strCmd);
538 return HRIL_ERR_SUCCESS;
539 }
540
SimStkIsReady(struct HdfSBuf * data)541 int32_t HRilSim::SimStkIsReady(struct HdfSBuf *data)
542 {
543 if ((simFuncs_ == nullptr) || (simFuncs_->SimStkIsReady == nullptr)) {
544 TELEPHONY_LOGE("SimStkIsReady::simFuncs_:%{public}p", simFuncs_);
545 return HRIL_ERR_NULL_POINT;
546 }
547 int32_t serial = 0;
548 if (!HdfSbufReadInt32(data, &serial)) {
549 TELEPHONY_LOGE("miss serial parameter");
550 return HRIL_ERR_INVALID_PARAMETER;
551 }
552
553 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_STK_IS_READY);
554 if (requestInfo == nullptr) {
555 TELEPHONY_LOGE("RilAdapter failed to do Create SimStkIsReady HRilRequest!");
556 return HRIL_ERR_NULL_POINT;
557 }
558 simFuncs_->SimStkIsReady(requestInfo);
559 return HRIL_ERR_SUCCESS;
560 }
561
SetRadioProtocol(struct HdfSBuf * data)562 int32_t HRilSim::SetRadioProtocol(struct HdfSBuf *data)
563 {
564 if ((simFuncs_ == nullptr) || (simFuncs_->SetRadioProtocol == nullptr)) {
565 TELEPHONY_LOGE("SetRadioProtocol::simFuncs_:%{public}p", simFuncs_);
566 return HRIL_ERR_NULL_POINT;
567 }
568 SimProtocolRequest protocol = SimProtocolRequest();
569 MessageParcel *parcel = nullptr;
570 if (SbufToParcel(data, &parcel)) {
571 TELEPHONY_LOGE("RilAdapter failed to do SbufToParcel");
572 return HRIL_ERR_INVALID_PARAMETER;
573 }
574 if (parcel == nullptr) {
575 TELEPHONY_LOGE("parcel in GetSimIO is nullptr!");
576 return HRIL_ERR_NULL_POINT;
577 }
578 if (!protocol.ReadFromParcel(*parcel)) {
579 TELEPHONY_LOGE("RilAdapter failed to do ReadFromParcel!");
580 return HRIL_ERR_INVALID_PARAMETER;
581 }
582 int32_t serial = protocol.serial;
583 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_RADIO_PROTOCOL);
584 if (requestInfo == nullptr) {
585 TELEPHONY_LOGE("RilAdapter failed to do Create SetRadioProtocol HRilRequest!");
586 return HRIL_ERR_NULL_POINT;
587 }
588 HRilSimProtocolRequest hRilSimProtocolRequest;
589 hRilSimProtocolRequest.phase = protocol.phase;
590 hRilSimProtocolRequest.protocol = protocol.protocol;
591 hRilSimProtocolRequest.slotId = protocol.slotId;
592 simFuncs_->SetRadioProtocol(requestInfo, &hRilSimProtocolRequest, sizeof(hRilSimProtocolRequest));
593 return HRIL_ERR_SUCCESS;
594 }
595
SimOpenLogicalChannel(struct HdfSBuf * data)596 int32_t HRilSim::SimOpenLogicalChannel(struct HdfSBuf *data)
597 {
598 if ((simFuncs_ == nullptr) || (simFuncs_->SimOpenLogicalChannel == nullptr)) {
599 TELEPHONY_LOGE("SimOpenLogicalChannel::simFuncs_:%{public}p", simFuncs_);
600 return HRIL_ERR_NULL_POINT;
601 }
602 int32_t serial = 0;
603 const char *appID = nullptr;
604 int32_t p2 = 0;
605 if (!HdfSbufReadInt32(data, &serial)) {
606 TELEPHONY_LOGE("miss serial parameter");
607 return HRIL_ERR_INVALID_PARAMETER;
608 }
609 appID = HdfSbufReadString(data);
610 if (appID == nullptr) {
611 TELEPHONY_LOGE("miss appID parameter");
612 return HRIL_ERR_NULL_POINT;
613 }
614 if (!HdfSbufReadInt32(data, &p2)) {
615 TELEPHONY_LOGE("miss p2 parameter");
616 return HRIL_ERR_INVALID_PARAMETER;
617 }
618
619 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_OPEN_LOGICAL_CHANNEL);
620 if (requestInfo == nullptr) {
621 TELEPHONY_LOGE("RilAdapter failed to do Create SimOpenLogicalChannel HRilRequest!");
622 return HRIL_ERR_NULL_POINT;
623 }
624
625 simFuncs_->SimOpenLogicalChannel(requestInfo, appID, p2);
626 return HRIL_ERR_SUCCESS;
627 }
628
SimCloseLogicalChannel(struct HdfSBuf * data)629 int32_t HRilSim::SimCloseLogicalChannel(struct HdfSBuf *data)
630 {
631 if ((simFuncs_ == nullptr) || (simFuncs_->SimCloseLogicalChannel == nullptr)) {
632 TELEPHONY_LOGE("SimCloseLogicalChannel::simFuncs_:%{public}p", simFuncs_);
633 return HRIL_ERR_NULL_POINT;
634 }
635 int32_t serial = 0;
636 int32_t channelId = 0;
637 if (!HdfSbufReadInt32(data, &serial)) {
638 TELEPHONY_LOGE("miss serial parameter");
639 return HRIL_ERR_INVALID_PARAMETER;
640 }
641 if (!HdfSbufReadInt32(data, &channelId)) {
642 TELEPHONY_LOGE("miss channelId parameter");
643 return HRIL_ERR_INVALID_PARAMETER;
644 }
645
646 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_CLOSE_LOGICAL_CHANNEL);
647 if (requestInfo == nullptr) {
648 TELEPHONY_LOGE("RilAdapter failed to do Create SimCloseLogicalChannel HRilRequest!");
649 return HRIL_ERR_NULL_POINT;
650 }
651
652 simFuncs_->SimCloseLogicalChannel(requestInfo, channelId);
653 return HRIL_ERR_SUCCESS;
654 }
655
SimTransmitApduLogicalChannel(struct HdfSBuf * data)656 int32_t HRilSim::SimTransmitApduLogicalChannel(struct HdfSBuf *data)
657 {
658 if ((simFuncs_ == nullptr) || (simFuncs_->SimTransmitApduLogicalChannel == nullptr)) {
659 TELEPHONY_LOGE("SimTransmitApduLogicalChannel::simFuncs_:%{public}p", simFuncs_);
660 return HRIL_ERR_NULL_POINT;
661 }
662 ApduSimIORequestInfo apduSimIO = ApduSimIORequestInfo();
663 MessageParcel *parcel = nullptr;
664 if (SbufToParcel(data, &parcel)) {
665 TELEPHONY_LOGE("RilAdapter failed to do SbufToParcel");
666 return HRIL_ERR_INVALID_PARAMETER;
667 }
668 if (parcel == nullptr) {
669 TELEPHONY_LOGE("parcel in SimTransmitApduLogicalChannel is nullptr!");
670 return HRIL_ERR_NULL_POINT;
671 }
672 if (!apduSimIO.ReadFromParcel(*parcel)) {
673 TELEPHONY_LOGE("RilAdapter failed to do ReadFromParcel!");
674 return HRIL_ERR_INVALID_PARAMETER;
675 }
676 HRilApduSimIO rilApduSimIO = {};
677 rilApduSimIO.channelId = apduSimIO.channelId;
678 rilApduSimIO.type = apduSimIO.type;
679 rilApduSimIO.instruction = apduSimIO.instruction;
680 rilApduSimIO.p1 = apduSimIO.p1;
681 rilApduSimIO.p2 = apduSimIO.p2;
682 rilApduSimIO.p3 = apduSimIO.p3;
683 rilApduSimIO.data = static_cast<char *>(const_cast<char *>(apduSimIO.data.c_str()));
684
685 int32_t serial = apduSimIO.serial;
686 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_TRANSMIT_APDU_LOGICAL_CHANNEL);
687 if (requestInfo == nullptr) {
688 TELEPHONY_LOGE("RilAdapter failed to do Create SimTransmitApduLogicalChannel HRilRequest!");
689 return HRIL_ERR_NULL_POINT;
690 }
691 simFuncs_->SimTransmitApduLogicalChannel(requestInfo, &rilApduSimIO, sizeof(rilApduSimIO));
692 return HRIL_ERR_SUCCESS;
693 }
694
UnlockSimLock(struct HdfSBuf * data)695 int32_t HRilSim::UnlockSimLock(struct HdfSBuf *data)
696 {
697 if ((simFuncs_ == nullptr) || (simFuncs_->UnlockSimLock == nullptr)) {
698 TELEPHONY_LOGE("UnlockSimLock::simFuncs_:%{public}p", simFuncs_);
699 return HRIL_ERR_NULL_POINT;
700 }
701 int32_t serial = 0;
702 int32_t lockType = 0;
703 const char *key = nullptr;
704 if (!HdfSbufReadInt32(data, &serial)) {
705 TELEPHONY_LOGE("miss serial parameter");
706 return HRIL_ERR_INVALID_PARAMETER;
707 }
708 if (!HdfSbufReadInt32(data, &lockType)) {
709 TELEPHONY_LOGE("miss lockType parameter");
710 return HRIL_ERR_INVALID_PARAMETER;
711 }
712 key = HdfSbufReadString(data);
713 if (key == nullptr) {
714 TELEPHONY_LOGE("miss key parameter");
715 return HRIL_ERR_NULL_POINT;
716 }
717 ReqDataInfo *requestInfo = CreateHRilRequest(serial, HREQ_SIM_UNLOCK_SIM_LOCK);
718 if (requestInfo == nullptr) {
719 TELEPHONY_LOGE("RilAdapter failed to do Create UnlockSimLock HRilRequest!");
720 return HRIL_ERR_NULL_POINT;
721 }
722 simFuncs_->UnlockSimLock(requestInfo, lockType, key);
723 return HRIL_ERR_SUCCESS;
724 }
725
GetSimIOResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)726 int32_t HRilSim::GetSimIOResponse(
727 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
728 {
729 if ((response == nullptr && responseLen != 0) ||
730 (response != nullptr && responseLen != sizeof(HRilSimIOResponse))) {
731 TELEPHONY_LOGE("Invalid response: Vendor exception!");
732 return HRIL_ERR_GENERIC_FAILURE;
733 } else if (response == nullptr && responseLen == 0) {
734 if (responseInfo.error == HRilErrType::NONE) {
735 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
736 }
737 }
738 IccIoResultInfo result = ProcessIccIoResponse(responseInfo, response, responseLen);
739 return ResponseMessageParcel(responseInfo, result, requestNum);
740 }
741
GetSimStatusResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)742 int32_t HRilSim::GetSimStatusResponse(
743 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
744 {
745 CardStatusInfo rilCardStatus = {};
746 if ((response == nullptr && responseLen != 0) ||
747 (response != nullptr && responseLen != sizeof(HRilCardState))) {
748 TELEPHONY_LOGE("Invalid response: Vendor exception!");
749 return HRIL_ERR_GENERIC_FAILURE;
750 } else if (response == nullptr && responseLen == 0) {
751 if (responseInfo.error == HRilErrType::NONE) {
752 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
753 }
754 } else {
755 const HRilCardState *curPtr = static_cast<const HRilCardState *>(response);
756 rilCardStatus.index = curPtr->index;
757 rilCardStatus.simType = curPtr->simType;
758 rilCardStatus.simState = curPtr->simState;
759 }
760
761 return ResponseMessageParcel(responseInfo, rilCardStatus, requestNum);
762 }
763
GetImsiResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)764 int32_t HRilSim::GetImsiResponse(
765 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
766 {
767 if (response == nullptr) {
768 if (responseInfo.error == HRilErrType::NONE) {
769 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
770 }
771 }
772 std::unique_ptr<MessageParcel> parcel = std::make_unique<MessageParcel>();
773 if (parcel == nullptr) {
774 TELEPHONY_LOGE("parcel is nullptr");
775 return HRIL_ERR_NULL_POINT;
776 }
777 if (!parcel->WriteInterfaceToken(HRIL_INTERFACE_TOKEN)) {
778 TELEPHONY_LOGE("write interface token failed.");
779 return HRIL_ERR_GENERIC_FAILURE;
780 }
781 struct HdfSBuf *dataSbuf = ParcelToSbuf(parcel.get());
782 if (dataSbuf == nullptr) {
783 TELEPHONY_LOGE("Error : dataSbuf in GetImsiResponse is nullptr!");
784 return HRIL_ERR_NULL_POINT;
785 }
786 if (!HdfSbufWriteInt32(dataSbuf, GetSlotId())) {
787 HdfSbufRecycle(dataSbuf);
788 return HRIL_ERR_GENERIC_FAILURE;
789 }
790 if (!HdfSbufWriteUnpadBuffer(dataSbuf, (const uint8_t *)&responseInfo, sizeof(responseInfo))) {
791 TELEPHONY_LOGE("HdfSbufWriteUnpadBuffer in GetImsiResponse is failed!");
792 HdfSbufRecycle(dataSbuf);
793 return HRIL_ERR_GENERIC_FAILURE;
794 }
795 if (!HdfSbufWriteString(dataSbuf, (const char *)response)) {
796 TELEPHONY_LOGE("HdfSbufWriteString in GetImsiResponse is failed!");
797 HdfSbufRecycle(dataSbuf);
798 return HRIL_ERR_GENERIC_FAILURE;
799 }
800 int32_t ret = ServiceDispatcher(requestNum, dataSbuf);
801 if (ret != HRIL_ERR_SUCCESS) {
802 TELEPHONY_LOGE("ret in GetImsiResponse is not equal to HRIL_ERR_SUCCESS!");
803 HdfSbufRecycle(dataSbuf);
804 return HRIL_ERR_GENERIC_FAILURE;
805 }
806 HdfSbufRecycle(dataSbuf);
807
808 return HRIL_ERR_SUCCESS;
809 }
810
GetSimLockStatusResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)811 int32_t HRilSim::GetSimLockStatusResponse(
812 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
813 {
814 int32_t simLockStatus = 0;
815 if (response == nullptr || responseLen != sizeof(int32_t)) {
816 TELEPHONY_LOGE("GetSimStatusResponse: Invalid response");
817 if (responseInfo.error == HRilErrType::NONE) {
818 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
819 }
820 } else {
821 simLockStatus = *(static_cast<const int32_t *>(response));
822 }
823 std::unique_ptr<MessageParcel> parcel = std::make_unique<MessageParcel>();
824 if (parcel == nullptr) {
825 TELEPHONY_LOGE("parcel is nullptr");
826 return HRIL_ERR_NULL_POINT;
827 }
828 if (!parcel->WriteInterfaceToken(HRIL_INTERFACE_TOKEN)) {
829 TELEPHONY_LOGE("write interface token failed.");
830 return HRIL_ERR_GENERIC_FAILURE;
831 }
832 struct HdfSBuf *dataSbuf = ParcelToSbuf(parcel.get());
833 if (dataSbuf == nullptr) {
834 TELEPHONY_LOGE("GetSimLockStatusResponse dataSbuf is NULL.");
835 return HRIL_ERR_NULL_POINT;
836 }
837 if (!HdfSbufWriteInt32(dataSbuf, GetSlotId())) {
838 HdfSbufRecycle(dataSbuf);
839 return HRIL_ERR_GENERIC_FAILURE;
840 }
841 if (!HdfSbufWriteUnpadBuffer(dataSbuf, (const uint8_t *)&responseInfo, sizeof(responseInfo))) {
842 TELEPHONY_LOGE("HdfSbufWriteUnpadBuffer in GetSimLockStatusResponse is failed!");
843 HdfSbufRecycle(dataSbuf);
844 return HRIL_ERR_GENERIC_FAILURE;
845 }
846 if (!HdfSbufWriteInt32(dataSbuf, simLockStatus)) {
847 TELEPHONY_LOGE("HdfSbufWriteInt32 in GetSimLockStatusResponse is failed!");
848 HdfSbufRecycle(dataSbuf);
849 return HRIL_ERR_GENERIC_FAILURE;
850 }
851 int32_t ret = ServiceDispatcher(requestNum, dataSbuf);
852 if (ret != HRIL_ERR_SUCCESS) {
853 TELEPHONY_LOGE("ret in GetSimLockStatusResponse is not equal to HRIL_ERR_SUCCESS!");
854 HdfSbufRecycle(dataSbuf);
855 return HRIL_ERR_GENERIC_FAILURE;
856 }
857 HdfSbufRecycle(dataSbuf);
858 return HRIL_ERR_SUCCESS;
859 }
860
SetSimLockResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)861 int32_t HRilSim::SetSimLockResponse(
862 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
863 {
864 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
865 }
866
ChangeSimPasswordResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)867 int32_t HRilSim::ChangeSimPasswordResponse(
868 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
869 {
870 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
871 }
872
UnlockPinResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)873 int32_t HRilSim::UnlockPinResponse(
874 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
875 {
876 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
877 }
878
UnlockPukResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)879 int32_t HRilSim::UnlockPukResponse(
880 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
881 {
882 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
883 }
884
GetSimPinInputTimesResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)885 int32_t HRilSim::GetSimPinInputTimesResponse(
886 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
887 {
888 SimPinInputTimes pinInputTimesResult = {};
889 if ((response == nullptr && responseLen != 0) ||
890 (response != nullptr && responseLen != sizeof(HRilPinInputTimes))) {
891 TELEPHONY_LOGE("Invalid response: Vendor exception!");
892 return HRIL_ERR_GENERIC_FAILURE;
893 } else if (response == nullptr && responseLen == 0) {
894 if (responseInfo.error == HRilErrType::NONE) {
895 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
896 }
897 } else {
898 const HRilPinInputTimes *pPinInputTimes = static_cast<const HRilPinInputTimes *>(response);
899 pinInputTimesResult.code = pPinInputTimes->code;
900 pinInputTimesResult.times = pPinInputTimes->times;
901 pinInputTimesResult.pukTimes = pPinInputTimes->pukTimes;
902 pinInputTimesResult.pinTimes = pPinInputTimes->pinTimes;
903 pinInputTimesResult.puk2Times = pPinInputTimes->puk2Times;
904 pinInputTimesResult.pin2Times = pPinInputTimes->pin2Times;
905 }
906
907 return ResponseMessageParcel(responseInfo, pinInputTimesResult, requestNum);
908 }
909
UnlockPin2Response(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)910 int32_t HRilSim::UnlockPin2Response(
911 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
912 {
913 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
914 }
915
UnlockPuk2Response(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)916 int32_t HRilSim::UnlockPuk2Response(
917 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
918 {
919 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
920 }
921
GetSimPin2InputTimesResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)922 int32_t HRilSim::GetSimPin2InputTimesResponse(
923 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
924 {
925 SimPinInputTimes pin2InputTimesResult = {};
926 if (response == nullptr) {
927 if (responseInfo.error == HRilErrType::NONE) {
928 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
929 }
930 } else {
931 const HRilPinInputTimes *pPin2InputTimes = static_cast<const HRilPinInputTimes *>(response);
932 pin2InputTimesResult.code = pPin2InputTimes->code;
933 pin2InputTimesResult.times = pPin2InputTimes->times;
934 pin2InputTimesResult.pukTimes = pPin2InputTimes->pukTimes;
935 pin2InputTimesResult.pinTimes = pPin2InputTimes->pinTimes;
936 pin2InputTimesResult.puk2Times = pPin2InputTimes->puk2Times;
937 pin2InputTimesResult.pin2Times = pPin2InputTimes->pin2Times;
938 }
939
940 return ResponseMessageParcel(responseInfo, pin2InputTimesResult, requestNum);
941 }
942
SetActiveSimResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)943 int32_t HRilSim::SetActiveSimResponse(
944 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
945 {
946 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
947 }
948
SimStkSendTerminalResponseResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)949 int32_t HRilSim::SimStkSendTerminalResponseResponse(
950 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
951 {
952 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
953 }
954
SimStkSendEnvelopeResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)955 int32_t HRilSim::SimStkSendEnvelopeResponse(
956 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
957 {
958 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
959 }
960
SimStkIsReadyResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)961 int32_t HRilSim::SimStkIsReadyResponse(
962 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
963 {
964 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
965 }
966
SetRadioProtocolResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)967 int32_t HRilSim::SetRadioProtocolResponse(
968 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
969 {
970 SimProtocolResponse pSimProtocol = {};
971 if (response == nullptr) {
972 if (responseInfo.error == HRilErrType::NONE) {
973 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
974 }
975 } else {
976 const HRilSimProtocolResponse *pSimProtocolResponse = static_cast<const HRilSimProtocolResponse *>(response);
977 pSimProtocol.phase = pSimProtocolResponse->phase;
978 pSimProtocol.result = pSimProtocolResponse->result;
979 pSimProtocol.slotId = pSimProtocolResponse->slotId;
980 }
981
982 return ResponseMessageParcel(responseInfo, pSimProtocol, requestNum);
983 }
984
SimOpenLogicalChannelResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)985 int32_t HRilSim::SimOpenLogicalChannelResponse(
986 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
987 {
988 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
989 }
990
SimCloseLogicalChannelResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)991 int32_t HRilSim::SimCloseLogicalChannelResponse(
992 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
993 {
994 return ResponseRequestInfo(requestNum, &responseInfo, sizeof(responseInfo));
995 }
996
SimTransmitApduLogicalChannelResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)997 int32_t HRilSim::SimTransmitApduLogicalChannelResponse(
998 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
999 {
1000 IccIoResultInfo result = ProcessIccIoResponse(responseInfo, response, responseLen);
1001 return ResponseMessageParcel(responseInfo, result, requestNum);
1002 }
1003
UnlockSimLockResponse(int32_t requestNum,HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)1004 int32_t HRilSim::UnlockSimLockResponse(
1005 int32_t requestNum, HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
1006 {
1007 LockStatusResp lockStatus = {};
1008
1009 if (response == nullptr || responseLen != sizeof(HRilLockStatus)) {
1010 TELEPHONY_LOGE("Invalid response: response is nullptr");
1011 if (responseInfo.error == HRilErrType::NONE) {
1012 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
1013 }
1014 } else {
1015 const HRilLockStatus *resp = static_cast<const HRilLockStatus *>(response);
1016 lockStatus.result = resp->result;
1017 lockStatus.remain = resp->remain;
1018 }
1019 return ResponseMessageParcel(responseInfo, lockStatus, requestNum);
1020 }
1021
ProcessIccIoResponse(HRilRadioResponseInfo & responseInfo,const void * response,size_t responseLen)1022 IccIoResultInfo HRilSim::ProcessIccIoResponse(
1023 HRilRadioResponseInfo &responseInfo, const void *response, size_t responseLen)
1024 {
1025 IccIoResultInfo result = {};
1026 if (response == nullptr || responseLen != sizeof(HRilSimIOResponse)) {
1027 TELEPHONY_LOGE("Invalid response: response is nullptr");
1028 if (responseInfo.error == HRilErrType::NONE) {
1029 responseInfo.error = HRilErrType::HRIL_ERR_INVALID_RESPONSE;
1030 }
1031 result.response = std::string("");
1032 } else {
1033 const HRilSimIOResponse *resp = static_cast<const HRilSimIOResponse *>(response);
1034 result.sw1 = resp->sw1;
1035 result.sw2 = resp->sw2;
1036 if (resp->response == nullptr) {
1037 result.response = "";
1038 } else {
1039 result.response = std::string(resp->response);
1040 }
1041 }
1042 return result;
1043 }
1044
SimStateUpdated(int32_t notifyType,const HRilErrNumber e,const void * response,size_t responseLen)1045 int32_t HRilSim::SimStateUpdated(int32_t notifyType, const HRilErrNumber e, const void *response, size_t responseLen)
1046 {
1047 std::unique_ptr<MessageParcel> parcel = std::make_unique<MessageParcel>();
1048 if (parcel == nullptr) {
1049 TELEPHONY_LOGE("parcel is nullptr");
1050 return HRIL_ERR_NULL_POINT;
1051 }
1052 if (!parcel->WriteInterfaceToken(HRIL_INTERFACE_TOKEN)) {
1053 TELEPHONY_LOGE("write interface token failed.");
1054 return HRIL_ERR_GENERIC_FAILURE;
1055 }
1056 struct HdfSBuf *dataSbuf = ParcelToSbuf(parcel.get());
1057 if (dataSbuf == nullptr) {
1058 TELEPHONY_LOGE("GetSimLockStatusResponse dataSbuf is NULL.");
1059 return HRIL_ERR_NULL_POINT;
1060 }
1061 if (!HdfSbufWriteInt32(dataSbuf, GetSlotId())) {
1062 HdfSbufRecycle(dataSbuf);
1063 return HRIL_ERR_GENERIC_FAILURE;
1064 }
1065 int32_t ret = ServiceNotifyDispatcher(HNOTI_SIM_STATUS_CHANGED, dataSbuf);
1066 if (ret != HRIL_ERR_SUCCESS) {
1067 TELEPHONY_LOGE("ret in SimStateUpdated is not equal to HRIL_ERR_SUCCESS!");
1068 HdfSbufRecycle(dataSbuf);
1069 return HRIL_ERR_GENERIC_FAILURE;
1070 }
1071 if (dataSbuf != nullptr) {
1072 HdfSbufRecycle(dataSbuf);
1073 }
1074
1075 return HRIL_ERR_SUCCESS;
1076 }
1077
SimStkSessionEndNotify(int32_t notifyType,const HRilErrNumber e,const void * response,size_t responseLen)1078 int32_t HRilSim::SimStkSessionEndNotify(
1079 int32_t notifyType, const HRilErrNumber e, const void *response, size_t responseLen)
1080 {
1081 std::unique_ptr<MessageParcel> parcel = std::make_unique<MessageParcel>();
1082 if (parcel == nullptr) {
1083 TELEPHONY_LOGE("parcel is nullptr");
1084 return HRIL_ERR_NULL_POINT;
1085 }
1086 if (!parcel->WriteInterfaceToken(HRIL_INTERFACE_TOKEN)) {
1087 TELEPHONY_LOGE("write interface token failed.");
1088 return HRIL_ERR_GENERIC_FAILURE;
1089 }
1090 struct HdfSBuf *dataSbuf = ParcelToSbuf(parcel.get());
1091 if (dataSbuf == nullptr) {
1092 TELEPHONY_LOGE("GetSimLockStatusResponse dataSbuf is NULL.");
1093 return HRIL_ERR_NULL_POINT;
1094 }
1095 if (!HdfSbufWriteInt32(dataSbuf, GetSlotId())) {
1096 HdfSbufRecycle(dataSbuf);
1097 return HRIL_ERR_GENERIC_FAILURE;
1098 }
1099 int32_t ret = ServiceNotifyDispatcher(HNOTI_SIM_STK_SESSION_END_NOTIFY, dataSbuf);
1100 if (ret != HRIL_ERR_SUCCESS) {
1101 TELEPHONY_LOGE("ret in SimStkSessionEndNotify is not equal to HRIL_ERR_SUCCESS!");
1102 HdfSbufRecycle(dataSbuf);
1103 return HRIL_ERR_GENERIC_FAILURE;
1104 }
1105 if (dataSbuf != nullptr) {
1106 HdfSbufRecycle(dataSbuf);
1107 }
1108
1109 return HRIL_ERR_SUCCESS;
1110 }
1111
SimStkProactiveNotify(int32_t notifyType,const HRilErrNumber e,const void * response,size_t responseLen)1112 int32_t HRilSim::SimStkProactiveNotify(
1113 int32_t notifyType, const HRilErrNumber e, const void *response, size_t responseLen)
1114 {
1115 std::unique_ptr<MessageParcel> parcel = std::make_unique<MessageParcel>();
1116 if (parcel == nullptr) {
1117 TELEPHONY_LOGE("parcel in is nullptr");
1118 return HRIL_ERR_NULL_POINT;
1119 }
1120 if (!parcel->WriteInterfaceToken(HRIL_INTERFACE_TOKEN)) {
1121 TELEPHONY_LOGE("write interface token failed.");
1122 return HRIL_ERR_GENERIC_FAILURE;
1123 }
1124 struct HdfSBuf *dataSbuf = ParcelToSbuf(parcel.get());
1125 if (dataSbuf == nullptr) {
1126 TELEPHONY_LOGE("Error : dataSbuf in SimStkProactiveNotify is nullptr!");
1127 return HRIL_ERR_NULL_POINT;
1128 }
1129 if (!HdfSbufWriteInt32(dataSbuf, GetSlotId())) {
1130 HdfSbufRecycle(dataSbuf);
1131 return HRIL_ERR_GENERIC_FAILURE;
1132 }
1133 if (!HdfSbufWriteString(dataSbuf, (const char *)response)) {
1134 TELEPHONY_LOGE("HdfSbufWriteString in SimStkProactiveNotify is failed!");
1135 HdfSbufRecycle(dataSbuf);
1136 return HRIL_ERR_GENERIC_FAILURE;
1137 }
1138 int32_t ret = ServiceNotifyDispatcher(HNOTI_SIM_STK_PROACTIVE_NOTIFY, dataSbuf);
1139 if (ret != HRIL_ERR_SUCCESS) {
1140 TELEPHONY_LOGE("ret in SimStkProactiveNotify is not equal to HRIL_ERR_SUCCESS!");
1141 HdfSbufRecycle(dataSbuf);
1142 return HRIL_ERR_GENERIC_FAILURE;
1143 }
1144 HdfSbufRecycle(dataSbuf);
1145
1146 return HRIL_ERR_SUCCESS;
1147 }
1148
SimStkAlphaNotify(int32_t notifyType,const HRilErrNumber e,const void * response,size_t responseLen)1149 int32_t HRilSim::SimStkAlphaNotify(int32_t notifyType, const HRilErrNumber e, const void *response, size_t responseLen)
1150 {
1151 std::unique_ptr<MessageParcel> parcel = std::make_unique<MessageParcel>();
1152 if (parcel == nullptr) {
1153 TELEPHONY_LOGE("parcel in is nullptr");
1154 return HRIL_ERR_NULL_POINT;
1155 }
1156 if (!parcel->WriteInterfaceToken(HRIL_INTERFACE_TOKEN)) {
1157 TELEPHONY_LOGE("write interface token failed.");
1158 return HRIL_ERR_GENERIC_FAILURE;
1159 }
1160 struct HdfSBuf *dataSbuf = ParcelToSbuf(parcel.get());
1161 if (dataSbuf == nullptr) {
1162 TELEPHONY_LOGE("Error : dataSbuf in SimStkProactiveNotify is nullptr!");
1163 return HRIL_ERR_NULL_POINT;
1164 }
1165 if (!HdfSbufWriteInt32(dataSbuf, GetSlotId())) {
1166 HdfSbufRecycle(dataSbuf);
1167 return HRIL_ERR_GENERIC_FAILURE;
1168 }
1169 int32_t ret = ServiceNotifyDispatcher(HNOTI_SIM_STK_ALPHA_NOTIFY, dataSbuf);
1170 if (ret != HRIL_ERR_SUCCESS) {
1171 TELEPHONY_LOGE("ret in SimStkAlphaNotify is not equal to HRIL_ERR_SUCCESS!");
1172 HdfSbufRecycle(dataSbuf);
1173 return HRIL_ERR_GENERIC_FAILURE;
1174 }
1175 if (dataSbuf != nullptr) {
1176 HdfSbufRecycle(dataSbuf);
1177 }
1178
1179 return HRIL_ERR_SUCCESS;
1180 }
1181
IsSimResponse(uint32_t code)1182 bool HRilSim::IsSimResponse(uint32_t code)
1183 {
1184 return ((code >= HREQ_SIM_BASE) && (code < HREQ_DATA_BASE));
1185 }
1186
IsSimNotification(uint32_t code)1187 bool HRilSim::IsSimNotification(uint32_t code)
1188 {
1189 return ((code >= HNOTI_SIM_BASE) && (code < HNOTI_DATA_BASE));
1190 }
1191 } // namespace Telephony
1192 } // namespace OHOS
1193