aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-base-bearer.c20
-rw-r--r--src/mm-broadband-bearer.c41
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);
}
/*****************************************************************************/