From a7ddc7847cb4afa3534da82222f296aafadb959d Mon Sep 17 00:00:00 2001 From: Abner Chang Date: Tue, 27 Apr 2021 12:53:30 +0800 Subject: [PATCH] RedfishPkg/JsonLib: Add more JsonLib functions Signed-off-by: Abner Chang Cc: Nickle Wang Reviewed-by: Nickle Wang --- RedfishPkg/Include/Library/JsonLib.h | 127 ++++++++++++++++++++-- RedfishPkg/Library/JsonLib/JsonLib.c | 156 ++++++++++++++++++++++++--- 2 files changed, 261 insertions(+), 22 deletions(-) diff --git a/RedfishPkg/Include/Library/JsonLib.h b/RedfishPkg/Include/Library/JsonLib.h index 8a30c5250b..83959dd52a 100644 --- a/RedfishPkg/Include/Library/JsonLib.h +++ b/RedfishPkg/Include/Library/JsonLib.h @@ -2,7 +2,7 @@ APIs for JSON operations. Copyright (c) 2019, Intel Corporation. All rights reserved.
- (C) Copyright 2020 Hewlett Packard Enterprise Development LP
+ (C) Copyright 2021 Hewlett Packard Enterprise Development LP
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -53,6 +53,13 @@ typedef INT64 EDKII_JSON_INT_T; // #JSON_INTEGER_IS_LONG_LONG is set to 1 Index < JsonArrayCount(Array) && (Value = JsonArrayGetValue(Array, Index)); \ Index++) +#define EDKII_JSON_OBJECT_FOREACH_SAFE(Object, N, Key, Value) \ + for (Key = JsonObjectIteratorKey(JsonObjectIterator(Object)), \ + N = JsonObjectIteratorNext(Object, JsonObjectKeyToIterator(Key)); \ + Key && (Value = JsonObjectIteratorValue(JsonObjectKeyToIterator(Key))); \ + Key = JsonObjectIteratorKey(N), \ + N = JsonObjectIteratorNext(Object, JsonObjectKeyToIterator(Key))) + /// /// Map to the json_error_t in jansson.h /// @@ -177,12 +184,12 @@ JsonValueInitUnicodeString ( @param[in] Value The integer to initialize to JSON value - @retval The created JSON value which contains a JSON number or NULL. + @retval The created JSON value which contains a JSON integer or NULL. **/ EDKII_JSON_VALUE EFIAPI -JsonValueInitNumber ( +JsonValueInitInteger ( IN INT64 Value ); @@ -218,6 +225,36 @@ JsonValueInitNull ( VOID ); +/** + The function is used to initialize a JSON value which contains a TRUE JSON value, + or NULL on error. + + NULL JSON value is kept as static value, and no need to do any cleanup work. + + @retval The created JSON TRUE value. + +**/ +EDKII_JSON_VALUE +EFIAPI +JsonValueInitTrue ( + VOID + ); + +/** + The function is used to initialize a JSON value which contains a FALSE JSON value, + or NULL on error. + + NULL JSON value is kept as static value, and no need to do any cleanup work. + + @retval The created JSON FALSE value. + +**/ +EDKII_JSON_VALUE +EFIAPI +JsonValueInitFalse ( + VOID + ); + /** The function is used to decrease the reference count of a JSON value by one, and once this reference count drops to zero, the value is destroyed and it can no longer be used. @@ -313,6 +350,21 @@ JsonValueIsString ( IN EDKII_JSON_VALUE Json ); +/** + The function is used to return if the provided JSON value contains a JSON integer. + + @param[in] Json The provided JSON value. + + @retval TRUE The JSON value is contains JSON integer. + @retval FALSE The JSON value doesn't contain a JSON integer. + +**/ +BOOLEAN +EFIAPI +JsonValueIsInteger ( + IN EDKII_JSON_VALUE Json + ); + /** The function is used to return if the provided JSON value contains a JSON number. @@ -343,6 +395,36 @@ JsonValueIsBoolean ( IN EDKII_JSON_VALUE Json ); +/** + The function is used to return if the provided JSON value contains a TRUE value. + + @param[in] Json The provided JSON value. + + @retval TRUE The JSON value contains a TRUE value. + @retval FALSE The JSON value doesn't contain a TRUE value. + +**/ +BOOLEAN +EFIAPI +JsonValueIsTrue ( + IN EDKII_JSON_VALUE Json + ); + +/** + The function is used to return if the provided JSON value contains a FALSE value. + + @param[in] Json The provided JSON value. + + @retval TRUE The JSON value contains a FALSE value. + @retval FALSE The JSON value doesn't contain a FALSE value. + +**/ +BOOLEAN +EFIAPI +JsonValueIsFalse ( + IN EDKII_JSON_VALUE Json + ); + /** The function is used to return if the provided JSON value contains a JSON NULL. @@ -424,19 +506,19 @@ JsonValueGetUnicodeString ( ); /** - The function is used to retrieve the associated integer in a number type JSON value. + The function is used to retrieve the associated integer in a integer type JSON value. - The input JSON value should not be NULL or contain no JSON number, otherwise it will + The input JSON value should not be NULL or contain no JSON Integer, otherwise it will ASSERT() and return 0. @param[in] Json The provided JSON value. - @retval Return the associated number in JSON value. + @retval Return the associated Integer in JSON value. **/ INT64 EFIAPI -JsonValueGetNumber ( +JsonValueGetInteger ( IN EDKII_JSON_VALUE Json ); @@ -675,6 +757,8 @@ JsonDumpString ( Caller needs to cleanup the root value by calling JsonValueFree(). @param[in] String The NULL terminated CHAR8 string to convert. + @param[in] Flags Flags for loading JSON string. + @param[in] Error Returned error status. @retval Array JSON value or object JSON value, or NULL when any error occurs. @@ -682,7 +766,9 @@ JsonDumpString ( EDKII_JSON_VALUE EFIAPI JsonLoadString ( - IN CONST CHAR8* String + IN CONST CHAR8* String, + IN UINT64 Flags, + IN EDKII_JSON_ERROR *Error ); /** @@ -781,11 +867,36 @@ JsonObjectIteratorValue ( @retval Iterator pointer **/ VOID * +EFIAPI JsonObjectIteratorNext ( IN EDKII_JSON_VALUE JsonValue, IN VOID *Iterator ); +/** + Returns the key of iterator pointing + + @param[in] Iterator Iterator pointer + @retval Key +**/ +CHAR8 * +EFIAPI +JsonObjectIteratorKey ( + IN VOID *Iterator +); + +/** + Returns the pointer of iterator by key. + + @param[in] Key The key of interator pointer. + @retval Pointer to interator +**/ +VOID * +EFIAPI +JsonObjectKeyToIterator ( + IN CHAR8 *Key +); + /** Returns the json type of this json value diff --git a/RedfishPkg/Library/JsonLib/JsonLib.c b/RedfishPkg/Library/JsonLib/JsonLib.c index c305a3767f..33d5eaef79 100644 --- a/RedfishPkg/Library/JsonLib/JsonLib.c +++ b/RedfishPkg/Library/JsonLib/JsonLib.c @@ -5,7 +5,7 @@ https://jansson.readthedocs.io/en/2.13/apiref.html Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.
- (C) Copyright 2020 Hewlett Packard Enterprise Development LP
+ (C) Copyright 2021 Hewlett Packard Enterprise Development LP
SPDX-License-Identifier: BSD-2-Clause-Patent **/ @@ -154,12 +154,12 @@ JsonValueInitUnicodeString ( @param[in] Value The integer to initialize to JSON value - @retval The created JSON value which contains a JSON number or NULL. + @retval The created JSON value which contains a JSON integer or NULL. **/ EDKII_JSON_VALUE EFIAPI -JsonValueInitNumber ( +JsonValueInitInteger ( IN INT64 Value ) { @@ -186,6 +186,42 @@ JsonValueInitBoolean ( return (EDKII_JSON_VALUE)json_boolean (Value); } +/** + The function is used to initialize a JSON value which contains a TRUE JSON value, + or NULL on error. + + NULL JSON value is kept as static value, and no need to do any cleanup work. + + @retval The created JSON TRUE value. + +**/ +EDKII_JSON_VALUE +EFIAPI +JsonValueInitTrue ( + VOID + ) +{ + return (EDKII_JSON_VALUE)json_true(); +} + +/** + The function is used to initialize a JSON value which contains a FALSE JSON value, + or NULL on error. + + NULL JSON value is kept as static value, and no need to do any cleanup work. + + @retval The created JSON FALSE value. + +**/ +EDKII_JSON_VALUE +EFIAPI +JsonValueInitFalse ( + VOID + ) +{ + return (EDKII_JSON_VALUE)json_false(); +} + /** The function is used to initialize a JSON value which contains a new JSON NULL, or NULL on error. @@ -314,6 +350,24 @@ JsonValueIsString ( return json_is_string ((json_t *) Json); } +/** + The function is used to return if the provided JSON value contains a JSON integer. + + @param[in] Json The provided JSON value. + + @retval TRUE The JSON value is contains JSON integer. + @retval FALSE The JSON value doesn't contain a JSON integer. + +**/ +BOOLEAN +EFIAPI +JsonValueIsInteger ( + IN EDKII_JSON_VALUE Json + ) +{ + return json_is_integer ((json_t *) Json); +} + /** The function is used to return if the provided JSON value contains a JSON number. @@ -329,7 +383,7 @@ JsonValueIsNumber ( IN EDKII_JSON_VALUE Json ) { - return json_is_integer ((json_t *) Json); + return json_is_number ((json_t *) Json); } /** @@ -350,6 +404,47 @@ JsonValueIsBoolean ( return json_is_boolean ((json_t *) Json); } +/** + The function is used to return if the provided JSON value contains a TRUE value. + + @param[in] Json The provided JSON value. + + @retval TRUE The JSON value contains a TRUE value. + @retval FALSE The JSON value doesn't contain a TRUE value. + +**/ +BOOLEAN +EFIAPI +JsonValueIsTrue ( + IN EDKII_JSON_VALUE Json + ) +{ + if (json_is_true ((json_t *)Json)) { + return TRUE; + } + return FALSE; +} + +/** + The function is used to return if the provided JSON value contains a FALSE value. + + @param[in] Json The provided JSON value. + + @retval TRUE The JSON value contains a FALSE value. + @retval FALSE The JSON value doesn't contain a FALSE value. + +**/ +BOOLEAN +EFIAPI +JsonValueIsFalse ( + IN EDKII_JSON_VALUE Json + ) +{ + if (json_is_false ((json_t *)Json)) { + return TRUE; + } + return FALSE; +} /** The function is used to return if the provided JSON value contains a JSON NULL. @@ -485,24 +580,24 @@ JsonValueGetUnicodeString ( } /** - The function is used to retrieve the associated integer in a number type JSON value. + The function is used to retrieve the associated integer in a integer type JSON value. - The input JSON value should not be NULL or contain no JSON number, otherwise it will + The input JSON value should not be NULL or contain no JSON integer, otherwise it will ASSERT() and return 0. @param[in] Json The provided JSON value. - @retval Return the associated number in JSON value. + @retval Return the associated integer in JSON value. **/ INT64 EFIAPI -JsonValueGetNumber ( +JsonValueGetInteger ( IN EDKII_JSON_VALUE Json ) { - ASSERT (Json != NULL && JsonValueIsNumber (Json)); - if (Json == NULL || !JsonValueIsNumber (Json)) { + ASSERT (Json != NULL && JsonValueIsInteger (Json)); + if (Json == NULL || !JsonValueIsInteger (Json)) { return 0; } @@ -830,6 +925,8 @@ JsonDumpString ( Caller needs to cleanup the root value by calling JsonValueFree(). @param[in] String The NULL terminated CHAR8 string to convert. + @param[in] Flags Flags for loading JSON string. + @param[in] Error Returned error status. @retval Array JSON value or object JSON value, or NULL when any error occurs. @@ -837,12 +934,12 @@ JsonDumpString ( EDKII_JSON_VALUE EFIAPI JsonLoadString ( - IN CONST CHAR8* String + IN CONST CHAR8* String, + IN UINT64 Flags, + IN EDKII_JSON_ERROR *Error ) { - json_error_t JsonError; - - return (EDKII_JSON_VALUE) json_loads ((const char *)String, 0, &JsonError); + return (EDKII_JSON_VALUE) json_loads ((const char *)String, Flags, (json_error_t *)Error); } /** @@ -959,6 +1056,7 @@ JsonObjectIteratorValue ( @retval Iterator pointer **/ VOID * +EFIAPI JsonObjectIteratorNext ( IN EDKII_JSON_VALUE JsonValue, IN VOID *Iterator @@ -967,6 +1065,36 @@ JsonObjectIteratorNext ( return json_object_iter_next(JsonValue, Iterator); } +/** + Returns the key of iterator pointing. + + @param[in] Iterator Iterator pointer + @retval Key +**/ +CHAR8 * +EFIAPI +JsonObjectIteratorKey ( + IN VOID *Iterator +) +{ + return (CHAR8 *)json_object_iter_key(Iterator); +} + +/** + Returns the pointer of iterator by key. + + @param[in] Key The key of interator pointer. + @retval Pointer to interator +**/ +VOID * +EFIAPI +JsonObjectKeyToIterator ( + IN CHAR8 *Key +) +{ + return json_object_key_to_iter(Key); +} + /** Returns the json type of this json value.