diff --git a/bin/system-info.c b/bin/system-info.c index 02f4ce0d1d0d1979746e4b16999885a52fac68e2..f331bd9834073288ff556694d58313885944cbd8 100644 --- a/bin/system-info.c +++ b/bin/system-info.c @@ -127,6 +127,7 @@ #include <json-glib/json-glib.h> +#include <steam-runtime-tools/json-utils-internal.h> #include <steam-runtime-tools/utils-internal.h> enum @@ -401,24 +402,10 @@ print_libraries_details (JsonBuilder *builder, } missing_symbols = srt_library_get_missing_symbols (l->data); - if (missing_symbols[0] != NULL) - { - json_builder_set_member_name (builder, "missing-symbols"); - json_builder_begin_array (builder); - for (gsize i = 0; missing_symbols[i] != NULL; i++) - json_builder_add_string_value (builder, missing_symbols[i]); - json_builder_end_array (builder); - } + _srt_json_builder_add_strv_value (builder, "missing-symbols", missing_symbols, FALSE); misversioned_symbols = srt_library_get_misversioned_symbols (l->data); - if (misversioned_symbols[0] != NULL) - { - json_builder_set_member_name (builder, "misversioned-symbols"); - json_builder_begin_array (builder); - for (gsize i = 0; misversioned_symbols[i] != NULL; i++) - json_builder_add_string_value (builder, misversioned_symbols[i]); - json_builder_end_array (builder); - } + _srt_json_builder_add_strv_value (builder, "misversioned-symbols", misversioned_symbols, FALSE); json_builder_end_object (builder); } @@ -614,8 +601,7 @@ jsonify_os_release (JsonBuilder *builder, json_builder_set_member_name (builder, "os-release"); json_builder_begin_object (builder); { - GStrv strv; - gsize i; + g_auto(GStrv) strv = NULL; gchar *tmp; tmp = srt_system_info_dup_os_id (info); @@ -629,17 +615,8 @@ jsonify_os_release (JsonBuilder *builder, strv = srt_system_info_dup_os_id_like (info, FALSE); - if (strv != NULL) - { - json_builder_set_member_name (builder, "id_like"); - json_builder_begin_array (builder); - { - for (i = 0; strv[i] != NULL; i++) - json_builder_add_string_value (builder, strv[i]); - } - json_builder_end_array (builder); - g_strfreev (strv); - } + _srt_json_builder_add_strv_value (builder, "id_like", (const gchar * const *)strv, + FALSE); tmp = srt_system_info_dup_os_name (info); @@ -793,6 +770,7 @@ main (int argc, SrtX86FeatureFlags known_x86_features = SRT_X86_FEATURE_NONE; g_autoptr(SrtObjectList) portal_backends = NULL; g_autoptr(SrtObjectList) portal_interfaces = NULL; + g_auto(GStrv) driver_environment = NULL; char *expectations = NULL; gboolean verbose = FALSE; JsonBuilder *builder; @@ -946,22 +924,15 @@ main (int argc, json_builder_set_member_name (builder, "overrides"); json_builder_begin_object (builder); - if (overrides != NULL && overrides[0] != NULL) - { - json_builder_set_member_name (builder, "list"); - json_builder_begin_array (builder); - for (gsize i = 0; overrides[i] != NULL; i++) - json_builder_add_string_value (builder, overrides[i]); - json_builder_end_array (builder); - } - if (messages != NULL && messages[0] != NULL) - { - json_builder_set_member_name (builder, "messages"); - json_builder_begin_array (builder); - for (gsize i = 0; messages[i] != NULL; i++) - json_builder_add_string_value (builder, messages[i]); - json_builder_end_array (builder); - } + + _srt_json_builder_add_strv_value (builder, "list", + (const gchar * const *)overrides, + FALSE); + + _srt_json_builder_add_strv_value (builder, "messages", + (const gchar * const *)messages, + FALSE); + json_builder_end_object (builder); g_strfreev (overrides); @@ -974,22 +945,15 @@ main (int argc, json_builder_set_member_name (builder, "pinned_libs_32"); json_builder_begin_object (builder); - if (values != NULL && values[0] != NULL) - { - json_builder_set_member_name (builder, "list"); - json_builder_begin_array (builder); - for (gsize i = 0; values[i] != NULL; i++) - json_builder_add_string_value (builder, values[i]); - json_builder_end_array (builder); - } - if (messages != NULL && messages[0] != NULL) - { - json_builder_set_member_name (builder, "messages"); - json_builder_begin_array (builder); - for (gsize i = 0; messages[i] != NULL; i++) - json_builder_add_string_value (builder, messages[i]); - json_builder_end_array (builder); - } + + _srt_json_builder_add_strv_value (builder, "list", + (const gchar * const *)values, + FALSE); + + _srt_json_builder_add_strv_value (builder, "messages", + (const gchar * const *)messages, + FALSE); + json_builder_end_object (builder); g_strfreev (values); @@ -998,22 +962,15 @@ main (int argc, json_builder_set_member_name (builder, "pinned_libs_64"); json_builder_begin_object (builder); - if (values != NULL && values[0] != NULL) - { - json_builder_set_member_name (builder, "list"); - json_builder_begin_array (builder); - for (gsize i = 0; values[i] != NULL; i++) - json_builder_add_string_value (builder, values[i]); - json_builder_end_array (builder); - } - if (messages != NULL && messages[0] != NULL) - { - json_builder_set_member_name (builder, "messages"); - json_builder_begin_array (builder); - for (gsize i = 0; messages[i] != NULL; i++) - json_builder_add_string_value (builder, messages[i]); - json_builder_end_array (builder); - } + + _srt_json_builder_add_strv_value (builder, "list", + (const gchar * const *)values, + FALSE); + + _srt_json_builder_add_strv_value (builder, "messages", + (const gchar * const *)messages, + FALSE); + json_builder_end_object (builder); g_strfreev (values); @@ -1025,19 +982,10 @@ main (int argc, jsonify_os_release (builder, info); jsonify_container (builder, info); - json_builder_set_member_name (builder, "driver_environment"); - json_builder_begin_array (builder); - { - GStrv strv = srt_system_info_list_driver_environment (info); - if (strv != NULL) - { - for (gsize i = 0; strv[i] != NULL; i++) - json_builder_add_string_value (builder, strv[i]); - - g_strfreev (strv); - } - } - json_builder_end_array (builder); + driver_environment = srt_system_info_list_driver_environment (info); + _srt_json_builder_add_strv_value (builder, "driver_environment", + (const gchar * const *)driver_environment, + TRUE); json_builder_set_member_name (builder, "architectures"); json_builder_begin_object (builder); diff --git a/steam-runtime-tools/json-utils-internal.h b/steam-runtime-tools/json-utils-internal.h index 318290e1b4d7d82f7df4ce8c2bc8445257922225..a62f42fd004652319c1702bf2d7883dc7940b73f 100644 --- a/steam-runtime-tools/json-utils-internal.h +++ b/steam-runtime-tools/json-utils-internal.h @@ -46,3 +46,8 @@ gchar ** _srt_json_object_dup_strv_member (JsonObject *json_obj, gchar *_srt_json_object_dup_array_of_lines_member (JsonObject *json_obj, const gchar *array_member); + +void _srt_json_builder_add_strv_value (JsonBuilder *builder, + const gchar *array_name, + const gchar * const *values, + gboolean allow_empty_array); diff --git a/steam-runtime-tools/json-utils.c b/steam-runtime-tools/json-utils.c index 10dfbc7f04b318812130cce618377bf2246236a7..26bae1d136566b652294bafd75cabd336d6ac12f 100644 --- a/steam-runtime-tools/json-utils.c +++ b/steam-runtime-tools/json-utils.c @@ -192,3 +192,36 @@ _srt_json_object_dup_array_of_lines_member (JsonObject *json_obj, return g_string_free (g_steal_pointer (&ret), FALSE); } + +/** + * _srt_json_builder_add_strv_value: + * @builder: (not nullable): A JSON Builder where the provided @values + * will be appended + * @array_name: (not nullable): The array member name to use + * @values: (nullable): Array of strings to be added in the JSON Builder + * @allow_empty_array: If %TRUE, a new array in JSON Builder will be always + * created, even if @values is %NULL or without any elements. Otherwise the + * new array will be created only if there is at least a non-NULL element in + * @values + */ +void +_srt_json_builder_add_strv_value (JsonBuilder *builder, + const gchar *array_name, + const gchar * const *values, + gboolean allow_empty_array) +{ + gsize i; + + g_return_if_fail (builder != NULL); + g_return_if_fail (array_name != NULL); + + if ((values != NULL && values[0] != NULL) || + allow_empty_array) + { + json_builder_set_member_name (builder, array_name); + json_builder_begin_array (builder); + for (i = 0; values != NULL && values[i] != NULL; i++) + json_builder_add_string_value (builder, values[i]); + json_builder_end_array (builder); + } +}