4 * Copyright (c) 2013 Samsung Electronics Co. Ltd. All rights reserved.
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
28 #include <core_object.h>
39 #include "imc_common.h"
42 #define DISABLE_FLAG 2
44 #define VAL_MINUS_ONE (-1)
46 #define IMC_SIM_ACCESS_READ_BINARY 176
47 #define IMC_SIM_ACCESS_READ_RECORD 178
48 #define IMC_SIM_ACCESS_GET_RESPONSE 192
49 #define IMC_SIM_ACCESS_UPDATE_BINARY 214
50 #define IMC_SIM_ACCESS_UPDATE_RECORD 220
52 #define IMC_SIM_READ_FILE(co, cb, cb_data, fileId, ret) \
54 ImcSimMetaInfo file_meta = {0, }; \
55 ImcRespCbData *resp_cb_data = NULL; \
57 file_meta.file_id = fileId; \
58 file_meta.file_result = TEL_SIM_RESULT_FAILURE; \
60 resp_cb_data = imc_create_resp_cb_data(cb, cb_data, &file_meta, sizeof(ImcSimMetaInfo)); \
62 ret = __imc_sim_get_response(co, resp_cb_data); \
63 dbg("Request reading '%s' - [%s]", #fileId, (ret == TEL_RETURN_SUCCESS ? "SUCCESS" : "FAILURE")); \
67 IMC_SIM_FILE_TYPE_DEDICATED = 0x00, /**< Dedicated */
68 IMC_SIM_FILE_TYPE_TRANSPARENT = 0x01, /**< Transparent -binary type*/
69 IMC_SIM_FILE_TYPE_LINEAR_FIXED = 0x02, /**< Linear fixed - record type*/
70 IMC_SIM_FILE_TYPE_CYCLIC = 0x04, /**< Cyclic - record type*/
71 IMC_SIM_FILE_TYPE_INVALID_TYPE = 0xFF /**< Invalid type */
75 IMC_SIM_CURR_SEC_OP_PIN1_VERIFY,
76 IMC_SIM_CURR_SEC_OP_PIN2_VERIFY,
77 IMC_SIM_CURR_SEC_OP_PUK1_VERIFY,
78 IMC_SIM_CURR_SEC_OP_PUK2_VERIFY,
79 IMC_SIM_CURR_SEC_OP_SIM_VERIFY,
80 IMC_SIM_CURR_SEC_OP_ADM_VERIFY,
81 IMC_SIM_CURR_SEC_OP_PIN1_CHANGE,
82 IMC_SIM_CURR_SEC_OP_PIN2_CHANGE,
83 IMC_SIM_CURR_SEC_OP_PIN1_ENABLE,
84 IMC_SIM_CURR_SEC_OP_PIN1_DISABLE,
85 IMC_SIM_CURR_SEC_OP_PIN2_ENABLE,
86 IMC_SIM_CURR_SEC_OP_PIN2_DISABLE, // 10
87 IMC_SIM_CURR_SEC_OP_SIM_ENABLE,
88 IMC_SIM_CURR_SEC_OP_SIM_DISABLE,
89 IMC_SIM_CURR_SEC_OP_NET_ENABLE,
90 IMC_SIM_CURR_SEC_OP_NET_DISABLE,
91 IMC_SIM_CURR_SEC_OP_NS_ENABLE,
92 IMC_SIM_CURR_SEC_OP_NS_DISABLE,
93 IMC_SIM_CURR_SEC_OP_SP_ENABLE,
94 IMC_SIM_CURR_SEC_OP_SP_DISABLE,
95 IMC_SIM_CURR_SEC_OP_CP_ENABLE,
96 IMC_SIM_CURR_SEC_OP_CP_DISABLE, // 20
97 IMC_SIM_CURR_SEC_OP_FDN_ENABLE,
98 IMC_SIM_CURR_SEC_OP_FDN_DISABLE,
99 IMC_SIM_CURR_SEC_OP_PIN1_STATUS,
100 IMC_SIM_CURR_SEC_OP_PIN2_STATUS,
101 IMC_SIM_CURR_SEC_OP_FDN_STATUS,
102 IMC_SIM_CURR_SEC_OP_NET_STATUS,
103 IMC_SIM_CURR_SEC_OP_NS_STATUS,
104 IMC_SIM_CURR_SEC_OP_SP_STATUS,
105 IMC_SIM_CURR_SEC_OP_CP_STATUS,
106 IMC_SIM_CURR_SEC_OP_SIM_STATUS,
107 IMC_SIM_CURR_SEC_OP_SIM_UNKNOWN = 0xff
111 guint smsp_count; /**< SMSP record count */
112 guint smsp_rec_len; /**< SMSP record length */
113 guint mb_rec_len; /**< MBDN record length */
117 gboolean b_valid; /**< Valid or not */
118 guint rec_length; /**< Length of one record in file */
119 guint rec_count; /**< Number of records in file */
120 guint data_size; /**< File size */
121 guint current_index; /**< Current index to read */
122 guint mb_count; /**< Current mbdn read index */
123 int mb_index[TEL_SIM_MSP_CNT_MAX * TEL_SIM_MAILBOX_TYPE_MAX]; /**< List of mbdn index to read */
124 int mbdn_index; /**< MBDN index to set mb_data */
125 TelSimMailBoxNumber *mb_data; /**< Set MailBox data */
126 ImcSimFileType file_type; /**< File type and structure */
127 ImcSimCurrSecOp sec_op; /**< Current index to read */
128 TelSimFileId file_id; /**< Current file id */
129 TelSimResult file_result; /**< File access result */
130 TelSimFileResult files; /**< File read data */
131 TcoreCommand req_command; /**< Request command Id */
132 TelSimImsiInfo imsi; /**< Stored locally as of now,
133 Need to store in secure storage */
136 /* Utility Function Declaration */
137 static TelSimResult __imc_sim_decode_status_word(unsigned short status_word1, unsigned short status_word2);
138 static void __imc_sim_update_sim_status(CoreObject *co, TelSimCardStatus sim_status);
139 static void __imc_sim_notify_sms_state(CoreObject *co, gboolean sms_ready);
140 static TelReturn __imc_sim_start_to_cache(CoreObject *co);
141 static TelReturn __imc_sim_get_sim_type(CoreObject *co,
142 TcoreObjectResponseCallback cb, void *cb_data);
143 static void __imc_sim_next_from_read_binary(CoreObject *co,
144 ImcRespCbData *resp_cb_data, TelSimResult sim_result, gboolean decode_ret);
145 static void __imc_sim_next_from_get_response(CoreObject *co,
146 ImcRespCbData *resp_cb_data, TelSimResult sim_result);
147 static void __sim_set_mailbox_info(CoreObject *co, ImcRespCbData *resp_cb_data);
148 static TelReturn __imc_sim_update_file(CoreObject *co,
149 ImcRespCbData *resp_cb_data, int cmd, TelSimFileId ef,
150 int p1, int p2, int p3, char *encoded_data);
151 static void __imc_sim_read_record(CoreObject *co, ImcRespCbData *resp_cb_data);
152 static void __imc_sim_read_binary(CoreObject *co, ImcRespCbData *resp_cb_data);
153 static TelReturn __imc_sim_get_response (CoreObject *co, ImcRespCbData *resp_cb_data);
154 static TelReturn __imc_sim_get_retry_count(CoreObject *co, ImcRespCbData *resp_cb_data);
155 static TelSimLockType __imc_sim_lock_type(int lock_type);
156 static char *__imc_sim_get_fac_from_lock_type(TelSimLockType lock_type,
157 ImcSimCurrSecOp *sec_op, int flag);
158 static int __imc_sim_get_lock_type(ImcSimCurrSecOp sec_op);
160 /* Internal Response Functions*/
161 static void __on_response_imc_sim_get_sim_type_internal(CoreObject *co, gint result, const void *response, void *user_data);
162 static void __on_response_imc_sim_get_sim_type(TcorePending *p, guint data_len, const void *data, void *user_data);
163 static void __on_response_imc_sim_read_data(TcorePending *p, guint data_len, const void *data, void *user_data);
164 static void __on_response_imc_sim_get_response(TcorePending *p, guint data_len, const void *data, void *user_data);
165 static void __on_response_imc_sim_get_retry_count(TcorePending *p, guint data_len, const void *data, void *user_data);
166 static void __on_response_imc_sim_update_file(TcorePending *p, guint data_len, const void *data, void *user_data);
169 __imc_sim_convert_cme_error_tel_sim_result(const TcoreAtResponse *at_resp)
172 TelSimResult result = TEL_SIM_RESULT_FAILURE;
174 GSList *tokens = NULL;
178 if (!at_resp || !at_resp->lines) {
179 err("Invalid response data");
183 line = (const gchar *)at_resp->lines->data;
184 tokens = tcore_at_tok_new(line);
185 if (g_slist_length(tokens) > 0) {
189 resp_str = g_slist_nth_data(tokens, 0);
191 err("Invalid CME Error data");
192 tcore_at_tok_free(tokens);
195 cme_err = atoi(resp_str);
196 dbg("CME error[%d]", cme_err);
200 result = TEL_SIM_RESULT_OPERATION_NOT_PERMITTED;
204 result = TEL_SIM_RESULT_OPERATION_NOT_SUPPORTED;
211 result = TEL_SIM_RESULT_CARD_ERROR;
220 result = TEL_SIM_RESULT_PIN_REQUIRED;
227 result = TEL_SIM_RESULT_PUK_REQUIRED;
231 result = TEL_SIM_RESULT_INCORRECT_PASSWORD;
236 result = TEL_SIM_RESULT_MEMORY_FAILURE;
240 result = TEL_SIM_RESULT_INVALID_PARAMETER;
244 result = TEL_SIM_RESULT_FAILURE;
247 tcore_at_tok_free(tokens);
252 /* GET SMSP info for SMS module */
253 gboolean imc_sim_get_smsp_info(TcorePlugin *plugin, int *rec_count, int *rec_len)
255 CoreObject *co = NULL;
256 ImcSimPrivateInfo *priv_info = NULL;
260 co = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_SIM);
261 priv_info = tcore_sim_ref_userdata(co);
265 *rec_count = priv_info->smsp_count;
266 *rec_len = priv_info->smsp_rec_len;
268 dbg("smsp_count:[%d], smsp_rec_len:[%d]", priv_info->smsp_count, priv_info->smsp_rec_len);
272 static void __imc_sim_set_identity(CoreObject *co, TelSimImsiInfo *imsi)
274 gchar new_imsi[15 + 1] = {0, };
277 memcpy(&new_imsi, imsi->mcc, strlen(imsi->mcc));
278 memcpy(&new_imsi[strlen(imsi->mcc)], imsi->mnc, strlen(imsi->mnc));
279 memcpy(&new_imsi[strlen(imsi->mcc) + strlen(imsi->mnc)], imsi->msin, strlen(imsi->msin));
281 /* TODO: This is temporary code, we should use secure storage instead of vconf */
282 old_imsi = vconf_get_str("db/telephony/imsi");
284 if (g_strcmp0(old_imsi, new_imsi) != 0) {
286 vconf_set_str("db/telephony/imsi", new_imsi);
287 tcore_sim_set_identification(co, TRUE);
290 tcore_sim_set_identification(co, FALSE);
293 dbg("Old IMSI value is NULL, set IMSI");
294 vconf_set_str("db/telephony/imsi", new_imsi);
295 tcore_sim_set_identification(co, TRUE);
299 /* Utility Functions */
300 static TelSimResult __imc_sim_decode_status_word(unsigned short status_word1, unsigned short status_word2)
302 TelSimResult rst = TEL_SIM_RESULT_FAILURE;
304 if (status_word1 == 0x93 && status_word2 == 0x00) {
305 /*Failed SIM request command*/
306 dbg("error - SIM application toolkit busy [%x][%x]", status_word1, status_word2);
307 } else if (status_word1 == 0x94 && status_word2 == 0x00) {
308 /*Failed SIM request command*/
309 dbg("error - No EF Selected [%x][%x]", status_word1, status_word2);
310 } else if (status_word1 == 0x94 && status_word2 == 0x02) {
311 /*Failed SIM request command*/
312 dbg("error - Out of Range - Invalid address or record number[%x][%x]",
313 status_word1, status_word2);
314 } else if (status_word1 == 0x94 && status_word2 == 0x04) {
315 /*Failed SIM request command*/
316 dbg("error - File ID not found [%x][%x]", status_word1, status_word2);
317 } else if (status_word1 == 0x94 && status_word2 == 0x08) {
318 /*Failed SIM request command*/
319 dbg("error - File is inconsistent with command - Modem not support or USE IPC [%x][%x]",
320 status_word1, status_word2);
321 } else if (status_word1 == 0x98 && status_word2 == 0x02) {
322 /*Failed SIM request command*/
323 dbg("error - CHV not initialized [%x][%x]", status_word1, status_word2);
324 } else if (status_word1 == 0x98 && status_word2 == 0x04) {
325 /*Failed SIM request command*/
326 dbg("error - Access condition not fullfilled [%x][%x]", status_word1, status_word2);
327 dbg("error -Unsuccessful CHV verification - at least one attempt left [%x][%x]",
328 status_word1, status_word2);
329 dbg("error - Unsuccessful Unblock CHV - at least one attempt left [%x][%x]",
330 status_word1, status_word2);
331 dbg("error - Authentication failure [%x][%x]", status_word1, status_word2);
332 } else if (status_word1 == 0x98 && status_word2 == 0x08) {
333 /*Failed SIM request command*/
334 dbg("error - Contradiction with CHV status [%x][%x]", status_word1, status_word2);
335 } else if (status_word1 == 0x98 && status_word2 == 0x10) {
336 /*Failed SIM request command*/
337 dbg("error - Contradiction with invalidation status [%x][%x]",
338 status_word1, status_word2);
339 } else if (status_word1 == 0x98 && status_word2 == 0x40) {
340 /*Failed SIM request command*/
341 dbg("error -Unsuccessful CHV verification - no attempt left [%x][%x]",
342 status_word1, status_word2);
343 dbg("error - Unsuccessful Unblock CHV - no attempt left [%x][%x]",
344 status_word1, status_word2);
345 dbg("error - CHV blocked [%x][%x]", status_word1, status_word2);
346 } else if (status_word1 == 0x67 && status_word2 == 0x00) {
347 dbg("error -Incorrect Parameter 3 [%x][%x]", status_word1, status_word2);
348 } else if (status_word1 == 0x6B && status_word2 == 0x00) {
349 dbg("error -Incorrect Parameter 1 or 2 [%x][%x]", status_word1, status_word2);
350 } else if (status_word1 == 0x6D && status_word2 == 0x00) {
351 dbg("error -Unknown instruction given as command [%x][%x]", status_word1, status_word2);
352 } else if (status_word1 == 0x6E && status_word2 == 0x00) {
353 dbg("error -Unknown instruction given as command [%x][%x]", status_word1, status_word2);
354 } else if (status_word1 == 0x69 && status_word2 == 0x82) {
355 dbg("error -Access denied [%x][%x]", status_word1, status_word2);
356 } else if (status_word1 == 0x6A && status_word2 == 0x87) {
357 dbg("error -Incorrect parameters [%x][%x]", status_word1, status_word2);
358 } else if (status_word1 == 0x6A && status_word2 == 0x82) {
359 dbg("error -File Not found [%x][%x]", status_word1, status_word2);
360 } else if (status_word1 == 0x6A && status_word2 == 0x83) {
361 dbg("error -Record Not found [%x][%x]", status_word1, status_word2);
363 rst = TEL_SIM_RESULT_CARD_ERROR;
364 dbg("error -Unknown state [%x][%x]", status_word1, status_word2);
369 static void __imc_sim_update_sim_status(CoreObject *co, TelSimCardStatus sim_status)
371 TelSimCardStatus curr_sim_status;
374 * Send SIM Init status, if not sent already
376 (void)tcore_sim_get_status(co, &curr_sim_status);
377 if (sim_status != curr_sim_status) {
378 TelSimCardStatusInfo sim_status_noti = {0, };
380 dbg("Change in SIM State - Old State: [0x%02x] --> New State: [0x%02x]",
381 curr_sim_status, sim_status);
383 /* Update SIM Status */
384 tcore_sim_set_status(co, sim_status);
385 sim_status_noti.status = sim_status;
386 tcore_sim_get_identification(co, &sim_status_noti.change_status);
388 /* Send notification: SIM Status */
389 tcore_object_send_notification(co,
390 TCORE_NOTIFICATION_SIM_STATUS,
391 sizeof(sim_status_noti), &sim_status_noti);
395 static void __imc_sim_notify_sms_state(CoreObject *co,
400 gboolean sms_status = FALSE;
404 plugin = tcore_object_ref_plugin(co);
405 co_sms = tcore_plugin_ref_core_object(plugin, CORE_OBJECT_TYPE_SMS);
406 tcore_check_return_assert(co_sms != NULL);
408 (void)tcore_sms_get_ready_status(co_sms, &sms_status);
409 if (sms_status == sms_ready) {
410 dbg("No change in SMS Status: [%s]",
411 (sms_status ? "INITIALIZED" : "UNINITIALIZED"));
413 TelSimCardStatus sim_status;
415 /* Update SMS State */
416 tcore_sms_set_ready_status(co_sms, sms_ready);
418 dbg("SMS Status - Changed [%s] --> [%s]",
419 (sms_status ? "INITIALIZED" : "UNINITIALIZED"),
420 (sms_ready ? "INITIALIZED" : "UNINITIALIZED"));
423 * Send SMS device ready notification, if SIM is initialiazed.
425 (void)tcore_sim_get_status(co, &sim_status);
426 if (sim_status == TEL_SIM_STATUS_SIM_INIT_COMPLETED) {
427 /* Send notification: SMS Device ready */
428 tcore_object_send_notification(co_sms,
429 TCORE_NOTIFICATION_SMS_DEVICE_READY,
430 sizeof(sms_ready), &sms_ready);
435 TelReturn __imc_sim_start_to_cache(CoreObject *co)
438 IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_IMSI, ret);
439 IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_CPHS_CPHS_INFO, ret);
440 IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_ICCID, ret);
441 IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_SPN, ret);
442 IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_SST, ret);
443 IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_ECC, ret);
444 IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_MSISDN, ret);
445 IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_SMSP, ret);
446 IMC_SIM_READ_FILE(co, NULL, NULL, TEL_SIM_EF_MBDN, ret);
450 static void __on_response_imc_sim_get_sim_type_internal(CoreObject *co,
451 gint result, const void *response, void *user_data)
453 dbg("SIM Response - SIM Type (internal): [+XUICC]");
455 if (result == TEL_SIM_RESULT_SUCCESS) {
456 TelSimCardType *sim_type = (TelSimCardType *)response;
457 dbg("SIM Type: [%d]", *sim_type);
459 /* Update SIM type */
460 tcore_sim_set_type(co, *sim_type);
461 if (*sim_type != TEL_SIM_CARD_TYPE_UNKNOWN) {
464 /* Start Caching SIM files */
465 ret = __imc_sim_start_to_cache(co);
466 dbg("ret:[%d]", ret);
468 /* Send SIM Type notification */
469 tcore_object_send_notification(co,
470 TCORE_NOTIFICATION_SIM_TYPE,
471 sizeof(TelSimCardType), sim_type);
476 static void __on_response_imc_sim_get_sim_type(TcorePending *p,
477 guint data_len, const void *data, void *user_data)
479 const TcoreAtResponse *at_resp = data;
480 CoreObject *co = tcore_pending_ref_core_object(p);
481 ImcRespCbData *resp_cb_data = user_data;
482 TelSimCardType sim_type = TEL_SIM_CARD_TYPE_UNKNOWN;
484 TelSimResult result = TEL_SIM_RESULT_FAILURE;
486 dbg("SIM Response - SIM Type: [+XUICC]");
488 tcore_check_return_assert(co != NULL);
489 tcore_check_return_assert(resp_cb_data != NULL);
491 if (at_resp && at_resp->success) {
492 if (at_resp->lines) {
496 line = (const gchar *)at_resp->lines->data;
503 tokens = tcore_at_tok_new(line);
506 if (g_slist_length(tokens) == 1) {
507 guint state = atoi(g_slist_nth_data(tokens, 0));
509 if (state == 0) /* 0 - 2G SIM */
510 sim_type = TEL_SIM_CARD_TYPE_GSM;
511 else if (state == 1) /* 1 - 3G SIM */
512 sim_type = TEL_SIM_CARD_TYPE_USIM;
514 result = TEL_SIM_RESULT_SUCCESS;
517 err("Invalid message");
520 tcore_at_tok_free(tokens);
524 /* Invoke callback */
525 if (resp_cb_data->cb)
526 resp_cb_data->cb(co, (gint)result, &sim_type, resp_cb_data->cb_data);
528 /* Free callback data */
529 imc_destroy_resp_cb_data(resp_cb_data);
533 * Operation - get_sim_type
536 * AT-Command: AT+XUICC?
538 * Response - sim_type (TelSimCardType)
539 * Success: (Single line) -
543 * +CME ERROR: <error>
545 TelReturn __imc_sim_get_sim_type(CoreObject *co,
546 TcoreObjectResponseCallback cb, void *cb_data)
548 ImcRespCbData *resp_cb_data;
551 /* Response callback data */
552 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
555 /* Send Request to modem */
556 ret = tcore_at_prepare_and_send_request(co,
557 "AT+XUICC?", "+XUICC:",
558 TCORE_AT_COMMAND_TYPE_SINGLELINE,
560 __on_response_imc_sim_get_sim_type, resp_cb_data,
561 on_send_imc_request, NULL);
562 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get SIM Type");
567 static void __imc_sim_process_sim_status(CoreObject *co, guint sim_state)
569 TelSimCardStatus sim_card_status;
573 sim_card_status = TEL_SIM_STATUS_CARD_NOT_PRESENT;
578 sim_card_status = TEL_SIM_STATUS_SIM_PIN_REQUIRED;
583 sim_card_status = TEL_SIM_STATUS_SIM_INITIALIZING;
584 dbg("PIN DISABLED AT BOOT UP");
588 sim_card_status = TEL_SIM_STATUS_SIM_INITIALIZING;
593 sim_card_status = TEL_SIM_STATUS_SIM_PUK_REQUIRED;
598 sim_card_status = TEL_SIM_STATUS_SIM_PUK_REQUIRED;
599 dbg("CARD PERMANENTLY BLOCKED");
603 sim_card_status = TEL_SIM_STATUS_CARD_ERROR;
604 dbg("SIM CARD ERROR");
608 sim_card_status = TEL_SIM_STATUS_SIM_INIT_COMPLETED;
609 dbg("SIM INIT COMPLETED");
613 sim_card_status = TEL_SIM_STATUS_CARD_ERROR;
614 dbg("SIM CARD ERROR");
618 sim_card_status = TEL_SIM_STATUS_CARD_REMOVED;
623 dbg("SIM SMS Ready");
625 /* Notify SMS status */
626 return __imc_sim_notify_sms_state(co, TRUE);
629 sim_card_status = TEL_SIM_STATUS_UNKNOWN;
630 dbg("SIM STATE UNKNOWN");
634 err("Unknown/Unsupported SIM state: [%d]", sim_state);
638 switch (sim_card_status) {
639 case TEL_SIM_STATUS_SIM_INIT_COMPLETED: {
640 TelSimCardType sim_type;
642 dbg("SIM INIT COMPLETED");
644 (void)tcore_sim_get_type(co, &sim_type);
645 if (sim_type == TEL_SIM_CARD_TYPE_UNKNOWN) {
647 * SIM is initialized for first time, need to
650 (void)__imc_sim_get_sim_type(co,
651 __on_response_imc_sim_get_sim_type_internal, NULL);
658 case TEL_SIM_STATUS_CARD_REMOVED:
659 dbg("SIM CARD REMOVED");
660 tcore_sim_set_type(co, TEL_SIM_CARD_TYPE_UNKNOWN);
663 case TEL_SIM_STATUS_CARD_NOT_PRESENT:
664 dbg("SIM CARD NOT PRESENT");
665 tcore_sim_set_type(co, TEL_SIM_CARD_TYPE_UNKNOWN);
668 case TEL_SIM_STATUS_CARD_ERROR:
669 dbg("SIM CARD ERROR");
670 tcore_sim_set_type(co, TEL_SIM_CARD_TYPE_UNKNOWN);
674 err("SIM Status: [0x%02x]", sim_card_status);
678 /* Update SIM Status */
679 return __imc_sim_update_sim_status(co, sim_card_status);
682 static void __on_response_imc_sim_get_sim_status(TcorePending *p,
683 guint data_len, const void *data, void *user_data)
685 const TcoreAtResponse *at_resp = data;
686 CoreObject *co = tcore_pending_ref_core_object(p);
687 ImcRespCbData *resp_cb_data = (ImcRespCbData *)user_data;
690 dbg("SIM Response - SIM status: [+XSIMSTATE]");
692 tcore_check_return_assert(co != NULL);
693 tcore_check_return_assert(resp_cb_data != NULL);
695 if (at_resp && at_resp->success) {
696 if (at_resp->lines) {
697 const gchar *line = NULL;
699 /* Process +XSIMSTATE response */
700 line = (const gchar *) (at_resp->lines->data);
703 guint sim_state, sms_state;
708 * +XSIMSTATE: <mode>,<SIM state>,<PB Ready>,<SMS Ready>
710 tokens = tcore_at_tok_new(line);
712 if (g_slist_length(tokens) == 4) {
714 sim_state = atoi(g_slist_nth_data(tokens, 1));
716 /* Process SIM Status */
717 __imc_sim_process_sim_status(co, sim_state);
720 sms_state = atoi(g_slist_nth_data(tokens, 3));
722 /* Notify SMS status */
723 __imc_sim_notify_sms_state(co, (sms_state > 0));
726 err("Invalid message");
729 tcore_at_tok_free(tokens);
734 /* Free callback data */
735 imc_destroy_resp_cb_data(resp_cb_data);
739 * Operation - get_sim_status
742 * AT-Command: AT+XSIMSTATE?
744 * Response - sim_status
745 * Success: (Single line) -
746 * +XSIMSTATE: <mode>,<SIM state>,<PB Ready>,<SMS Ready>
749 * +CME ERROR: <error>
751 static gboolean __imc_sim_get_sim_status(CoreObject *co,
752 TcoreObjectResponseCallback cb, void *cb_data)
754 ImcRespCbData *resp_cb_data;
757 /* Response callback data */
758 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
761 /* Send Request to modem */
762 ret = tcore_at_prepare_and_send_request(co,
763 "AT+XSIMSTATE?", "+XSIMSTATE:",
764 TCORE_AT_COMMAND_TYPE_SINGLELINE,
766 __on_response_imc_sim_get_sim_status, resp_cb_data,
767 on_send_imc_request, NULL);
768 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get SIM Status");
773 static void __imc_sim_next_from_read_binary(CoreObject *co, ImcRespCbData *resp_cb_data, TelSimResult sim_result, gboolean decode_ret)
775 ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
776 TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
780 dbg("[SIM]EF[0x%x] read sim_result[%d] Decode rt[%d]", file_meta->file_id, sim_result, decode_ret);
781 switch (file_meta->file_id) {
783 case TEL_SIM_EF_USIM_PL:
785 case TEL_SIM_EF_USIM_LI:
786 if (decode_ret == TRUE) {
787 if (resp_cb_data->cb)
788 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
790 tcore_sim_get_type(co, &card_type);
792 /* The ME requests the Extended Language Preference. The ME only requests the Language Preference (EFLP) if at least one of the following conditions holds:
793 - EFELP is not available;
794 - EFELP does not contain an Entry corresponding to a language specified in ISO 639[30];
795 - the ME does not support any of the languages in EFELP.
798 /* The ME only requests the Language Preference (EFPL) if at least one of the following conditions holds:
799 - if the EFLI has the value 'FFFF' in its highest priority position
800 - if the ME does not support any of the language codes indicated in EFLI , or if EFLI is not present
802 if (TEL_SIM_CARD_TYPE_GSM == card_type) {
803 if (file_meta->file_id == TEL_SIM_EF_LP) {
804 if (resp_cb_data->cb)
805 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
807 file_meta->file_id = TEL_SIM_EF_LP;
808 __imc_sim_get_response(co, resp_cb_data);
811 } else if (TEL_SIM_CARD_TYPE_USIM) {
812 if (file_meta->file_id == TEL_SIM_EF_LP || file_meta->file_id == TEL_SIM_EF_USIM_LI) {
813 file_meta->file_id = TEL_SIM_EF_ELP;
814 __imc_sim_get_response(co, resp_cb_data);
817 if (resp_cb_data->cb)
818 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
825 tcore_sim_get_type(co, &card_type);
826 if (TEL_SIM_CARD_TYPE_USIM == card_type) {
827 if (file_meta->current_index == file_meta->rec_count) {
828 if (resp_cb_data->cb)
829 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
831 file_meta->current_index++;
832 __imc_sim_read_record(co, resp_cb_data);
835 } else if (TEL_SIM_CARD_TYPE_GSM == card_type) {
836 if (resp_cb_data->cb)
837 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
839 dbg("[SIM DATA]Invalid CardType[%d] Unable to handle", card_type);
843 case TEL_SIM_EF_IMSI:
844 /* Update SIM INIT status - INIT COMPLETE */
845 __imc_sim_update_sim_status(co, TEL_SIM_STATUS_SIM_INIT_COMPLETED);
847 if (resp_cb_data->cb) {
848 resp_cb_data->cb(co, (gint)sim_result, &file_meta->imsi, resp_cb_data->cb_data);
850 file_meta->file_id = TEL_SIM_EF_CPHS_CPHS_INFO;
851 file_meta->file_result = TEL_SIM_RESULT_FAILURE;
852 __imc_sim_get_response(co, resp_cb_data);
857 case TEL_SIM_EF_MSISDN:
858 if (file_meta->current_index == file_meta->rec_count) {
860 dbg("rec_count [%d], msisdn_count[%d]", file_meta->rec_count,
861 file_meta->files.data.msisdn_list.count);
862 if (resp_cb_data->cb) {
863 resp_cb_data->cb(co, (gint)sim_result,
864 &file_meta->files.data.msisdn_list, resp_cb_data->cb_data);
868 for (i = 0; i < file_meta->files.data.msisdn_list.count; i++) {
869 tcore_free(file_meta->files.data.msisdn_list.list[i].alpha_id);
870 tcore_free(file_meta->files.data.msisdn_list.list[i].num);
872 tcore_free(file_meta->files.data.msisdn_list.list);
874 file_meta->current_index++;
875 __imc_sim_read_record(co, resp_cb_data);
881 if (file_meta->current_index == file_meta->rec_count) {
882 if (resp_cb_data->cb)
883 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
886 file_meta->current_index++;
887 __imc_sim_read_record(co, resp_cb_data);
893 if (file_meta->current_index == file_meta->rec_count) {
894 if (resp_cb_data->cb)
895 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
897 file_meta->current_index++;
898 __imc_sim_read_record(co, resp_cb_data);
903 case TEL_SIM_EF_USIM_MBI:
904 if (file_meta->current_index == file_meta->rec_count) {
905 if (file_meta->mb_data) {
907 for (i = 0; i < file_meta->files.data.mb.count; i++) {
908 if (file_meta->files.data.mb.list[i].mb_type
909 == file_meta->mb_data->mb_type)
910 file_meta->mbdn_index = file_meta->mb_index[i];
913 if(!file_meta->mbdn_index)
914 file_meta->mbdn_index = VAL_MINUS_ONE;
916 __sim_set_mailbox_info(co, resp_cb_data);
921 /* Init file_meta to read next EF file */
922 file_meta->rec_count = 0;
923 file_meta->current_index = 0;
924 file_meta->file_id = TEL_SIM_EF_MBDN;
926 /* Read MBDN record*/
927 dbg("Read MBDN record");
928 __imc_sim_get_response(co, resp_cb_data);
933 file_meta->current_index++;
935 __imc_sim_read_record(co, resp_cb_data);
941 case TEL_SIM_EF_MBDN:
942 case TEL_SIM_EF_CPHS_MAILBOX_NUMBERS:
943 if (file_meta->mb_count == file_meta->files.data.mb.count) {
944 if (resp_cb_data->cb)
945 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
947 file_meta->current_index = file_meta->mb_index[file_meta->mb_count];
948 __imc_sim_read_record(co, resp_cb_data);
953 case TEL_SIM_EF_USIM_CFIS:
954 case TEL_SIM_EF_USIM_MWIS:
955 case TEL_SIM_EF_CPHS_INFORMATION_NUMBERS:
956 if (file_meta->current_index == file_meta->rec_count) {
957 if (resp_cb_data->cb)
958 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
960 file_meta->current_index++;
961 __imc_sim_read_record(co, resp_cb_data);
966 case TEL_SIM_EF_CPHS_OPERATOR_NAME_STRING:
968 ImcSimMetaInfo *file_meta_new = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
970 file_meta->files.result = sim_result;
971 if (decode_ret == TRUE && sim_result == TEL_SIM_RESULT_SUCCESS) {
972 file_meta_new->files.data.cphs_net.full_name = file_meta->files.data.cphs_net.full_name;
973 dbg("file_meta_new->files.data.cphs_net.full_name[%s]", file_meta_new->files.data.cphs_net.full_name);
976 file_meta_new->file_id = TEL_SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING;
977 file_meta_new->file_result = TEL_SIM_RESULT_FAILURE;
979 __imc_sim_get_response(co, resp_cb_data);
984 case TEL_SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
985 if (resp_cb_data->cb)
986 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data.cphs_net, resp_cb_data->cb_data);
988 tcore_free(file_meta->files.data.cphs_net.full_name);
989 tcore_free(file_meta->files.data.cphs_net.short_name);
990 file_meta->files.data.cphs_net.full_name = NULL;
991 file_meta->files.data.cphs_net.short_name = NULL;
994 case TEL_SIM_EF_ICCID:
995 if (resp_cb_data->cb)
996 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data.iccid, resp_cb_data->cb_data);
999 case TEL_SIM_EF_SPDI: {
1001 dbg("spdi count[%d]", file_meta->files.data.spdi.count);
1003 if (resp_cb_data->cb)
1004 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
1006 /* Free resources */
1007 for (i = 0; i < file_meta->files.data.spdi.count; i++)
1008 tcore_free(file_meta->files.data.spdi.list[i].plmn);
1010 tcore_free(file_meta->files.data.spdi.list);
1014 case TEL_SIM_EF_SST:
1015 case TEL_SIM_EF_SPN:
1016 case TEL_SIM_EF_OPLMN_ACT:
1017 case TEL_SIM_EF_CPHS_CPHS_INFO:
1018 case TEL_SIM_EF_CPHS_CALL_FORWARD_FLAGS:
1019 case TEL_SIM_EF_CPHS_VOICE_MSG_WAITING:
1020 case TEL_SIM_EF_CPHS_DYNAMICFLAGS:
1021 case TEL_SIM_EF_CPHS_DYNAMIC2FLAG:
1022 case TEL_SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
1023 case TEL_SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2:
1024 if (resp_cb_data->cb)
1025 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
1029 err("File id not handled [0x%x]", file_meta->file_id);
1033 /* free resp_cb_data */
1034 imc_destroy_resp_cb_data(resp_cb_data);
1037 static void __imc_sim_next_from_get_response(CoreObject *co, ImcRespCbData *resp_cb_data, TelSimResult sim_result)
1039 ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
1040 TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
1042 dbg("EF[0x%x] access Result[%d]", file_meta->file_id, sim_result);
1044 file_meta->files.result = sim_result;
1045 if (file_meta->file_id != TEL_SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING &&
1046 file_meta->file_id != TEL_SIM_EF_USIM_MBI &&
1047 file_meta->file_id != TEL_SIM_EF_MBDN)
1048 memset(&file_meta->files.data, 0x00, sizeof(file_meta->files.data));
1050 if ((file_meta->file_id != TEL_SIM_EF_ELP && file_meta->file_id != TEL_SIM_EF_LP &&
1051 file_meta->file_id != TEL_SIM_EF_USIM_PL && file_meta->file_id != TEL_SIM_EF_CPHS_CPHS_INFO)
1052 && (sim_result != TEL_SIM_RESULT_SUCCESS)) {
1053 if (resp_cb_data->cb)
1054 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
1055 /* free resp_cb_data */
1056 imc_destroy_resp_cb_data(resp_cb_data);
1060 switch (file_meta->file_id) {
1061 case TEL_SIM_EF_ELP:
1062 if (sim_result == TEL_SIM_RESULT_SUCCESS) {
1063 dbg("[SIM DATA] exist EFELP/PL(0x2F05)");
1064 __imc_sim_read_binary(co, resp_cb_data);
1066 tcore_sim_get_type(co, &card_type);
1067 if (TEL_SIM_CARD_TYPE_GSM == card_type) {
1068 ImcSimMetaInfo file_meta_new = {0,};
1070 dbg("[SIM DATA]SIM_EF_ELP(2F05) access fail. Request SIM_EF_LP(0x6F05) info");
1071 /* The ME requests the Language Preference (EFLP) if EFELP is not available */
1072 file_meta_new.file_id = TEL_SIM_EF_LP;
1073 file_meta_new.file_result = TEL_SIM_RESULT_FAILURE;
1074 file_meta_new.req_command = TCORE_COMMAND_SIM_GET_LANGUAGE;
1076 memcpy(resp_cb_data->data, &file_meta_new, sizeof(ImcSimMetaInfo));
1078 __imc_sim_get_response(co, resp_cb_data);
1079 } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
1080 dbg(" [SIM DATA]fail to get Language information in USIM(EF-LI(6F05),EF-PL(2F05))");
1081 if (resp_cb_data->cb)
1082 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
1083 /* free resp_cb_data */
1084 imc_destroy_resp_cb_data(resp_cb_data);
1091 case TEL_SIM_EF_USIM_LI:
1092 if (sim_result == TEL_SIM_RESULT_SUCCESS) {
1093 dbg("[SIM DATA] exist EFLP/LI(0x6F05)");
1094 __imc_sim_read_binary(co, resp_cb_data);
1096 tcore_sim_get_type(co, &card_type);
1097 dbg("[SIM DATA]SIM_EF_LP/LI(6F05) access fail. Current CardType[%d]", card_type);
1098 if (TEL_SIM_CARD_TYPE_GSM == card_type) {
1099 if (resp_cb_data->cb)
1100 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
1101 /* free resp_cb_data */
1102 imc_destroy_resp_cb_data(resp_cb_data);
1106 /* if EFLI is not present, then the language selection shall be as defined in EFPL at the MF level */
1107 else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
1108 ImcSimMetaInfo file_meta_new = {0,};
1110 dbg("[SIM DATA] try USIM EFPL(0x2F05)");
1111 file_meta_new.file_id = TEL_SIM_EF_ELP;
1112 file_meta_new.file_result = TEL_SIM_RESULT_FAILURE;
1113 file_meta_new.req_command = TCORE_COMMAND_SIM_GET_LANGUAGE;
1115 memcpy(resp_cb_data->data, &file_meta_new, sizeof(ImcSimMetaInfo));
1117 __imc_sim_get_response(co, resp_cb_data);
1122 case TEL_SIM_EF_USIM_PL:
1123 if (sim_result == TEL_SIM_RESULT_SUCCESS) {
1124 dbg("[SIM DATA] exist EFELP/PL(0x2F05)");
1125 __imc_sim_read_binary(co, resp_cb_data);
1127 /* EFELIand EFPL not present, so set language count as zero and select ECC */
1129 " [SIM DATA]SIM_EF_USIM_PL(2A05) access fail. Request SIM_EF_ECC(0x6FB7) info");
1130 if (resp_cb_data->cb)
1131 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
1132 /* free resp_cb_data */
1133 imc_destroy_resp_cb_data(resp_cb_data);
1139 case TEL_SIM_EF_ECC:
1140 tcore_sim_get_type(co, &card_type);
1141 if (TEL_SIM_CARD_TYPE_GSM == card_type) {
1142 __imc_sim_read_binary(co, resp_cb_data);
1143 } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
1144 if (file_meta->rec_count > TEL_SIM_ECC_LIST_MAX) {
1145 file_meta->rec_count = TEL_SIM_ECC_LIST_MAX;
1147 file_meta->current_index++;
1148 __imc_sim_read_record(co, resp_cb_data);
1152 case TEL_SIM_EF_ICCID:
1153 case TEL_SIM_EF_IMSI:
1154 case TEL_SIM_EF_SST:
1155 case TEL_SIM_EF_SPN:
1156 case TEL_SIM_EF_SPDI:
1157 case TEL_SIM_EF_CPHS_CALL_FORWARD_FLAGS:
1158 case TEL_SIM_EF_CPHS_VOICE_MSG_WAITING:
1159 case TEL_SIM_EF_CPHS_OPERATOR_NAME_STRING:
1160 case TEL_SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
1161 case TEL_SIM_EF_CPHS_DYNAMICFLAGS:
1162 case TEL_SIM_EF_CPHS_DYNAMIC2FLAG:
1163 case TEL_SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
1164 case TEL_SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE_LINE2:
1165 __imc_sim_read_binary(co, resp_cb_data);
1168 case TEL_SIM_EF_CPHS_CPHS_INFO:
1169 if (sim_result == TEL_SIM_RESULT_SUCCESS) {
1170 tcore_sim_set_cphs_status(co, TRUE);
1171 __imc_sim_read_binary(co, resp_cb_data);
1173 tcore_sim_set_cphs_status(co, FALSE);
1174 if (resp_cb_data->cb)
1175 resp_cb_data->cb(co, (gint)sim_result, &file_meta->files.data, resp_cb_data->cb_data);
1177 /* free resp_cb_data */
1178 imc_destroy_resp_cb_data(resp_cb_data);
1183 case TEL_SIM_EF_USIM_CFIS:
1184 if (file_meta->rec_count > TEL_SIM_CALL_FORWARDING_TYPE_MAX) {
1185 file_meta->rec_count = TEL_SIM_CALL_FORWARDING_TYPE_MAX;
1187 file_meta->current_index++;
1188 __imc_sim_read_record(co, resp_cb_data);
1191 case TEL_SIM_EF_MSISDN:
1192 file_meta->files.data.msisdn_list.list =
1193 tcore_malloc0(sizeof(TelSimSubscriberInfo) * file_meta->rec_count);
1194 file_meta->current_index++;
1195 __imc_sim_read_record(co, resp_cb_data);
1198 case TEL_SIM_EF_MBDN:
1200 ImcSimPrivateInfo *priv_info = NULL;
1201 priv_info = tcore_sim_ref_userdata(co);
1203 priv_info->mb_rec_len = file_meta->rec_length;
1204 file_meta->mb_count = 0;
1205 file_meta->current_index = file_meta->mb_index[file_meta->mb_count];
1206 __imc_sim_read_record(co, resp_cb_data);
1210 case TEL_SIM_EF_OPL:
1211 case TEL_SIM_EF_PNN:
1212 case TEL_SIM_EF_USIM_MWIS:
1213 case TEL_SIM_EF_USIM_MBI:
1214 case TEL_SIM_EF_CPHS_MAILBOX_NUMBERS:
1215 case TEL_SIM_EF_CPHS_INFORMATION_NUMBERS:
1216 file_meta->current_index++;
1217 __imc_sim_read_record(co, resp_cb_data);
1220 case TEL_SIM_EF_SMSP:
1222 ImcSimPrivateInfo *priv_info = NULL;
1224 priv_info = tcore_sim_ref_userdata(co);
1226 dbg("SMSP info set to tcore : count:[%d], rec_len:[%d]",file_meta->rec_count, file_meta->rec_length);
1227 priv_info->smsp_count = file_meta->rec_count;
1228 priv_info->smsp_rec_len = file_meta->rec_length;
1233 dbg("error - File id for get file info [0x%x]", file_meta->file_id);
1239 static void __on_response_imc_sim_update_file(TcorePending *p, guint data_len, const void *data, void *user_data)
1241 const TcoreAtResponse *resp = data;
1242 CoreObject *co_sim = NULL;
1243 GSList *tokens = NULL;
1244 TelSimResult sim_result = TEL_SIM_RESULT_CARD_ERROR;
1246 ImcRespCbData *resp_cb_data = (ImcRespCbData *) user_data;
1247 ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
1251 co_sim = tcore_pending_ref_core_object(p);
1253 dbg("file_id:[0x%x]", file_meta->file_id);
1255 if (resp->success > 0) {
1260 line = (const char *)resp->lines->data;
1261 tokens = tcore_at_tok_new(line);
1262 if (g_slist_length(tokens) != 2) {
1263 err("Invalid message");
1266 sw1 = atoi(g_slist_nth_data(tokens, 0));
1267 sw2 = atoi(g_slist_nth_data(tokens, 1));
1270 if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
1271 sim_result = TEL_SIM_RESULT_SUCCESS;
1273 sim_result = __imc_sim_decode_status_word(sw1, sw2);
1276 err("RESPONSE NOK");
1277 sim_result = __imc_sim_convert_cme_error_tel_sim_result(resp);
1281 if (resp_cb_data->cb)
1282 resp_cb_data->cb(co_sim, (gint)sim_result, NULL, resp_cb_data->cb_data);
1284 /* free resp_cb_data */
1285 imc_destroy_resp_cb_data(resp_cb_data);
1287 tcore_at_tok_free(tokens);
1291 static void __on_response_imc_sim_read_data(TcorePending *p, guint data_len,
1292 const void *data, void *user_data)
1294 const TcoreAtResponse *resp = data;
1295 CoreObject *co = NULL;
1296 GSList *tokens = NULL;
1297 TelSimResult sim_result;
1298 gboolean dr = FALSE;
1299 const char *line = NULL;
1305 TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
1306 ImcRespCbData *resp_cb_data = (ImcRespCbData *) user_data;
1307 ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
1311 co = tcore_pending_ref_core_object(p);
1313 if (resp->success > 0) {
1316 line = (const char *)resp->lines->data;
1317 tokens = tcore_at_tok_new(line);
1318 if (g_slist_length(tokens) < 2) {
1319 err("Invalid message");
1320 tcore_at_tok_free(tokens);
1321 /* free resp_cb_data */
1322 imc_destroy_resp_cb_data(resp_cb_data);
1326 sw1 = atoi(g_slist_nth_data(tokens, 0));
1327 sw2 = atoi(g_slist_nth_data(tokens, 1));
1329 if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
1330 res = g_slist_nth_data(tokens, 2);
1332 tmp = tcore_at_tok_extract(res);
1333 tcore_util_hexstring_to_bytes(tmp, &res, (guint *)&res_len);
1334 dbg("Response: [%s] Response length: [%d]", res, res_len);
1336 sim_result = TEL_SIM_RESULT_SUCCESS;
1337 file_meta->files.result = sim_result;
1339 dbg("File ID: [0x%x]", file_meta->file_id);
1340 switch (file_meta->file_id) {
1341 case TEL_SIM_EF_IMSI: {
1342 dbg("Data: [%s]", res);
1343 dr = tcore_sim_decode_imsi((unsigned char *)res, res_len, &file_meta->imsi);
1345 err("IMSI decoding failed");
1347 __imc_sim_set_identity(co, &file_meta->imsi);
1350 tcore_sim_set_imsi(co, &file_meta->imsi);
1355 case TEL_SIM_EF_ICCID: {
1356 dr = tcore_sim_decode_iccid((unsigned char *)res, res_len,
1357 file_meta->files.data.iccid);
1361 case TEL_SIM_EF_ELP: /* 2G EF - 2 bytes decoding */
1362 case TEL_SIM_EF_USIM_LI: /* 3G EF - 2 bytes decoding */
1363 case TEL_SIM_EF_USIM_PL: /* 3G EF - same as EFELP, so 2 byte decoding */
1364 case TEL_SIM_EF_LP: /* 1 byte encoding */
1366 tcore_sim_get_type(co, &card_type);
1367 if ((TEL_SIM_CARD_TYPE_GSM == card_type)
1368 && (file_meta->file_id == TEL_SIM_EF_LP)) {
1370 * 2G LP(0x6F05) has 1 byte for each language
1372 dr = tcore_sim_decode_lp((unsigned char *)res, res_len, &file_meta->files.data.language);
1375 * 3G LI(0x6F05)/PL(0x2F05),
1376 * 2G ELP(0x2F05) has 2 bytes for each language
1378 dr = tcore_sim_decode_li((unsigned char *)res, res_len,
1379 file_meta->file_id, &file_meta->files.data.language);
1384 case TEL_SIM_EF_SPN:
1385 dr = tcore_sim_decode_spn((unsigned char *)res, res_len, &file_meta->files.data.spn);
1387 err("SPN decoding failed");
1389 tcore_sim_set_disp_condition(co, file_meta->files.data.spn.display_condition);
1390 tcore_sim_set_spn(co, file_meta->files.data.spn.spn);
1394 case TEL_SIM_EF_SPDI:
1395 dr = tcore_sim_decode_spdi((unsigned char *)res, res_len, &file_meta->files.data.spdi);
1398 case TEL_SIM_EF_SST:
1400 TelSimServiceTable *svct = NULL;
1402 svct = g_try_new0(TelSimServiceTable, 1);
1403 tcore_sim_get_type(co, &card_type);
1404 svct->sim_type = card_type;
1405 if (TEL_SIM_CARD_TYPE_GSM == card_type) {
1406 dr = tcore_sim_decode_sst((unsigned char *)res, res_len, svct->table.sst_service);
1407 } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
1408 dr = tcore_sim_decode_ust((unsigned char *)res, res_len, svct->table.ust_service);
1410 err("Not handled card_type[%d]", card_type);
1414 err("SST/UST decoding failed");
1416 tcore_sim_set_service_table(co, svct);
1424 case TEL_SIM_EF_ECC:
1426 tcore_sim_get_type(co, &card_type);
1427 if (TEL_SIM_CARD_TYPE_GSM == card_type) {
1428 dr = tcore_sim_decode_ecc((unsigned char *)res, res_len, &file_meta->files.data.ecc);
1429 } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
1430 TelSimEcc *ecc = NULL;
1432 ecc = g_try_new0(TelSimEcc, 1);
1433 dbg("Index [%d]", file_meta->current_index);
1435 dr = tcore_sim_decode_uecc((unsigned char *)res, res_len, ecc);
1437 memcpy(&file_meta->files.data.ecc.list[file_meta->files.data.ecc.count], ecc, sizeof(TelSimEcc));
1438 file_meta->files.data.ecc.count++;
1444 dbg("Unknown/Unsupported SIM card Type: [%d]", card_type);
1449 case TEL_SIM_EF_MSISDN:
1451 TelSimSubscriberInfo *msisdn = NULL;
1453 dbg("Index [%d]", file_meta->current_index);
1454 msisdn = tcore_malloc0(sizeof(TelSimSubscriberInfo));
1455 dr = tcore_sim_decode_msisdn((unsigned char *)res, res_len, msisdn);
1457 memcpy(&file_meta->files.data.msisdn_list.list[file_meta->files.data.msisdn_list.count],
1458 msisdn, sizeof(TelSimSubscriberInfo));
1460 file_meta->files.data.msisdn_list.count++;
1464 dbg("Freeing resources");
1469 case TEL_SIM_EF_OPL:
1471 TelSimOpl *opl = NULL;
1473 dbg("decode w/ index [%d]", file_meta->current_index);
1474 opl = g_try_new0(TelSimOpl, 1);
1476 dr = tcore_sim_decode_opl((unsigned char *)res, res_len, opl);
1478 memcpy(&file_meta->files.data.opl.list[file_meta->files.data.opl.opl_count],
1479 opl, sizeof(TelSimOpl));
1481 file_meta->files.data.opl.opl_count++;
1489 case TEL_SIM_EF_PNN:
1491 TelSimPnn *pnn = NULL;
1493 dbg("decode w/ index [%d]", file_meta->current_index);
1494 pnn = g_try_new0(TelSimPnn, 1);
1496 dr = tcore_sim_decode_pnn((unsigned char *)res, res_len, pnn);
1498 memcpy(&file_meta->files.data.pnn.list[file_meta->files.data.pnn.pnn_count],
1499 pnn, sizeof(TelSimPnn));
1501 file_meta->files.data.pnn.pnn_count++;
1509 case TEL_SIM_EF_OPLMN_ACT:
1510 /*dr = tcore_sim_decode_oplmnwact(&file_meta->files.data.opwa,
1511 (unsigned char *)res, res_len);*/
1514 case TEL_SIM_EF_CPHS_CUSTOMER_SERVICE_PROFILE:
1515 /*dr = tcore_sim_decode_csp(&po->p_cphs->csp,
1516 p_data->response, p_data->response_len);*/
1519 case TEL_SIM_EF_USIM_MBI: /* linear type */
1521 TelSimMbi *mbi = NULL;
1524 mbi = g_try_new0(TelSimMbi, 1);
1525 dr = tcore_sim_decode_mbi((unsigned char *)res, res_len, mbi);
1527 dbg("voice_index [0x%2x],fax_index[0x%2x], email_index[0x%2x]," \
1528 "other_index[0x%2x], video_index [0x%2x] ", mbi->voice_index,
1529 mbi->fax_index, mbi->email_index, mbi->other_index, mbi->video_index);
1532 count = file_meta->files.data.mb.count;
1534 if(mbi->voice_index) {
1535 file_meta->files.data.mb.list[count].mb_type = TEL_SIM_MAILBOX_VOICE;
1536 file_meta->mb_index[count] = mbi->voice_index;
1539 if(mbi->fax_index) {
1540 file_meta->files.data.mb.list[count].mb_type = TEL_SIM_MAILBOX_FAX;
1541 file_meta->mb_index[count] = mbi->fax_index;
1544 if(mbi->email_index) {
1545 file_meta->files.data.mb.list[count].mb_type = TEL_SIM_MAILBOX_EMAIL;
1546 file_meta->mb_index[count] = mbi->email_index;
1549 if(mbi->other_index) {
1550 file_meta->files.data.mb.list[count].mb_type = TEL_SIM_MAILBOX_OTHER;
1551 file_meta->mb_index[count] = mbi->other_index;
1554 if(mbi->video_index) {
1555 file_meta->files.data.mb.list[count].mb_type = TEL_SIM_MAILBOX_VIDEO;
1556 file_meta->mb_index[count] = mbi->video_index;
1560 file_meta->files.data.mb.count = count;
1565 dbg("index [%d] mb_type[%d]", count, file_meta->files.data.mb.list[count].mb_type);
1569 case TEL_SIM_EF_CPHS_MAILBOX_NUMBERS: /* linear type */
1570 case TEL_SIM_EF_MBDN: /* linear type */
1572 dr = tcore_sim_decode_xdn((unsigned char *)res, res_len,
1573 file_meta->files.data.mb.list[file_meta->mb_count].alpha_id,
1574 &file_meta->files.data.mb.list[file_meta->mb_count].alpha_id_len,
1575 file_meta->files.data.mb.list[file_meta->mb_count].number);
1576 file_meta->files.data.mb.list[file_meta->mb_count].profile_id = file_meta->mb_count+1;
1577 file_meta->mb_count++;
1581 case TEL_SIM_EF_CPHS_VOICE_MSG_WAITING: /* transparent type */
1582 dr = tcore_sim_decode_vmwf((unsigned char *)res, res_len, file_meta->files.data.mw.mw);
1585 case TEL_SIM_EF_USIM_MWIS: { /* linear type */
1586 TelSimMwis *mw = NULL;
1588 mw = g_try_new0(TelSimMwis, 1);
1590 dr = tcore_sim_decode_mwis((unsigned char *)res, res_len, mw);
1592 guint count = file_meta->files.data.mw.profile_count;
1594 memcpy(&file_meta->files.data.mw.mw[count], mw, sizeof(TelSimMwis));
1597 * The Profile Identity shall be between 1 and 4 as defined
1598 * in TS 23.097 for MSP
1600 file_meta->files.data.mw.mw[count].profile_id = count+1;
1602 file_meta->files.data.mw.profile_count++;
1610 case TEL_SIM_EF_CPHS_CALL_FORWARD_FLAGS: /* transparent type */
1611 dr = tcore_sim_decode_cff((unsigned char *)res, res_len, file_meta->files.data.mw.mw);
1614 case TEL_SIM_EF_USIM_CFIS: /* linear type */
1616 TelSimCfis *cf = NULL;
1618 cf = g_try_new0(TelSimCfis, 1);
1619 dr = tcore_sim_decode_cfis((unsigned char *)res, res_len, cf);
1621 memcpy(&file_meta->files.data.cf.cf[file_meta->files.data.cf.profile_count],
1622 cf, sizeof(TelSimCfis));
1623 file_meta->files.data.cf.profile_count++;
1631 case TEL_SIM_EF_CPHS_SERVICE_STRING_TABLE:
1632 dbg("not handled - TEL_SIM_EF_CPHS_SERVICE_STRING_TABLE ");
1635 case TEL_SIM_EF_CPHS_OPERATOR_NAME_STRING:
1636 file_meta->files.data.cphs_net.full_name = tcore_malloc0(TEL_SIM_CPHS_OPERATOR_NAME_LEN_MAX+1);
1637 dr = tcore_sim_decode_ons((unsigned char *)res, res_len,
1638 (unsigned char*)file_meta->files.data.cphs_net.full_name);
1639 dbg("file_meta->files.result[%d],file_meta->files.data.cphs_net.full_name[%s]",
1640 file_meta->files.result, file_meta->files.data.cphs_net.full_name);
1643 case TEL_SIM_EF_CPHS_DYNAMICFLAGS:
1644 /*dr = tcore_sim_decode_dynamic_flag(&po->p_cphs->dflagsinfo,
1645 p_data->response, p_data->response_len);*/
1648 case TEL_SIM_EF_CPHS_DYNAMIC2FLAG:
1649 /*dr = tcore_sim_decode_dynamic2_flag(&po->p_cphs->d2flagsinfo, p_data->response,
1650 p_data->response_len);*/
1653 case TEL_SIM_EF_CPHS_CPHS_INFO:
1654 /*dr = tcore_sim_decode_cphs_info(&file_meta->files.data.cphs,
1655 (unsigned char *)res, res_len);*/
1658 case TEL_SIM_EF_CPHS_OPERATOR_NAME_SHORT_FORM_STRING:
1659 file_meta->files.data.cphs_net.short_name = tcore_malloc0(TEL_SIM_CPHS_OPERATOR_NAME_SHORT_FORM_LEN_MAX+1);
1660 dr = tcore_sim_decode_short_ons((unsigned char *)res, res_len,
1661 (unsigned char*)file_meta->files.data.cphs_net.short_name);
1662 dbg("file_meta->files.result[%d],file_meta->files.data.cphs_net.short_name[%s]",
1663 file_meta->files.result, file_meta->files.data.cphs_net.short_name);
1666 case TEL_SIM_EF_CPHS_INFORMATION_NUMBERS:
1667 /*dr = tcore_sim_decode_information_number(&po->p_cphs->infn, p_data->response, p_data->response_len);*/
1671 dbg("File Decoding Failed - not handled File[0x%x]", file_meta->file_id);
1676 sim_result = __imc_sim_decode_status_word(sw1, sw2);
1677 file_meta->files.result = sim_result;
1685 tcore_at_tok_free(tokens);
1687 err("RESPONSE NOK");
1688 dbg("Error - File ID: [0x%x]", file_meta->file_id);
1689 sim_result = __imc_sim_convert_cme_error_tel_sim_result(resp);
1693 __imc_sim_next_from_read_binary(tcore_pending_ref_core_object(p), resp_cb_data, sim_result, dr);
1698 static void __on_response_imc_sim_get_response(TcorePending *p,
1699 guint data_len, const void *data, void *user_data)
1701 const TcoreAtResponse *resp = data;
1702 CoreObject *co = NULL;
1703 TelSimResult sim_result;
1704 GSList *tokens = NULL;
1705 const char *line = NULL;
1708 ImcRespCbData *resp_cb_data = (ImcRespCbData *)user_data;
1709 ImcSimMetaInfo *file_meta =
1710 (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
1712 dbg("SIM Response - SIM File info: [+CRSM]");
1714 co = tcore_pending_ref_core_object(p);
1716 if (resp->success > 0) {
1719 line = (const char *)resp->lines->data;
1720 tokens = tcore_at_tok_new(line);
1721 if (g_slist_length(tokens) < 2) {
1722 err("Invalid message");
1723 tcore_at_tok_free(tokens);
1727 sw1 = atoi(g_slist_nth_data(tokens, 0));
1728 sw2 = atoi(g_slist_nth_data(tokens, 1));
1730 /*1. SIM access success case*/
1731 if ((sw1 == 0x90 && sw2 == 0x00) || sw1 == 0x91) {
1732 unsigned char tag_len = 0;
1733 unsigned short record_len = 0;
1734 char num_of_records = 0;
1735 unsigned char file_id_len = 0;
1736 unsigned short file_id = 0;
1737 unsigned short file_size = 0;
1738 unsigned short file_type = 0;
1739 unsigned short arr_file_id = 0;
1740 int arr_file_id_rec_num = 0;
1741 TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
1743 /* handling only last 3 bits */
1744 unsigned char file_type_tag = 0x07;
1745 unsigned char *ptr_data;
1749 char *record_data = NULL;
1750 guint record_data_len;
1751 hexData = g_slist_nth_data(tokens, 2);
1752 dbg("hexData: %s", hexData);
1753 dbg("hexData: %s", hexData + 1);
1755 tmp = tcore_at_tok_extract(hexData);
1756 tcore_util_hexstring_to_bytes(tmp, &record_data, &record_data_len);
1757 tcore_util_hex_dump(" ", record_data_len, record_data);
1760 ptr_data = (unsigned char *)record_data;
1761 tcore_sim_get_type(co, &card_type);
1762 if (TEL_SIM_CARD_TYPE_USIM == card_type) {
1764 ETSI TS 102 221 v7.9.0
1766 '62' FCP template tag
1767 - Response for an EF
1768 '82' M File Descriptor
1769 '83' M File Identifier
1770 'A5' O Proprietary information
1771 '8A' M Life Cycle Status Integer
1772 '8B', '8C' or 'AB' C1 Security attributes
1774 '81' O Total file size
1775 '88' O Short File Identifier (SFI)
1778 /* rsim.res_len has complete data length received */
1780 /* FCP template tag - File Control Parameters tag*/
1781 if (*ptr_data == 0x62) {
1782 /* parse complete FCP tag*/
1783 /* increment to next byte */
1785 tag_len = *ptr_data++;
1786 dbg("tag_len: %02x", tag_len);
1787 /* FCP file descriptor - file type, accessibility, DF, ADF etc*/
1788 if (*ptr_data == 0x82) {
1789 /* increment to next byte */
1793 /* consider only last 3 bits*/
1794 dbg("file_type_tag: %02x", file_type_tag);
1795 file_type_tag = file_type_tag & (*ptr_data);
1796 dbg("file_type_tag: %02x", file_type_tag);
1798 switch (file_type_tag) {
1799 /* increment to next byte */
1802 dbg("Getting FileType: [Transparent file type]");
1803 file_type = IMC_SIM_FILE_TYPE_TRANSPARENT;
1805 /* increment to next byte */
1807 /* increment to next byte */
1812 dbg("Getting FileType: [Linear fixed file type]");
1813 /* increment to next byte */
1815 /* data coding byte - value 21 */
1818 memcpy(&record_len, ptr_data, 2);
1820 IMC_SWAP_BYTES_16(record_len);
1821 ptr_data = ptr_data + 2;
1822 num_of_records = *ptr_data++;
1823 /* Data lossy conversation from enum (int) to unsigned char */
1824 file_type = IMC_SIM_FILE_TYPE_LINEAR_FIXED;
1828 dbg("Cyclic fixed file type");
1829 /* increment to next byte */
1831 /* data coding byte - value 21 */
1834 memcpy(&record_len, ptr_data, 2);
1836 IMC_SWAP_BYTES_16(record_len);
1837 ptr_data = ptr_data + 2;
1838 num_of_records = *ptr_data++;
1839 file_type = IMC_SIM_FILE_TYPE_CYCLIC;
1843 dbg("not handled file type [0x%x]", *ptr_data);
1847 dbg("INVALID FCP received - DEbug!");
1848 tcore_at_tok_free(tokens);
1849 g_free(record_data);
1853 /*File identifier - 0x84,0x85,0x86 etc are currently ignored and not handled */
1854 if (*ptr_data == 0x83) {
1855 /* increment to next byte */
1857 file_id_len = *ptr_data++;
1858 dbg("file_id_len: %02x", file_id_len);
1860 memcpy(&file_id, ptr_data, file_id_len);
1861 dbg("file_id: %x", file_id);
1864 IMC_SWAP_BYTES_16(file_id);
1865 dbg("file_id: %x", file_id);
1867 ptr_data = ptr_data + 2;
1868 dbg("Getting FileID=[0x%x]", file_id);
1870 dbg("INVALID FCP received - DEbug!");
1871 tcore_at_tok_free(tokens);
1872 g_free(record_data);
1876 /* proprietary information */
1877 if (*ptr_data == 0xA5) {
1878 unsigned short prop_len;
1879 /* increment to next byte */
1883 prop_len = *ptr_data;
1884 dbg("prop_len: %02x", prop_len);
1887 ptr_data = ptr_data + prop_len + 1;
1889 dbg("INVALID FCP received - DEbug!");
1892 /* life cycle status integer [8A][length:0x01][status]*/
1895 00000000 : No information given
1896 00000001 : creation state
1897 00000011 : initialization state
1898 000001-1 : operation state -activated
1899 000001-0 : operation state -deactivated
1900 000011-- : Termination state
1901 b8~b5 !=0, b4~b1=X : Proprietary
1902 Any other value : RFU
1904 if (*ptr_data == 0x8A) {
1905 /* increment to next byte */
1907 /* length - value 1 */
1910 switch (*ptr_data) {
1913 dbg("<RX> operation state -deactivated");
1919 dbg("<RX> operation state -activated");
1924 dbg("<RX> DEBUG! LIFE CYCLE STATUS =[0x%x]", *ptr_data);
1930 /* related to security attributes : currently not handled*/
1931 if (*ptr_data == 0x86 || *ptr_data == 0x8B || *ptr_data == 0x8C || *ptr_data == 0xAB) {
1932 /* increment to next byte */
1934 /* if tag length is 3 */
1935 if (*ptr_data == 0x03) {
1936 /* increment to next byte */
1939 memcpy(&arr_file_id, ptr_data, 2);
1941 IMC_SWAP_BYTES_16(arr_file_id);
1942 ptr_data = ptr_data + 2;
1943 arr_file_id_rec_num = *ptr_data++;
1944 dbg("arr_file_id_rec_num:[%d]", arr_file_id_rec_num);
1946 /* if tag length is not 3 */
1947 /* ignoring bytes */
1948 // ptr_data = ptr_data + 4;
1949 dbg("Useless security attributes, so jump to next tag");
1950 ptr_data = ptr_data + (*ptr_data + 1);
1953 dbg("INVALID FCP received[0x%x] - DEbug!", *ptr_data);
1954 tcore_at_tok_free(tokens);
1955 g_free(record_data);
1959 dbg("Current ptr_data value is [%x]", *ptr_data);
1961 /* file size excluding structural info*/
1962 if (*ptr_data == 0x80) {
1963 /* for EF file size is body of file and for Linear or cyclic it is
1964 * number of recXsizeof(one record)
1966 /* increment to next byte */
1968 /* length is 1 byte - value is 2 bytes or more */
1970 memcpy(&file_size, ptr_data, 2);
1972 IMC_SWAP_BYTES_16(file_size);
1973 ptr_data = ptr_data + 2;
1975 dbg("INVALID FCP received - DEbug!");
1976 tcore_at_tok_free(tokens);
1977 g_free(record_data);
1981 /* total file size including structural info*/
1982 if (*ptr_data == 0x81) {
1984 /* increment to next byte */
1988 dbg("len:[%d]", len);
1990 ptr_data = ptr_data + 3;
1992 dbg("INVALID FCP received - DEbug!");
1993 /* 0x81 is optional tag?? check out! so do not return -1 from here! */
1995 /*short file identifier ignored*/
1996 if (*ptr_data == 0x88) {
1997 dbg("0x88: Do Nothing");
2001 dbg("INVALID FCP received - DEbug!");
2002 tcore_at_tok_free(tokens);
2003 g_free(record_data);
2006 } else if (TEL_SIM_CARD_TYPE_GSM == card_type) {
2007 unsigned char gsm_specific_file_data_len = 0;
2008 /* ignore RFU byte1 and byte2 */
2012 // file_size = p_info->response_len;
2013 memcpy(&file_size, ptr_data, 2);
2015 IMC_SWAP_BYTES_16(file_size);
2016 /* parsed file size */
2017 ptr_data = ptr_data + 2;
2019 memcpy(&file_id, ptr_data, 2);
2020 IMC_SWAP_BYTES_16(file_id);
2021 dbg("FILE id --> [%x]", file_id);
2022 ptr_data = ptr_data + 2;
2023 /* save file type - transparent, linear fixed or cyclic */
2024 file_type_tag = (*(ptr_data + 7));
2026 switch (*ptr_data) {
2029 dbg("RFU file type- not handled - Debug!");
2034 dbg("MF file type - not handled - Debug!");
2039 dbg("DF file type - not handled - Debug!");
2044 dbg("EF file type [%d] ", file_type_tag);
2045 /* increment to next byte */
2048 if (file_type_tag == 0x00 || file_type_tag == 0x01) {
2049 /* increament to next byte as this byte is RFU */
2052 (file_type_tag == 0x00) ? IMC_SIM_FILE_TYPE_TRANSPARENT : IMC_SIM_FILE_TYPE_LINEAR_FIXED;
2054 /* increment to next byte */
2056 /* For a cyclic EF all bits except bit 7 are RFU; b7=1 indicates that */
2057 /* the INCREASE command is allowed on the selected cyclic file. */
2058 file_type = IMC_SIM_FILE_TYPE_CYCLIC;
2060 /* bytes 9 to 11 give SIM file access conditions */
2062 /* byte 10 has one nibble that is RF U and another for INCREASE which is not used currently */
2064 /* byte 11 is invalidate and rehabilate nibbles */
2066 /* byte 12 - file status */
2068 /* byte 13 - GSM specific data */
2069 gsm_specific_file_data_len = *ptr_data;
2070 dbg("gsm_specific_file_data_len:[%d]", gsm_specific_file_data_len);
2072 /* byte 14 - structure of EF - transparent or linear or cyclic , already saved above */
2074 /* byte 15 - length of record for linear and cyclic , for transparent it is set to 0x00. */
2075 record_len = *ptr_data;
2076 dbg("record length[%d], file size[%d]", record_len, file_size);
2077 if (record_len != 0)
2078 num_of_records = (file_size / record_len);
2080 dbg("Number of records [%d]", num_of_records);
2084 dbg("not handled file type");
2088 err("Unknown Card Type - [%d]", card_type);
2091 dbg("req ef[0x%x] resp ef[0x%x] size[%ld] Type[0x%x] NumOfRecords[%ld] RecordLen[%ld]",
2092 file_meta->file_id, file_id, file_size, file_type, num_of_records, record_len);
2094 file_meta->file_type = file_type;
2095 file_meta->data_size = file_size;
2096 file_meta->rec_length = record_len;
2097 file_meta->rec_count = num_of_records;
2098 file_meta->current_index = 0; /* reset for new record type EF */
2099 sim_result = TEL_SIM_RESULT_SUCCESS;
2100 g_free(record_data);
2102 /*2. SIM access fail case*/
2103 err("Failed to get ef[0x%x] (file_meta->file_id) ", file_meta->file_id);
2104 sim_result = __imc_sim_decode_status_word(sw1, sw2);
2107 tcore_at_tok_free(tokens);
2109 err("RESPONSE NOK");
2110 err("Failed to get ef[0x%x] (file_meta->file_id) ", file_meta->file_id);
2111 sim_result = __imc_sim_convert_cme_error_tel_sim_result(resp);
2115 dbg("Calling __imc_sim_next_from_get_response");
2116 __imc_sim_next_from_get_response(co, resp_cb_data, sim_result);
2120 static TelReturn __imc_sim_update_file(CoreObject *co,
2121 ImcRespCbData *resp_cb_data, int cmd, TelSimFileId ef,
2122 int p1, int p2, int p3, char *encoded_data)
2124 char *cmd_str = NULL;
2125 TelReturn ret = TEL_RETURN_FAILURE;
2126 ImcSimMetaInfo *file_meta =
2127 (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
2129 dbg("Entry File-id:[0x%02x]", file_meta->file_id);
2131 cmd_str = g_strdup_printf("AT+CRSM=%d,%d,%d,%d,%d,\"%s\"",
2132 cmd, ef, p1, p2, p3, encoded_data);
2134 ret = tcore_at_prepare_and_send_request(co,
2136 TCORE_AT_COMMAND_TYPE_SINGLELINE,
2138 __on_response_imc_sim_update_file, resp_cb_data,
2139 on_send_imc_request, NULL);
2140 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Update SIM File");
2142 tcore_free(encoded_data);
2148 static void __imc_sim_read_record(CoreObject *co, ImcRespCbData *resp_cb_data)
2150 gchar *at_cmd = NULL;
2154 ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
2155 TelReturn ret = TEL_RETURN_FAILURE;
2157 dbg("Entry File-id:[0x%02x]", file_meta->file_id);
2159 /* According to TS 102 221, values of p1, p2, p3 can be as below:
2160 * 11.1.5 READ RECORD
2162 * P2: Mode, see table 11.11
2165 * Le: Number of bytes to be read (P3)
2168 p1 = (unsigned char) file_meta->current_index;
2169 p2 = (unsigned char) 0x04; /* 0x4 for absolute mode */
2170 p3 = (unsigned char) file_meta->rec_length;
2172 at_cmd = g_strdup_printf("AT+CRSM=%d, %d, %d, %d, %d",
2173 IMC_SIM_ACCESS_READ_RECORD, file_meta->file_id, p1, p2, p3);
2175 ret = tcore_at_prepare_and_send_request(co,
2177 TCORE_AT_COMMAND_TYPE_SINGLELINE,
2179 __on_response_imc_sim_read_data, resp_cb_data,
2180 on_send_imc_request, NULL);
2181 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get File Record");
2183 dbg("ret:[%d]", ret);
2189 static void __imc_sim_read_binary(CoreObject *co, ImcRespCbData *resp_cb_data)
2191 gchar *at_cmd = NULL;
2196 ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
2197 TelReturn ret = TEL_RETURN_FAILURE;
2199 dbg("Entry File-id:[0x%02x]", file_meta->file_id);
2201 /* According to TS 102 221, values of P1, P2, P3 can be as below:
2202 * 11.1.3 READ BINARY
2203 * P1: See table 11.10
2207 * Le: Number of bytes to be read (P3)
2210 p1 = (unsigned char) (offset & 0xFF00) >> 8;
2211 p2 = (unsigned char) offset & 0x00FF; /* offset low */
2212 p3 = (unsigned char) file_meta->data_size;
2214 at_cmd = g_strdup_printf("AT+CRSM=%d, %d, %d, %d, %d",
2215 IMC_SIM_ACCESS_READ_BINARY, file_meta->file_id, p1, p2, p3);
2217 ret = tcore_at_prepare_and_send_request(co,
2219 TCORE_AT_COMMAND_TYPE_SINGLELINE,
2221 __on_response_imc_sim_read_data, resp_cb_data,
2222 on_send_imc_request, NULL);
2223 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get File Data");
2225 dbg("ret:[%d]", ret);
2231 static TelReturn __imc_sim_get_response(CoreObject *co, ImcRespCbData *resp_cb_data)
2233 gchar *at_cmd = NULL;
2234 ImcSimMetaInfo *file_meta =
2235 (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
2236 TelReturn ret = TEL_RETURN_FAILURE;
2238 dbg("Entry File-id:[0x%02x]", file_meta->file_id);
2240 at_cmd = g_strdup_printf("AT+CRSM=%d, %d",
2241 IMC_SIM_ACCESS_GET_RESPONSE, file_meta->file_id);
2243 ret = tcore_at_prepare_and_send_request(co,
2245 TCORE_AT_COMMAND_TYPE_SINGLELINE,
2247 __on_response_imc_sim_get_response, resp_cb_data,
2248 on_send_imc_request, NULL);
2249 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get File Info");
2256 static void __on_response_imc_sim_get_retry_count(TcorePending *p, guint data_len,
2257 const void *data, void *user_data)
2259 TelSimResult result = TEL_SIM_RESULT_INCORRECT_PASSWORD;
2260 const TcoreAtResponse *at_resp = data;
2261 ImcRespCbData *resp_cb_data = user_data;
2262 CoreObject *co = tcore_pending_ref_core_object(p);
2263 ImcSimCurrSecOp *sec_op = NULL;
2264 GSList *tokens = NULL;
2265 const char *line = NULL;
2267 int attempts_left = 0;
2268 int time_penalty = 0;
2272 tcore_check_return_assert(co != NULL);
2273 tcore_check_return_assert(resp_cb_data != NULL);
2275 sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
2277 if (at_resp && at_resp->success) {
2278 dbg("Sim Get Retry Count [OK]");
2280 if (at_resp->lines) {
2281 line = (const char *)at_resp->lines->data;
2282 tokens = tcore_at_tok_new(line);
2283 if (g_slist_length(tokens) < 3) {
2284 err("Invalid message");
2288 lock_type = atoi(g_slist_nth_data(tokens, 0));
2289 attempts_left = atoi(g_slist_nth_data(tokens, 1));
2290 time_penalty = atoi(g_slist_nth_data(tokens, 2));
2292 dbg("lock_type = %d, attempts_left = %d, time_penalty = %d",
2293 lock_type, attempts_left, time_penalty);
2296 case IMC_SIM_CURR_SEC_OP_PIN1_VERIFY:
2297 case IMC_SIM_CURR_SEC_OP_PIN2_VERIFY:
2299 TelSimSecPinResult verify_pin = {0, };
2301 if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN1_VERIFY)
2302 verify_pin.pin_type = TEL_SIM_PIN_TYPE_PIN1;
2303 else if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN2_VERIFY)
2304 verify_pin.pin_type = TEL_SIM_PIN_TYPE_PIN2;
2306 verify_pin.retry_count = attempts_left;
2308 if(resp_cb_data->cb)
2309 resp_cb_data->cb(co, (gint)result,
2310 &verify_pin, resp_cb_data->cb_data);
2313 case IMC_SIM_CURR_SEC_OP_PUK1_VERIFY:
2314 case IMC_SIM_CURR_SEC_OP_PUK2_VERIFY:
2316 TelSimSecPukResult verify_puk = {0, };
2318 if (*sec_op == IMC_SIM_CURR_SEC_OP_PUK1_VERIFY)
2319 verify_puk.puk_type = TEL_SIM_PUK_TYPE_PUK1;
2320 else if (*sec_op == IMC_SIM_CURR_SEC_OP_PUK2_VERIFY)
2321 verify_puk.puk_type = TEL_SIM_PUK_TYPE_PUK2;
2323 verify_puk.retry_count = attempts_left;
2325 if(resp_cb_data->cb)
2326 resp_cb_data->cb(co, (gint)result,
2327 &verify_puk, resp_cb_data->cb_data);
2330 case IMC_SIM_CURR_SEC_OP_PIN1_CHANGE:
2331 case IMC_SIM_CURR_SEC_OP_PIN2_CHANGE:
2333 TelSimSecPinResult change_pin = {0, };
2335 if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN1_CHANGE)
2336 change_pin.pin_type = TEL_SIM_PIN_TYPE_PIN1;
2337 else if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN2_CHANGE)
2338 change_pin.pin_type = TEL_SIM_PIN_TYPE_PIN2;
2340 change_pin.retry_count = attempts_left;
2342 if(resp_cb_data->cb)
2343 resp_cb_data->cb(co, (gint)result,
2344 &change_pin, resp_cb_data->cb_data);
2347 case IMC_SIM_CURR_SEC_OP_PIN1_DISABLE:
2348 case IMC_SIM_CURR_SEC_OP_PIN2_DISABLE:
2349 case IMC_SIM_CURR_SEC_OP_FDN_DISABLE:
2350 case IMC_SIM_CURR_SEC_OP_SIM_DISABLE:
2351 case IMC_SIM_CURR_SEC_OP_NET_DISABLE:
2352 case IMC_SIM_CURR_SEC_OP_NS_DISABLE:
2353 case IMC_SIM_CURR_SEC_OP_SP_DISABLE:
2354 case IMC_SIM_CURR_SEC_OP_CP_DISABLE:
2356 TelSimFacilityResult disable_facility = {0, };
2359 lock_type = __imc_sim_get_lock_type(*sec_op);
2360 if (lock_type == -1)
2363 disable_facility.type = lock_type;
2364 disable_facility.retry_count = attempts_left;
2366 if(resp_cb_data->cb)
2367 resp_cb_data->cb(co, (gint)result,
2368 &disable_facility, resp_cb_data->cb_data);
2371 case IMC_SIM_CURR_SEC_OP_PIN1_ENABLE:
2372 case IMC_SIM_CURR_SEC_OP_PIN2_ENABLE:
2373 case IMC_SIM_CURR_SEC_OP_FDN_ENABLE:
2374 case IMC_SIM_CURR_SEC_OP_SIM_ENABLE:
2375 case IMC_SIM_CURR_SEC_OP_NET_ENABLE:
2376 case IMC_SIM_CURR_SEC_OP_NS_ENABLE:
2377 case IMC_SIM_CURR_SEC_OP_SP_ENABLE:
2378 case IMC_SIM_CURR_SEC_OP_CP_ENABLE:
2380 TelSimFacilityResult enable_facility = {0, };
2383 lock_type = __imc_sim_get_lock_type(*sec_op);
2384 if (lock_type == -1)
2387 enable_facility.type = lock_type;
2388 enable_facility.retry_count = attempts_left;
2390 if(resp_cb_data->cb)
2391 resp_cb_data->cb(co, (gint)result,
2392 &enable_facility, resp_cb_data->cb_data);
2396 err("Unhandled sec op [%d]", *sec_op);
2400 tcore_at_tok_free(tokens);
2401 imc_destroy_resp_cb_data(resp_cb_data);
2404 err("Sim Get Retry Count [NOK]");
2406 /*TODO - send response for verify pin, puk etc.,
2407 * when get_retry_count fails
2409 tcore_at_tok_free(tokens);
2410 imc_destroy_resp_cb_data(resp_cb_data);
2413 static TelReturn __imc_sim_get_retry_count(CoreObject *co,
2414 ImcRespCbData *resp_cb_data)
2416 TelReturn ret = TEL_RETURN_FAILURE;
2417 ImcSimCurrSecOp *sec_op = (
2418 ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
2420 gchar *cmd_str = NULL;
2425 case IMC_SIM_CURR_SEC_OP_PIN1_VERIFY:
2426 case IMC_SIM_CURR_SEC_OP_PIN1_CHANGE:
2427 case IMC_SIM_CURR_SEC_OP_PIN1_ENABLE:
2428 case IMC_SIM_CURR_SEC_OP_PIN1_DISABLE:
2431 case IMC_SIM_CURR_SEC_OP_PIN2_VERIFY:
2432 case IMC_SIM_CURR_SEC_OP_PIN2_CHANGE:
2433 case IMC_SIM_CURR_SEC_OP_PIN2_ENABLE:
2434 case IMC_SIM_CURR_SEC_OP_PIN2_DISABLE:
2435 case IMC_SIM_CURR_SEC_OP_FDN_ENABLE:
2436 case IMC_SIM_CURR_SEC_OP_FDN_DISABLE:
2439 case IMC_SIM_CURR_SEC_OP_PUK1_VERIFY:
2442 case IMC_SIM_CURR_SEC_OP_PUK2_VERIFY:
2445 case IMC_SIM_CURR_SEC_OP_NET_ENABLE:
2446 case IMC_SIM_CURR_SEC_OP_NET_DISABLE:
2449 case IMC_SIM_CURR_SEC_OP_NS_ENABLE:
2450 case IMC_SIM_CURR_SEC_OP_NS_DISABLE:
2453 case IMC_SIM_CURR_SEC_OP_SP_ENABLE:
2454 case IMC_SIM_CURR_SEC_OP_SP_DISABLE:
2457 case IMC_SIM_CURR_SEC_OP_CP_ENABLE:
2458 case IMC_SIM_CURR_SEC_OP_CP_DISABLE:
2461 case IMC_SIM_CURR_SEC_OP_ADM_VERIFY:
2467 cmd_str = g_strdup_printf("AT+XPINCNT=%d", lock_type);
2469 ret = tcore_at_prepare_and_send_request(co,
2471 TCORE_AT_COMMAND_TYPE_SINGLELINE,
2473 __on_response_imc_sim_get_retry_count, resp_cb_data,
2474 on_send_imc_request, NULL);
2475 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Get Retry Count");
2481 static TelSimLockType __imc_sim_lock_type(int lock_type)
2483 switch (lock_type) {
2485 return TEL_SIM_LOCK_SC;
2487 return TEL_SIM_LOCK_FD;
2489 return TEL_SIM_LOCK_PN;
2491 return TEL_SIM_LOCK_PU;
2493 return TEL_SIM_LOCK_PP;
2495 return TEL_SIM_LOCK_PC ;
2497 return TEL_SIM_LOCK_PS ;
2499 err("Invalid lock_type [%d]", lock_type);
2504 static char *__imc_sim_get_fac_from_lock_type(TelSimLockType lock_type,
2505 ImcSimCurrSecOp *sec_op, int flag)
2508 switch (lock_type) {
2509 case TEL_SIM_LOCK_PS :
2511 if (flag == ENABLE_FLAG)
2512 *sec_op = IMC_SIM_CURR_SEC_OP_SIM_ENABLE;
2513 else if (flag == DISABLE_FLAG)
2514 *sec_op = IMC_SIM_CURR_SEC_OP_SIM_DISABLE;
2516 *sec_op = IMC_SIM_CURR_SEC_OP_SIM_STATUS;
2518 case TEL_SIM_LOCK_SC :
2520 if (flag == ENABLE_FLAG)
2521 *sec_op = IMC_SIM_CURR_SEC_OP_PIN1_ENABLE;
2522 else if (flag == DISABLE_FLAG)
2523 *sec_op = IMC_SIM_CURR_SEC_OP_PIN1_DISABLE;
2525 *sec_op = IMC_SIM_CURR_SEC_OP_PIN1_STATUS;
2527 case TEL_SIM_LOCK_FD :
2529 if (flag == ENABLE_FLAG)
2530 *sec_op = IMC_SIM_CURR_SEC_OP_FDN_ENABLE;
2531 else if (flag == DISABLE_FLAG)
2532 *sec_op = IMC_SIM_CURR_SEC_OP_FDN_DISABLE;
2534 *sec_op = IMC_SIM_CURR_SEC_OP_FDN_STATUS;
2536 case TEL_SIM_LOCK_PN :
2538 if (flag == ENABLE_FLAG)
2539 *sec_op = IMC_SIM_CURR_SEC_OP_NET_ENABLE;
2540 else if (flag == DISABLE_FLAG)
2541 *sec_op = IMC_SIM_CURR_SEC_OP_NET_DISABLE;
2543 *sec_op = IMC_SIM_CURR_SEC_OP_NET_STATUS;
2545 case TEL_SIM_LOCK_PU :
2547 if (flag == ENABLE_FLAG)
2548 *sec_op = IMC_SIM_CURR_SEC_OP_NS_ENABLE;
2549 else if (flag == DISABLE_FLAG)
2550 *sec_op = IMC_SIM_CURR_SEC_OP_NS_DISABLE;
2552 *sec_op = IMC_SIM_CURR_SEC_OP_NS_STATUS;
2554 case TEL_SIM_LOCK_PP :
2556 if (flag == ENABLE_FLAG)
2557 *sec_op = IMC_SIM_CURR_SEC_OP_SP_ENABLE;
2558 else if (flag == DISABLE_FLAG)
2559 *sec_op = IMC_SIM_CURR_SEC_OP_SP_DISABLE;
2561 *sec_op = IMC_SIM_CURR_SEC_OP_SP_STATUS;
2563 case TEL_SIM_LOCK_PC :
2565 if (flag == ENABLE_FLAG)
2566 *sec_op = IMC_SIM_CURR_SEC_OP_CP_ENABLE;
2567 else if (flag == DISABLE_FLAG)
2568 *sec_op = IMC_SIM_CURR_SEC_OP_CP_DISABLE;
2570 *sec_op = IMC_SIM_CURR_SEC_OP_CP_STATUS;
2573 err("Unhandled sim lock type [%d]", lock_type);
2578 static int __imc_sim_get_lock_type(ImcSimCurrSecOp sec_op)
2581 case IMC_SIM_CURR_SEC_OP_SIM_DISABLE :
2582 case IMC_SIM_CURR_SEC_OP_SIM_ENABLE :
2583 case IMC_SIM_CURR_SEC_OP_SIM_STATUS :
2584 return TEL_SIM_LOCK_PS;
2585 case IMC_SIM_CURR_SEC_OP_PIN1_DISABLE :
2586 case IMC_SIM_CURR_SEC_OP_PIN1_ENABLE :
2587 case IMC_SIM_CURR_SEC_OP_PIN1_STATUS :
2588 return TEL_SIM_LOCK_SC;
2589 case IMC_SIM_CURR_SEC_OP_FDN_DISABLE :
2590 case IMC_SIM_CURR_SEC_OP_FDN_ENABLE :
2591 case IMC_SIM_CURR_SEC_OP_FDN_STATUS :
2592 return TEL_SIM_LOCK_FD;
2593 case IMC_SIM_CURR_SEC_OP_NET_DISABLE :
2594 case IMC_SIM_CURR_SEC_OP_NET_ENABLE :
2595 case IMC_SIM_CURR_SEC_OP_NET_STATUS :
2596 return TEL_SIM_LOCK_PN;
2597 case IMC_SIM_CURR_SEC_OP_NS_DISABLE :
2598 case IMC_SIM_CURR_SEC_OP_NS_ENABLE :
2599 case IMC_SIM_CURR_SEC_OP_NS_STATUS :
2600 return TEL_SIM_LOCK_PU;
2601 case IMC_SIM_CURR_SEC_OP_SP_DISABLE :
2602 case IMC_SIM_CURR_SEC_OP_SP_ENABLE :
2603 case IMC_SIM_CURR_SEC_OP_SP_STATUS :
2604 return TEL_SIM_LOCK_PP;
2605 case IMC_SIM_CURR_SEC_OP_CP_DISABLE :
2606 case IMC_SIM_CURR_SEC_OP_CP_ENABLE :
2607 case IMC_SIM_CURR_SEC_OP_CP_STATUS :
2608 return TEL_SIM_LOCK_PC ;
2610 err("Invalid sec op [%d]", sec_op);
2617 * Notification: +XSIM: <SIM state>
2619 * Possible values of <SIM state> can be
2621 * 1 PIN verification needed
2622 * 2 PIN verification not needed - Ready
2623 * 3 PIN verified - Ready
2624 * 4 PUK verification needed
2625 * 5 SIM permanently blocked
2627 * 7 ready for attach (+COPS)
2628 * 8 SIM Technical Problem
2630 * 10 SIM Reactivating
2631 * 11 SIM Reactivated
2632 * 12 SIM SMS Caching Completed. (Sent only when SMS caching enabled)
2633 * 99 SIM State Unknown
2635 static gboolean on_notification_imc_sim_status(CoreObject *co,
2636 const void *event_info, void *user_data)
2638 GSList *lines = (GSList *)event_info;
2641 dbg("SIM notification - SIM status: [+XSIM]");
2643 if (g_slist_length(lines) != 1) {
2644 err("+XSIM unsolicited message expected to be "
2645 "Single line but received multiple lines");
2649 line = (const gchar *) (lines->data);
2657 * +XSIM: <SIM state>
2659 tokens = tcore_at_tok_new(line);
2660 if (g_slist_length(tokens) == 1) {
2662 sim_state = atoi(g_slist_nth_data(tokens, 0));
2664 /* Process SIM Status */
2665 __imc_sim_process_sim_status(co, sim_state);
2667 err("Invalid message");
2670 tcore_at_tok_free(tokens);
2677 static TcoreHookReturn on_hook_imc_modem_power(TcorePlugin *source,
2678 TcoreNotification command, guint data_len, void *data, void *user_data)
2680 CoreObject *co = (CoreObject *)user_data;
2682 tcore_check_return_value(co != NULL, TCORE_HOOK_RETURN_CONTINUE);
2684 dbg("Get SIM status");
2685 (void)__imc_sim_get_sim_status(co, NULL, NULL);
2687 return TCORE_HOOK_RETURN_CONTINUE;
2690 /* Response Functions */
2691 static void on_response_imc_sim_req_authentication(TcorePending *p, guint data_len,
2692 const void *data, void *user_data)
2694 const TcoreAtResponse *at_resp = data;
2695 GSList *tokens = NULL;
2696 CoreObject *co = tcore_pending_ref_core_object(p);
2697 TelSimAuthenticationResponse auth_resp = {0, };
2698 TelSimResult sim_result = TEL_SIM_RESULT_FAILURE;
2699 ImcRespCbData *resp_cb_data = user_data;
2700 TelSimAuthenticationType *auth_type = (TelSimAuthenticationType *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
2704 if (NULL == at_resp) {
2705 err("at_resp is NULL");
2706 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2710 auth_resp.auth_type = *auth_type;
2712 if (at_resp->success == TRUE) {
2717 if (at_resp->lines != NULL) {
2718 line = at_resp->lines->data;
2719 dbg("Received data: [%s]", line);
2721 err("at_resp->lines is NULL");
2722 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2726 tokens = tcore_at_tok_new(line);
2727 if (tokens == NULL) {
2728 err("tokens is NULL");
2729 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2733 status = atoi(g_slist_nth_data(tokens, 0));
2736 dbg("Authentications successful");
2737 auth_resp.detailed_result = TEL_SIM_AUTH_NO_ERROR;
2740 err("Synchronize fail");
2741 auth_resp.detailed_result = TEL_SIM_AUTH_SYNCH_FAILURE;
2745 auth_resp.detailed_result = TEL_SIM_AUTH_MAK_CODE_FAILURE;
2748 err("Does not support security context");
2749 auth_resp.detailed_result = TEL_SIM_AUTH_UNSUPPORTED_CONTEXT;
2752 err("Other failure");
2753 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2757 if (auth_resp.auth_type == TEL_SIM_AUTH_GSM) {
2759 char *convert_kc, *convert_sres;
2761 kc = g_slist_nth_data(tokens, 1);
2763 guint convert_kc_len = 0;
2764 kc = tcore_at_tok_extract(kc);
2765 dbg("Kc: [%s]", kc);
2767 tcore_util_hexstring_to_bytes(kc, &convert_kc, &convert_kc_len);
2768 if (convert_kc_len && convert_kc_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
2769 auth_resp.authentication_key_length = convert_kc_len;
2770 memcpy(&auth_resp.authentication_key, convert_kc, convert_kc_len);
2773 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2779 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2783 sres = g_slist_nth_data(tokens, 2);
2785 guint convert_sres_len = 0;
2786 sres = tcore_at_tok_extract(sres);
2787 dbg("SRES: [%s]", sres);
2789 tcore_util_hexstring_to_bytes(sres, &convert_sres, &convert_sres_len);
2790 if (convert_sres_len && convert_sres_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
2791 auth_resp.resp_length = convert_sres_len;
2792 memcpy(&auth_resp.resp_data, convert_sres, convert_sres_len);
2794 err("Invalid SRES");
2795 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2798 g_free(convert_sres);
2800 err("Invalid SRES");
2801 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2804 } else if (auth_resp.auth_type == TEL_SIM_AUTH_3G_CTX) {
2805 char *res, *ck, *ik, *kc;
2806 char *convert_res, *convert_ck;
2807 char *convert_ik, *convert_kc;
2809 res = g_slist_nth_data(tokens, 1);
2811 guint convert_res_len = 0;
2812 res = tcore_at_tok_extract(res);
2813 dbg("RES/AUTS: [%s]", res);
2815 tcore_util_hexstring_to_bytes(res, &convert_res, &convert_res_len);
2816 if (convert_res_len && convert_res_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
2817 auth_resp.resp_length = convert_res_len;
2818 memcpy(auth_resp.resp_data, convert_res, convert_res_len);
2820 err("Invalid RES/AUTS");
2821 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2824 g_free(convert_res);
2826 err("Invalid RES/AUTS");
2827 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2831 ck = g_slist_nth_data(tokens, 2);
2833 guint convert_ck_len = 0;
2834 ck = tcore_at_tok_extract(ck);
2835 dbg("CK: [%s]", ck);
2837 tcore_util_hexstring_to_bytes(ck, &convert_ck, &convert_ck_len);
2838 if (convert_ck_len && convert_ck_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
2839 auth_resp.cipher_length = convert_ck_len;
2840 memcpy(&auth_resp.cipher_data, convert_ck, convert_ck_len);
2843 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2849 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2853 ik = g_slist_nth_data(tokens, 3);
2855 guint convert_ik_len = 0;
2856 ik = tcore_at_tok_extract(ik);
2857 dbg("IK: [%s]", ik);
2859 tcore_util_hexstring_to_bytes(ik, &convert_ik, &convert_ik_len);
2860 if (convert_ik_len && convert_ik_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
2861 auth_resp.integrity_length = convert_ik_len;
2862 memcpy(&auth_resp.integrity_data, convert_ik, convert_ik_len);
2865 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2871 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2875 kc = g_slist_nth_data(tokens, 4);
2877 guint convert_kc_len = 0;
2878 kc = tcore_at_tok_extract(kc);
2879 dbg("Kc: [%s]", kc);
2881 tcore_util_hexstring_to_bytes(kc, &convert_kc, &convert_kc_len);
2882 if (convert_kc_len && convert_kc_len <= TEL_SIM_AUTH_MAX_RESP_DATA_LEN) {
2883 auth_resp.authentication_key_length = convert_kc_len;
2884 memcpy(&auth_resp.authentication_key, convert_kc, convert_kc_len);
2887 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2893 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2897 err("Not supported");
2898 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2901 sim_result = TEL_SIM_RESULT_SUCCESS;
2903 err("RESPONSE NOK");
2904 auth_resp.detailed_result = TEL_SIM_AUTH_CANNOT_PERFORM;
2908 if(resp_cb_data->cb)
2909 resp_cb_data->cb(co, (gint)sim_result, &auth_resp, resp_cb_data->cb_data);
2911 /* free resp_cb_data */
2912 imc_destroy_resp_cb_data(resp_cb_data);
2914 tcore_at_tok_free(tokens);
2917 static void on_response_imc_sim_verify_pins(TcorePending *p, guint data_len,
2918 const void *data, void *user_data)
2920 const TcoreAtResponse *at_resp = data;
2921 ImcRespCbData *resp_cb_data = user_data;
2922 CoreObject *co = tcore_pending_ref_core_object(p);
2923 TelSimResult result = TEL_SIM_RESULT_FAILURE;
2924 ImcSimCurrSecOp *sec_op = NULL;
2925 TelSimSecPinResult verify_pin_resp = {0, };
2929 tcore_check_return_assert(co != NULL);
2930 tcore_check_return_assert(resp_cb_data != NULL);
2932 sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
2934 if (at_resp && at_resp->success) {
2935 dbg("Sim Verify Pin Response- [OK]");
2937 result = TEL_SIM_RESULT_SUCCESS;
2939 if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN1_VERIFY) {
2940 TelSimCardStatus status;
2942 verify_pin_resp.pin_type = TEL_SIM_PIN_TYPE_PIN1;
2944 tcore_sim_get_status(co, &status);
2945 if (status != TEL_SIM_STATUS_SIM_INIT_COMPLETED) {
2946 /*Update sim status*/
2947 __imc_sim_update_sim_status(co,
2948 TEL_SIM_STATUS_SIM_INITIALIZING);
2950 } else if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN2_VERIFY) {
2951 verify_pin_resp.pin_type = TEL_SIM_PIN_TYPE_PIN2;
2955 if(resp_cb_data->cb)
2956 resp_cb_data->cb(co, (gint)result,
2958 resp_cb_data->cb_data);
2959 imc_destroy_resp_cb_data(resp_cb_data);
2961 err("Sim Verify Pin Response- [NOK]");
2962 /* Get retry count */
2963 __imc_sim_get_retry_count(co, resp_cb_data);
2967 static void on_response_imc_sim_verify_puks(TcorePending *p, guint data_len,
2968 const void *data, void *user_data)
2970 const TcoreAtResponse *at_resp = data;
2971 ImcRespCbData *resp_cb_data = user_data;
2972 CoreObject *co = tcore_pending_ref_core_object(p);
2973 TelSimResult result = TEL_SIM_RESULT_FAILURE;
2974 ImcSimCurrSecOp *sec_op = NULL;
2975 TelSimSecPukResult verify_puk_resp = {0, };
2979 tcore_check_return_assert(co != NULL);
2980 tcore_check_return_assert(resp_cb_data != NULL);
2982 sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
2984 if (at_resp && at_resp->success) {
2985 dbg("Sim Verify Puk Response- [OK]");
2987 result = TEL_SIM_RESULT_SUCCESS;
2989 if (*sec_op == IMC_SIM_CURR_SEC_OP_PUK1_VERIFY) {
2990 verify_puk_resp.puk_type = TEL_SIM_PUK_TYPE_PUK1;
2991 } else if (*sec_op == IMC_SIM_CURR_SEC_OP_PUK2_VERIFY) {
2992 verify_puk_resp.puk_type = TEL_SIM_PUK_TYPE_PUK2;
2995 if(resp_cb_data->cb)
2996 resp_cb_data->cb(co, (gint)result,
2998 resp_cb_data->cb_data);
2999 imc_destroy_resp_cb_data(resp_cb_data);
3001 err("Sim Verify Puk Response- [NOK]");
3002 /* Get retry count */
3003 __imc_sim_get_retry_count(co, resp_cb_data);
3007 static void on_response_imc_sim_change_pins(TcorePending *p, guint data_len,
3008 const void *data, void *user_data)
3010 const TcoreAtResponse *at_resp = data;
3011 ImcRespCbData *resp_cb_data = user_data;
3012 CoreObject *co = tcore_pending_ref_core_object(p);
3013 TelSimResult result = TEL_SIM_RESULT_FAILURE;
3014 ImcSimCurrSecOp *sec_op = NULL;
3015 TelSimSecPinResult change_pin_resp = {0, };
3019 tcore_check_return_assert(co != NULL);
3020 tcore_check_return_assert(resp_cb_data != NULL);
3022 sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
3024 if (at_resp && at_resp->success) {
3025 dbg("Sim Change Pin Response- [OK]");
3027 result = TEL_SIM_RESULT_SUCCESS;
3029 if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN1_CHANGE) {
3030 change_pin_resp.pin_type = TEL_SIM_PIN_TYPE_PIN1;
3031 } else if (*sec_op == IMC_SIM_CURR_SEC_OP_PIN2_CHANGE) {
3032 change_pin_resp.pin_type = TEL_SIM_PIN_TYPE_PIN2;
3035 if(resp_cb_data->cb)
3036 resp_cb_data->cb(co, (gint)result,
3038 resp_cb_data->cb_data);
3039 imc_destroy_resp_cb_data(resp_cb_data);
3041 err("Sim Change Pin Response- [NOK]");
3042 /* Get retry count */
3043 __imc_sim_get_retry_count(co, resp_cb_data);
3047 static void on_response_imc_sim_disable_facility(TcorePending *p, guint data_len,
3048 const void *data, void *user_data)
3050 const TcoreAtResponse *at_resp = data;
3051 ImcRespCbData *resp_cb_data = user_data;
3052 CoreObject *co = tcore_pending_ref_core_object(p);
3053 TelSimResult result = TEL_SIM_RESULT_FAILURE;
3054 ImcSimCurrSecOp *sec_op = NULL;
3055 TelSimFacilityResult disable_facility_resp = {0, };
3059 tcore_check_return_assert(co != NULL);
3060 tcore_check_return_assert(resp_cb_data != NULL);
3062 sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
3064 if (at_resp && at_resp->success) {
3066 dbg("Sim Disable Facility Response- [OK]");
3068 lock_type = __imc_sim_get_lock_type(*sec_op);
3069 if (lock_type == -1) {
3070 result = TEL_SIM_RESULT_INVALID_PARAMETER;
3073 if(resp_cb_data->cb)
3074 resp_cb_data->cb(co, (gint)result,
3076 resp_cb_data->cb_data);
3077 imc_destroy_resp_cb_data(resp_cb_data);
3081 disable_facility_resp.type = lock_type;
3082 result = TEL_SIM_RESULT_SUCCESS;
3085 if(resp_cb_data->cb)
3086 resp_cb_data->cb(co, (gint)result,
3087 &disable_facility_resp,
3088 resp_cb_data->cb_data);
3089 imc_destroy_resp_cb_data(resp_cb_data);
3091 err("Sim Disable Facility Response- [NOK]");
3092 /* Get retry count */
3093 __imc_sim_get_retry_count(co, resp_cb_data);
3097 static void on_response_imc_sim_enable_facility(TcorePending *p, guint data_len,
3098 const void *data, void *user_data)
3100 const TcoreAtResponse *at_resp = data;
3101 ImcRespCbData *resp_cb_data = user_data;
3102 CoreObject *co = tcore_pending_ref_core_object(p);
3103 TelSimResult result = TEL_SIM_RESULT_FAILURE;
3104 ImcSimCurrSecOp *sec_op = NULL;
3105 TelSimFacilityResult enable_facility_resp = {0, };
3109 tcore_check_return_assert(co != NULL);
3110 tcore_check_return_assert(resp_cb_data != NULL);
3112 sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
3114 if (at_resp && at_resp->success) {
3116 dbg("Sim Enable Facility Response- [OK]");
3118 lock_type = __imc_sim_get_lock_type(*sec_op);
3119 if (lock_type == -1) {
3120 result = TEL_SIM_RESULT_INVALID_PARAMETER;
3123 if(resp_cb_data->cb)
3124 resp_cb_data->cb(co, (gint)result,
3126 resp_cb_data->cb_data);
3127 imc_destroy_resp_cb_data(resp_cb_data);
3131 enable_facility_resp.type = lock_type;
3132 result = TEL_SIM_RESULT_SUCCESS;
3135 if(resp_cb_data->cb)
3136 resp_cb_data->cb(co, (gint)result,
3137 &enable_facility_resp,
3138 resp_cb_data->cb_data);
3139 imc_destroy_resp_cb_data(resp_cb_data);
3141 err("Sim Enable Facility Response- [NOK]");
3142 /* Get retry count */
3143 __imc_sim_get_retry_count(co, resp_cb_data);
3147 static void on_response_imc_sim_get_facility(TcorePending *p, guint data_len,
3148 const void *data, void *user_data)
3150 const TcoreAtResponse *at_resp = data;
3151 ImcRespCbData *resp_cb_data = user_data;
3152 CoreObject *co = tcore_pending_ref_core_object(p);
3153 TelSimResult result = TEL_SIM_RESULT_FAILURE;
3154 ImcSimCurrSecOp *sec_op = NULL;
3155 TelSimFacilityInfo get_facility_resp = {0, };
3159 tcore_check_return_assert(co != NULL);
3160 tcore_check_return_assert(resp_cb_data != NULL);
3162 sec_op = (ImcSimCurrSecOp *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
3164 if (at_resp && at_resp->success) {
3165 GSList *tokens = NULL;
3169 dbg("Sim Get Facility Response- [OK]");
3171 lock_type = __imc_sim_get_lock_type(*sec_op);
3172 if (lock_type == -1) {
3173 result = TEL_SIM_RESULT_INVALID_PARAMETER;
3176 if (at_resp->lines) {
3177 line = (const char *)at_resp->lines->data;
3178 tokens = tcore_at_tok_new(line);
3179 if (g_slist_length(tokens) != 1) {
3180 err("Invalid message");
3181 tcore_at_tok_free(tokens);
3184 get_facility_resp.f_status = atoi(g_slist_nth_data(tokens, 0));
3185 get_facility_resp.type = lock_type;
3186 result = TEL_SIM_RESULT_SUCCESS;
3189 tcore_at_tok_free(tokens);
3191 err("Sim Get Facility Response- [NOK]");
3192 result = __imc_sim_convert_cme_error_tel_sim_result(at_resp);
3196 /* Invoke callback */
3197 if(resp_cb_data->cb)
3198 resp_cb_data->cb(co, (gint)result, &get_facility_resp, resp_cb_data->cb_data);
3199 imc_destroy_resp_cb_data(resp_cb_data);
3202 static void on_response_imc_sim_get_lock_info(TcorePending *p, guint data_len,
3203 const void *data, void *user_data)
3205 const TcoreAtResponse *at_resp = data;
3206 ImcRespCbData *resp_cb_data = user_data;
3207 CoreObject *co = tcore_pending_ref_core_object(p);
3208 TelSimResult result = TEL_SIM_RESULT_FAILURE;
3209 TelSimLockInfo get_lock_info_resp = {0, };
3213 tcore_check_return_assert(co != NULL);
3214 tcore_check_return_assert(resp_cb_data != NULL);
3216 if(at_resp && at_resp->success) {
3217 GSList *tokens = NULL;
3220 int attempts_left = 0;
3221 int time_penalty = 0;
3223 dbg("Sim Get Lock Info Response- [OK]");
3225 if (at_resp->lines) {
3226 line = (const char *)at_resp->lines->data;
3227 tokens = tcore_at_tok_new(line);
3228 if (g_slist_length(tokens) < 3) {
3229 err("Invalid message");
3230 tcore_at_tok_free(tokens);
3234 lock_type = atoi(g_slist_nth_data(tokens, 0));
3235 attempts_left = atoi(g_slist_nth_data(tokens, 1));
3236 time_penalty = atoi(g_slist_nth_data(tokens, 2));
3238 dbg("lock_type = %d, attempts_left = %d, time_penalty = %d",
3239 lock_type, attempts_left, time_penalty);
3241 get_lock_info_resp.lock_type = __imc_sim_lock_type(lock_type);
3242 get_lock_info_resp.retry_count = attempts_left;
3243 result = TEL_SIM_RESULT_SUCCESS;
3245 tcore_at_tok_free(tokens);
3247 err("Sim Get Lock Info Response- [NOK]");
3248 result = __imc_sim_convert_cme_error_tel_sim_result(at_resp);
3251 /* Invoke callback */
3252 if(resp_cb_data->cb)
3253 resp_cb_data->cb(co, (gint)result, &get_lock_info_resp, resp_cb_data->cb_data);
3254 imc_destroy_resp_cb_data(resp_cb_data);
3257 static void on_response_imc_sim_req_apdu (TcorePending *p, guint data_len, const void *data, void *user_data)
3259 const TcoreAtResponse *resp = data;
3260 CoreObject *co = NULL;
3261 TelSimApduResp apdu_resp = {0,};
3262 TelSimResult sim_result = TEL_SIM_RESULT_FAILURE;
3263 GSList *tokens = NULL;
3265 ImcRespCbData *resp_cb_data = (ImcRespCbData *) user_data;
3269 co = tcore_pending_ref_core_object(p);
3271 if (resp->success > 0) {
3275 char *decoded_data = NULL;
3276 guint decoded_data_len = 0;
3277 line = (const char *)resp->lines->data;
3278 tokens = tcore_at_tok_new(line);
3279 if (g_slist_length(tokens) != 2) {
3280 err("Invalid message");
3284 tmp = tcore_at_tok_extract(g_slist_nth_data(tokens, 1));
3285 tcore_util_hexstring_to_bytes(tmp, &decoded_data, &decoded_data_len);
3287 apdu_resp.apdu_resp_len = decoded_data_len;
3288 memcpy((char *)apdu_resp.apdu_resp, decoded_data, decoded_data_len);
3290 g_free(decoded_data);
3291 sim_result = TEL_SIM_RESULT_SUCCESS;
3294 err("RESPONSE NOK");
3295 sim_result = __imc_sim_convert_cme_error_tel_sim_result(resp);
3300 if (resp_cb_data->cb)
3301 resp_cb_data->cb(co, (gint)sim_result, &apdu_resp, resp_cb_data->cb_data);
3302 tcore_at_tok_free(tokens);
3303 imc_destroy_resp_cb_data(resp_cb_data);
3307 static void on_response_imc_sim_req_atr(TcorePending *p, guint data_len, const void *data, void *user_data)
3309 const TcoreAtResponse *resp = data;
3310 CoreObject *co = NULL;
3311 TelSimAtr atr_res = {0,};
3312 TelSimResult sim_result = TEL_SIM_RESULT_FAILURE;
3313 GSList *tokens = NULL;
3315 ImcRespCbData *resp_cb_data = (ImcRespCbData *) user_data;
3319 co = tcore_pending_ref_core_object(p);
3321 if (resp->success > 0) {
3325 char *decoded_data = NULL;
3326 guint decoded_data_len = 0;
3327 line = (const char *)resp->lines->data;
3328 tokens = tcore_at_tok_new(line);
3329 if (g_slist_length(tokens) < 1) {
3330 err("Invalid message");
3334 tmp = tcore_at_tok_extract(g_slist_nth_data(tokens, 0));
3335 tcore_util_hexstring_to_bytes(tmp, &decoded_data, &decoded_data_len);
3337 atr_res.atr_len = decoded_data_len;
3338 memcpy((char *)atr_res.atr, decoded_data, decoded_data_len);
3340 g_free(decoded_data);
3341 sim_result = TEL_SIM_RESULT_SUCCESS;
3344 err("RESPONSE NOK");
3345 sim_result = __imc_sim_convert_cme_error_tel_sim_result(resp);
3351 if (resp_cb_data->cb)
3352 resp_cb_data->cb(co, (gint)sim_result, &atr_res, resp_cb_data->cb_data);
3353 tcore_at_tok_free(tokens);
3354 imc_destroy_resp_cb_data(resp_cb_data);
3358 /* SIM Operations */
3360 * Operation - get_imsi
3363 * AT-Command: AT+CRSM= <command>[,<fileid>[,<P1>,<P2>,<P3>[,<data>[,<pathid>]]]]
3374 * 28423 meaning IMSI file (6F07)
3375 * 28473 meaning ACM file (6F39)
3376 * 28481 meaning PUKT file (6F41)
3377 * 28482 meaning SMS file (6F42)
3380 * Integer type defining the request.
3381 * These parameters are mandatory for every command, except GET RESPONSE and STATUS.
3384 * Information which shall be written to the SIM
3387 * String type, contains the path of an elementary file on the SIM/USIM in hexadecimal format
3395 * +CRSM: <sw1>,<sw2>[,<response>]
3398 * Integer type containing the SIM information
3401 * Response of successful completion of the command previously issued
3404 * +CME ERROR: <error>
3406 static TelReturn imc_sim_get_imsi (CoreObject *co,
3407 TcoreObjectResponseCallback cb, void *cb_data)
3412 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_IMSI, ret);
3417 static TelReturn imc_sim_get_ecc (CoreObject *co,
3418 TcoreObjectResponseCallback cb, void *cb_data)
3423 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_ECC, ret);
3428 static TelReturn imc_sim_get_iccid (CoreObject *co,
3429 TcoreObjectResponseCallback cb, void *cb_data)
3434 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_ICCID, ret);
3439 static TelReturn imc_sim_get_language (CoreObject *co,
3440 TcoreObjectResponseCallback cb, void *cb_data)
3445 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_LP, ret);
3449 static TelReturn imc_sim_set_language (CoreObject *co,
3450 TelSimLanguagePreferenceCode language,
3451 TcoreObjectResponseCallback cb, void *cb_data)
3453 ImcSimMetaInfo file_meta = {0, };
3454 TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
3455 ImcRespCbData *resp_cb_data = NULL;
3456 char *encoded_data = NULL;
3457 int encoded_data_len = 0;
3464 file_meta.file_id = TEL_SIM_EF_LP;
3465 file_meta.file_result = TEL_SIM_RESULT_FAILURE;
3467 tcore_sim_get_type(co, &card_type);
3469 dbg("language[%d], card_type[%d]", language, card_type);
3471 if (TEL_SIM_CARD_TYPE_GSM == card_type) {
3474 tcore_sim_encode_lp(language, &encoded_data, &encoded_data_len);
3475 } else if (TEL_SIM_CARD_TYPE_USIM == card_type) {
3479 if (tcore_sim_encode_li(language, &tmp, &encoded_data_len)) {
3480 encoded_data = g_strdup_printf("%02x%02x", tmp[0], tmp[1]);
3484 err("Failed to encode Language [%d]", language);
3485 return TEL_RETURN_FAILURE;
3488 err("Invalid card_type:[%d]", card_type);
3489 return TEL_RETURN_OPERATION_NOT_SUPPORTED;
3492 if (!encoded_data_len) {
3493 err("Failed to encode Language [%d]", language);
3494 return TEL_RETURN_FAILURE;
3496 dbg("Encoded Language [%s] len[%d]", encoded_data, encoded_data_len);
3500 p3 = encoded_data_len;
3502 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
3503 &file_meta, sizeof(ImcSimMetaInfo));
3505 return __imc_sim_update_file(co, resp_cb_data,
3506 IMC_SIM_ACCESS_UPDATE_BINARY, TEL_SIM_EF_LP,
3507 p1, p2, p3, encoded_data);
3510 static TelReturn imc_sim_get_callforwarding_info (CoreObject *co,
3511 TcoreObjectResponseCallback cb, void *cb_data)
3516 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_USIM_CFIS, ret);
3521 static TelReturn imc_sim_get_messagewaiting_info (CoreObject *co,
3522 TcoreObjectResponseCallback cb, void *cb_data)
3527 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_USIM_MWIS, ret);
3532 static TelReturn imc_sim_set_messagewaiting_info (CoreObject *co,
3533 const TelSimMwis *request, TcoreObjectResponseCallback cb, void *cb_data)
3535 ImcSimMetaInfo file_meta = {0, };
3536 ImcRespCbData *resp_cb_data = NULL;
3537 gchar *encoded_mwis;
3538 guint encoded_mwis_len = 0;
3539 gchar *encoded_data = NULL;
3540 guint encoded_data_len = 0;
3548 * Videomail is not supported.
3550 if (!tcore_sim_encode_mwis(request, TEL_SIM_MAILBOX_TYPE_MAX,
3551 &encoded_mwis, &encoded_mwis_len)) {
3552 err("Failed to encode mwis");
3553 return TEL_RETURN_FAILURE;
3556 encoded_data_len = 2 * encoded_mwis_len;
3557 encoded_data = (char *)tcore_malloc0(encoded_data_len + 1);
3558 tcore_util_byte_to_hex(encoded_mwis, encoded_data, encoded_mwis_len);
3559 tcore_free(encoded_mwis);
3560 dbg("Encoded data: [%s] Encoded data length: [%d]", encoded_data, encoded_data_len);
3564 p3 = TEL_SIM_MAILBOX_TYPE_MAX; /* Indicator Status | Voicemail | Fax | Electronic Mail | Others */
3565 dbg("p1: [%d] p2: [%d] p3: [%d]", p1, p2, p3);
3567 file_meta.file_id = TEL_SIM_EF_USIM_MWIS;
3568 file_meta.file_result = TEL_SIM_RESULT_FAILURE;
3570 resp_cb_data = imc_create_resp_cb_data(cb, cb_data, &file_meta, sizeof(ImcSimMetaInfo));
3572 return __imc_sim_update_file(co, resp_cb_data, IMC_SIM_ACCESS_UPDATE_RECORD,
3573 TEL_SIM_EF_USIM_MWIS, p1, p2, p3, encoded_data);
3576 static TelReturn imc_sim_get_mailbox_info (CoreObject *co,
3577 TcoreObjectResponseCallback cb, void *cb_data)
3582 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_USIM_MBI, ret);
3586 static void __sim_set_mailbox_info(CoreObject *co, ImcRespCbData *resp_cb_data)
3589 char *encoded_data = NULL;
3590 int encoded_data_len = 0;
3594 TelSimResult sim_result = TEL_SIM_RESULT_FAILURE;
3595 ImcSimMetaInfo *file_meta = (ImcSimMetaInfo *)IMC_GET_DATA_FROM_RESP_CB_DATA(resp_cb_data);
3596 ImcSimPrivateInfo *priv_info = tcore_sim_ref_userdata(co);
3600 if (!file_meta || !file_meta->mb_data || !priv_info) {
3601 err("NULL data : file_meta[%p], file_meta->mb_data[%p], priv_info[%p]",
3602 file_meta, file_meta->mb_data, priv_info);
3606 if (file_meta->mbdn_index == VAL_MINUS_ONE) {
3607 err("Failed to get MBDN Index");
3611 dbg("mbdn_index:[%d], mb_rec_len:[%d]",
3612 file_meta->mbdn_index, priv_info->mb_rec_len);
3614 if (!tcore_sim_encode_xdn(file_meta->mb_data->alpha_id,
3615 file_meta->mb_data->number,
3616 priv_info->mb_rec_len, &tmp)) {
3617 err("Failed to encode mailbox_info");
3624 dbg("Record length: [%d]", priv_info->mb_rec_len);
3626 encoded_data_len = 2 * priv_info->mb_rec_len;
3627 encoded_data = (char *)tcore_malloc0(encoded_data_len + 1);
3628 tcore_util_byte_to_hex(tmp, encoded_data, priv_info->mb_rec_len);
3629 if (!encoded_data) {
3630 err("Failed to convert byte to hex");
3634 p1 = file_meta->mbdn_index;
3636 p3 = priv_info->mb_rec_len;
3637 dbg("encoded_data - [%s], encoded_data_len - %d",
3638 encoded_data, priv_info->mb_rec_len);
3640 __imc_sim_update_file(co, resp_cb_data,
3641 IMC_SIM_ACCESS_UPDATE_RECORD,
3642 TEL_SIM_EF_MBDN, p1, p2, p3, encoded_data);
3645 tcore_free(file_meta->mb_data);
3646 file_meta->mb_data = NULL;
3653 if (resp_cb_data->cb)
3654 resp_cb_data->cb(co, (gint)sim_result, NULL, resp_cb_data->cb_data);
3658 tcore_free(encoded_data);
3659 tcore_free(file_meta->mb_data);
3660 file_meta->mb_data = NULL;
3661 imc_destroy_resp_cb_data(resp_cb_data);
3666 static TelReturn imc_sim_set_mailbox_info (CoreObject *co,
3667 const TelSimMailBoxNumber *request, TcoreObjectResponseCallback cb, void *cb_data)
3669 ImcSimMetaInfo file_meta = {0, };
3670 ImcRespCbData *resp_cb_data = NULL;
3675 file_meta.file_id = TEL_SIM_EF_USIM_MBI;
3676 file_meta.file_result = TEL_SIM_RESULT_FAILURE;
3678 file_meta.mb_data = (TelSimMailBoxNumber *)tcore_malloc0(sizeof(TelSimMailBoxNumber));
3679 memcpy(file_meta.mb_data, request, sizeof(TelSimMailBoxNumber));
3681 resp_cb_data = imc_create_resp_cb_data(cb, cb_data, &file_meta, sizeof(ImcSimMetaInfo));
3682 ret = __imc_sim_get_response(co, resp_cb_data);
3687 static TelReturn imc_sim_get_msisdn (CoreObject *co,
3688 TcoreObjectResponseCallback cb, void *cb_data)
3693 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_MSISDN, ret);
3698 static TelReturn imc_sim_get_spn (CoreObject *co,
3699 TcoreObjectResponseCallback cb, void *cb_data)
3704 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_SPN, ret);
3709 static TelReturn imc_sim_get_cphs_netname (CoreObject *co,
3710 TcoreObjectResponseCallback cb, void *cb_data)
3715 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_CPHS_OPERATOR_NAME_STRING, ret);
3720 static TelReturn imc_sim_get_sp_display_info (CoreObject *co,
3721 TcoreObjectResponseCallback cb, void *cb_data)
3726 IMC_SIM_READ_FILE(co, cb, cb_data, TEL_SIM_EF_SPDI, ret);
3731 static TelReturn imc_sim_req_authentication (CoreObject *co,
3732 const TelSimAuthenticationData *request,
3733 TcoreObjectResponseCallback cb, void *cb_data)
3735 gchar *cmd_str = NULL;
3736 ImcRespCbData *resp_cb_data = NULL;
3737 TelReturn ret = TEL_RETURN_FAILURE;
3738 TelSimCardType card_type = TEL_SIM_CARD_TYPE_UNKNOWN;
3739 char *convert_rand = NULL;
3740 char *convert_autn = NULL;
3746 tcore_sim_get_type(co, &card_type);
3747 if (TEL_SIM_CARD_TYPE_GSM == card_type || TEL_SIM_CARD_TYPE_USIM == card_type) {
3750 err("Not Supported SIM type:[%d]", card_type);
3751 return TEL_SIM_RESULT_OPERATION_NOT_SUPPORTED;
3754 convert_rand = tcore_malloc0(request->rand_length*2 + 1);
3755 tcore_util_byte_to_hex(request->rand_data, convert_rand, request->rand_length);
3756 dbg("Convert RAND hex to string: [%s]", convert_rand);
3758 switch (request->auth_type) {
3759 case TEL_SIM_AUTH_GSM:
3761 cmd_str = g_strdup_printf("AT+XAUTH=%d,%d,\"%s\"",
3762 session_id, context_type, convert_rand);
3764 case TEL_SIM_AUTH_3G_CTX:
3766 convert_autn = tcore_malloc0(request->autn_length*2 + 1);
3767 tcore_util_byte_to_hex(request->autn_data, convert_autn, request->autn_length);
3769 dbg("Convert AUTN hex to string: [%s]", convert_autn);
3771 cmd_str = g_strdup_printf("AT+XAUTH=%d,%d,\"%s\",\"%s\"",
3772 session_id, context_type, convert_rand, convert_autn);
3775 err("Not supported Authentication type:[%d]", request->auth_type);
3776 ret = TEL_SIM_RESULT_OPERATION_NOT_SUPPORTED;
3780 resp_cb_data = imc_create_resp_cb_data(cb, cb_data, (void *)&request->auth_type, sizeof(TelSimAuthenticationType));
3782 ret = tcore_at_prepare_and_send_request(co,
3784 TCORE_AT_COMMAND_TYPE_SINGLELINE,
3786 on_response_imc_sim_req_authentication, resp_cb_data,
3787 on_send_imc_request, NULL);
3788 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim request authentication");
3792 tcore_free(convert_rand);
3793 tcore_free(convert_autn);
3799 * Operation - verify_pins/verify_puks
3803 * AT-Command: AT+CPIN= <pin> [, <newpin>]
3806 * String type values
3809 * AT-Command: AT+CPIN2= <puk2/oldpin2> [, <newpin2>]andAT+CPIN2=<oldpin2>
3811 * <puk2/pin2>, <newpin2>
3812 * String type values
3818 * +CME ERROR: <error>
3820 static TelReturn imc_sim_verify_pins(CoreObject *co, const TelSimSecPinPw *request,
3821 TcoreObjectResponseCallback cb, void *cb_data)
3823 TelReturn ret = TEL_RETURN_FAILURE;
3824 ImcRespCbData *resp_cb_data = NULL;
3825 ImcSimCurrSecOp sec_op;
3826 gchar *cmd_str = NULL;
3830 if (request->pin_type == TEL_SIM_PIN_TYPE_PIN1) {
3831 sec_op = IMC_SIM_CURR_SEC_OP_PIN1_VERIFY;
3832 cmd_str = g_strdup_printf("AT+CPIN=\"%s\"", request->pw);
3833 } else if (request->pin_type == TEL_SIM_PIN_TYPE_PIN2) {
3834 sec_op = IMC_SIM_CURR_SEC_OP_PIN2_VERIFY;
3835 cmd_str = g_strdup_printf("AT+CPIN2=\"%s\"", request->pw);
3837 err("Invalid pin type [%d]", request->pin_type);
3838 return TEL_RETURN_INVALID_PARAMETER;
3841 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
3842 &sec_op, sizeof(sec_op));
3844 ret = tcore_at_prepare_and_send_request(co,
3846 TCORE_AT_COMMAND_TYPE_NO_RESULT,
3848 on_response_imc_sim_verify_pins, resp_cb_data,
3849 on_send_imc_request, NULL);
3850 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Verify Pins");
3856 static TelReturn imc_sim_verify_puks(CoreObject *co, const TelSimSecPukPw *request,
3857 TcoreObjectResponseCallback cb, void *cb_data)
3859 TelReturn ret = TEL_RETURN_FAILURE;
3860 ImcRespCbData *resp_cb_data = NULL;
3861 ImcSimCurrSecOp sec_op;
3862 gchar *cmd_str = NULL;
3866 if (request->puk_type == TEL_SIM_PUK_TYPE_PUK1) {
3867 sec_op = IMC_SIM_CURR_SEC_OP_PUK1_VERIFY;
3868 cmd_str = g_strdup_printf("AT+CPIN=\"%s\", \"%s\"",
3869 request->puk_pw, request->new_pin_pw);
3870 } else if (request->puk_type == TEL_SIM_PUK_TYPE_PUK2) {
3871 sec_op = IMC_SIM_CURR_SEC_OP_PUK2_VERIFY;
3872 cmd_str = g_strdup_printf("AT+CPIN2=\"%s\", \"%s\"",
3873 request->puk_pw, request->new_pin_pw);
3875 err("Invalid puk type [%d]", request->puk_type);
3876 return TEL_RETURN_INVALID_PARAMETER;
3879 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
3880 &sec_op, sizeof(sec_op));
3882 ret = tcore_at_prepare_and_send_request(co,
3884 TCORE_AT_COMMAND_TYPE_NO_RESULT,
3886 on_response_imc_sim_verify_puks, resp_cb_data,
3887 on_send_imc_request, NULL);
3888 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Verify Puks");
3895 * Operation - change_pins
3898 * AT-Command: AT+CPWD= <fac>,<oldpwd>,<newpwd>
3913 * +CME ERROR: <error>
3915 static TelReturn imc_sim_change_pins(CoreObject *co, const TelSimSecChangePinPw *request,
3916 TcoreObjectResponseCallback cb, void *cb_data)
3918 TelReturn ret = TEL_RETURN_FAILURE;
3919 ImcRespCbData *resp_cb_data = NULL;
3920 ImcSimCurrSecOp sec_op;
3921 gchar *cmd_str = NULL;
3922 char *pin1_fac = "SC";
3923 char *pin2_fac = "P2";
3927 if (request->pin_type == TEL_SIM_PIN_TYPE_PIN1) {
3928 sec_op = IMC_SIM_CURR_SEC_OP_PIN1_CHANGE;
3929 cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"",
3930 pin1_fac, request->old_pw, request->new_pw);
3931 } else if (request->pin_type == TEL_SIM_PIN_TYPE_PIN2) {
3932 sec_op = IMC_SIM_CURR_SEC_OP_PIN2_CHANGE;
3933 cmd_str = g_strdup_printf("AT+CPWD=\"%s\",\"%s\",\"%s\"",
3934 pin2_fac, request->old_pw, request->new_pw);
3936 err("Invalid pin type [%d]", request->pin_type);
3937 return TEL_RETURN_INVALID_PARAMETER;
3940 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
3941 &sec_op, sizeof(sec_op));
3943 ret = tcore_at_prepare_and_send_request(co,
3945 TCORE_AT_COMMAND_TYPE_NO_RESULT,
3947 on_response_imc_sim_change_pins, resp_cb_data,
3948 on_send_imc_request, NULL);
3949 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Change Pins");
3956 * Operation - disable_facility/enable_facility/get_facility
3959 * AT-Command: AT+CLCK = <fac>, <mode> [, <passwd> [, <class>]]
3976 * Success: when <mode>=2:
3978 * +CLCK: <status>[,<class1> [<CR><LF>
3979 * +CLCK: <status>,<class2> [...]]
3983 static TelReturn imc_sim_disable_facility(CoreObject *co, const TelSimFacilityPw *request,
3984 TcoreObjectResponseCallback cb, void *cb_data)
3986 TelReturn ret = TEL_RETURN_FAILURE;
3987 ImcRespCbData *resp_cb_data = NULL;
3988 ImcSimCurrSecOp sec_op;
3989 gchar *cmd_str = NULL;
3991 int mode = 0; /*mode = 0 for disable lock*/
3995 fac = __imc_sim_get_fac_from_lock_type(request->lock_type,
3996 &sec_op, DISABLE_FLAG);
3998 return TEL_RETURN_INVALID_PARAMETER;
4000 cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d, \"%s\"",
4001 fac, mode, request->pw);
4003 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
4004 &sec_op, sizeof(sec_op));
4006 ret = tcore_at_prepare_and_send_request(co,
4008 TCORE_AT_COMMAND_TYPE_SINGLELINE,
4010 on_response_imc_sim_disable_facility, resp_cb_data,
4011 on_send_imc_request, NULL);
4012 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Disable Facility");
4018 static TelReturn imc_sim_enable_facility(CoreObject *co, const TelSimFacilityPw *request,
4019 TcoreObjectResponseCallback cb, void *cb_data)
4021 TelReturn ret = TEL_RETURN_FAILURE;
4022 ImcRespCbData *resp_cb_data = NULL;
4023 ImcSimCurrSecOp sec_op;
4024 gchar *cmd_str = NULL;
4026 int mode = 1; /*mode = 1 for enable lock*/
4030 fac = __imc_sim_get_fac_from_lock_type(request->lock_type,
4031 &sec_op, ENABLE_FLAG);
4033 return TEL_RETURN_INVALID_PARAMETER;
4035 cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d, \"%s\"",
4036 fac, mode, request->pw);
4038 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
4039 &sec_op, sizeof(sec_op));
4041 ret = tcore_at_prepare_and_send_request(co,
4043 TCORE_AT_COMMAND_TYPE_SINGLELINE,
4045 on_response_imc_sim_enable_facility, resp_cb_data,
4046 on_send_imc_request, NULL);
4047 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Disable Facility");
4053 static TelReturn imc_sim_get_facility(CoreObject *co, TelSimLockType lock_type,
4054 TcoreObjectResponseCallback cb, void *cb_data)
4056 TelReturn ret = TEL_RETURN_FAILURE;
4057 ImcRespCbData *resp_cb_data = NULL;
4058 ImcSimCurrSecOp sec_op;
4059 gchar *cmd_str = NULL;
4061 int mode = 2; /*mode = 2 for Get Facility*/
4065 fac = __imc_sim_get_fac_from_lock_type(lock_type,
4068 return TEL_RETURN_INVALID_PARAMETER;
4070 cmd_str = g_strdup_printf("AT+CLCK=\"%s\", %d", fac, mode);
4072 resp_cb_data = imc_create_resp_cb_data(cb, cb_data,
4073 &sec_op, sizeof(sec_op));
4075 ret = tcore_at_prepare_and_send_request(co,
4077 TCORE_AT_COMMAND_TYPE_SINGLELINE,
4079 on_response_imc_sim_get_facility, resp_cb_data,
4080 on_send_imc_request, NULL);
4081 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Get Facility");
4087 static TelReturn imc_sim_get_lock_info(CoreObject *co, TelSimLockType lock_type,
4088 TcoreObjectResponseCallback cb, void *cb_data)
4090 TelReturn ret = TEL_RETURN_FAILURE;
4091 ImcRespCbData *resp_cb_data = NULL;
4092 gchar *cmd_str = NULL;
4097 resp_cb_data = imc_create_resp_cb_data(cb, cb_data, NULL, 0);
4099 switch (lock_type) {
4100 case TEL_SIM_LOCK_PS:
4104 case TEL_SIM_LOCK_SC:
4108 case TEL_SIM_LOCK_FD:
4112 case TEL_SIM_LOCK_PN:
4116 case TEL_SIM_LOCK_PU:
4120 case TEL_SIM_LOCK_PP:
4124 case TEL_SIM_LOCK_PC:
4132 cmd_str = g_strdup_printf("AT+XPINCNT=%d", lockType);
4134 ret = tcore_at_prepare_and_send_request(co,
4135 cmd_str, "+XPINCNT:",
4136 TCORE_AT_COMMAND_TYPE_SINGLELINE,
4138 on_response_imc_sim_get_lock_info, resp_cb_data,
4139 on_send_imc_request, NULL);
4140 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Get Lock Info");
4146 static TelReturn imc_sim_req_apdu (CoreObject *co, const TelSimApdu *request, TcoreObjectResponseCallback cb, void *cb_data)
4148 gchar *cmd_str = NULL;
4150 ImcRespCbData *resp_cb_data = NULL;
4151 TelReturn ret = TEL_RETURN_FAILURE;
4155 resp_cb_data = imc_create_resp_cb_data(cb, cb_data, NULL, 0);
4157 apdu = (char *)tcore_malloc0((2 * request->apdu_len) + 1);
4158 tcore_util_byte_to_hex((char *)request->apdu, apdu, request->apdu_len);
4160 cmd_str = g_strdup_printf("AT+CSIM=%d,\"%s\"", strlen((const char *)apdu), apdu);
4162 ret = tcore_at_prepare_and_send_request(co,
4164 TCORE_AT_COMMAND_TYPE_SINGLELINE,
4166 on_response_imc_sim_req_apdu, resp_cb_data,
4167 on_send_imc_request, NULL);
4168 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Request APDU");
4177 static TelReturn imc_sim_req_atr (CoreObject *co, TcoreObjectResponseCallback cb, void *cb_data)
4179 gchar *cmd_str = NULL;
4180 ImcRespCbData *resp_cb_data = NULL;
4181 TelReturn ret = TEL_RETURN_FAILURE;
4185 resp_cb_data = imc_create_resp_cb_data(cb, cb_data, NULL, 0);
4187 cmd_str = g_strdup_printf("AT+XGATR");
4189 ret = tcore_at_prepare_and_send_request(co,
4191 TCORE_AT_COMMAND_TYPE_SINGLELINE,
4193 on_response_imc_sim_req_atr, resp_cb_data,
4194 on_send_imc_request, NULL);
4195 IMC_CHECK_REQUEST_RET(ret, resp_cb_data, "Sim Request ATR");
4203 /* SIM Operations */
4204 static TcoreSimOps imc_sim_ops = {
4205 .get_imsi = imc_sim_get_imsi,
4206 .get_ecc = imc_sim_get_ecc,
4207 .get_iccid = imc_sim_get_iccid,
4208 .get_language = imc_sim_get_language,
4209 .set_language = imc_sim_set_language,
4210 .get_callforwarding_info = imc_sim_get_callforwarding_info,
4211 .get_messagewaiting_info = imc_sim_get_messagewaiting_info,
4212 .set_messagewaiting_info = imc_sim_set_messagewaiting_info,
4213 .get_mailbox_info = imc_sim_get_mailbox_info,
4214 .set_mailbox_info = imc_sim_set_mailbox_info,
4215 .get_msisdn = imc_sim_get_msisdn,
4216 .get_spn = imc_sim_get_spn,
4217 .get_cphs_netname = imc_sim_get_cphs_netname,
4218 .get_sp_display_info = imc_sim_get_sp_display_info,
4219 .req_authentication = imc_sim_req_authentication,
4220 .verify_pins = imc_sim_verify_pins,
4221 .verify_puks = imc_sim_verify_puks,
4222 .change_pins = imc_sim_change_pins,
4223 .disable_facility = imc_sim_disable_facility,
4224 .enable_facility = imc_sim_enable_facility,
4225 .get_facility = imc_sim_get_facility,
4226 .get_lock_info = imc_sim_get_lock_info,
4227 .req_apdu = imc_sim_req_apdu,
4228 .req_atr = imc_sim_req_atr
4231 gboolean imc_sim_init(TcorePlugin *p, CoreObject *co)
4233 ImcSimPrivateInfo *priv_info = NULL;
4237 priv_info = g_try_new0(ImcSimPrivateInfo, 1);
4238 if (priv_info == NULL)
4241 tcore_sim_link_userdata(co, priv_info);
4243 /* Set operations */
4244 tcore_sim_set_ops(co, &imc_sim_ops);
4247 tcore_object_add_callback(co, "+XSIM:",
4248 on_notification_imc_sim_status, NULL);
4251 tcore_plugin_add_notification_hook(p,
4252 TCORE_NOTIFICATION_MODEM_POWER,
4253 on_hook_imc_modem_power, co);
4259 void imc_sim_exit(TcorePlugin *plugin, CoreObject *co)
4261 ImcSimPrivateInfo *priv_info = NULL;
4265 priv_info = tcore_sim_ref_userdata(co);