libmm-glib,helpers: Add helpers for CellBroadcast channel lists

Signed-off-by: Guido Günther <agx@sigxcpu.org>
This commit is contained in:
Guido Günther
2025-03-28 20:53:52 +00:00
committed by Dan Williams
parent 61656dcb3d
commit 0c20d13b30
3 changed files with 94 additions and 0 deletions
+71
View File
@@ -1280,6 +1280,77 @@ mm_common_build_oma_pending_network_initiated_sessions_default (void)
return g_variant_builder_end (&builder);
}
/******************************************************************************/
/* 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 */
+7
View File
@@ -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);
+16
View File
@@ -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_ */