option/hso: ensure unsolicited messages get turned off on disable
This commit is contained in:
+32
-10
@@ -405,6 +405,34 @@ disable_done (MMModem *modem,
|
||||
parent_modem_iface->disable (info->modem, parent_disable_done, info);
|
||||
}
|
||||
|
||||
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,
|
||||
@@ -412,25 +440,19 @@ disable (MMModem *modem,
|
||||
{
|
||||
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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -115,18 +115,56 @@ set_allowed_mode (MMGenericGsm *gsm,
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
static void
|
||||
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;
|
||||
|
||||
/* 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 (info->modem, parent_disable_done, info);
|
||||
}
|
||||
|
||||
static void
|
||||
disable (MMModem *modem,
|
||||
MMModemFn callback,
|
||||
gpointer user_data)
|
||||
{
|
||||
MMModem *parent_modem_iface;
|
||||
MMCallbackInfo *info;
|
||||
|
||||
option_change_unsolicited_messages (MM_GENERIC_GSM (modem), FALSE);
|
||||
mm_generic_gsm_pending_registration_stop (MM_GENERIC_GSM (modem));
|
||||
|
||||
/* 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);
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user