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