diff options
author | Michael Biebl <biebl@debian.org> | 2011-06-16 17:12:41 +0200 |
---|---|---|
committer | Guido Günther <agx@sigxcpu.org> | 2014-02-05 08:38:26 +0100 |
commit | 59ed3390b9a798ff8bf9133cbc28c4539ad99f42 (patch) | |
tree | 2009d57abbd0061b4ee230516e004eb83509aac5 /plugins/mm-modem-mbm.c | |
parent | bbf8a053e07c66f336ed46a7fb6105dc30645596 (diff) | |
parent | 3dbe8df8bfe8741e1b9a48b56e41517816f17dc1 (diff) |
Imported Debian patch 0.4.997-1debian/0.4.997-1
Diffstat (limited to 'plugins/mm-modem-mbm.c')
-rw-r--r-- | plugins/mm-modem-mbm.c | 113 |
1 files changed, 91 insertions, 22 deletions
diff --git a/plugins/mm-modem-mbm.c b/plugins/mm-modem-mbm.c index 9303453..70faef4 100644 --- a/plugins/mm-modem-mbm.c +++ b/plugins/mm-modem-mbm.c @@ -177,6 +177,11 @@ mbm_set_allowed_mode_done (MMAtSerialPort *port, { MMCallbackInfo *info = (MMCallbackInfo *) user_data; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) info->error = g_error_copy (error); @@ -257,6 +262,11 @@ get_allowed_mode_done (MMAtSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; gboolean parsed = FALSE; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) info->error = g_error_copy (error); else if (!g_str_has_prefix (response->str, "CFUN: ")) { @@ -351,6 +361,11 @@ mbm_enable_done (MMAtSerialPort *port, { MMCallbackInfo *info = (MMCallbackInfo *) user_data; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + /* Start unsolicited signal strength and access technology responses */ mm_at_serial_port_queue_command (port, "*ERINFO=1", 3, NULL, NULL); @@ -359,14 +374,21 @@ mbm_enable_done (MMAtSerialPort *port, static void mbm_enap0_done (MMAtSerialPort *port, - GString *response, - GError *error, - gpointer user_data) + GString *response, + GError *error, + gpointer user_data) { MMCallbackInfo *info = user_data; - MMModemMbmPrivate *priv = MM_MODEM_MBM_GET_PRIVATE (info->modem); + MMModemMbmPrivate *priv; char *command; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + priv = MM_MODEM_MBM_GET_PRIVATE (info->modem); + if (!priv->network_mode) priv->network_mode = MBM_NETWORK_MODE_ANY; @@ -382,7 +404,14 @@ mbm_init_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = user_data; - MMModemMbmPrivate *priv = MM_MODEM_MBM_GET_PRIVATE (info->modem); + MMModemMbmPrivate *priv; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + priv = MM_MODEM_MBM_GET_PRIVATE (info->modem); if (error) { mm_generic_gsm_enable_complete (MM_GENERIC_GSM (info->modem), error, info); @@ -408,12 +437,19 @@ mbm_emrdy_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = user_data; - MMModemMbmPrivate *priv = MM_MODEM_MBM_GET_PRIVATE (info->modem); + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; if (g_error_matches (error, MM_SERIAL_ERROR, MM_SERIAL_ERROR_RESPONSE_TIMEOUT)) mm_warn ("timed out waiting for EMRDY response."); - else + else { + MMModemMbmPrivate *priv = MM_MODEM_MBM_GET_PRIVATE (info->modem); + priv->have_emrdy = TRUE; + } do_init (port, info); } @@ -437,11 +473,7 @@ do_enable (MMGenericGsm *self, MMModemFn callback, gpointer user_data) mm_at_serial_port_queue_command (primary, "*EMRDY?", 5, mbm_emrdy_done, info); } -typedef struct { - MMModem *modem; - MMModemFn callback; - gpointer user_data; -} DisableInfo; +/*****************************************************************************/ static void disable_unsolicited_done (MMAtSerialPort *port, @@ -450,12 +482,29 @@ disable_unsolicited_done (MMAtSerialPort *port, gpointer user_data) { - MMModem *parent_modem_iface; - DisableInfo *info = user_data; + MMCallbackInfo *info = (MMCallbackInfo *) user_data; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; - parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GET_INTERFACE (info->modem)); - parent_modem_iface->disable (info->modem, info->callback, info->user_data); - g_free (info); + /* Ignore all errors */ + mm_callback_info_schedule (info); +} + +static void +invoke_call_parent_disable_fn (MMCallbackInfo *info) +{ + /* Note: we won't call the parent disable if info->modem is no longer + * valid. The invoke is called always once the info gets scheduled, which + * may happen during removed modem detection. */ + if (info->modem) { + MMModem *parent_modem_iface; + + parent_modem_iface = g_type_interface_peek_parent (MM_MODEM_GET_INTERFACE (info->modem)); + parent_modem_iface->disable (info->modem, (MMModemFn)info->callback, info->user_data); + } } static void @@ -464,12 +513,12 @@ disable (MMModem *modem, gpointer user_data) { MMAtSerialPort *primary; - DisableInfo *info; + MMCallbackInfo *info; - info = g_malloc0 (sizeof (DisableInfo)); - info->callback = callback; - info->user_data = user_data; - info->modem = modem; + info = mm_callback_info_new_full (modem, + invoke_call_parent_disable_fn, + (GCallback)callback, + user_data); primary = mm_generic_gsm_get_at_port (MM_GENERIC_GSM (modem), MM_PORT_TYPE_PRIMARY); g_assert (primary); @@ -536,6 +585,11 @@ factory_reset_done (MMAtSerialPort *port, { MMCallbackInfo *info = (MMCallbackInfo *) user_data; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + mm_serial_port_close (MM_SERIAL_PORT (port)); mm_callback_info_schedule (info); } @@ -659,6 +713,11 @@ enap_poll_response (MMAtSerialPort *port, g_assert (info); + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + count = GPOINTER_TO_UINT (mm_callback_info_get_data (info, "mbm-enap-poll-count")); if (sscanf (response->str, "*ENAP: %d", &state) == 1 && state == 1) { @@ -702,6 +761,11 @@ enap_done (MMAtSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; guint tid; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { mm_generic_gsm_connect_complete (MM_GENERIC_GSM (info->modem), error, info); return; @@ -796,6 +860,11 @@ send_epin_done (MMAtSerialPort *port, const char *pin_type; int attempts_left = 0; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { info->error = g_error_copy (error); goto done; |