summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrzej Zaborowski <andrew.zaborowski@intel.com>2010-04-09 08:48:50 +0200
committerDenis Kenzior <denkenz@gmail.com>2010-04-15 16:49:40 -0500
commitddfe8acf11f351a5887ced8fedf736ee4b108c51 (patch)
tree77277e91bfbfe21b3c2d91a2e34d3e352edaa027
parent22cbe981468a1eeb5ea5f07e07c31b11da2507e0 (diff)
downloadofono-ddfe8acf11f351a5887ced8fedf736ee4b108c51.tar.bz2
Drivers can notify core of SIM insertion / removal
Add ofono_sim_inserted_notify function to notify the core of SIM insertion / removal. Make every plugin generate a sim inserted event on start. For devices with removable card, the event should be emitted after the plugin detects such event. For devices that need to wait for SIM card initialization, they can emit this event later.
-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)