blob: edcef9af28639e5cd2351c6b7a93a95b585a2d2f [file] [log] [blame]
liubin281ac462023-07-19 14:22:54 +08001#include "ql/ql_sim.h"
2#include "mbtk_type.h"
3#include "mbtk_info_api.h"
4
5extern mbtk_info_handle_t* ql_info_handle;
6extern int ql_info_handle_num;
7static bool inited = FALSE;
8
9QL_SIM_CardStatusIndMsgHandlerFunc_t handlerPtr_cb = NULL;
10
11typedef struct
12{
13 uint8 *operator_l;
14 uint8 *operator_s;
15 uint32 mcc_mnc;
16} operator_mcc_mnc_t;
17
18static operator_mcc_mnc_t operator_mcc_mnc[] =
19{
20 {"China Mobile","CMCC",46000},
21 {"China Unicom","CU",46001},
22 {"China Mobile","CMCC",46002},
23 {"China Telecom","CT",46003},
24 {"China Mobile","CMCC",46004},
25 {"China Telecom","CT",46005},
26 {"China Unicom","CU",46006},
27 {"China Mobile","CMCC",46007},
28 {"China Mobile","CMCC",46008},
29 {"China Unicom","CU",46009},
30 {"China Telecom","CT",46011}
31};
32
33void ql_sim_state_change_cb(const void* data, int data_len)
34{
35 if(handlerPtr_cb != NULL)
36 {
37 //QL_SIM_NFY_MSG_ID msg_id, void *pv_data, int pv_data_len, void *contextPtr
38 //handlerPtr_cb(net_data[2]);
39 }
40 mbtk_sim_card_info *info = NULL;
41 info = (mbtk_sim_card_info*)data;
42
43 QL_SIM_CARD_STATUS_INFO sim_card_info = {0};
44 sim_card_info.card_state = info->sim;
45 sim_card_info.card_type = info->sim_card_type;
46 /*
47 sim_client_handle_type h_sim,
48 E_QL_SIM_NFY_MSG_ID_T e_msg_id,
49 void *pv_data,
50 void *contextPtr
51 */
52 handlerPtr_cb(QL_SIM_CARD_STATUS_UPDATE_EVENT, &sim_card_info, sizeof(QL_SIM_CARD_STATUS_INFO), NULL);
53}
54
55QL_SIM_ERROR_CODE ql_sim_init()
56{
57 if(!inited && ql_info_handle == NULL)
58 {
59 ql_info_handle = mbtk_info_handle_get();
60 if(ql_info_handle)
61 {
62 ql_info_handle_num++;
63 inited = TRUE;
64 return QL_SIM_SUCCESS;
65 } else {
66 LOGE("mbtk_info_handle_get() fail.");
67 return QL_SIM_GENERIC_FAILURE;
68 }
69 } else {
70 if(!inited) {
71 ql_info_handle_num++;
72 inited = TRUE;
73 }
74 return QL_SIM_SUCCESS;
75 }
76}
77
78
79QL_SIM_ERROR_CODE ql_sim_release()
80{
81 if(ql_info_handle)
82 {
83 LOGD("ql_info_handle_num = %d", ql_info_handle_num);
84 if(ql_info_handle_num == 1) { // 最后一个引用,可释放。
85 int ret = mbtk_info_handle_free(&ql_info_handle);
86 if(ret) {
87 LOGE("mbtk_info_handle_free() fail.");
88 return QL_SIM_GENERIC_FAILURE;
89 }
90 else
91 {
92 ql_info_handle_num = 0;
93 ql_info_handle = NULL;
94 return QL_SIM_SUCCESS;
95 }
96 } else {
97 ql_info_handle_num--;
98 return QL_SIM_SUCCESS;
99 }
100 }
101 else
102 {
103 LOGE("Sim handle not inited.");
104 return QL_SIM_GENERIC_FAILURE;
105 }
106}
107
108
109QL_SIM_ERROR_CODE ql_sim_get_imsi(uint8_t *imsi, size_t imsiLen)
110{
111 if(ql_info_handle == NULL || imsi == NULL || imsiLen <= 0)
112 {
113 LOGE("ARG error.");
114 return QL_SIM_GENERIC_FAILURE;
115 }
116 memset(imsi,0,imsiLen);
117 int err = mbtk_imsi_get(ql_info_handle, imsi);
118 if(err) {
119 return QL_SIM_GENERIC_FAILURE;
120 } else {
121 return QL_SIM_SUCCESS;
122 }
123}
124
125QL_SIM_ERROR_CODE ql_sim_get_iccid(uint8_t *iccid, size_t iccidLen)
126{
127 if(ql_info_handle == NULL || iccid == NULL || iccidLen <= 0)
128 {
129 LOGE("ARG error.");
130 return QL_SIM_GENERIC_FAILURE;
131 }
132 memset(iccid, 0, iccidLen);
133 int err = mbtk_iccid_get(ql_info_handle, iccid);
134 if(err) {
135 return QL_SIM_GENERIC_FAILURE;
136 } else {
137 return QL_SIM_SUCCESS;
138 }
139}
140
141QL_SIM_ERROR_CODE ql_sim_get_phonenumber(uint8_t *phone_num, size_t phoneLen)
142{
143 if(ql_info_handle == NULL || phone_num == NULL || phoneLen <= 0)
144 {
145 LOGE("ARG error.");
146 return QL_SIM_GENERIC_FAILURE;
147 }
148 memset(phone_num, 0, phoneLen);
149 int err = mbtk_phone_number_get(ql_info_handle, phone_num);
150 if(err) {
151 return QL_SIM_GENERIC_FAILURE;
152 } else {
153 return QL_SIM_SUCCESS;
154 }
155}
156
157QL_SIM_ERROR_CODE ql_sim_get_operator_plmn_list(QL_SIM_PREFERRED_OPERATOR_LIST *pt_info)
158{
159 if(ql_info_handle == NULL || pt_info == NULL)
160 {
161 LOGE("ARG error.");
162 return QL_SIM_GENERIC_FAILURE;
163 }
164
165 mbtk_plmn_info plmn;
166 int err = mbtk_get_plmn_list(ql_info_handle, &plmn);
167 if(err) {
168 LOGE("mbtk_get_plmn_list file : %d",err);
169 return QL_SIM_GENERIC_FAILURE;
170 } else {
171 memset(pt_info, 0x0, sizeof(QL_SIM_PREFERRED_OPERATOR_LIST));
172 pt_info->preferred_operator_list_num = plmn.count;
173 int list_count;
174 for(list_count = 0; list_count < plmn.count; list_count++)
175 {
176 if(plmn.mbtk_plmn_name[list_count].format == 2) //number
177 {
178 uint32 plmn_name = (uint32)atoi(plmn.mbtk_plmn_name[list_count].plmn_name);
179 sprintf(pt_info->preferred_operator_list[list_count].mcc,"%d",plmn_name/100);
180 sprintf(pt_info->preferred_operator_list[list_count].mnc,"%02d",plmn_name%100);
181 }
182 else if(plmn.mbtk_plmn_name[list_count].format == 0)
183 {
184 int i = 0;
185 while(i < ARRAY_SIZE(operator_mcc_mnc))
186 {
187 if(!strcmp(operator_mcc_mnc[i].operator_l,plmn.mbtk_plmn_name))
188 break;
189 i++;
190 }
191
192 if(i == ARRAY_SIZE(operator_mcc_mnc)) // No found mcc&mnc
193 {
194 memcpy(pt_info->preferred_operator_list[list_count].mcc,0,3);
195 memcpy(pt_info->preferred_operator_list[list_count].mnc,0,3);
196 }
197 else
198 {
199 sprintf(pt_info->preferred_operator_list[list_count].mcc, "%d", (operator_mcc_mnc[i].mcc_mnc)/100);
200 sprintf(pt_info->preferred_operator_list[list_count].mnc, "%d", (operator_mcc_mnc[i].mcc_mnc)%100);
201 }
202 }
203 else
204 {
205 int i = 0;
206 while(i < ARRAY_SIZE(operator_mcc_mnc))
207 {
208 if(!strcmp(operator_mcc_mnc[i].operator_s,plmn.mbtk_plmn_name))
209 break;
210 i++;
211 }
212
213 if(i == ARRAY_SIZE(operator_mcc_mnc)) // No found mcc&mnc
214 {
215 memcpy(pt_info->preferred_operator_list[list_count].mcc,0,3);
216 memcpy(pt_info->preferred_operator_list[list_count].mnc,0,3);
217 }
218 else
219 {
220 sprintf(pt_info->preferred_operator_list[list_count].mcc, "%d", (operator_mcc_mnc[i].mcc_mnc)/100);
221 sprintf(pt_info->preferred_operator_list[list_count].mnc, "%d", (operator_mcc_mnc[i].mcc_mnc)%100);
222 }
223 }
224 }
225 int i;
226 for (i=0;i<pt_info->preferred_operator_list_num;i++)
227 {
228 LOGD("pt_info->preferred_operator_list[%d].mcc=%s",i, pt_info->preferred_operator_list[i].mcc);
229 LOGD("pt_info->preferred_operator_list[%d].mnc=%s",i, pt_info->preferred_operator_list[i].mnc);
230 }
231 return QL_SIM_SUCCESS;
232 }
233}
234
235QL_SIM_ERROR_CODE ql_sim_verify_pin(QL_SIM_VERIFY_PIN_INFO *pt_info)
236{
237 if(ql_info_handle == NULL || pt_info == NULL)
238 {
239 LOGE("ARG error.");
240 return QL_SIM_GENERIC_FAILURE;
241 }
242
243 int err = mbtk_verify_pin(ql_info_handle, pt_info->pin_value);
244 if(err) {
245 LOGE("mbtk_verify_pin fail : %d",err);
246 return QL_SIM_GENERIC_FAILURE;
247 } else {
248 return QL_SIM_SUCCESS;
249 }
250}
251
252QL_SIM_ERROR_CODE ql_sim_change_pin(QL_SIM_CHANGE_PIN_INFO *pt_info)
253{
254 if(ql_info_handle == NULL || pt_info == NULL)
255 {
256 LOGE("ARG error.");
257 return QL_SIM_GENERIC_FAILURE;
258 }
259 mbtk_change_pin_info pin_info = {0};
260 memcpy(pin_info.old_pin_value, pt_info->old_pin_value, strlen(pt_info->old_pin_value));
261 memcpy(pin_info.new_pin_value, pt_info->new_pin_value, strlen(pt_info->new_pin_value));
262 int err = mbtk_change_pin(ql_info_handle, &pin_info);
263 if(err) {
264 LOGE("mbtk_change_pin fail : %d",err);
265 return QL_SIM_GENERIC_FAILURE;
266 } else {
267 return QL_SIM_SUCCESS;
268 }
269}
270
271QL_SIM_ERROR_CODE ql_sim_unblock_pin(QL_SIM_UNBLOCK_PIN_INFO *pt_info)
272{
273 if(ql_info_handle == NULL || pt_info == NULL)
274 {
275 LOGE("ARG error.");
276 return QL_SIM_GENERIC_FAILURE;
277 }
278 mbtk_unlock_pin_info puk_pin_info = {0};
279 memcpy(puk_pin_info.pin_value, pt_info->new_pin_value, strlen(pt_info->new_pin_value));
280 memcpy(puk_pin_info.puk_value, pt_info->puk_value, strlen(pt_info->puk_value));
281 int err = mbtk_unlock_pin(ql_info_handle, &puk_pin_info);
282 if(err) {
283 LOGE("mbtk_unlock_pin fail : %d",err);
284 return QL_SIM_GENERIC_FAILURE;
285 } else {
286 return QL_SIM_SUCCESS;
287 }
288}
289
290QL_SIM_ERROR_CODE ql_sim_enable_pin(QL_SIM_VERIFY_PIN_INFO *pt_info)
291{
292 if(ql_info_handle == NULL || pt_info == NULL)
293 {
294 LOGE("ARG error.");
295 return QL_SIM_GENERIC_FAILURE;
296 }
297 mbtk_enable_pin_info pin_info = {0};
298 memcpy(pin_info.pin_value, pt_info->pin_value, strlen(pt_info->pin_value));
299 pin_info.enable = 1;
300 int err = mbtk_enable_pin(ql_info_handle, &pin_info);
301 if(err) {
302 LOGE("mbtk_enable_pin fail : %d",err);
303 return QL_SIM_GENERIC_FAILURE;
304 } else {
305 return QL_SIM_SUCCESS;
306 }
307}
308
309QL_SIM_ERROR_CODE ql_sim_disable_pin(QL_SIM_VERIFY_PIN_INFO *pt_info)
310{
311 if(ql_info_handle == NULL || pt_info == NULL)
312 {
313 LOGE("ARG error.");
314 return QL_SIM_GENERIC_FAILURE;
315 }
316 mbtk_enable_pin_info pin_info = {0};
317 memcpy(pin_info.pin_value, pt_info->pin_value, strlen(pt_info->pin_value));
318 pin_info.enable = 0;
319 int err = mbtk_enable_pin(ql_info_handle, &pin_info);
320 if(err) {
321 LOGE("ql_sim_disable_pin fail : %d",err);
322 return QL_SIM_GENERIC_FAILURE;
323 } else {
324 return QL_SIM_SUCCESS;
325 }
326}
327
328QL_SIM_ERROR_CODE ql_sim_get_card_status(QL_SIM_CARD_STATUS_INFO *pt_info)
329{
330 if(ql_info_handle == NULL || pt_info == NULL)
331 {
332 LOGE("sim not init.");
333 return QL_SIM_GENERIC_FAILURE;
334 }
335
336 mbtk_sim_state_enum sim;
337 mbtk_sim_card_type_enum sim_card_type;
338 mbtk_pin_puk_last_times ql_last_times = {0};
339 int err = mbtk_sim_state_get(ql_info_handle, &sim);
340 LOGD("mbtk_sim_state_get - %d");
341 if(err) {
342 return QL_SIM_GENERIC_FAILURE;
343 } else {
344 memset(pt_info, 0x0, sizeof(QL_SIM_CARD_STATUS_INFO));
345 pt_info->card_state = sim;
346 switch (sim)
347 {
348 case 0: //ABSENT
349 pt_info->card_state = QL_SIM_STAT_NOT_INSERTED;
350 break;
351 case 1: //NOT READY
352 pt_info->card_state = QL_SIM_STAT_UNKNOWN;
353 break;
354 case 2: //READY
355 pt_info->card_state = QL_SIM_STAT_READY;
356 break;
357 case 3: //SIM PIN
358 pt_info->card_state = QL_SIM_STAT_SIM_PIN;
359 break;
360 case 4: //SIM PUK
361 pt_info->card_state = QL_SIM_STAT_SIM_PUK;
362 break;
363 case 5: //NETWORK
364 pt_info->card_state = QL_SIM_STAT_UNKNOWN;
365 break;
366 default:
367 pt_info->card_state = QL_SIM_STAT_UNKNOWN;
368 break;
369 }
370 }
371 err = mbtk_sim_card_type_get(ql_info_handle, &sim_card_type);
372 LOGD("mbtk_sim_card_type_get - %d", err);
373 if(err) {
374 return QL_SIM_GENERIC_FAILURE;
375 } else {
376 if(sim_card_type == 0 || sim_card_type == 2)
377 pt_info->card_type = QL_SIM_CARD_TYPE_ICC;
378 else if(sim_card_type == 1 || sim_card_type == 3)
379 pt_info->card_type = QL_SIM_CARD_TYPE_UICC;
380 else
381 pt_info->card_type = QL_SIM_CARD_TYPE_UNKNOWN;
382 }
383 err = mbtk_pin_last_num_get(ql_info_handle, &ql_last_times);
384 LOGD("mbtk_pin_last_num_get - %d", err);
385 if(err) {
386 return QL_SIM_GENERIC_FAILURE;
387 } else {
388 pt_info->card_pin_info.pin1_num_retries = ql_last_times.p1_retry;
389 pt_info->card_pin_info.pin2_num_retries = ql_last_times.p2_retry;
390 pt_info->card_pin_info.puk1_num_retries = ql_last_times.puk1_retry;
391 pt_info->card_pin_info.puk2_num_retries = ql_last_times.puk2_retry;
392 }
393 return QL_SIM_SUCCESS;
394}
395
396QL_SIM_ERROR_CODE ql_sim_add_event_handler(QL_SIM_CardStatusIndMsgHandlerFunc_t handlerPtr, void* contextPtr)
397{
398 if(ql_info_handle == NULL || handlerPtr == NULL)
399 {
400 return QL_SIM_GENERIC_FAILURE;
401 }
402 handlerPtr_cb = handlerPtr;
403 mbtk_sim_state_change_cb_reg(ql_info_handle, ql_sim_state_change_cb);
404 return QL_SIM_SUCCESS;
405}
406