diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/mm-modem-anydata-cdma.c | 10 | ||||
-rw-r--r-- | plugins/mm-modem-gobi-gsm.c | 5 | ||||
-rw-r--r-- | plugins/mm-modem-hso.c | 66 | ||||
-rw-r--r-- | plugins/mm-modem-huawei-cdma.c | 5 | ||||
-rw-r--r-- | plugins/mm-modem-huawei-gsm.c | 45 | ||||
-rw-r--r-- | plugins/mm-modem-icera.c | 59 | ||||
-rw-r--r-- | plugins/mm-modem-linktop.c | 12 | ||||
-rw-r--r-- | plugins/mm-modem-longcheer-gsm.c | 20 | ||||
-rw-r--r-- | plugins/mm-modem-mbm.c | 70 | ||||
-rw-r--r-- | plugins/mm-modem-novatel-cdma.c | 19 | ||||
-rw-r--r-- | plugins/mm-modem-novatel-gsm.c | 20 | ||||
-rw-r--r-- | plugins/mm-modem-option-utils.c | 28 | ||||
-rwxr-xr-x | plugins/mm-modem-samsung-gsm.c | 42 | ||||
-rw-r--r-- | plugins/mm-modem-sierra-cdma.c | 24 | ||||
-rw-r--r-- | plugins/mm-modem-sierra-gsm.c | 48 | ||||
-rw-r--r-- | plugins/mm-modem-simtech-gsm.c | 43 | ||||
-rw-r--r-- | plugins/mm-modem-wavecom-gsm.c | 89 | ||||
-rw-r--r-- | plugins/mm-modem-x22x-gsm.c | 19 | ||||
-rw-r--r-- | plugins/mm-modem-zte.c | 46 |
19 files changed, 581 insertions, 89 deletions
diff --git a/plugins/mm-modem-anydata-cdma.c b/plugins/mm-modem-anydata-cdma.c index 0e7e65c5..7b6b37a2 100644 --- a/plugins/mm-modem-anydata-cdma.c +++ b/plugins/mm-modem-anydata-cdma.c @@ -128,6 +128,11 @@ evdo_state_done (MMAtSerialPort *port, GRegex *r; GMatchInfo *match_info; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { /* Leave superclass' reg state alone if AT*HSTATE isn't supported */ mm_callback_info_schedule (info); @@ -195,6 +200,11 @@ state_done (MMAtSerialPort *port, GRegex *r; GMatchInfo *match_info; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { /* Leave superclass' reg state alone if AT*STATE isn't supported */ mm_callback_info_schedule (info); diff --git a/plugins/mm-modem-gobi-gsm.c b/plugins/mm-modem-gobi-gsm.c index 7e2fa4ca..ab19642b 100644 --- a/plugins/mm-modem-gobi-gsm.c +++ b/plugins/mm-modem-gobi-gsm.c @@ -63,6 +63,11 @@ get_string_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 && response && !strcmp (response->str, "ERROR")) { info->error = g_error_new_literal (MM_MOBILE_ERROR, MM_MOBILE_ERROR_SIM_NOT_INSERTED, diff --git a/plugins/mm-modem-hso.c b/plugins/mm-modem-hso.c index 70816665..e3d4dce7 100644 --- a/plugins/mm-modem-hso.c +++ b/plugins/mm-modem-hso.c @@ -117,8 +117,16 @@ auth_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemHso *self = MM_MODEM_HSO (info->modem); - MMModemHsoPrivate *priv = MM_MODEM_HSO_GET_PRIVATE (self); + MMModemHso *self; + MMModemHsoPrivate *priv; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + self = MM_MODEM_HSO (info->modem); + priv = MM_MODEM_HSO_GET_PRIVATE (self); if (error) { priv->auth_idx++; @@ -257,6 +265,11 @@ hso_call_control_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 && !mm_callback_info_get_data (info, IGNORE_ERRORS_TAG)) info->error = g_error_copy (error); @@ -318,12 +331,13 @@ hso_enabled (MMModem *modem, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - GError *tmp_error; - tmp_error = mm_modem_check_removed (modem, error); - if (tmp_error) { - mm_generic_gsm_connect_complete (MM_GENERIC_GSM (modem), tmp_error, info); - g_clear_error (&tmp_error); + /* Do nothing if modem removed */ + if (!modem || mm_callback_info_check_modem_removed (info)) + return; + + if (error) { + mm_generic_gsm_connect_complete (MM_GENERIC_GSM (modem), error, info); } else { MMModemHsoPrivate *priv = MM_MODEM_HSO_GET_PRIVATE (modem); @@ -338,13 +352,14 @@ old_context_clear_done (MMModem *modem, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - GError *tmp_error; - tmp_error = mm_modem_check_removed (modem, error); - if (tmp_error) { - mm_generic_gsm_connect_complete (MM_GENERIC_GSM (modem), tmp_error, info); - g_clear_error (&tmp_error); - } else { + /* Do nothing if modem removed */ + if (!modem || mm_callback_info_check_modem_removed (info)) + return; + + if (error) + mm_generic_gsm_connect_complete (MM_GENERIC_GSM (modem), error, info); + else { /* Success, activate the PDP context and start the data session */ hso_call_control (MM_MODEM_HSO (modem), TRUE, FALSE, hso_enabled, info); } @@ -356,12 +371,13 @@ connect_auth_done (MMModem *modem, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - GError *tmp_error; - tmp_error = mm_modem_check_removed (modem, error); - if (tmp_error) { - mm_generic_gsm_connect_complete (MM_GENERIC_GSM (modem), tmp_error, info); - g_clear_error (&tmp_error); + /* Do nothing if modem removed */ + if (!modem || mm_callback_info_check_modem_removed (info)) + return; + + if (error) { + mm_generic_gsm_connect_complete (MM_GENERIC_GSM (modem), error, info); } else { /* Now connect; kill any existing connections first */ hso_call_control (MM_MODEM_HSO (modem), FALSE, TRUE, old_context_clear_done, info); @@ -491,6 +507,11 @@ get_ip4_config_done (MMAtSerialPort *port, guint32 tmp; gint cid; + /* 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 out; @@ -560,7 +581,14 @@ disconnect_owancall_done (MMAtSerialPort *port, GError *error, gpointer user_data) { - mm_callback_info_schedule ((MMCallbackInfo *) 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; + + mm_callback_info_schedule (info); } static void diff --git a/plugins/mm-modem-huawei-cdma.c b/plugins/mm-modem-huawei-cdma.c index 3aec470b..b24ec64b 100644 --- a/plugins/mm-modem-huawei-cdma.c +++ b/plugins/mm-modem-huawei-cdma.c @@ -167,6 +167,11 @@ sysinfo_done (MMAtSerialPort *port, GMatchInfo *match_info; const char *reply; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { /* Leave superclass' reg state alone if AT^SYSINFO isn't supported */ goto done; diff --git a/plugins/mm-modem-huawei-gsm.c b/plugins/mm-modem-huawei-gsm.c index df58d535..93cb4cca 100644 --- a/plugins/mm-modem-huawei-gsm.c +++ b/plugins/mm-modem-huawei-gsm.c @@ -171,6 +171,11 @@ 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); @@ -232,11 +237,18 @@ get_allowed_mode_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemHuaweiGsm *self = MM_MODEM_HUAWEI_GSM (info->modem); + MMModemHuaweiGsm *self; int mode_a, mode_b, u1, u2; guint32 band; MMModemGsmAllowedMode mode = MM_MODEM_GSM_ALLOWED_MODE_ANY; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + self = MM_MODEM_HUAWEI_GSM (info->modem); + if (error) info->error = g_error_copy (error); else if (parse_syscfg (self, response->str, &mode_a, &mode_b, &band, &u1, &u2, &mode)) @@ -271,8 +283,16 @@ set_band_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemHuaweiGsm *self = MM_MODEM_HUAWEI_GSM (info->modem); - MMModemHuaweiGsmPrivate *priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (self); + MMModemHuaweiGsm *self; + MMModemHuaweiGsmPrivate *priv; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + self = MM_MODEM_HUAWEI_GSM (info->modem); + priv = MM_MODEM_HUAWEI_GSM_GET_PRIVATE (self); if (error) info->error = g_error_copy (error); @@ -321,10 +341,17 @@ get_band_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemHuaweiGsm *self = MM_MODEM_HUAWEI_GSM (info->modem); + MMModemHuaweiGsm *self; int mode_a, mode_b, u1, u2; guint32 band; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + self = MM_MODEM_HUAWEI_GSM (info->modem); + if (error) info->error = g_error_copy (error); else if (parse_syscfg (self, response->str, &mode_a, &mode_b, &band, &u1, &u2, NULL)) { @@ -410,6 +437,11 @@ get_act_request_done (MMAtSerialPort *port, char *str; int srv_stat = 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; @@ -504,6 +536,11 @@ send_huawei_cpin_done (MMAtSerialPort *port, char *str = NULL; guint32 num = 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; diff --git a/plugins/mm-modem-icera.c b/plugins/mm-modem-icera.c index d34e71ee..b093b344 100644 --- a/plugins/mm-modem-icera.c +++ b/plugins/mm-modem-icera.c @@ -56,6 +56,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, "%IPSYS: ")) { @@ -119,6 +124,11 @@ 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); @@ -235,8 +245,14 @@ get_nwstate_done (MMAtSerialPort *port, { MMCallbackInfo *info = user_data; - info->error = mm_modem_check_removed (info->modem, error); - if (!info->error) { + /* 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 { MMModemIcera *self = MM_MODEM_ICERA (info->modem); MMModemIceraPrivate *priv = MM_MODEM_ICERA_GET_PRIVATE (self); @@ -277,7 +293,14 @@ disconnect_ipdpact_done (MMAtSerialPort *port, GError *error, gpointer user_data) { - mm_callback_info_schedule ((MMCallbackInfo *) 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; + + mm_callback_info_schedule (info); } void @@ -458,6 +481,11 @@ icera_connected (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) { mm_generic_gsm_connect_complete (MM_GENERIC_GSM (info->modem), error, info); } else { @@ -481,6 +509,11 @@ old_context_clear_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; + /* Activate the PDP context and start the data session */ icera_call_control (MM_MODEM_ICERA (info->modem), TRUE, icera_connected, info); } @@ -493,6 +526,11 @@ auth_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) mm_generic_gsm_connect_complete (MM_GENERIC_GSM (info->modem), error, info); else { @@ -574,6 +612,11 @@ get_ip4_config_done (MMAtSerialPort *port, guint32 tmp; gint cid; + /* 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 out; @@ -710,8 +753,14 @@ is_icera_done (MMAtSerialPort *port, { MMCallbackInfo *info = user_data; - info->error = mm_modem_check_removed (info->modem, error); - if (!info->error) + /* 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 mm_callback_info_set_result (info, GUINT_TO_POINTER (TRUE), NULL); mm_callback_info_schedule (info); } diff --git a/plugins/mm-modem-linktop.c b/plugins/mm-modem-linktop.c index 923c2191..cfe0c0de 100644 --- a/plugins/mm-modem-linktop.c +++ b/plugins/mm-modem-linktop.c @@ -104,6 +104,11 @@ linktop_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); @@ -127,7 +132,7 @@ set_allowed_mode (MMGenericGsm *gsm, mm_callback_info_schedule (info); return; } - + command = g_strdup_printf ("+CFUN=%d", linktop_parse_allowed_mode (mode)); mm_at_serial_port_queue_command (port, command, 3, linktop_set_allowed_mode_done, info); g_free (command); @@ -142,6 +147,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: ")) { diff --git a/plugins/mm-modem-longcheer-gsm.c b/plugins/mm-modem-longcheer-gsm.c index 33763e27..610ec777 100644 --- a/plugins/mm-modem-longcheer-gsm.c +++ b/plugins/mm-modem-longcheer-gsm.c @@ -60,9 +60,15 @@ get_allowed_mode_done (MMAtSerialPort *port, MMModemGsmAllowedMode mode = MM_MODEM_GSM_ALLOWED_MODE_ANY; gint mododr = -1; - info->error = mm_modem_check_removed (info->modem, error); - if (info->error) + /* 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; + } p = mm_strip_tag (response->str, "+MODODR:"); if (!p) { @@ -120,6 +126,11 @@ 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); @@ -175,6 +186,11 @@ get_act_request_done (MMAtSerialPort *port, MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN; const char *p; + /* 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 { diff --git a/plugins/mm-modem-mbm.c b/plugins/mm-modem-mbm.c index 93034537..1a9fbf37 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); } @@ -536,6 +572,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 +700,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 +748,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 +847,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; diff --git a/plugins/mm-modem-novatel-cdma.c b/plugins/mm-modem-novatel-cdma.c index 6b8c4aa9..c1f4151a 100644 --- a/plugins/mm-modem-novatel-cdma.c +++ b/plugins/mm-modem-novatel-cdma.c @@ -122,16 +122,15 @@ get_rssi_done (MMAtSerialPort *port, MMModemCdma *parent_iface; int qual; - info->error = mm_modem_check_removed (info->modem, error); - if (info->error) { - if (info->modem) { - /* Fallback to parent's method */ - g_clear_error (&info->error); - parent_iface = g_type_interface_peek_parent (MM_MODEM_CDMA_GET_INTERFACE (info->modem)); - parent_iface->get_signal_quality (MM_MODEM_CDMA (info->modem), parent_csq_done, info); - } else - mm_callback_info_schedule (info); + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { + /* Fallback to parent's method */ + parent_iface = g_type_interface_peek_parent (MM_MODEM_CDMA_GET_INTERFACE (info->modem)); + parent_iface->get_signal_quality (MM_MODEM_CDMA (info->modem), parent_csq_done, info); return; } @@ -149,7 +148,7 @@ get_rssi_done (MMAtSerialPort *port, info->error = g_error_new (MM_MODEM_ERROR, MM_MODEM_ERROR_GENERAL, "%s", "Could not parse signal quality results"); } - + mm_callback_info_schedule (info); } diff --git a/plugins/mm-modem-novatel-gsm.c b/plugins/mm-modem-novatel-gsm.c index 64a81bd5..5d78db73 100644 --- a/plugins/mm-modem-novatel-gsm.c +++ b/plugins/mm-modem-novatel-gsm.c @@ -118,6 +118,11 @@ 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); @@ -227,8 +232,14 @@ get_allowed_mode_done (MMAtSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; MMModemGsmAllowedMode mode = MM_MODEM_GSM_ALLOWED_MODE_ANY; - info->error = mm_modem_check_removed (info->modem, error); - if (!info->error) { + /* 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 { parse_nwrat_response (response, &mode, &info->error); mm_callback_info_set_result (info, GUINT_TO_POINTER (mode), NULL); } @@ -265,6 +276,11 @@ get_act_request_done (MMAtSerialPort *port, MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN; const char *p; + /* 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 { diff --git a/plugins/mm-modem-option-utils.c b/plugins/mm-modem-option-utils.c index 35dd1acd..61ca5d15 100644 --- a/plugins/mm-modem-option-utils.c +++ b/plugins/mm-modem-option-utils.c @@ -32,6 +32,11 @@ option_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, "_OPSYS: ")) { @@ -95,6 +100,11 @@ option_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); @@ -357,8 +367,14 @@ unsolicited_msg_done (MMAtSerialPort *port, { MMCallbackInfo *info = user_data; - if (info) + if (info) { + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + mm_callback_info_chain_complete_one (info); + } } static void @@ -394,6 +410,11 @@ get_act_octi_request_done (MMAtSerialPort *port, MMModemGsmAccessTech octi = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN; MMModemGsmAccessTech owcti; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (!error) { if (parse_octi_response (response, &octi)) { /* If no 3G tech yet or current tech isn't 3G, then 2G tech is the best */ @@ -416,6 +437,11 @@ get_act_owcti_request_done (MMAtSerialPort *port, MMModemGsmAccessTech owcti = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN; const char *p; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (!error) { p = mm_strip_tag (response->str, "_OWCTI:"); if (owcti_to_mm (*p, &owcti)) { diff --git a/plugins/mm-modem-samsung-gsm.c b/plugins/mm-modem-samsung-gsm.c index 0f63e03f..b7df067d 100755 --- a/plugins/mm-modem-samsung-gsm.c +++ b/plugins/mm-modem-samsung-gsm.c @@ -144,6 +144,11 @@ set_band_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); @@ -232,6 +237,11 @@ get_band_done (MMAtSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; MMModemGsmBand mm_band = MM_MODEM_GSM_BAND_UNKNOWN; + /* 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 (parse_ipbm (response->str, &mm_band)) @@ -290,6 +300,11 @@ send_samsung_pinnum_done (MMAtSerialPort *port, char *str = NULL; guint32 num = 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; @@ -461,7 +476,14 @@ init_all_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemSamsungGsm *self = MM_MODEM_SAMSUNG_GSM (info->modem); + MMModemSamsungGsm *self; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + self = MM_MODEM_SAMSUNG_GSM (info->modem); if (!error) mm_modem_icera_change_unsolicited_messages (MM_MODEM_ICERA (self), TRUE); @@ -476,7 +498,14 @@ init2_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemSamsungGsm *self = MM_MODEM_SAMSUNG_GSM (info->modem); + MMModemSamsungGsm *self; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + self = MM_MODEM_SAMSUNG_GSM (info->modem); if (error) mm_generic_gsm_enable_complete (MM_GENERIC_GSM (self), error, info); @@ -493,7 +522,14 @@ init_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemSamsungGsm *self = MM_MODEM_SAMSUNG_GSM (info->modem); + MMModemSamsungGsm *self; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + self = MM_MODEM_SAMSUNG_GSM (info->modem); if (error) mm_generic_gsm_enable_complete (MM_GENERIC_GSM (self), error, info); diff --git a/plugins/mm-modem-sierra-cdma.c b/plugins/mm-modem-sierra-cdma.c index 1168c834..faf36757 100644 --- a/plugins/mm-modem-sierra-cdma.c +++ b/plugins/mm-modem-sierra-cdma.c @@ -148,7 +148,7 @@ status_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemSierraCdmaPrivate *priv = MM_MODEM_SIERRA_CDMA_GET_PRIVATE (info->modem); + MMModemSierraCdmaPrivate *priv; char **lines, **iter; gboolean registered = FALSE; gboolean have_sid = FALSE; @@ -156,6 +156,13 @@ status_done (MMAtSerialPort *port, SysMode sys_mode = SYS_MODE_UNKNOWN; gboolean evdo_roam = FALSE, cdma1x_roam = FALSE; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + priv = MM_MODEM_SIERRA_CDMA_GET_PRIVATE (info->modem); + if (error) { /* Leave superclass' reg state alone if AT!STATUS isn't supported */ goto done; @@ -167,11 +174,11 @@ status_done (MMAtSerialPort *port, goto done; } - /* Sierra CDMA parts have two general formats depending on whether they + /* Sierra CDMA parts have two general formats depending on whether they * support EVDO or not. EVDO parts report both 1x and EVDO roaming status * while of course 1x parts only report 1x status. Some modems also do not * report the Roaming information (MP 555 GPS). - * + * * AT!STATUS responses: * * Unregistered MC5725: @@ -182,7 +189,7 @@ status_done (MMAtSerialPort *port, * Temp: 33 State: 100 Sys Mode: NO SRV * Pilot NOT acquired * Modem has NOT registered - * + * * Registered MC5725: * ----------------------- * Current band: Cellular Sleep @@ -340,10 +347,17 @@ pcstate_done (MMAtSerialPort *port, GError *error, gpointer 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; + /* Ignore errors for now; we're not sure if all Sierra CDMA devices support * at!pcstate. */ - mm_callback_info_schedule ((MMCallbackInfo *) user_data); + mm_callback_info_schedule (info); } static void diff --git a/plugins/mm-modem-sierra-gsm.c b/plugins/mm-modem-sierra-gsm.c index d4636d73..6d4e4d5a 100644 --- a/plugins/mm-modem-sierra-gsm.c +++ b/plugins/mm-modem-sierra-gsm.c @@ -74,9 +74,15 @@ get_allowed_mode_done (MMAtSerialPort *port, GRegex *r = NULL; GMatchInfo *match_info; - info->error = mm_modem_check_removed (info->modem, error); - if (info->error) + /* 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; + } /* Example response: !SELRAT: 03, UMTS 3G Preferred */ r = g_regex_new ("!SELRAT:\\s*(\\d+).*$", 0, 0, NULL); @@ -156,6 +162,11 @@ 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); @@ -217,6 +228,11 @@ get_act_request_done (MMAtSerialPort *port, MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN; const char *p; + /* 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 { @@ -260,6 +276,11 @@ get_sim_iccid_done (MMAtSerialPort *port, char buf[21]; int i; + /* 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; @@ -415,7 +436,13 @@ ppp_connect_done (MMModem *modem, GError *error, gpointer user_data) { MMCallbackInfo *info = user_data; - info->error = mm_modem_check_removed (modem, error); + /* Do nothing if modem removed */ + if (!modem || mm_callback_info_check_modem_removed (info)) + return; + + if (error) + info->error = g_error_copy (error); + mm_callback_info_schedule (info); } @@ -427,6 +454,11 @@ net_activate_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_generic_gsm_connect_complete (MM_GENERIC_GSM (info->modem), error, info); } @@ -441,6 +473,11 @@ auth_done (MMAtSerialPort *port, gint cid; char *command; + /* 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); mm_callback_info_schedule (info); @@ -467,6 +504,11 @@ ps_attach_done (MMAtSerialPort *port, MMModem *parent_modem_iface; const char *number; + /* 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); mm_callback_info_schedule (info); diff --git a/plugins/mm-modem-simtech-gsm.c b/plugins/mm-modem-simtech-gsm.c index 4a626947..5d420335 100644 --- a/plugins/mm-modem-simtech-gsm.c +++ b/plugins/mm-modem-simtech-gsm.c @@ -67,9 +67,15 @@ get_mode_pref_done (MMAtSerialPort *port, guint32 acqord; MMModemGsmAllowedMode allowed = MM_MODEM_GSM_ALLOWED_MODE_ANY; - info->error = mm_modem_check_removed (info->modem, error); - if (info->error) + /* 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; + } p = mm_strip_tag (response->str, "+CNMP:"); if (!p) { @@ -125,9 +131,15 @@ get_acq_order_done (MMAtSerialPort *port, const char *p; gint acqord = -1; - info->error = mm_modem_check_removed (info->modem, error); - if (info->error) + /* 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; + } p = mm_strip_tag (response->str, "+CNAOP:"); if (!p) { @@ -182,6 +194,11 @@ set_acq_order_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); @@ -198,8 +215,13 @@ set_mode_pref_done (MMAtSerialPort *port, guint32 naop; char *command; - info->error = mm_modem_check_removed (info->modem, error); - if (info->error) { + /* 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); mm_callback_info_schedule (info); return; } @@ -286,8 +308,13 @@ get_act_tech_done (MMAtSerialPort *port, MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN; const char *p; - info->error = mm_modem_check_removed (info->modem, error); - if (info->error) { + /* 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); mm_callback_info_schedule (info); return; } diff --git a/plugins/mm-modem-wavecom-gsm.c b/plugins/mm-modem-wavecom-gsm.c index 3c8a49b0..c66637cf 100644 --- a/plugins/mm-modem-wavecom-gsm.c +++ b/plugins/mm-modem-wavecom-gsm.c @@ -239,12 +239,19 @@ set_band_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_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 (error) info->error = g_error_copy (error); - else + else { + MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); + priv->current_bands = GPOINTER_TO_UINT (mm_callback_info_get_data (info, "new-band")); + } mm_callback_info_schedule (info); } @@ -389,11 +396,16 @@ get_2g_band_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_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 (error) info->error = g_error_copy (error); else { + MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); const gchar *p; guint32 mm_band = MM_MODEM_GSM_BAND_UNKNOWN; @@ -430,11 +442,16 @@ get_3g_band_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_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 (error) info->error = g_error_copy (error); else { + MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); const gchar *p; guint mm_band = MM_MODEM_GSM_BAND_UNKNOWN; guint32 wavecom_band; @@ -516,6 +533,11 @@ get_access_technology_cb (MMAtSerialPort *port, MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN; const gchar *p; + /* 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 { @@ -583,19 +605,26 @@ get_allowed_mode_cb (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = user_data; - MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); + MMModemWavecomGsmPrivate *priv; gint read_mode = -1; gchar *mode_str = NULL; gchar *prefer_str = NULL; GRegex *r = NULL; GMatchInfo *match_info = NULL; + /* 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); mm_callback_info_schedule (info); return; } + priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); + /* Possible responses: * +WWSM: 0 (2G only) * +WWSM: 1 (3G only) @@ -706,12 +735,19 @@ set_allowed_mode_cb (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_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 (error) info->error = g_error_copy (error); - else + else { + MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); + priv->allowed_mode = GPOINTER_TO_UINT (mm_callback_info_get_data (info, "new-mode")); + } mm_callback_info_schedule (info); } @@ -813,17 +849,24 @@ set_highest_ms_class_cb (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); guint new_class; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { enable_complete (MM_GENERIC_GSM (info->modem), error, info); return; } new_class = GPOINTER_TO_UINT (mm_callback_info_get_data (info, "new-class")); - if (new_class) + if (new_class) { + MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); + priv->current_ms_class = new_class; + } /* All done without errors! */ mm_dbg ("[5/5] All done"); @@ -882,14 +925,21 @@ get_current_ms_class_cb (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = user_data; - MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); + MMModemWavecomGsmPrivate *priv; const gchar *p; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { enable_complete (MM_GENERIC_GSM (info->modem), error, info); return; } + priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); + p = mm_strip_tag (response->str, "+CGCLASS:"); if (strncmp (p, @@ -936,14 +986,21 @@ get_supported_ms_classes_cb (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = user_data; - MMModemWavecomGsmPrivate *priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); + MMModemWavecomGsmPrivate *priv; const gchar *p; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { enable_complete (MM_GENERIC_GSM (info->modem), error, info); return; } + priv = MM_MODEM_WAVECOM_GSM_GET_PRIVATE (info->modem); + /* Reset currently supported MS classes */ priv->supported_ms_classes = 0; @@ -996,6 +1053,11 @@ get_current_functionality_status_cb (MMAtSerialPort *port, const gchar *p; GError *inner_error; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { enable_complete (MM_GENERIC_GSM (info->modem), error, info); return; @@ -1027,6 +1089,11 @@ do_enable_power_up_done (MMGenericGsm *gsm, MMAtSerialPort *port; GError *inner_error = NULL; + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + if (error) { enable_complete (gsm, error, info); return; diff --git a/plugins/mm-modem-x22x-gsm.c b/plugins/mm-modem-x22x-gsm.c index ff232971..c5d65c0f 100644 --- a/plugins/mm-modem-x22x-gsm.c +++ b/plugins/mm-modem-x22x-gsm.c @@ -115,8 +115,14 @@ get_allowed_mode_done (MMAtSerialPort *port, MMCallbackInfo *info = (MMCallbackInfo *) user_data; MMModemGsmAllowedMode mode = MM_MODEM_GSM_ALLOWED_MODE_ANY; - info->error = mm_modem_check_removed (info->modem, error); - if (!info->error) { + /* 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 { parse_syssel_response (response, &mode, &info->error); mm_callback_info_set_result (info, GUINT_TO_POINTER (mode), NULL); } @@ -151,7 +157,14 @@ set_allowed_mode_done (MMAtSerialPort *port, { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - info->error = mm_modem_check_removed (info->modem, error); + /* 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); + mm_callback_info_schedule (info); } diff --git a/plugins/mm-modem-zte.c b/plugins/mm-modem-zte.c index e7387a05..4b7abafa 100644 --- a/plugins/mm-modem-zte.c +++ b/plugins/mm-modem-zte.c @@ -103,9 +103,15 @@ get_allowed_mode_done (MMAtSerialPort *port, GRegex *r = NULL; GMatchInfo *match_info; - info->error = mm_modem_check_removed (info->modem, error); - if (info->error) + /* 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; + } r = g_regex_new ("+ZSNT:\\s*(\\d),(\\d),(\\d)", G_REGEX_UNGREEDY, 0, NULL); if (!r) { @@ -192,6 +198,11 @@ 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); @@ -260,6 +271,11 @@ get_act_request_done (MMAtSerialPort *port, MMModemGsmAccessTech act = MM_MODEM_GSM_ACCESS_TECH_UNKNOWN; const char *p; + /* 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 { @@ -346,7 +362,14 @@ cpms_try_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = user_data; - MMModemZtePrivate *priv = MM_MODEM_ZTE_GET_PRIVATE (info->modem); + MMModemZtePrivate *priv; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + priv = MM_MODEM_ZTE_GET_PRIVATE (info->modem); if (error && g_error_matches (error, MM_MOBILE_ERROR, MM_MOBILE_ERROR_SIM_BUSY)) { if (priv->cpms_tries++ < 4) { @@ -377,6 +400,11 @@ init_modem_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_at_serial_port_queue_command (port, "E0", 5, NULL, NULL); /* Attempt to disable floods of "+ZUSIMR:2" unsolicited responses that @@ -417,8 +445,16 @@ pre_init_done (MMAtSerialPort *port, gpointer user_data) { MMCallbackInfo *info = (MMCallbackInfo *) user_data; - MMModemZte *self = MM_MODEM_ZTE (info->modem); - MMModemZtePrivate *priv = MM_MODEM_ZTE_GET_PRIVATE (self); + MMModemZte *self; + MMModemZtePrivate *priv; + + /* If the modem has already been removed, return without + * scheduling callback */ + if (mm_callback_info_check_modem_removed (info)) + return; + + self = MM_MODEM_ZTE (info->modem); + priv = MM_MODEM_ZTE_GET_PRIVATE (self); if (error) { /* Retry the init string one more time; the modem sometimes throws it away */ |