diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2016-08-07 14:09:41 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2016-10-12 11:29:52 +0200 |
commit | f2c2a6a05f82450383667eb32dca4fd63488ae4f (patch) | |
tree | 3b274d6235a0608d032b2c93c0abe5cff780b8af | |
parent | 26d0d718f7834348146ab9e040051f7a538f04f0 (diff) |
novatel: subclass the connection monitoring logic
Instead of setting up a custom timeout source to poll the connection status, use
the generic logic in the base bearer object, and just re-implement the command
used to check the status.
-rw-r--r-- | plugins/novatel/mm-broadband-bearer-novatel-lte.c | 172 | ||||
-rw-r--r-- | plugins/novatel/mm-broadband-bearer-novatel-lte.h | 2 |
2 files changed, 79 insertions, 95 deletions
diff --git a/plugins/novatel/mm-broadband-bearer-novatel-lte.c b/plugins/novatel/mm-broadband-bearer-novatel-lte.c index 461ed617..e06a6bec 100644 --- a/plugins/novatel/mm-broadband-bearer-novatel-lte.c +++ b/plugins/novatel/mm-broadband-bearer-novatel-lte.c @@ -13,6 +13,7 @@ * Copyright (C) 2008 - 2009 Novell, Inc. * Copyright (C) 2009 - 2012 Red Hat, Inc. * Copyright (C) 2011 - 2012 Google, Inc. + * Copyright (C) 2016 Aleksander Morgado <aleksander@aleksander.es> */ #include <config.h> @@ -32,15 +33,11 @@ #include "mm-log.h" #include "mm-modem-helpers.h" -#define CONNECTION_CHECK_TIMEOUT_SEC 5 #define QMISTATUS_TAG "$NWQMISTATUS:" -G_DEFINE_TYPE (MMBroadbandBearerNovatelLte, mm_broadband_bearer_novatel_lte, MM_TYPE_BROADBAND_BEARER); +G_DEFINE_TYPE (MMBroadbandBearerNovatelLte, mm_broadband_bearer_novatel_lte, MM_TYPE_BROADBAND_BEARER) -struct _MMBroadbandBearerNovatelLtePrivate { - /* timeout id for checking whether we're still connected */ - guint connection_poller; -}; +/*****************************************************************************/ static gchar * normalize_qmistatus (const gchar *status) @@ -58,46 +55,6 @@ normalize_qmistatus (const gchar *status) return normalized_status; } -/*****************************************************************************/ -/* 3GPP Connection sequence */ - -typedef struct { - MMBroadbandBearerNovatelLte *self; - MMBaseModem *modem; - MMPortSerialAt *primary; - MMPort *data; - GCancellable *cancellable; - GSimpleAsyncResult *result; - gint retries; -} DetailedConnectContext; - -static void -detailed_connect_context_complete_and_free (DetailedConnectContext *ctx) -{ - g_simple_async_result_complete_in_idle (ctx->result); - g_object_unref (ctx->result); - g_object_unref (ctx->cancellable); - if (ctx->data) - g_object_unref (ctx->data); - g_object_unref (ctx->primary); - g_object_unref (ctx->modem); - g_object_unref (ctx->self); - g_slice_free (DetailedConnectContext, ctx); -} - -static MMBearerConnectResult * -connect_3gpp_finish (MMBroadbandBearer *self, - GAsyncResult *res, - GError **error) -{ - if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) - return NULL; - - return mm_bearer_connect_result_ref (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res))); -} - -static gboolean connect_3gpp_qmistatus (DetailedConnectContext *ctx); - static gboolean is_qmistatus_connected (const gchar *str) { @@ -122,48 +79,103 @@ is_qmistatus_call_failed (const gchar *str) return (g_strrstr (str, "QMI_RESULT_FAILURE:QMI_ERR_CALL_FAILED") != NULL); } +/*****************************************************************************/ +/* Connection status monitoring */ + +static MMBearerConnectionStatus +load_connection_status_finish (MMBaseBearer *bearer, + GAsyncResult *res, + GError **error) +{ + gssize value; + + value = g_task_propagate_int (G_TASK (res), error); + return (value < 0 ? MM_BEARER_CONNECTION_STATUS_UNKNOWN : (MMBearerConnectionStatus) value); +} + static void -poll_connection_ready (MMBaseModem *modem, +poll_connection_ready (MMBaseModem *modem, GAsyncResult *res, - MMBroadbandBearerNovatelLte *bearer) + GTask *task) { const gchar *result; GError *error = NULL; result = mm_base_modem_at_command_finish (modem, res, &error); - if (!result) { - mm_warn ("QMI connection status failed: %s", error->message); - g_error_free (error); - return; - } - - if (is_qmistatus_disconnected (result)) { - mm_base_bearer_report_connection_status (MM_BASE_BEARER (bearer), MM_BEARER_CONNECTION_STATUS_DISCONNECTED); - g_source_remove (bearer->priv->connection_poller); - bearer->priv->connection_poller = 0; - } + if (!result) + g_task_return_error (task, error); + else if (is_qmistatus_disconnected (result)) + g_task_return_int (task, MM_BEARER_CONNECTION_STATUS_DISCONNECTED); + else + g_task_return_int (task, MM_BEARER_CONNECTION_STATUS_CONNECTED); + g_object_unref (task); } -static gboolean -poll_connection (MMBroadbandBearerNovatelLte *bearer) +static void +load_connection_status (MMBaseBearer *bearer, + GAsyncReadyCallback callback, + gpointer user_data) { + GTask *task; MMBaseModem *modem = NULL; + task = g_task_new (bearer, NULL, callback, user_data); + g_object_get (MM_BASE_BEARER (bearer), MM_BASE_BEARER_MODEM, &modem, NULL); + mm_base_modem_at_command ( modem, "$NWQMISTATUS", 3, FALSE, - (GAsyncReadyCallback)poll_connection_ready, - bearer); + (GAsyncReadyCallback) poll_connection_ready, + task); + g_object_unref (modem); +} + +/*****************************************************************************/ +/* 3GPP Connection sequence */ + +typedef struct { + MMBroadbandBearerNovatelLte *self; + MMBaseModem *modem; + MMPortSerialAt *primary; + MMPort *data; + GCancellable *cancellable; + GSimpleAsyncResult *result; + gint retries; +} DetailedConnectContext; + +static void +detailed_connect_context_complete_and_free (DetailedConnectContext *ctx) +{ + g_simple_async_result_complete_in_idle (ctx->result); + g_object_unref (ctx->result); + g_object_unref (ctx->cancellable); + if (ctx->data) + g_object_unref (ctx->data); + g_object_unref (ctx->primary); + g_object_unref (ctx->modem); + g_object_unref (ctx->self); + g_slice_free (DetailedConnectContext, ctx); +} + +static MMBearerConnectResult * +connect_3gpp_finish (MMBroadbandBearer *self, + GAsyncResult *res, + GError **error) +{ + if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error)) + return NULL; - return G_SOURCE_CONTINUE; + return mm_bearer_connect_result_ref (g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res))); } +static gboolean connect_3gpp_qmistatus (DetailedConnectContext *ctx); + static void connect_3gpp_qmistatus_ready (MMBaseModem *modem, GAsyncResult *res, @@ -187,9 +199,6 @@ connect_3gpp_qmistatus_ready (MMBaseModem *modem, MMBearerIpConfig *config; mm_dbg("Connected"); - ctx->self->priv->connection_poller = g_timeout_add_seconds (CONNECTION_CHECK_TIMEOUT_SEC, - (GSourceFunc)poll_connection, - ctx->self); config = mm_bearer_ip_config_new (); mm_bearer_ip_config_set_method (config, MM_BEARER_IP_METHOD_DHCP); g_simple_async_result_set_op_res_gpointer ( @@ -494,12 +503,6 @@ disconnect_3gpp (MMBroadbandBearer *self, gpointer user_data) { DetailedDisconnectContext *ctx; - MMBroadbandBearerNovatelLte *bearer = MM_BROADBAND_BEARER_NOVATEL_LTE (self); - - if (bearer->priv->connection_poller) { - g_source_remove (bearer->priv->connection_poller); - bearer->priv->connection_poller = 0; - } ctx = detailed_disconnect_context_new (self, modem, primary, data, callback, user_data); @@ -558,33 +561,16 @@ mm_broadband_bearer_novatel_lte_new (MMBroadbandModemNovatelLte *modem, static void mm_broadband_bearer_novatel_lte_init (MMBroadbandBearerNovatelLte *self) { - self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, - MM_TYPE_BROADBAND_BEARER_NOVATEL_LTE, - MMBroadbandBearerNovatelLtePrivate); - - self->priv->connection_poller = 0; -} - -static void -finalize (GObject *object) -{ - MMBroadbandBearerNovatelLte *self = MM_BROADBAND_BEARER_NOVATEL_LTE (object); - - if (self->priv->connection_poller) - g_source_remove (self->priv->connection_poller); - - G_OBJECT_CLASS (mm_broadband_bearer_novatel_lte_parent_class)->finalize (object); } static void mm_broadband_bearer_novatel_lte_class_init (MMBroadbandBearerNovatelLteClass *klass) { - GObjectClass *object_class = G_OBJECT_CLASS (klass); + MMBaseBearerClass *base_bearer_class = MM_BASE_BEARER_CLASS (klass); MMBroadbandBearerClass *broadband_bearer_class = MM_BROADBAND_BEARER_CLASS (klass); - g_type_class_add_private (object_class, sizeof (MMBroadbandBearerNovatelLtePrivate)); - - object_class->finalize = finalize; + base_bearer_class->load_connection_status = load_connection_status; + base_bearer_class->load_connection_status_finish = load_connection_status_finish; broadband_bearer_class->connect_3gpp = connect_3gpp; broadband_bearer_class->connect_3gpp_finish = connect_3gpp_finish; diff --git a/plugins/novatel/mm-broadband-bearer-novatel-lte.h b/plugins/novatel/mm-broadband-bearer-novatel-lte.h index d5799911..4f503865 100644 --- a/plugins/novatel/mm-broadband-bearer-novatel-lte.h +++ b/plugins/novatel/mm-broadband-bearer-novatel-lte.h @@ -36,11 +36,9 @@ typedef struct _MMBroadbandBearerNovatelLte MMBroadbandBearerNovatelLte; typedef struct _MMBroadbandBearerNovatelLteClass MMBroadbandBearerNovatelLteClass; -typedef struct _MMBroadbandBearerNovatelLtePrivate MMBroadbandBearerNovatelLtePrivate; struct _MMBroadbandBearerNovatelLte { MMBroadbandBearer parent; - MMBroadbandBearerNovatelLtePrivate *priv; }; struct _MMBroadbandBearerNovatelLteClass { |