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.
This commit is contained in:
Andrzej Zaborowski 2010-04-09 08:48:50 +02:00 committed by Denis Kenzior
parent 22cbe98146
commit ddfe8acf11
12 changed files with 107 additions and 34 deletions

View File

@ -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

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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)