libmm-glib: retrieve stats from the bearer
The MMBearer object is updated to provide getter methods to retrieve the new MMBearerStats object.
This commit is contained in:
@@ -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
|
||||
|
@@ -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.
|
||||
|
@@ -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_ */
|
||||
|
Reference in New Issue
Block a user