aboutsummaryrefslogtreecommitdiff
path: root/libmm-glib
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2025-02-22 17:16:36 +0100
committerDan Williams <dan@ioncontrol.co>2025-03-28 20:53:52 +0000
commit0c20d13b30a7f93625b48a5150f92ebd76ccb7b0 (patch)
tree02c505ae9883ec03c84fbd5db9309dd8a1d8b293 /libmm-glib
parent61656dcb3d8262b60e9e0bb839440f71383bf125 (diff)
libmm-glib,helpers: Add helpers for CellBroadcast channel lists
Signed-off-by: Guido Günther <agx@sigxcpu.org>
Diffstat (limited to 'libmm-glib')
-rw-r--r--libmm-glib/mm-common-helpers.c71
-rw-r--r--libmm-glib/mm-common-helpers.h7
-rw-r--r--libmm-glib/mm-helper-types.h16
3 files changed, 94 insertions, 0 deletions
diff --git a/libmm-glib/mm-common-helpers.c b/libmm-glib/mm-common-helpers.c
index 72007ab5..e249a2fc 100644
--- a/libmm-glib/mm-common-helpers.c
+++ b/libmm-glib/mm-common-helpers.c
@@ -1281,6 +1281,77 @@ mm_common_build_oma_pending_network_initiated_sessions_default (void)
}
/******************************************************************************/
+/* MMModemCellbroadcastChannel array management */
+
+GArray *
+mm_common_cell_broadcast_channels_variant_to_garray (GVariant *variant)
+{
+ GArray *array = NULL;
+
+ if (variant) {
+ GVariantIter iter;
+ guint n;
+
+ g_variant_iter_init (&iter, variant);
+ n = g_variant_iter_n_children (&iter);
+
+ if (n > 0) {
+ MMCellBroadcastChannels channels;
+
+ array = g_array_sized_new (FALSE, FALSE, sizeof (MMCellBroadcastChannels), n);
+ while (g_variant_iter_loop (&iter, "(uu)", &channels.start, &channels.end))
+ g_array_append_val (array, channels);
+ }
+ }
+
+ /* If nothing set, fallback to empty */
+ if (!array)
+ array = g_array_new (FALSE, FALSE, sizeof (MMCellBroadcastChannels));
+
+ return array;
+}
+
+GVariant *
+mm_common_cell_broadcast_channels_array_to_variant (const MMCellBroadcastChannels *channels,
+ guint n_sessions)
+{
+ if (n_sessions > 0) {
+ GVariantBuilder builder;
+ guint i;
+
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(uu)"));
+
+ for (i = 0; i < n_sessions; i++)
+ g_variant_builder_add_value (&builder,
+ g_variant_new ("(uu)",
+ ((guint32)channels[i].start),
+ ((guint32)channels[i].end)));
+ return g_variant_builder_end (&builder);
+ }
+
+ return mm_common_build_cell_broadcast_channels_default ();
+}
+
+GVariant *
+mm_common_cell_broadcast_channels_garray_to_variant (GArray *array)
+{
+ if (array)
+ return mm_common_cell_broadcast_channels_array_to_variant ((const MMCellBroadcastChannels *)array->data,
+ array->len);
+
+ return mm_common_cell_broadcast_channels_array_to_variant (NULL, 0);
+}
+
+GVariant *
+mm_common_build_cell_broadcast_channels_default (void)
+{
+ GVariantBuilder builder;
+
+ g_variant_builder_init (&builder, G_VARIANT_TYPE ("a(uu)"));
+ return g_variant_builder_end (&builder);
+}
+
+/******************************************************************************/
/* Common parsers */
/* Expecting input as:
diff --git a/libmm-glib/mm-common-helpers.h b/libmm-glib/mm-common-helpers.h
index 6ff89e21..bea220e0 100644
--- a/libmm-glib/mm-common-helpers.h
+++ b/libmm-glib/mm-common-helpers.h
@@ -164,6 +164,13 @@ GVariant *mm_common_oma_pending_network_initiated_sessions_array_to_variant (co
GVariant *mm_common_oma_pending_network_initiated_sessions_garray_to_variant (GArray *array);
GVariant *mm_common_build_oma_pending_network_initiated_sessions_default (void);
+/* MMModemCellbroadcastChannel array management */
+GArray *mm_common_cell_broadcast_channels_variant_to_garray (GVariant *variant);
+GVariant *mm_common_cell_broadcast_channels_array_to_variant (const MMCellBroadcastChannels *channels,
+ guint n_sessions);
+GVariant *mm_common_cell_broadcast_channels_garray_to_variant (GArray *array);
+GVariant *mm_common_build_cell_broadcast_channels_default (void);
+
/******************************************************************************/
const gchar *mm_common_str_boolean (gboolean value);
diff --git a/libmm-glib/mm-helper-types.h b/libmm-glib/mm-helper-types.h
index 0d9de269..cc0d3a28 100644
--- a/libmm-glib/mm-helper-types.h
+++ b/libmm-glib/mm-helper-types.h
@@ -80,4 +80,20 @@ struct _MMOmaPendingNetworkInitiatedSession {
guint session_id;
};
+/**
+ * MMCellBroadcastChannels:
+ * @start: The first channel
+ * @end: The last channel
+ *
+ * #MMCellBroadcastChannels is a simple struct specifying the start and end
+ * of a channel interval.
+ *
+ * Since: 1.24
+ */
+typedef struct _MMCellBroadcastChannels MMCellBroadcastChannels;
+struct _MMCellBroadcastChannels {
+ guint start;
+ guint end;
+};
+
#endif /* _MM_HELPER_TYPES_H_ */