aboutsummaryrefslogtreecommitdiff
path: root/plugins/mm-modem-mbm.c
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2011-06-16 17:12:41 +0200
committerGuido Günther <agx@sigxcpu.org>2014-02-05 08:38:26 +0100
commit59ed3390b9a798ff8bf9133cbc28c4539ad99f42 (patch)
tree2009d57abbd0061b4ee230516e004eb83509aac5 /plugins/mm-modem-mbm.c
parentbbf8a053e07c66f336ed46a7fb6105dc30645596 (diff)
parent3dbe8df8bfe8741e1b9a48b56e41517816f17dc1 (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.c113
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;