From 1b94b6e76b3657a2635be97fd79d269635ca67a5 Mon Sep 17 00:00:00 2001 From: Simon McVittie <smcv@collabora.com> Date: Mon, 9 Nov 2020 16:41:12 +0000 Subject: [PATCH] json-utils: Add control over the placeholder for non-string items in strv Signed-off-by: Simon McVittie <smcv@collabora.com> --- steam-runtime-tools/json-utils-internal.h | 3 ++- steam-runtime-tools/json-utils.c | 25 ++++++++++++++++------- steam-runtime-tools/system-info.c | 12 ++++++++--- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/steam-runtime-tools/json-utils-internal.h b/steam-runtime-tools/json-utils-internal.h index b3e1d208d..c7e0a6793 100644 --- a/steam-runtime-tools/json-utils-internal.h +++ b/steam-runtime-tools/json-utils-internal.h @@ -41,4 +41,5 @@ guint srt_get_flags_from_json_array (GType flags_type, guint flag_if_unknown); gchar ** _srt_json_object_dup_strv_member (JsonObject *json_obj, - const gchar *array_member); + const gchar *array_member, + const gchar *placeholder); diff --git a/steam-runtime-tools/json-utils.c b/steam-runtime-tools/json-utils.c index 422d2456e..160d44582 100644 --- a/steam-runtime-tools/json-utils.c +++ b/steam-runtime-tools/json-utils.c @@ -84,9 +84,9 @@ out: * @json_obj: (not nullable): A JSON Object used to search for * @array_member property * @array_member: (not nullable): The JSON member to look up - * - * Every %NULL or non string members of the array are replaced with the value - * "<invalid>". + * @placeholder: (nullable): If an item in the array is not a string, + * substitute this non-%NULL value; or if %NULL, behave as though it + * was not present * * Returns: (transfer full) (array zero-terminated=1) (element-type utf8) (nullable): * A string array from the given @json_obj, or %NULL if it doesn't have a @@ -94,7 +94,8 @@ out: */ gchar ** _srt_json_object_dup_strv_member (JsonObject *json_obj, - const gchar *array_member) + const gchar *array_member, + const gchar *placeholder) { JsonArray *array; guint length; @@ -106,20 +107,30 @@ _srt_json_object_dup_strv_member (JsonObject *json_obj, if (json_object_has_member (json_obj, array_member)) { + guint j = 0; + array = json_object_get_array_member (json_obj, array_member); if (array == NULL) return ret; length = json_array_get_length (array); ret = g_new0 (gchar *, length + 1); + for (guint i = 0; i < length; i++) { element = json_array_get_string_element (array, i); + if (element == NULL) - element = "<invalid>"; - ret[i] = g_strdup (element); + element = placeholder; + + if (element == NULL) + continue; + + ret[j++] = g_strdup (element); } - ret[length] = NULL; + + g_assert (j <= length); + ret[j] = NULL; } return ret; diff --git a/steam-runtime-tools/system-info.c b/steam-runtime-tools/system-info.c index 83121dfd3..2928a68e0 100644 --- a/steam-runtime-tools/system-info.c +++ b/steam-runtime-tools/system-info.c @@ -1349,9 +1349,13 @@ _srt_system_info_get_pinned_libs_from_report (JsonObject *json_obj, { json_pinned_obj = json_object_get_object_member (json_obj, which); - pinned_list = _srt_json_object_dup_strv_member (json_pinned_obj, "list"); + pinned_list = _srt_json_object_dup_strv_member (json_pinned_obj, + "list", + "<invalid>"); - *messages = _srt_json_object_dup_strv_member (json_pinned_obj, "messages"); + *messages = _srt_json_object_dup_strv_member (json_pinned_obj, + "messages", + "<invalid>"); } return pinned_list; @@ -3232,7 +3236,9 @@ srt_system_info_list_driver_environment (SrtSystemInfo *self) static gchar ** _srt_system_info_driver_environment_from_report (JsonObject *json_obj) { - return _srt_json_object_dup_strv_member (json_obj, "driver_environment"); + return _srt_json_object_dup_strv_member (json_obj, + "driver_environment", + "<invalid>"); } typedef struct -- GitLab