aboutsummaryrefslogtreecommitdiff
path: root/libmm-glib/mm-common-helpers.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmm-glib/mm-common-helpers.c')
-rw-r--r--libmm-glib/mm-common-helpers.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/libmm-glib/mm-common-helpers.c b/libmm-glib/mm-common-helpers.c
index e249a2fc..12796429 100644
--- a/libmm-glib/mm-common-helpers.c
+++ b/libmm-glib/mm-common-helpers.c
@@ -174,6 +174,36 @@ mm_common_build_mode_combinations_string (const MMModemModeCombination *modes,
return g_string_free (str, FALSE);
}
+gchar *
+mm_common_build_channels_string (const MMCellBroadcastChannels *channels,
+ guint n_channels)
+{
+ gboolean first = TRUE;
+ GString *str;
+ guint i;
+
+ if (!channels || !n_channels)
+ return g_strdup ("none");
+
+ str = g_string_new ("");
+ for (i = 0; i < n_channels; i++) {
+ if (channels[i].start == channels[i].end) {
+ g_string_append_printf (str, "%s%u",
+ first ? "" : ",",
+ channels[i].start);
+ } else {
+ g_string_append_printf (str, "%s%u-%u",
+ first ? "" : ",",
+ channels[i].start, channels[i].end);
+ }
+
+ if (first)
+ first = FALSE;
+ }
+
+ return g_string_free (str, FALSE);
+}
+
/******************************************************************************/
/* String to enums/flags parsers */
@@ -738,6 +768,90 @@ mm_common_get_profile_source_from_string (const gchar *str,
error);
}
+gboolean
+mm_common_get_cell_broadcast_channels_from_string (const gchar *str,
+ MMCellBroadcastChannels **channels,
+ guint *n_channels,
+ GError **error)
+{
+ GError *inner_error = NULL;
+ GArray *array;
+ g_auto(GStrv) channel_strings = NULL;
+
+ array = g_array_new (FALSE, FALSE, sizeof (MMCellBroadcastChannels));
+
+ channel_strings = g_strsplit (str, ",", -1);
+
+ if (channel_strings) {
+ guint i;
+
+ for (i = 0; channel_strings[i]; i++) {
+ char *startptr, *endptr;
+ gint64 start;
+
+ startptr = channel_strings[i];
+ start = g_ascii_strtoll (startptr, &endptr, 10);
+ if (startptr == endptr || start > G_MAXUINT16 || start < 0) {
+ inner_error = g_error_new (MM_CORE_ERROR,
+ MM_CORE_ERROR_INVALID_ARGS,
+ "Couldn't parse '%s' as MMCellBroadcastChannel start value",
+ channel_strings[i]);
+ break;
+ }
+ if (*endptr == '\0') {
+ MMCellBroadcastChannels ch;
+
+ ch.start = start;
+ ch.end = start;
+ g_array_append_val (array, ch);
+ } else if (*endptr == '-') {
+ gint64 end;
+
+ startptr = endptr + 1;
+ end = g_ascii_strtoll (startptr, &endptr, 10);
+ if (startptr == endptr || end > G_MAXUINT16 || end < 0) {
+ inner_error = g_error_new (MM_CORE_ERROR,
+ MM_CORE_ERROR_INVALID_ARGS,
+ "Couldn't parse '%s' as MMCellBroadcastChannel end value",
+ channel_strings[i]);
+ break;
+ }
+ if (*endptr == '\0') {
+ MMCellBroadcastChannels ch;
+
+ ch.start = start;
+ ch.end = end;
+ g_array_append_val (array, ch);
+ } else {
+ inner_error = g_error_new (MM_CORE_ERROR,
+ MM_CORE_ERROR_INVALID_ARGS,
+ "Couldn't parse '%s' as MMCellBroadcastChannel end value",
+ channel_strings[i]);
+ break;
+ }
+ } else {
+ inner_error = g_error_new (MM_CORE_ERROR,
+ MM_CORE_ERROR_INVALID_ARGS,
+ "Couldn't parse '%s' as MMCellBroadcastChannel value",
+ channel_strings[i]);
+ break;
+ }
+ }
+ }
+
+ if (inner_error) {
+ g_propagate_error (error, inner_error);
+ g_array_free (array, TRUE);
+ *n_channels = 0;
+ *channels = NULL;
+ return FALSE;
+ }
+
+ *n_channels = array->len;
+ *channels = (MMCellBroadcastChannels *)g_array_free (array, FALSE);
+ return TRUE;
+}
+
/******************************************************************************/
/* MMModemPortInfo array management */