diff options
-rw-r--r-- | src/mm-base-bearer.c | 20 | ||||
-rw-r--r-- | src/mm-broadband-bearer.c | 41 |
2 files changed, 46 insertions, 15 deletions
diff --git a/src/mm-base-bearer.c b/src/mm-base-bearer.c index 0cca8534..02084dff 100644 --- a/src/mm-base-bearer.c +++ b/src/mm-base-bearer.c @@ -92,6 +92,8 @@ struct _MMBaseBearerPrivate { /* Connection status monitoring */ guint connection_monitor_id; + /* Flag to specify whether connection monitoring is supported or not */ + gboolean load_connection_status_unsupported; /*-- 3GPP specific --*/ guint deferred_3gpp_unregistration_id; @@ -162,7 +164,18 @@ load_connection_status_ready (MMBaseBearer *self, status = MM_BASE_BEARER_GET_CLASS (self)->load_connection_status_finish (self, res, &error); if (status == MM_BEARER_CONNECTION_STATUS_UNKNOWN) { - mm_warn ("checking if connected failed: %s", error->message); + /* Only warn if not reporting an "unsupported" error */ + if (!g_error_matches (error, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED)) { + mm_warn ("checking if connected failed: %s", error->message); + g_error_free (error); + return; + } + + /* If we're being told that connection monitoring is unsupported, just + * ignore the error and remove the timeout. */ + mm_dbg ("Connection monitoring is unsupported by the device"); + self->priv->load_connection_status_unsupported = TRUE; + connection_monitor_stop (self); g_error_free (error); return; } @@ -176,7 +189,7 @@ load_connection_status_ready (MMBaseBearer *self, static gboolean connection_monitor_cb (MMBaseBearer *self) { - /* If the implementation knows how to update stat values, run it */ + /* If the implementation knows how to load connection status, run it */ MM_BASE_BEARER_GET_CLASS (self)->load_connection_status ( self, (GAsyncReadyCallback)load_connection_status_ready, @@ -192,6 +205,9 @@ connection_monitor_start (MMBaseBearer *self) !MM_BASE_BEARER_GET_CLASS (self)->load_connection_status_finish) return; + if (self->priv->load_connection_status_unsupported) + return; + /* Schedule */ g_assert (!self->priv->connection_monitor_id); self->priv->connection_monitor_id = g_timeout_add_seconds (BEARER_CONNECTION_MONITOR_TIMEOUT, diff --git a/src/mm-broadband-bearer.c b/src/mm-broadband-bearer.c index 3a82defa..9491f5a8 100644 --- a/src/mm-broadband-bearer.c +++ b/src/mm-broadband-bearer.c @@ -1992,30 +1992,45 @@ load_connection_status (MMBaseBearer *self, GAsyncReadyCallback callback, gpointer user_data) { - GTask *task; - MMBaseModem *modem = NULL; + GTask *task; + MMBaseModem *modem = NULL; + MMPortSerialAt *port; task = g_task_new (self, NULL, callback, user_data); + g_object_get (MM_BASE_BEARER (self), + MM_BASE_BEARER_MODEM, &modem, + NULL); + + /* If CID not defined, error out */ if (!MM_BROADBAND_BEARER (self)->priv->cid) { g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "Couldn't load connection status: cid not defined"); g_object_unref (task); - return; + goto out; } - g_object_get (MM_BASE_BEARER (self), - MM_BASE_BEARER_MODEM, &modem, - NULL); + /* If no control port available, error out */ + port = mm_base_modem_peek_best_at_port (modem, NULL); + if (!port) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, + "Couldn't load connection status: no control port available"); + g_object_unref (task); + goto out; + } - mm_base_modem_at_command (MM_BASE_MODEM (modem), - "+CGACT?", - 3, - FALSE, - (GAsyncReadyCallback) cgact_periodic_query_ready, - task); + mm_base_modem_at_command_full (MM_BASE_MODEM (modem), + port, + "+CGACT?", + 3, + FALSE, /* allow cached */ + FALSE, /* raw */ + NULL, /* cancellable */ + (GAsyncReadyCallback) cgact_periodic_query_ready, + task); - g_object_unref (modem); +out: + g_clear_object (&modem); } /*****************************************************************************/ |