diff options
-rw-r--r-- | plugins/mm-modem-hso.c | 42 | ||||
-rw-r--r-- | plugins/mm-modem-option-utils.c | 31 | ||||
-rw-r--r-- | plugins/mm-modem-option.c | 50 |
3 files changed, 102 insertions, 21 deletions
diff --git a/plugins/mm-modem-hso.c b/plugins/mm-modem-hso.c index 6825ac9a..f3600d08 100644 --- a/plugins/mm-modem-hso.c +++ b/plugins/mm-modem-hso.c @@ -406,31 +406,53 @@ disable_done (MMModem *modem, } static void +unsolicited_disable_done (MMModem *modem, + GError *error, + gpointer user_data) +{ + MMCallbackInfo *info = user_data; + + /* Handle modem removal, but ignore other errors */ + if (g_error_matches (error, MM_MODEM_ERROR, MM_MODEM_ERROR_REMOVED)) + info->error = g_error_copy (error); + else if (!modem) { + info->error = g_error_new_literal (MM_MODEM_ERROR, + MM_MODEM_ERROR_REMOVED, + "The modem was removed."); + } + + if (info->error) { + mm_callback_info_schedule (info); + return; + } + + /* Otherwise, kill any existing connection */ + if (mm_generic_gsm_get_cid (MM_GENERIC_GSM (modem)) >= 0) + hso_call_control (MM_MODEM_HSO (modem), FALSE, TRUE, disable_done, info); + else + disable_done (modem, NULL, info); +} + +static void disable (MMModem *modem, MMModemFn callback, gpointer user_data) { MMModemHso *self = MM_MODEM_HSO (modem); MMModemHsoPrivate *priv = MM_MODEM_HSO_GET_PRIVATE (self); - MMGenericGsm *gsm = MM_GENERIC_GSM (modem); MMCallbackInfo *info; - mm_generic_gsm_pending_registration_stop (gsm); + mm_generic_gsm_pending_registration_stop (MM_GENERIC_GSM (modem)); g_free (priv->username); priv->username = NULL; g_free (priv->password); priv->password = NULL; - option_change_unsolicited_messages (gsm, FALSE); - info = mm_callback_info_new (modem, callback, user_data); - /* Kill any existing connection */ - if (mm_generic_gsm_get_cid (gsm) >= 0) - hso_call_control (MM_MODEM_HSO (modem), FALSE, TRUE, disable_done, info); - else - disable_done (modem, NULL, info); + /* Turn off unsolicited messages so they don't pile up in the modem */ + option_change_unsolicited_messages (MM_GENERIC_GSM (modem), FALSE, unsolicited_disable_done, info); } /*****************************************************************************/ @@ -567,7 +589,7 @@ real_do_enable_power_up_done (MMGenericGsm *gsm, { /* Enable Option unsolicited messages */ if (gsm && !error) - option_change_unsolicited_messages (gsm, TRUE); + option_change_unsolicited_messages (gsm, TRUE, NULL, NULL); /* Chain up to parent */ MM_GENERIC_GSM_CLASS (mm_modem_hso_parent_class)->do_enable_power_up_done (gsm, response, error, info); diff --git a/plugins/mm-modem-option-utils.c b/plugins/mm-modem-option-utils.c index 25ce5a70..66946357 100644 --- a/plugins/mm-modem-option-utils.c +++ b/plugins/mm-modem-option-utils.c @@ -333,16 +333,37 @@ option_register_unsolicted_handlers (MMGenericGsm *modem, MMAtSerialPort *port) } static void -option_change_unsolicited_messages (MMGenericGsm *modem, gboolean enabled) +unsolicited_msg_done (MMAtSerialPort *port, + GString *response, + GError *error, + gpointer user_data) { + MMCallbackInfo *info = user_data; + + if (info) + mm_callback_info_chain_complete_one (info); +} + +static void +option_change_unsolicited_messages (MMGenericGsm *modem, + gboolean enabled, + MMModemFn callback, + gpointer user_data) +{ + MMCallbackInfo *info = NULL; MMAtSerialPort *primary; + if (callback) { + info = mm_callback_info_new (MM_MODEM (modem), callback, user_data); + mm_callback_info_chain_start (info, 4); + } + primary = mm_generic_gsm_get_at_port (modem, MM_PORT_TYPE_PRIMARY); g_assert (primary); - mm_at_serial_port_queue_command (primary, enabled ? "_OSSYS=1" : "_OSSYS=0", 3, NULL, NULL); - mm_at_serial_port_queue_command (primary, enabled ? "_OCTI=1" : "_OCTI=0", 3, NULL, NULL); - mm_at_serial_port_queue_command (primary, enabled ? "_OUWCTI=1" : "_OUWCTI=0", 3, NULL, NULL); - mm_at_serial_port_queue_command (primary, enabled ? "_OSQI=1" : "_OSQI=0", 3, NULL, NULL); + mm_at_serial_port_queue_command (primary, enabled ? "_OSSYS=1" : "_OSSYS=0", 3, unsolicited_msg_done, info); + mm_at_serial_port_queue_command (primary, enabled ? "_OCTI=1" : "_OCTI=0", 3, unsolicited_msg_done, info); + mm_at_serial_port_queue_command (primary, enabled ? "_OUWCTI=1" : "_OUWCTI=0", 3, unsolicited_msg_done, info); + mm_at_serial_port_queue_command (primary, enabled ? "_OSQI=1" : "_OSQI=0", 3, unsolicited_msg_done, info); } diff --git a/plugins/mm-modem-option.c b/plugins/mm-modem-option.c index 8accc051..97b083f5 100644 --- a/plugins/mm-modem-option.c +++ b/plugins/mm-modem-option.c @@ -66,7 +66,7 @@ option_enabled (gpointer user_data) priv = MM_MODEM_OPTION_GET_PRIVATE (modem); priv->enable_wait_id = 0; - option_change_unsolicited_messages (modem, TRUE); + option_change_unsolicited_messages (modem, TRUE, NULL, NULL); MM_GENERIC_GSM_CLASS (mm_modem_option_parent_class)->do_enable_power_up_done (modem, NULL, NULL, info); } @@ -116,17 +116,55 @@ set_allowed_mode (MMGenericGsm *gsm, /*****************************************************************************/ static void -disable (MMModem *modem, - MMModemFn callback, - gpointer user_data) +parent_disable_done (MMModem *modem, GError *error, gpointer user_data) { + MMCallbackInfo *info = (MMCallbackInfo *) user_data; + + if (error) + info->error = g_error_copy (error); + mm_callback_info_schedule (info); +} + +static void +unsolicited_disable_done (MMModem *modem, + GError *error, + gpointer user_data) +{ + MMCallbackInfo *info = user_data; MMModem *parent_modem_iface; + GError *tmp_error = NULL; - option_change_unsolicited_messages (MM_GENERIC_GSM (modem), FALSE); + /* Handle modem removal, but ignore other errors */ + if (g_error_matches (error, MM_MODEM_ERROR, MM_MODEM_ERROR_REMOVED)) { + parent_disable_done (modem, error, user_data); + return; + } else if (!modem) { + tmp_error = g_error_new_literal (MM_MODEM_ERROR, + MM_MODEM_ERROR_REMOVED, + "The modem was removed."); + parent_disable_done (modem, tmp_error, user_data); + g_error_free (tmp_error); + return; + } /* Chain up to parent */ parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GET_INTERFACE (modem)); - parent_modem_iface->disable (modem, callback, user_data); + parent_modem_iface->disable (info->modem, parent_disable_done, info); +} + +static void +disable (MMModem *modem, + MMModemFn callback, + gpointer user_data) +{ + MMCallbackInfo *info; + + mm_generic_gsm_pending_registration_stop (MM_GENERIC_GSM (modem)); + + info = mm_callback_info_new (modem, callback, user_data); + + /* Turn off unsolicited messages so they don't pile up in the modem */ + option_change_unsolicited_messages (MM_GENERIC_GSM (modem), FALSE, unsolicited_disable_done, info); } static gboolean |