diff options
-rw-r--r-- | include/sim.h | 3 | ||||
-rw-r--r-- | plugins/atgen.c | 6 | ||||
-rw-r--r-- | plugins/calypso.c | 6 | ||||
-rw-r--r-- | plugins/em770.c | 6 | ||||
-rw-r--r-- | plugins/g1.c | 6 | ||||
-rw-r--r-- | plugins/hso.c | 6 | ||||
-rw-r--r-- | plugins/huawei.c | 6 | ||||
-rw-r--r-- | plugins/mbm.c | 6 | ||||
-rw-r--r-- | plugins/palmpre.c | 6 | ||||
-rw-r--r-- | plugins/phonesim.c | 6 | ||||
-rw-r--r-- | plugins/ste.c | 6 | ||||
-rw-r--r-- | src/sim.c | 78 |
12 files changed, 107 insertions, 34 deletions
diff --git a/include/sim.h b/include/sim.h index 23b1905a..2218564a 100644 --- a/include/sim.h +++ b/include/sim.h @@ -187,7 +187,8 @@ unsigned int ofono_sim_add_state_watch(struct ofono_sim *sim, void ofono_sim_remove_state_watch(struct ofono_sim *sim, unsigned int id); enum ofono_sim_state ofono_sim_get_state(struct ofono_sim *sim); -void ofono_sim_set_ready(struct ofono_sim *sim); + +void ofono_sim_inserted_notify(struct ofono_sim *sim, ofono_bool_t inserted); /* This will queue an operation to read all available records with id from the * SIM. Callback cb will be called every time a record has been read, or once diff --git a/plugins/atgen.c b/plugins/atgen.c index 7e760bc3..ed963c2d 100644 --- a/plugins/atgen.c +++ b/plugins/atgen.c @@ -156,12 +156,16 @@ static int atgen_disable(struct ofono_modem *modem) static void atgen_pre_sim(struct ofono_modem *modem) { GAtChat *chat = ofono_modem_get_data(modem); + struct ofono_sim *sim; DBG("%p", modem); ofono_devinfo_create(modem, 0, "atmodem", chat); - ofono_sim_create(modem, 0, "atmodem", chat); + sim = ofono_sim_create(modem, 0, "atmodem", chat); ofono_voicecall_create(modem, 0, "atmodem", chat); + + if (sim) + ofono_sim_inserted_notify(sim, TRUE); } static void atgen_post_sim(struct ofono_modem *modem) diff --git a/plugins/calypso.c b/plugins/calypso.c index 5b28176c..9d6280cc 100644 --- a/plugins/calypso.c +++ b/plugins/calypso.c @@ -431,12 +431,16 @@ static int calypso_disable(struct ofono_modem *modem) static void calypso_pre_sim(struct ofono_modem *modem) { struct calypso_data *data = ofono_modem_get_data(modem); + struct ofono_sim *sim; DBG(""); ofono_devinfo_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]); - ofono_sim_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]); + sim = ofono_sim_create(modem, 0, "atmodem", data->dlcs[AUX_DLC]); ofono_voicecall_create(modem, 0, "calypsomodem", data->dlcs[VOICE_DLC]); + + if (sim) + ofono_sim_inserted_notify(sim, TRUE); } static void calypso_post_sim(struct ofono_modem *modem) diff --git a/plugins/em770.c b/plugins/em770.c index a5d87f73..138c67ac 100644 --- a/plugins/em770.c +++ b/plugins/em770.c @@ -172,12 +172,16 @@ static int em770_disable(struct ofono_modem *modem) static void em770_pre_sim(struct ofono_modem *modem) { struct em770_data *data = ofono_modem_get_data(modem); + struct ofono_sim *sim; DBG("%p", modem); ofono_devinfo_create(modem, 0, "atmodem", data->chat); - ofono_sim_create(modem, 0, "atmodem", data->chat); + sim = ofono_sim_create(modem, 0, "atmodem", data->chat); ofono_voicecall_create(modem, 0, "atmodem", data->chat); + + if (sim) + ofono_sim_inserted_notify(sim, TRUE); } static void em770_post_sim(struct ofono_modem *modem) diff --git a/plugins/g1.c b/plugins/g1.c index 81edfab3..fa96eb1e 100644 --- a/plugins/g1.c +++ b/plugins/g1.c @@ -156,12 +156,16 @@ static int g1_disable(struct ofono_modem *modem) static void g1_pre_sim(struct ofono_modem *modem) { GAtChat *chat = ofono_modem_get_data(modem); + struct ofono_sim *sim; DBG(""); ofono_devinfo_create(modem, 0, "atmodem", chat); - ofono_sim_create(modem, 0, "atmodem", chat); + sim = ofono_sim_create(modem, 0, "atmodem", chat); ofono_voicecall_create(modem, 0, "atmodem", chat); + + if (sim) + ofono_sim_inserted_notify(sim, TRUE); } static void g1_post_sim(struct ofono_modem *modem) diff --git a/plugins/hso.c b/plugins/hso.c index e682064b..27b69dce 100644 --- a/plugins/hso.c +++ b/plugins/hso.c @@ -198,11 +198,15 @@ static int hso_disable(struct ofono_modem *modem) static void hso_pre_sim(struct ofono_modem *modem) { struct hso_data *data = ofono_modem_get_data(modem); + struct ofono_sim *sim; DBG("%p", modem); ofono_devinfo_create(modem, 0, "atmodem", data->control); - ofono_sim_create(modem, 0, "atmodem", data->control); + sim = ofono_sim_create(modem, 0, "atmodem", data->control); + + if (sim) + ofono_sim_inserted_notify(sim, TRUE); } static void hso_post_sim(struct ofono_modem *modem) diff --git a/plugins/huawei.c b/plugins/huawei.c index 41ad6361..90fdcf04 100644 --- a/plugins/huawei.c +++ b/plugins/huawei.c @@ -163,12 +163,16 @@ static int huawei_disable(struct ofono_modem *modem) static void huawei_pre_sim(struct ofono_modem *modem) { struct huawei_data *data = ofono_modem_get_data(modem); + struct ofono_sim *sim; DBG("%p", modem); ofono_devinfo_create(modem, 0, "atmodem", data->chat); - ofono_sim_create(modem, 0, "atmodem", data->chat); + sim = ofono_sim_create(modem, 0, "atmodem", data->chat); ofono_voicecall_create(modem, 0, "atmodem", data->chat); + + if (sim) + ofono_sim_inserted_notify(sim, TRUE); } static void huawei_post_sim(struct ofono_modem *modem) diff --git a/plugins/mbm.c b/plugins/mbm.c index 439d3b9e..79d180be 100644 --- a/plugins/mbm.c +++ b/plugins/mbm.c @@ -285,12 +285,16 @@ static int mbm_disable(struct ofono_modem *modem) static void mbm_pre_sim(struct ofono_modem *modem) { struct mbm_data *data = ofono_modem_get_data(modem); + struct ofono_sim *sim; DBG("%p", modem); ofono_devinfo_create(modem, 0, "atmodem", data->modem_port); - ofono_sim_create(modem, 0, "atmodem", data->modem_port); + sim = ofono_sim_create(modem, 0, "atmodem", data->modem_port); ofono_voicecall_create(modem, 0, "atmodem", data->modem_port); + + if (sim) + ofono_sim_inserted_notify(sim, TRUE); } static void mbm_post_sim(struct ofono_modem *modem) diff --git a/plugins/palmpre.c b/plugins/palmpre.c index 049b9bd7..7d2aeb43 100644 --- a/plugins/palmpre.c +++ b/plugins/palmpre.c @@ -170,13 +170,17 @@ static int palmpre_disable(struct ofono_modem *modem) static void palmpre_pre_sim(struct ofono_modem *modem) { struct palmpre_data *data = ofono_modem_get_data(modem); + struct ofono_sim *sim; DBG("%p", modem); ofono_devinfo_create(modem, 0, "atmodem", data->chat); - ofono_sim_create(modem, OFONO_VENDOR_QUALCOMM_MSM, "atmodem", + sim = ofono_sim_create(modem, OFONO_VENDOR_QUALCOMM_MSM, "atmodem", data->chat); ofono_voicecall_create(modem, 0, "atmodem", data->chat); + + if (sim) + ofono_sim_inserted_notify(sim, TRUE); } static void palmpre_post_sim(struct ofono_modem *modem) diff --git a/plugins/phonesim.c b/plugins/phonesim.c index ca12cf23..4c3b3ce8 100644 --- a/plugins/phonesim.c +++ b/plugins/phonesim.c @@ -277,16 +277,20 @@ static int phonesim_disable(struct ofono_modem *modem) static void phonesim_pre_sim(struct ofono_modem *modem) { struct phonesim_data *data = ofono_modem_get_data(modem); + struct ofono_sim *sim; DBG("%p", modem); ofono_devinfo_create(modem, 0, "atmodem", data->chat); - ofono_sim_create(modem, 0, "atmodem", data->chat); + sim = ofono_sim_create(modem, 0, "atmodem", data->chat); if (data->calypso) ofono_voicecall_create(modem, 0, "calypsomodem", data->chat); else ofono_voicecall_create(modem, 0, "atmodem", data->chat); + + if (sim) + ofono_sim_inserted_notify(sim, TRUE); } static void phonesim_post_sim(struct ofono_modem *modem) diff --git a/plugins/ste.c b/plugins/ste.c index 66065c14..7e2df968 100644 --- a/plugins/ste.c +++ b/plugins/ste.c @@ -208,12 +208,16 @@ static int ste_disable(struct ofono_modem *modem) static void ste_pre_sim(struct ofono_modem *modem) { struct ste_data *data = ofono_modem_get_data(modem); + struct ofono_sim *sim; DBG("%p", modem); ofono_devinfo_create(modem, 0, "atmodem", data->chat); - ofono_sim_create(modem, 0, "atmodem", data->chat); + sim = ofono_sim_create(modem, 0, "atmodem", data->chat); ofono_voicecall_create(modem, 0, "stemodem", data->chat); + + if (sim) + ofono_sim_inserted_notify(sim, TRUE); } static void ste_post_sim(struct ofono_modem *modem) @@ -55,6 +55,7 @@ static gboolean sim_op_next(gpointer user_data); static gboolean sim_op_retrieve_next(gpointer user); static void sim_own_numbers_update(struct ofono_sim *sim); static void sim_pin_check(struct ofono_sim *sim); +static void sim_set_ready(struct ofono_sim *sim); struct sim_file_op { int id; @@ -1003,7 +1004,7 @@ static void sim_cphs_information_read_cb(int ok, int length, int record, memcpy(sim->cphs_service_table, data + 1, 2); ready: - ofono_sim_set_ready(sim); + sim_set_ready(sim); } static void sim_imsi_cb(const struct ofono_error *error, const char *imsi, @@ -1778,6 +1779,53 @@ const unsigned char *ofono_sim_get_cphs_service_table(struct ofono_sim *sim) return sim->cphs_service_table; } +void ofono_sim_inserted_notify(struct ofono_sim *sim, ofono_bool_t inserted) +{ + ofono_sim_state_event_notify_cb_t notify; + GSList *l; + + if (inserted && sim->state == OFONO_SIM_STATE_NOT_PRESENT) + sim->state = OFONO_SIM_STATE_INSERTED; + else if (!inserted && sim->state != OFONO_SIM_STATE_NOT_PRESENT) + sim->state = OFONO_SIM_STATE_NOT_PRESENT; + else + return; + + if (!__ofono_atom_get_registered(sim->atom)) + return; + + for (l = sim->state_watches->items; l; l = l->next) { + struct ofono_watchlist_item *item = l->data; + notify = item->notify; + + notify(item->notify_data, sim->state); + } + + if (!inserted) + return; + + /* Perform SIM initialization according to 3GPP 31.102 Section 5.1.1.2 + * The assumption here is that if sim manager is being initialized, + * then sim commands are implemented, and the sim manager is then + * responsible for checking the PIN, reading the IMSI and signaling + * SIM ready condition. + * + * The procedure according to 31.102 is roughly: + * Read EFecc + * Read EFli and EFpl + * SIM Pin check + * Request SIM phase (only in 51.011) + * Read EFust + * Read EFest + * Read IMSI + * + * At this point we signal the SIM ready condition and allow + * arbitrary files to be written or read, assuming their presence + * in the EFust + */ + sim_determine_phase(sim); +} + unsigned int ofono_sim_add_state_watch(struct ofono_sim *sim, ofono_sim_state_event_notify_cb_t notify, void *data, ofono_destroy_func destroy) @@ -1814,7 +1862,7 @@ enum ofono_sim_state ofono_sim_get_state(struct ofono_sim *sim) return sim->state; } -void ofono_sim_set_ready(struct ofono_sim *sim) +static void sim_set_ready(struct ofono_sim *sim) { GSList *l; ofono_sim_state_event_notify_cb_t notify; @@ -2000,6 +2048,7 @@ void ofono_sim_register(struct ofono_sim *sim) DBusConnection *conn = ofono_dbus_get_connection(); struct ofono_modem *modem = __ofono_atom_get_modem(sim->atom); const char *path = __ofono_atom_get_path(sim->atom); + ofono_bool_t inserted; if (!g_dbus_register_interface(conn, path, OFONO_SIM_MANAGER_INTERFACE, @@ -2013,32 +2062,15 @@ void ofono_sim_register(struct ofono_sim *sim) ofono_modem_add_interface(modem, OFONO_SIM_MANAGER_INTERFACE); sim->state_watches = __ofono_watchlist_new(g_free); - sim->state = OFONO_SIM_STATE_INSERTED; __ofono_atom_register(sim->atom, sim_unregister); ofono_sim_add_state_watch(sim, sim_ready, sim, NULL); - /* Perform SIM initialization according to 3GPP 31.102 Section 5.1.1.2 - * The assumption here is that if sim manager is being initialized, - * then sim commands are implemented, and the sim manager is then - * responsible for checking the PIN, reading the IMSI and signaling - * SIM ready condition. - * - * The procedure according to 31.102 is roughly: - * Read EFecc - * Read EFli and EFpl - * SIM Pin check - * Request SIM phase (only in 51.011) - * Read EFust - * Read EFest - * Read IMSI - * - * At this point we signal the SIM ready condition and allow - * arbitrary files to be written or read, assuming their presence - * in the EFust - */ - sim_determine_phase(sim); + inserted = sim->state != OFONO_SIM_STATE_NOT_PRESENT; + sim->state = OFONO_SIM_STATE_NOT_PRESENT; + + ofono_sim_inserted_notify(sim, inserted); } void ofono_sim_remove(struct ofono_sim *sim) |