summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sim.h3
-rw-r--r--plugins/atgen.c6
-rw-r--r--plugins/calypso.c6
-rw-r--r--plugins/em770.c6
-rw-r--r--plugins/g1.c6
-rw-r--r--plugins/hso.c6
-rw-r--r--plugins/huawei.c6
-rw-r--r--plugins/mbm.c6
-rw-r--r--plugins/palmpre.c6
-rw-r--r--plugins/phonesim.c6
-rw-r--r--plugins/ste.c6
-rw-r--r--src/sim.c78
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)
diff --git a/src/sim.c b/src/sim.c
index 58de1918..5559be48 100644
--- a/src/sim.c
+++ b/src/sim.c
@@ -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)