diff --git a/plugins/gemalto.c b/plugins/gemalto.c index 55736064..68f7062b 100644 --- a/plugins/gemalto.c +++ b/plugins/gemalto.c @@ -147,6 +147,67 @@ static GAtChat *open_device(const char *device) return chat; } +static void sim_ready_cb(gboolean present, gpointer user_data) +{ + struct ofono_modem *modem = user_data; + struct gemalto_data *data = ofono_modem_get_data(modem); + struct ofono_sim *sim = data->sim; + + at_util_sim_state_query_free(data->sim_state_query); + data->sim_state_query = NULL; + + DBG("sim present: %d", present); + + ofono_sim_inserted_notify(sim, present); +} + +static void gemalto_ciev_notify(GAtResult *result, gpointer user_data) +{ + struct ofono_modem *modem = user_data; + struct gemalto_data *data = ofono_modem_get_data(modem); + struct ofono_sim *sim = data->sim; + + const char *sim_status = "simstatus"; + const char *ind_str; + int status; + GAtResultIter iter; + + g_at_result_iter_init(&iter, result); + + /* Example: +CIEV: simstatus, */ + if (!g_at_result_iter_next(&iter, "+CIEV:")) + return; + + if (!g_at_result_iter_next_unquoted_string(&iter, &ind_str)) + return; + + if (!g_str_equal(sim_status, ind_str)) + return; + + if (!g_at_result_iter_next_number(&iter, &status)) + return; + + DBG("sim status %d", status); + + switch (status) { + /* SIM is removed from the holder */ + case 0: + ofono_sim_inserted_notify(sim, FALSE); + break; + + /* SIM is inserted inside the holder */ + case 1: + /* The SIM won't be ready yet */ + data->sim_state_query = at_util_sim_state_query_new(data->app, + 1, 20, sim_ready_cb, modem, + NULL); + break; + + default: + break; + } +} + static void sim_state_cb(gboolean present, gpointer user_data) { struct ofono_modem *modem = user_data; @@ -157,6 +218,13 @@ static void sim_state_cb(gboolean present, gpointer user_data) data->have_sim = present; ofono_modem_set_powered(modem, TRUE); + + /* Register for specific sim status reports */ + g_at_chat_register(data->app, "+CIEV:", + gemalto_ciev_notify, FALSE, modem, NULL); + + g_at_chat_send(data->app, "AT^SIND=\"simstatus\",1", none_prefix, + NULL, NULL, NULL); } static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data) @@ -492,17 +560,16 @@ static void gemalto_set_online(struct ofono_modem *modem, ofono_bool_t online, static void gemalto_pre_sim(struct ofono_modem *modem) { struct gemalto_data *data = ofono_modem_get_data(modem); - struct ofono_sim *sim; DBG("%p", modem); ofono_devinfo_create(modem, 0, "atmodem", data->app); ofono_location_reporting_create(modem, 0, "gemaltomodem", data->app); - sim = ofono_sim_create(modem, OFONO_VENDOR_CINTERION, "atmodem", + data->sim = ofono_sim_create(modem, OFONO_VENDOR_CINTERION, "atmodem", data->app); - if (sim && data->have_sim == TRUE) - ofono_sim_inserted_notify(sim, TRUE); + if (data->sim && data->have_sim == TRUE) + ofono_sim_inserted_notify(data->sim, TRUE); } static void gemalto_post_sim(struct ofono_modem *modem)