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_get_ipv6_config
|
||||||
mm_bearer_peek_properties
|
mm_bearer_peek_properties
|
||||||
mm_bearer_get_properties
|
mm_bearer_get_properties
|
||||||
|
mm_bearer_peek_stats
|
||||||
|
mm_bearer_get_stats
|
||||||
<SUBSECTION Methods>
|
<SUBSECTION Methods>
|
||||||
mm_bearer_connect
|
mm_bearer_connect
|
||||||
mm_bearer_connect_finish
|
mm_bearer_connect_finish
|
||||||
|
@@ -53,6 +53,11 @@ struct _MMBearerPrivate {
|
|||||||
GMutex properties_mutex;
|
GMutex properties_mutex;
|
||||||
guint properties_id;
|
guint properties_id;
|
||||||
MMBearerProperties *properties;
|
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:
|
* mm_bearer_connect_finish:
|
||||||
* @self: A #MMBearer.
|
* @self: A #MMBearer.
|
||||||
|
@@ -33,6 +33,7 @@
|
|||||||
#include "mm-gdbus-bearer.h"
|
#include "mm-gdbus-bearer.h"
|
||||||
#include "mm-bearer-properties.h"
|
#include "mm-bearer-properties.h"
|
||||||
#include "mm-bearer-ip-config.h"
|
#include "mm-bearer-ip-config.h"
|
||||||
|
#include "mm-bearer-stats.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
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_get_ipv6_config (MMBearer *self);
|
||||||
MMBearerIpConfig *mm_bearer_peek_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
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* _MM_BEARER_H_ */
|
#endif /* _MM_BEARER_H_ */
|
||||||
|
Reference in New Issue
Block a user