[PATCH v2 2/7] libmm-glib: new helper object to handle bearer stats

Aleksander Morgado aleksander at aleksander.es
Wed Dec 2 08:32:40 PST 2015


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 <aleksander at 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 <aleksander at 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


More information about the ModemManager-devel mailing list