From b3dad969725022fbdb58c4a857d4ca885b455f07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= Date: Fri, 20 Nov 2020 22:09:43 +0400 Subject: [PATCH] util: json: add virJSONValueObjectGetStringArray convenience MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marc-André Lureau Signed-off-by: Michal Privoznik Reviewed-by: Michal Privoznik Tested-by: Han Han --- src/libvirt_private.syms | 1 + src/util/virjson.c | 37 +++++++++++++++++++++++++++++++++++++ src/util/virjson.h | 1 + 3 files changed, 39 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index f581676227..581857deb9 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2409,6 +2409,7 @@ virJSONValueObjectGetNumberUint; virJSONValueObjectGetNumberUlong; virJSONValueObjectGetObject; virJSONValueObjectGetString; +virJSONValueObjectGetStringArray; virJSONValueObjectGetValue; virJSONValueObjectHasKey; virJSONValueObjectIsNull; diff --git a/src/util/virjson.c b/src/util/virjson.c index 3fa9a9ca24..d471923732 100644 --- a/src/util/virjson.c +++ b/src/util/virjson.c @@ -1463,6 +1463,43 @@ virJSONValueObjectIsNull(virJSONValuePtr object, return virJSONValueIsNull(val); } +char ** +virJSONValueObjectGetStringArray(virJSONValuePtr object, const char *key) +{ + g_auto(GStrv) ret = NULL; + virJSONValuePtr data; + size_t n; + size_t i; + + data = virJSONValueObjectGetArray(object, key); + if (!data) + return NULL; + + n = virJSONValueArraySize(data); + ret = g_new0(char *, n + 1); + for (i = 0; i < n; i++) { + virJSONValuePtr child = virJSONValueArrayGet(data, i); + const char *tmp; + + if (!child) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("%s array element is missing item %zu"), + key, i); + return NULL; + } + + if (!(tmp = virJSONValueGetString(child))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("%s array element does not contain a string"), + key); + return NULL; + } + + ret[i] = g_strdup(tmp); + } + + return g_steal_pointer(&ret); +} /** * virJSONValueObjectForeachKeyValue: diff --git a/src/util/virjson.h b/src/util/virjson.h index 588c977650..4dc7ed1a2d 100644 --- a/src/util/virjson.h +++ b/src/util/virjson.h @@ -117,6 +117,7 @@ virJSONValuePtr virJSONValueObjectStealObject(virJSONValuePtr object, const char *key); const char *virJSONValueObjectGetString(virJSONValuePtr object, const char *key); +char **virJSONValueObjectGetStringArray(virJSONValuePtr object, const char *key); const char *virJSONValueObjectGetStringOrNumber(virJSONValuePtr object, const char *key); int virJSONValueObjectGetNumberInt(virJSONValuePtr object, const char *key, int *value); int virJSONValueObjectGetNumberUint(virJSONValuePtr object, const char *key, unsigned int *value);