Add support for voice-only SIM cards and enable phonebook atom for
non-voice modems.
---
plugins/huawei.c | 56 +++++++++++++++++++++++++++++++++++------------------
1 files changed, 37 insertions(+), 19 deletions(-)
diff --git a/plugins/huawei.c b/plugins/huawei.c
index 47d59d0..fd31d2c 100644
--- a/plugins/huawei.c
+++ b/plugins/huawei.c
@@ -104,13 +104,15 @@ static void notify_sim_state(struct ofono_modem *modem, gint
sim_state)
{
struct huawei_data *data = ofono_modem_get_data(modem);
- if (data->sim_state == 0 && sim_state == 1) {
- ofono_sim_inserted_notify(data->sim, TRUE);
- data->sim_state = sim_state;
- } else if (data->sim_state == 1 && sim_state == 0) {
+ if (data->sim_state == sim_state)
+ return;
+
+ if (sim_state == 255)
ofono_sim_inserted_notify(data->sim, FALSE);
- data->sim_state = sim_state;
- }
+ else
+ ofono_sim_inserted_notify(data->sim, TRUE);
+
+ data->sim_state = sim_state;
}
static void sysinfo_cb(gboolean ok, GAtResult *result, gpointer user_data)
@@ -235,7 +237,8 @@ static void huawei_disconnect(gpointer user_data)
DBG("");
- ofono_gprs_context_remove(data->gc);
+ if (data->gc)
+ ofono_gprs_context_remove(data->gc);
g_at_chat_unref(data->modem);
data->modem = NULL;
@@ -247,13 +250,15 @@ static void huawei_disconnect(gpointer user_data)
g_at_chat_set_disconnect_function(data->modem,
huawei_disconnect, modem);
- ofono_info("Reopened GPRS context channel");
+ if (data->sim_state == 1 || data->sim_state == 2) {
+ ofono_info("Reopened GPRS context channel");
- data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
- data->modem);
+ data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
+ data->modem);
- if (data->gprs && data->gc)
- ofono_gprs_add_context(data->gprs, data->gc);
+ if (data->gprs && data->gc)
+ ofono_gprs_add_context(data->gprs, data->gc);
+ }
}
static int huawei_enable(struct ofono_modem *modem)
@@ -333,7 +338,8 @@ static void huawei_pre_sim(struct ofono_modem *modem)
ofono_devinfo_create(modem, 0, "atmodem", data->pcui);
data->sim = ofono_sim_create(modem, 0, "atmodem", data->pcui);
- if (ofono_modem_get_boolean(modem, "HasVoice") == TRUE)
+ if ((data->sim_state == 1 || data->sim_state == 3) &&
+ ofono_modem_get_boolean(modem, "HasVoice") == TRUE)
ofono_voicecall_create(modem, 0, "atmodem", data->pcui);
}
@@ -345,6 +351,14 @@ static void huawei_post_sim(struct ofono_modem *modem)
DBG("%p", modem);
+ if (data->sim_state == 255)
+ return;
+
+ if (data->sim_state == 4) {
+ ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
+ return;
+ }
+
netreg = ofono_netreg_create(modem, OFONO_VENDOR_HUAWEI, "atmodem",
data->pcui);
@@ -352,19 +366,23 @@ static void huawei_post_sim(struct ofono_modem *modem)
ofono_cbs_create(modem, OFONO_VENDOR_QUALCOMM_MSM, "atmodem",
data->pcui);
ofono_ussd_create(modem, 0, "atmodem", data->pcui);
+ ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
- data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
- data->gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
+ if (data->sim_state == 1 || data->sim_state == 2) {
+ data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
+ data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
+ data->modem);
- if (data->gprs && data->gc)
- ofono_gprs_add_context(data->gprs, data->gc);
+ if (data->gprs && data->gc)
+ ofono_gprs_add_context(data->gprs, data->gc);
+ }
- if (ofono_modem_get_boolean(modem, "HasVoice") == TRUE) {
+ if ((data->sim_state == 1 || data->sim_state == 3) &&
+ ofono_modem_get_boolean(modem, "HasVoice") == TRUE) {
ofono_call_forwarding_create(modem, 0, "atmodem", data->pcui);
ofono_call_settings_create(modem, 0, "atmodem", data->pcui);
ofono_call_barring_create(modem, 0, "atmodem", data->pcui);
ofono_ssn_create(modem, 0, "atmodem", data->pcui);
- ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
mw = ofono_message_waiting_create(modem);
if (mw)
--
1.7.0.4