aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2010-03-22 15:05:45 -0700
committerDan Williams <dcbw@redhat.com>2010-03-22 15:05:45 -0700
commit9e8a0fda9fb63e7db824e5d86fd3b99d52974327 (patch)
treefb076e34d2f8725a14d81d5eececd9884aae42d9
parent7a5ba2e0990753b3e41a9fc3a95f743dec4f7160 (diff)
option/hso: ensure unsolicited messages get turned off on disable
-rw-r--r--plugins/mm-modem-hso.c42
-rw-r--r--plugins/mm-modem-option-utils.c31
-rw-r--r--plugins/mm-modem-option.c50
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