The MMBearer object is updated to provide getter methods to retrieve the new MMBearerStats object. --- docs/reference/libmm-glib/libmm-glib-sections.txt | 2 + libmm-glib/mm-bearer.c | 116 ++++++++++++++++++++++ libmm-glib/mm-bearer.h | 4 + 3 files changed, 122 insertions(+)
diff --git a/docs/reference/libmm-glib/libmm-glib-sections.txt b/docs/reference/libmm-glib/libmm-glib-sections.txt index b17f281..49bce22 100644 --- a/docs/reference/libmm-glib/libmm-glib-sections.txt +++ b/docs/reference/libmm-glib/libmm-glib-sections.txt @@ -933,6 +933,8 @@ mm_bearer_peek_ipv6_config mm_bearer_get_ipv6_config mm_bearer_peek_properties mm_bearer_get_properties +mm_bearer_peek_stats +mm_bearer_get_stats <SUBSECTION Methods> mm_bearer_connect mm_bearer_connect_finish diff --git a/libmm-glib/mm-bearer.c b/libmm-glib/mm-bearer.c index 4694cbe..5f65b68 100644 --- a/libmm-glib/mm-bearer.c +++ b/libmm-glib/mm-bearer.c @@ -53,6 +53,11 @@ struct _MMBearerPrivate { GMutex properties_mutex; guint properties_id; MMBearerProperties *properties; + + /* Stats */ + GMutex stats_mutex; + guint stats_id; + MMBearerStats *stats; }; /*****************************************************************************/ @@ -535,6 +540,117 @@ mm_bearer_peek_properties (MMBearer *self) /*****************************************************************************/ +static void +stats_updated (MMBearer *self, + GParamSpec *pspec) +{ + g_mutex_lock (&self->priv->stats_mutex); + { + GVariant *dictionary; + + g_clear_object (&self->priv->stats); + + dictionary = mm_gdbus_bearer_get_stats (MM_GDBUS_BEARER (self)); + if (dictionary) { + GError *error = NULL; + + self->priv->stats = mm_bearer_stats_new_from_dictionary (dictionary, &error); + if (error) { + g_warning ("Invalid bearer stats update received: %s", error->message); + g_error_free (error); + } + } + } + g_mutex_unlock (&self->priv->stats_mutex); +} + +static void +ensure_internal_stats (MMBearer *self, + MMBearerStats **dup) +{ + g_mutex_lock (&self->priv->stats_mutex); + { + /* If this is the first time ever asking for the object, setup the + * update listener and the initial object, if any. */ + if (!self->priv->stats_id) { + GVariant *dictionary; + + dictionary = mm_gdbus_bearer_dup_stats (MM_GDBUS_BEARER (self)); + if (dictionary) { + GError *error = NULL; + + self->priv->stats = mm_bearer_stats_new_from_dictionary (dictionary, &error); + if (error) { + g_warning ("Invalid initial bearer stats: %s", error->message); + g_error_free (error); + } + g_variant_unref (dictionary); + } + + /* No need to clear this signal connection when freeing self */ + self->priv->stats_id = + g_signal_connect (self, + "notify::stats", + G_CALLBACK (stats_updated), + NULL); + } + + if (dup && self->priv->stats) + *dup = g_object_ref (self->priv->stats); + } + g_mutex_unlock (&self->priv->stats_mutex); +} + +/** + * mm_bearer_get_stats: + * @self: A #MMBearer. + * + * Gets a #MMBearerStats object specifying the statistics of the current bearer + * connection. + * + * <warning>The values reported by @self are not updated when the values in the + * interface change. Instead, the client is expected to call + * mm_bearer_get_stats() again to get a new #MMBearerStats with the + * new values.</warning> + * + * Returns: (transfer full): A #MMBearerStats that must be freed with g_object_unref() or %NULL if unknown. + */ +MMBearerStats * +mm_bearer_get_stats (MMBearer *self) +{ + MMBearerStats *config = NULL; + + g_return_val_if_fail (MM_IS_BEARER (self), NULL); + + ensure_internal_stats (self, &config); + return config; +} + +/** + * mm_bearer_peek_stats: + * @self: A #MMBearer. + * + * Gets a #MMBearerStats object specifying the statistics of the current bearer + * connection. + * + * <warning>The returned value is only valid until the property changes so + * it is only safe to use this function on the thread where + * @self was constructed. Use mm_bearer_get_stats() if on another + * thread.</warning> + * + * Returns: (transfer none): A #MMBearerStats. Do not free the returned value, it belongs to @self. + */ +MMBearerStats * +mm_bearer_peek_stats (MMBearer *self) +{ + g_return_val_if_fail (MM_IS_BEARER (self), NULL); + + ensure_internal_stats (self, NULL); + return self->priv->stats; +} + +/*****************************************************************************/ + /** * mm_bearer_connect_finish: * @self: A #MMBearer. diff --git a/libmm-glib/mm-bearer.h b/libmm-glib/mm-bearer.h index dbaf497..cd08142 100644 --- a/libmm-glib/mm-bearer.h +++ b/libmm-glib/mm-bearer.h @@ -33,6 +33,7 @@ #include "mm-gdbus-bearer.h" #include "mm-bearer-properties.h" #include "mm-bearer-ip-config.h" +#include "mm-bearer-stats.h" G_BEGIN_DECLS @@ -109,6 +110,9 @@ MMBearerIpConfig *mm_bearer_peek_ipv4_config (MMBearer *self); MMBearerIpConfig *mm_bearer_get_ipv6_config (MMBearer *self); MMBearerIpConfig *mm_bearer_peek_ipv6_config (MMBearer *self); +MMBearerStats *mm_bearer_get_stats (MMBearer *self); +MMBearerStats *mm_bearer_peek_stats (MMBearer *self); + G_END_DECLS #endif /* _MM_BEARER_H_ */ -- 2.6.2 _______________________________________________ ModemManager-devel mailing list ModemManager-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/modemmanager-devel