The new MMBearerStats object provides a simple API to interact with the new dictionary containing the bearer connection stats. --- docs/reference/libmm-glib/libmm-glib-docs.xml | 1 + docs/reference/libmm-glib/libmm-glib-sections.txt | 30 +++ libmm-glib/Makefile.am | 3 + libmm-glib/mm-bearer-stats.c | 222 ++++++++++++++++++++++ libmm-glib/mm-bearer-stats.h | 85 +++++++++ 5 files changed, 341 insertions(+) create mode 100644 libmm-glib/mm-bearer-stats.c create mode 100644 libmm-glib/mm-bearer-stats.h
diff --git a/docs/reference/libmm-glib/libmm-glib-docs.xml b/docs/reference/libmm-glib/libmm-glib-docs.xml index 38a0b9f..810eb96 100644 --- a/docs/reference/libmm-glib/libmm-glib-docs.xml +++ b/docs/reference/libmm-glib/libmm-glib-docs.xml @@ -130,6 +130,7 @@ <xi:include href="xml/mm-bearer.xml"/> <xi:include href="xml/mm-bearer-properties.xml"/> <xi:include href="xml/mm-bearer-ip-config.xml"/> + <xi:include href="xml/mm-bearer-stats.xml"/> </chapter> <chapter> diff --git a/docs/reference/libmm-glib/libmm-glib-sections.txt b/docs/reference/libmm-glib/libmm-glib-sections.txt index 773b48d..f59aa45 100644 --- a/docs/reference/libmm-glib/libmm-glib-sections.txt +++ b/docs/reference/libmm-glib/libmm-glib-sections.txt @@ -987,6 +987,33 @@ mm_bearer_ip_config_get_type </SECTION> <SECTION> +<FILE>mm-bearer-stats</FILE> +<TITLE>MMBearerStats</TITLE> +MMBearerStats +<SUBSECTION Getters> +mm_bearer_stats_get_duration +mm_bearer_stats_get_rx_bytes +mm_bearer_stats_get_tx_bytes +<SUBSECTION Private> +mm_bearer_stats_get_dictionary +mm_bearer_stats_new +mm_bearer_stats_new_from_dictionary +mm_bearer_stats_set_duration +mm_bearer_stats_set_rx_bytes +mm_bearer_stats_set_tx_bytes +<SUBSECTION Standard> +MMBearerStatsClass +MMBearerStatsPrivate +MM_BEARER_STATS +MM_BEARER_STATS_CLASS +MM_BEARER_STATS_GET_CLASS +MM_IS_BEARER_STATS +MM_IS_BEARER_STATS_CLASS +MM_TYPE_BEARER_STATS +mm_bearer_stats_get_type +</SECTION> + +<SECTION> <FILE>mm-bearer-properties</FILE> <TITLE>MMBearerProperties</TITLE> MMBearerProperties @@ -1439,6 +1466,8 @@ mm_gdbus_bearer_get_properties mm_gdbus_bearer_dup_properties mm_gdbus_bearer_get_connected mm_gdbus_bearer_get_suspended +mm_gdbus_bearer_get_stats +mm_gdbus_bearer_dup_stats <SUBSECTION Methods> mm_gdbus_bearer_call_connect mm_gdbus_bearer_call_connect_finish @@ -1455,6 +1484,7 @@ mm_gdbus_bearer_set_ip6_config mm_gdbus_bearer_set_ip_timeout mm_gdbus_bearer_set_properties mm_gdbus_bearer_set_suspended +mm_gdbus_bearer_set_stats mm_gdbus_bearer_override_properties mm_gdbus_bearer_complete_connect mm_gdbus_bearer_complete_disconnect diff --git a/libmm-glib/Makefile.am b/libmm-glib/Makefile.am index cb8f63a..4b7ab4f 100644 --- a/libmm-glib/Makefile.am +++ b/libmm-glib/Makefile.am @@ -60,6 +60,8 @@ libmm_glib_la_SOURCES = \ mm-call-properties.c \ mm-bearer-ip-config.h \ mm-bearer-ip-config.c \ + mm-bearer-stats.h \ + mm-bearer-stats.c \ mm-location-common.h \ mm-location-3gpp.h \ mm-location-3gpp.c \ @@ -131,6 +133,7 @@ include_HEADERS = \ mm-sms-properties.h \ mm-call-properties.h \ mm-bearer-ip-config.h \ + mm-bearer-stats.h \ mm-location-common.h \ mm-location-3gpp.h \ mm-location-gps-nmea.h \ diff --git a/libmm-glib/mm-bearer-stats.c b/libmm-glib/mm-bearer-stats.c new file mode 100644 index 0000000..f2be488 --- /dev/null +++ b/libmm-glib/mm-bearer-stats.c @@ -0,0 +1,222 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details: + * + * Copyright (C) 2015 Azimut Electronics + * + * Author: Aleksander Morgado <aleksan...@aleksander.es> + */ + +#include <string.h> + +#include "mm-errors-types.h" +#include "mm-bearer-stats.h" + +/** + * SECTION: mm-bearer-stats + * @title: MMBearerStats + * @short_description: Helper object to handle bearer stats. + * + * The #MMBearerStats is an object handling the statistics reported by the + * bearer object during a connection. + * + * This object is retrieved with either mm_bearer_get_stats() or + * mm_bearer_peek_stats(). + */ + +G_DEFINE_TYPE (MMBearerStats, mm_bearer_stats, G_TYPE_OBJECT) + +#define PROPERTY_DURATION "duration" +#define PROPERTY_RX_BYTES "rx-bytes" +#define PROPERTY_TX_BYTES "tx-bytes" + +struct _MMBearerStatsPrivate { + guint duration; + guint64 rx_bytes; + guint64 tx_bytes; +}; + +/*****************************************************************************/ + +/** + * mm_bearer_stats_get_duration: + * @self: a #MMBearerStats. + * + * Gets the duration of the current connection, in seconds. + * + * Returns: a #guint. + */ +guint +mm_bearer_stats_get_duration (MMBearerStats *self) +{ + g_return_val_if_fail (MM_IS_BEARER_STATS (self), 0); + + return self->priv->duration; +} + +void +mm_bearer_stats_set_duration (MMBearerStats *self, + guint duration) +{ + g_return_if_fail (MM_IS_BEARER_STATS (self)); + + self->priv->duration = duration; +} + +/*****************************************************************************/ + +/** + * mm_bearer_stats_get_rx_bytes: + * @self: a #MMBearerStats. + * + * Gets the number of bytes received without error in the connection. + * + * Returns: a #guint64. + */ +guint64 +mm_bearer_stats_get_rx_bytes (MMBearerStats *self) +{ + g_return_val_if_fail (MM_IS_BEARER_STATS (self), 0); + + return self->priv->rx_bytes; +} + +void +mm_bearer_stats_set_rx_bytes (MMBearerStats *self, + guint64 bytes) +{ + g_return_if_fail (MM_IS_BEARER_STATS (self)); + + self->priv->rx_bytes = bytes; +} + +/*****************************************************************************/ + +/** + * mm_bearer_stats_get_tx_bytes: + * @self: a #MMBearerStats. + * + * Gets the number of bytes transmitted without error in the connection. + * + * Returns: a #guint64. + */ +guint64 +mm_bearer_stats_get_tx_bytes (MMBearerStats *self) +{ + g_return_val_if_fail (MM_IS_BEARER_STATS (self), 0); + + return self->priv->tx_bytes; +} + +void +mm_bearer_stats_set_tx_bytes (MMBearerStats *self, + guint64 bytes) +{ + g_return_if_fail (MM_IS_BEARER_STATS (self)); + + self->priv->tx_bytes = bytes; +} + +/*****************************************************************************/ + +GVariant * +mm_bearer_stats_get_dictionary (MMBearerStats *self) +{ + GVariantBuilder builder; + + /* We do allow self==NULL. We'll just report NULL. */ + if (!self) + return NULL; + + g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{sv}")); + g_variant_builder_add (&builder, + "{sv}", + PROPERTY_DURATION, + g_variant_new_uint32 (self->priv->duration)); + g_variant_builder_add (&builder, + "{sv}", + PROPERTY_RX_BYTES, + g_variant_new_uint64 (self->priv->rx_bytes)); + g_variant_builder_add (&builder, + "{sv}", + PROPERTY_TX_BYTES, + g_variant_new_uint64 (self->priv->tx_bytes)); + return g_variant_builder_end (&builder); +} + +/*****************************************************************************/ + +MMBearerStats * +mm_bearer_stats_new_from_dictionary (GVariant *dictionary, + GError **error) +{ + GVariantIter iter; + gchar *key; + GVariant *value; + MMBearerStats *self; + + self = mm_bearer_stats_new (); + if (!dictionary) + return self; + + if (!g_variant_is_of_type (dictionary, G_VARIANT_TYPE ("a{sv}"))) { + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_INVALID_ARGS, + "Cannot create Stats from dictionary: " + "invalid variant type received"); + g_object_unref (self); + return NULL; + } + + g_variant_iter_init (&iter, dictionary); + while (g_variant_iter_next (&iter, "{sv}", &key, &value)) { + if (g_str_equal (key, PROPERTY_DURATION)) { + mm_bearer_stats_set_duration ( + self, + g_variant_get_uint32 (value)); + } else if (g_str_equal (key, PROPERTY_RX_BYTES)) { + mm_bearer_stats_set_rx_bytes ( + self, + g_variant_get_uint64 (value)); + } else if (g_str_equal (key, PROPERTY_TX_BYTES)) { + mm_bearer_stats_set_tx_bytes ( + self, + g_variant_get_uint64 (value)); + } + g_free (key); + g_variant_unref (value); + } + + return self; +} + +/*****************************************************************************/ + +MMBearerStats * +mm_bearer_stats_new (void) +{ + return (MM_BEARER_STATS (g_object_new (MM_TYPE_BEARER_STATS, NULL))); +} + +static void +mm_bearer_stats_init (MMBearerStats *self) +{ + self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self, MM_TYPE_BEARER_STATS, MMBearerStatsPrivate); +} + +static void +mm_bearer_stats_class_init (MMBearerStatsClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (object_class, sizeof (MMBearerStatsPrivate)); +} diff --git a/libmm-glib/mm-bearer-stats.h b/libmm-glib/mm-bearer-stats.h new file mode 100644 index 0000000..54b5328 --- /dev/null +++ b/libmm-glib/mm-bearer-stats.h @@ -0,0 +1,85 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details: + * + * Copyright (C) 2015 Azimut Electronics + * + * Author: Aleksander Morgado <aleksan...@aleksander.es> + */ + +#ifndef MM_BEARER_STATS_H +#define MM_BEARER_STATS_H + +#if !defined (__LIBMM_GLIB_H_INSIDE__) && !defined (LIBMM_GLIB_COMPILATION) +#error "Only <libmm-glib.h> can be included directly." +#endif + +#include <ModemManager.h> +#include <glib-object.h> + +G_BEGIN_DECLS + +#define MM_TYPE_BEARER_STATS (mm_bearer_stats_get_type ()) +#define MM_BEARER_STATS(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MM_TYPE_BEARER_STATS, MMBearerStats)) +#define MM_BEARER_STATS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), MM_TYPE_BEARER_STATS, MMBearerStatsClass)) +#define MM_IS_BEARER_STATS(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MM_TYPE_BEARER_STATS)) +#define MM_IS_BEARER_STATS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), MM_TYPE_BEARER_STATS)) +#define MM_BEARER_STATS_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), MM_TYPE_BEARER_STATS, MMBearerStatsClass)) + +typedef struct _MMBearerStats MMBearerStats; +typedef struct _MMBearerStatsClass MMBearerStatsClass; +typedef struct _MMBearerStatsPrivate MMBearerStatsPrivate; + +/** + * MMBearerStats: + * + * The #MMBearerStats structure contains private data and should + * only be accessed using the provided API. + */ +struct _MMBearerStats { + /*< private >*/ + GObject parent; + MMBearerStatsPrivate *priv; +}; + +struct _MMBearerStatsClass { + /*< private >*/ + GObjectClass parent; +}; + +GType mm_bearer_stats_get_type (void); + +guint mm_bearer_stats_get_duration (MMBearerStats *self); +guint64 mm_bearer_stats_get_rx_bytes (MMBearerStats *self); +guint64 mm_bearer_stats_get_tx_bytes (MMBearerStats *self); + +/*****************************************************************************/ +/* ModemManager/libmm-glib/mmcli specific methods */ + +#if defined (_LIBMM_INSIDE_MM) || \ + defined (_LIBMM_INSIDE_MMCLI) || \ + defined (LIBMM_GLIB_COMPILATION) + +MMBearerStats *mm_bearer_stats_new (void); +MMBearerStats *mm_bearer_stats_new_from_dictionary (GVariant *dictionary, + GError **error); + +void mm_bearer_stats_set_duration (MMBearerStats *self, guint duration); +void mm_bearer_stats_set_rx_bytes (MMBearerStats *self, guint64 rx_bytes); +void mm_bearer_stats_set_tx_bytes (MMBearerStats *self, guint64 tx_bytes); + +GVariant *mm_bearer_stats_get_dictionary (MMBearerStats *self); + +#endif + +G_END_DECLS + +#endif /* MM_BEARER_STATS_H */ -- 2.6.2 _______________________________________________ ModemManager-devel mailing list ModemManager-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/modemmanager-devel