123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116 |
- /** @file
- APIs for JSON operations. The fuctions provided by this library are the
- wrapper to native open source jansson library. See below document for
- the API reference.
- https://jansson.readthedocs.io/en/2.13/apiref.html
- Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
- (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
- Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include <Uefi.h>
- #include <Library/JsonLib.h>
- #include <Library/BaseUcs2Utf8Lib.h>
- #include <Library/MemoryAllocationLib.h>
- #include "jansson.h"
- /**
- The function is used to initialize a JSON value which contains a new JSON array,
- or NULL on error. Initially, the array is empty.
- The reference count of this value will be set to 1, and caller needs to cleanup the
- value by calling JsonValueFree().
- More details for reference count strategy can refer to the API description for JsonValueFree().
- @retval The created JSON value which contains a JSON array or NULL if intial a JSON array
- is failed.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonValueInitArray (
- VOID
- )
- {
- return (EDKII_JSON_VALUE)json_array ();
- }
- /**
- The function is used to initialize a JSON value which contains a new JSON object,
- or NULL on error. Initially, the object is empty.
- The reference count of this value will be set to 1, and caller needs to cleanup the
- value by calling JsonValueFree().
- More details for reference count strategy can refer to the API description for JsonValueFree().
- @retval The created JSON value which contains a JSON object or NULL if intial a JSON object
- is failed.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonValueInitObject (
- VOID
- )
- {
- return (EDKII_JSON_VALUE)json_object ();
- }
- /**
- The function is used to initialize a JSON value which contains a new JSON string,
- or NULL on error.
- The input string must be NULL terminated Ascii format, non-Ascii characters will
- be processed as an error. Unicode characters can also be represented by Ascii string
- as the format: \u + 4 hexadecimal digits, like \u3E5A, or \u003F.
- The reference count of this value will be set to 1, and caller needs to cleanup the
- value by calling JsonValueFree().
- More details for reference count strategy can refer to the API description for JsonValueFree().
- @param[in] String The Ascii string to initialize to JSON value
- @retval The created JSON value which contains a JSON string or NULL. Select a
- Getter API for a specific encoding format.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonValueInitAsciiString (
- IN CONST CHAR8 *String
- )
- {
- UINTN Index;
- if (String == NULL) {
- return NULL;
- }
- Index = 0;
- while (*(String + Index) != '\0') {
- if (((*(String + Index)) & 0x80) != 0x00) {
- return NULL;
- }
- Index++;
- }
- return (EDKII_JSON_VALUE)json_string (String);
- }
- /**
- The function is used to initialize a JSON value which contains a new JSON string,
- or NULL on error.
- The input must be a NULL terminated UCS2 format Unicode string.
- The reference count of this value will be set to 1, and caller needs to cleanup the
- value by calling JsonValueFree().
- More details for reference count strategy can refer to the API description for JsonValueFree().
- @param[in] String The Unicode string to initialize to JSON value
- @retval The created JSON value which contains a JSON string or NULL. Select a
- Getter API for a specific encoding format.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonValueInitUnicodeString (
- IN CHAR16 *String
- )
- {
- EFI_STATUS Status;
- CHAR8 *Utf8Str;
- if (String == NULL) {
- return NULL;
- }
- Utf8Str = NULL;
- Status = UCS2StrToUTF8 (String, &Utf8Str);
- if (EFI_ERROR (Status)) {
- return NULL;
- }
- return (EDKII_JSON_VALUE)json_string (Utf8Str);
- }
- /**
- The function is used to initialize a JSON value which contains a new JSON integer,
- or NULL on error.
- The reference count of this value will be set to 1, and caller needs to cleanup the
- value by calling JsonValueFree().
- More details for reference count strategy can refer to the API description for JsonValueFree().
- @param[in] Value The integer to initialize to JSON value
- @retval The created JSON value which contains a JSON integer or NULL.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonValueInitInteger (
- IN INT64 Value
- )
- {
- return (EDKII_JSON_VALUE)json_integer (Value);
- }
- /**
- The function is used to initialize a JSON value which contains a new JSON boolean,
- or NULL on error.
- Boolean JSON value is kept as static value, and no need to do any cleanup work.
- @param[in] Value The boolean value to initialize.
- @retval The created JSON value which contains a JSON boolean or NULL.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonValueInitBoolean (
- IN BOOLEAN Value
- )
- {
- 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.
- NULL JSON value is kept as static value, and no need to do any cleanup work.
- @retval The created NULL JSON value.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonValueInitNull (
- VOID
- )
- {
- return (EDKII_JSON_VALUE)json_null ();
- }
- /**
- 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.
- If this destroyed value is object type or array type, reference counts for all containing
- JSON values will be decreased by 1. Boolean JSON value and NULL JSON value won't be destroyed
- since they are static values kept in memory.
- Reference Count Strategy: BaseJsonLib uses this strategy to track whether a value is still
- in use or not. When a value is created, it's reference count is set to 1. If a reference to a
- value is kept for use, its reference count is incremented, and when the value is no longer
- needed, the reference count is decremented. When the reference count drops to zero, there are
- no references left, and the value can be destroyed.
- The given JSON value maybe NULL and not causing any problem. Just output the debug message
- to inform caller the NULL value is passed in.
- @param[in] Json The JSON value to be freed. json_decref may return without any
- changes if Json is NULL.
- **/
- VOID
- EFIAPI
- JsonValueFree (
- IN EDKII_JSON_VALUE Json
- )
- {
- json_decref ((json_t *)Json);
- }
- /**
- The function is used to create a fresh copy of a JSON value, and all child values are deep
- copied in a recursive fashion. It should be called when this JSON value might be modified
- in later use, but the original still wants to be used in somewhere else.
- Reference counts of the returned root JSON value and all child values will be set to 1, and
- caller needs to cleanup the root value by calling JsonValueFree().
- * Note: Since this function performs a copy from bottom to up, too many calls may cause some
- performance issues, user should avoid unnecessary calls to this function unless it is really
- needed.
- @param[in] Json The JSON value to be cloned.
- @retval Return the cloned JSON value, or NULL on error.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonValueClone (
- IN EDKII_JSON_VALUE Json
- )
- {
- return (EDKII_JSON_VALUE)json_deep_copy ((json_t *)Json);
- }
- /**
- The function is used to return if the provided JSON value contains a JSON array.
- @param[in] Json The provided JSON value.
- @retval TRUE The JSON value contains a JSON array.
- @retval FALSE The JSON value doesn't contain a JSON array.
- **/
- BOOLEAN
- EFIAPI
- JsonValueIsArray (
- IN EDKII_JSON_VALUE Json
- )
- {
- return json_is_array ((json_t *)Json);
- }
- /**
- The function is used to return if the provided JSON value contains a JSON object.
- @param[in] Json The provided JSON value.
- @retval TRUE The JSON value contains a JSON object.
- @retval FALSE The JSON value doesn't contain a JSON object.
- **/
- BOOLEAN
- EFIAPI
- JsonValueIsObject (
- IN EDKII_JSON_VALUE Json
- )
- {
- return json_is_object ((json_t *)Json);
- }
- /**
- The function is used to return if the provided JSON Value contains a string, Ascii or
- Unicode format is not differentiated.
- @param[in] Json The provided JSON value.
- @retval TRUE The JSON value contains a JSON string.
- @retval FALSE The JSON value doesn't contain a JSON string.
- **/
- BOOLEAN
- EFIAPI
- JsonValueIsString (
- IN EDKII_JSON_VALUE Json
- )
- {
- 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.
- @param[in] Json The provided JSON value.
- @retval TRUE The JSON value is contains JSON number.
- @retval FALSE The JSON value doesn't contain a JSON number.
- **/
- BOOLEAN
- EFIAPI
- JsonValueIsNumber (
- IN EDKII_JSON_VALUE Json
- )
- {
- return json_is_number ((json_t *)Json);
- }
- /**
- The function is used to return if the provided JSON value contains a JSON boolean.
- @param[in] Json The provided JSON value.
- @retval TRUE The JSON value contains a JSON boolean.
- @retval FALSE The JSON value doesn't contain a JSON boolean.
- **/
- BOOLEAN
- EFIAPI
- JsonValueIsBoolean (
- IN EDKII_JSON_VALUE Json
- )
- {
- 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.
- @param[in] Json The provided JSON value.
- @retval TRUE The JSON value contains a JSON NULL.
- @retval FALSE The JSON value doesn't contain a JSON NULL.
- **/
- BOOLEAN
- EFIAPI
- JsonValueIsNull (
- IN EDKII_JSON_VALUE Json
- )
- {
- return json_is_null ((json_t *)Json);
- }
- /**
- The function is used to retrieve the associated array in an array type JSON value.
- Any changes to the returned array will impact the original JSON value.
- @param[in] Json The provided JSON value.
- @retval Return the associated array in JSON value or NULL.
- **/
- EDKII_JSON_ARRAY
- EFIAPI
- JsonValueGetArray (
- IN EDKII_JSON_VALUE Json
- )
- {
- if ((Json == NULL) || !JsonValueIsArray (Json)) {
- return NULL;
- }
- return (EDKII_JSON_ARRAY)Json;
- }
- /**
- The function is used to retrieve the associated object in an object type JSON value.
- Any changes to the returned object will impact the original JSON value.
- @param[in] Json The provided JSON value.
- @retval Return the associated object in JSON value or NULL.
- **/
- EDKII_JSON_OBJECT
- EFIAPI
- JsonValueGetObject (
- IN EDKII_JSON_VALUE Json
- )
- {
- if ((Json == NULL) || !JsonValueIsObject (Json)) {
- return NULL;
- }
- return (EDKII_JSON_OBJECT)Json;
- }
- /**
- The function is used to retrieve the associated Ascii string in a string type JSON value.
- Any changes to the returned string will impact the original JSON value.
- @param[in] Json The provided JSON value.
- @retval Return the associated Ascii string in JSON value or NULL.
- **/
- CONST CHAR8 *
- EFIAPI
- JsonValueGetAsciiString (
- IN EDKII_JSON_VALUE Json
- )
- {
- CONST CHAR8 *AsciiStr;
- UINTN Index;
- AsciiStr = json_string_value ((json_t *)Json);
- if (AsciiStr == NULL) {
- return NULL;
- }
- Index = 0;
- while (*(AsciiStr + Index) != '\0') {
- if (((*(AsciiStr + Index)) & 0x80) != 0x00) {
- return NULL;
- }
- Index++;
- }
- return AsciiStr;
- }
- /**
- The function is used to retrieve the associated Unicode string in a string type JSON value.
- Caller can do any changes to the returned string without any impact to the original JSON
- value, and caller needs to free the returned string using FreePool().
- @param[in] Json The provided JSON value.
- @retval Return the associated Unicode string in JSON value or NULL.
- **/
- CHAR16 *
- EFIAPI
- JsonValueGetUnicodeString (
- IN EDKII_JSON_VALUE Json
- )
- {
- EFI_STATUS Status;
- CONST CHAR8 *Utf8Str;
- CHAR16 *Ucs2Str;
- Ucs2Str = NULL;
- Utf8Str = json_string_value ((json_t *)Json);
- if (Utf8Str == NULL) {
- return NULL;
- }
- Status = UTF8StrToUCS2 ((CHAR8 *)Utf8Str, &Ucs2Str);
- if (EFI_ERROR (Status)) {
- return NULL;
- }
- return Ucs2Str;
- }
- /**
- 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 integer, otherwise it will
- ASSERT() and return 0.
- @param[in] Json The provided JSON value.
- @retval Return the associated integer in JSON value.
- **/
- INT64
- EFIAPI
- JsonValueGetInteger (
- IN EDKII_JSON_VALUE Json
- )
- {
- ASSERT (Json != NULL && JsonValueIsInteger (Json));
- if ((Json == NULL) || !JsonValueIsInteger (Json)) {
- return 0;
- }
- return json_integer_value ((json_t *)Json);
- }
- /**
- The function is used to retrieve the associated boolean in a boolean type JSON value.
- The input JSON value should not be NULL or contain no JSON boolean, otherwise it will
- ASSERT() and return FALSE.
- @param[in] Json The provided JSON value.
- @retval Return the associated value of JSON boolean.
- **/
- BOOLEAN
- EFIAPI
- JsonValueGetBoolean (
- IN EDKII_JSON_VALUE Json
- )
- {
- ASSERT (Json != NULL && JsonValueIsBoolean (Json));
- if ((Json == NULL) || !JsonValueIsBoolean (Json)) {
- return FALSE;
- }
- return json_is_true ((json_t *)Json);
- }
- /**
- The function is used to retrieve the associated string in a string type JSON value.
- Any changes to the returned string will impact the original JSON value.
- @param[in] Json The provided JSON value.
- @retval Return the associated Ascii string in JSON value or NULL on errors.
- **/
- CONST CHAR8 *
- EFIAPI
- JsonValueGetString (
- IN EDKII_JSON_VALUE Json
- )
- {
- return json_string_value ((const json_t *)Json);
- }
- /**
- The function is used to get the number of elements in a JSON object, or 0 if it is NULL or
- not a JSON object.
- @param[in] JsonObject The provided JSON object.
- @retval Return the number of elements in this JSON object or 0.
- **/
- UINTN
- EFIAPI
- JsonObjectSize (
- IN EDKII_JSON_OBJECT JsonObject
- )
- {
- return json_object_size ((json_t *)JsonObject);
- }
- /**
- The function is used to enumerate all keys in a JSON object.
- Caller should be responsible to free the returned key array reference using
- FreePool(). But contained keys are read only and must not be modified or freed.
- @param[in] JsonObj The provided JSON object for enumeration.
- @param[out] KeyCount The count of keys in this JSON object.
- @retval Return an array of the enumerated keys in this JSON object or NULL if
- JsonObj is not an JSON object, key count is zero or on other errors.
- **/
- CHAR8 **
- JsonObjectGetKeys (
- IN EDKII_JSON_OBJECT JsonObj,
- OUT UINTN *KeyCount
- )
- {
- UINTN Index;
- CONST CHAR8 **KeyArray;
- CONST CHAR8 *Key;
- EDKII_JSON_VALUE Value;
- if ((JsonObj == NULL) || (KeyCount == NULL)) {
- return NULL;
- }
- Index = 0;
- json_object_foreach (JsonObj, Key, Value) {
- Index++;
- }
- if (Index == 0) {
- *KeyCount = 0;
- return NULL;
- }
- *KeyCount = Index;
- KeyArray = (CONST CHAR8 **)AllocateZeroPool (*KeyCount * sizeof (CHAR8 *));
- if (KeyArray == NULL) {
- return NULL;
- }
- Key = NULL;
- Value = NULL;
- Index = 0;
- json_object_foreach ((json_t *)JsonObj, Key, Value) {
- KeyArray[Index] = Key;
- Index++;
- }
- return (CHAR8 **)KeyArray;
- }
- /**
- The function is used to get a JSON value corresponding to the input key from a JSON object.
- It only returns a reference to this value and any changes on this value will impact the
- original JSON object. If that is not expected, please call JsonValueClone() to clone it to
- use.
- Input key must be a valid NULL terminated UTF8 encoded string. NULL will be returned when
- Key-Value is not found in this JSON object.
- @param[in] JsonObj The provided JSON object.
- @param[in] Key The key of the JSON value to be retrieved.
- @retval Return the corresponding JSON value to key, or NULL on error.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonObjectGetValue (
- IN CONST EDKII_JSON_OBJECT JsonObj,
- IN CONST CHAR8 *Key
- )
- {
- return (EDKII_JSON_VALUE)json_object_get ((const json_t *)JsonObj, (const char *)Key);
- }
- /**
- The function is used to set a JSON value corresponding to the input key from a JSON object,
- and the reference count of this value will be increased by 1.
- Input key must be a valid NULL terminated UTF8 encoded string. If there already is a value for
- this key, this key will be assigned to the new JSON value. The old JSON value will be removed
- from this object and thus its' reference count will be decreased by 1.
- More details for reference count strategy can refer to the API description for JsonValueFree().
- @param[in] JsonObj The provided JSON object.
- @param[in] Key The key of the JSON value to be set.
- @param[in] Json The JSON value to set to this JSON object mapped by key.
- @retval EFI_ABORTED Some error occur and operation aborted.
- @retval EFI_SUCCESS The JSON value has been set to this JSON object.
- **/
- EFI_STATUS
- EFIAPI
- JsonObjectSetValue (
- IN EDKII_JSON_OBJECT JsonObj,
- IN CONST CHAR8 *Key,
- IN EDKII_JSON_VALUE Json
- )
- {
- if (json_object_set ((json_t *)JsonObj, Key, (json_t *)Json) != 0) {
- return EFI_ABORTED;
- } else {
- return EFI_SUCCESS;
- }
- }
- /**
- The function is used to get the number of elements in a JSON array. Returns or 0 if JsonArray
- is NULL or not a JSON array.
- @param[in] JsonArray The provided JSON array.
- @retval Return the number of elements in this JSON array or 0.
- **/
- UINTN
- EFIAPI
- JsonArrayCount (
- IN EDKII_JSON_ARRAY JsonArray
- )
- {
- return json_array_size ((json_t *)JsonArray);
- }
- /**
- The function is used to return the JSON value in the array at position index. The valid range
- for this index is from 0 to the return value of JsonArrayCount() minus 1.
- It only returns a reference to this value and any changes on this value will impact the
- original JSON object. If that is not expected, please call JsonValueClone() to clone it to
- use.
- If this array is NULL or not a JSON array, or if index is out of range, NULL will be returned.
- @param[in] JsonArray The provided JSON Array.
- @retval Return the JSON value located in the Index position or
- NULL if JsonArray is not an array or no items in the array.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonArrayGetValue (
- IN EDKII_JSON_ARRAY JsonArray,
- IN UINTN Index
- )
- {
- return (EDKII_JSON_VALUE)json_array_get ((json_t *)JsonArray, Index);
- }
- /**
- The function is used to append a JSON value to the end of the JSON array, and grow the size of
- array by 1. The reference count of this value will be increased by 1.
- More details for reference count strategy can refer to the API description for JsonValueFree().
- @param[in] JsonArray The provided JSON object.
- @param[in] Json The JSON value to append.
- @retval EFI_ABORTED Some error occur and operation aborted.
- @retval EFI_SUCCESS JSON value has been appended to the end of the JSON array.
- **/
- EFI_STATUS
- EFIAPI
- JsonArrayAppendValue (
- IN EDKII_JSON_ARRAY JsonArray,
- IN EDKII_JSON_VALUE Json
- )
- {
- if (json_array_append ((json_t *)JsonArray, (json_t *)Json) != 0) {
- return EFI_ABORTED;
- } else {
- return EFI_SUCCESS;
- }
- }
- /**
- The function is used to remove a JSON value at position index, shifting the elements after index
- one position towards the start of the array. The reference count of this value will be decreased
- by 1.
- More details for reference count strategy can refer to the API description for JsonValueFree().
- @param[in] JsonArray The provided JSON array.
- @param[in] Index The Index position before removement.
- @retval EFI_ABORTED Some error occur and operation aborted.
- @retval EFI_SUCCESS The JSON array has been removed at position index.
- **/
- EFI_STATUS
- EFIAPI
- JsonArrayRemoveValue (
- IN EDKII_JSON_ARRAY JsonArray,
- IN UINTN Index
- )
- {
- if (json_array_remove ((json_t *)JsonArray, Index) != 0) {
- return EFI_ABORTED;
- } else {
- return EFI_SUCCESS;
- }
- }
- /**
- Dump JSON to a buffer.
- @param[in] JsonValue The provided JSON value.
- @param[in] Flags The Index position before removement. The value
- could be the combination of below flags.
- - EDKII_JSON_INDENT(n)
- - EDKII_JSON_COMPACT
- - EDKII_JSON_ENSURE_ASCII
- - EDKII_JSON_SORT_KEYS
- - EDKII_JSON_PRESERVE_ORDER
- - EDKII_JSON_ENCODE_ANY
- - EDKII_JSON_ESCAPE_SLASH
- - EDKII_JSON_REAL_PRECISION(n)
- - EDKII_JSON_EMBED
- See below URI for the JSON encoding flags reference.
- https://jansson.readthedocs.io/en/2.13/apiref.html#encoding
- @retval CHAR8 * Dump fail if NULL returned, otherwise the buffer
- contain JSON paylaod in ASCII string. The return
- value must be freed by the caller using FreePool().
- **/
- CHAR8 *
- EFIAPI
- JsonDumpString (
- IN EDKII_JSON_VALUE JsonValue,
- IN UINTN Flags
- )
- {
- if (JsonValue == NULL) {
- return NULL;
- }
- return json_dumps ((json_t *)JsonValue, Flags);
- }
- /**
- Convert a string to JSON object.
- The function is used to convert a NULL terminated CHAR8 string to a JSON
- value. Only object and array represented strings can be converted successfully,
- since they are the only valid root values of a JSON text for UEFI usage.
- Real number and number with exponent part are not supportted by UEFI.
- 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.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonLoadString (
- IN CONST CHAR8 *String,
- IN UINT64 Flags,
- IN EDKII_JSON_ERROR *Error
- )
- {
- return (EDKII_JSON_VALUE)json_loads ((const char *)String, Flags, (json_error_t *)Error);
- }
- /**
- Load JSON from a buffer.
- @param[in] Buffer Bufffer to the JSON payload
- @param[in] BufferLen Length of the buffer
- @param[in] Flags Flag of loading JSON buffer, the value
- could be the combination of below flags.
- - EDKII_JSON_REJECT_DUPLICATES
- - EDKII_JSON_DISABLE_EOF_CHECK
- - EDKII_JSON_DECODE_ANY
- - EDKII_JSON_DECODE_INT_AS_REAL
- - EDKII_JSON_ALLOW_NUL
- See below URI for the JSON encoding flags reference.
- https://jansson.readthedocs.io/en/2.13/apiref.html?highlight=json_loadb#decoding
- @param[in,out] Error Pointer EDKII_JSON_ERROR structure
- @retval EDKII_JSON_VALUE NULL means fail to load JSON payload.
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonLoadBuffer (
- IN CONST CHAR8 *Buffer,
- IN UINTN BufferLen,
- IN UINTN Flags,
- IN OUT EDKII_JSON_ERROR *Error
- )
- {
- return json_loadb (Buffer, BufferLen, Flags, (json_error_t *)Error);
- }
- /**
- The reference count is used to track whether a value is still in use or not.
- When a value is created, it's reference count is set to 1.
- when the value is no longer needed, the reference count is decremented.
- When the reference count drops to zero, there are no references left and the
- value can be destroyed.
- This funciton decrement the reference count of EDKII_JSON_VALUE. As soon as
- a call to json_decref() drops the reference count to zero, the value is
- destroyed and it can no longer be used.
- @param[in] JsonValue JSON value
- **/
- VOID
- EFIAPI
- JsonDecreaseReference (
- IN EDKII_JSON_VALUE JsonValue
- )
- {
- json_decref (JsonValue);
- }
- /**
- The reference count is used to track whether a value is still in use or not.
- When a value is created, it's reference count is set to 1.
- If a reference to a value is kept (e.g. a value is stored somewhere for later use),
- its reference count is incremented.
- This function increment the reference count of json if it's not NULL.
- Returns EDKII_JSON_VALUE.
- @param[in] JsonValue JSON value
- @retval EDKII_JSON_VALUE of itself
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonIncreaseReference (
- IN EDKII_JSON_VALUE JsonValue
- )
- {
- return json_incref (JsonValue);
- }
- /**
- Returns an opaque iterator which can be used to iterate over all key-value pairs
- in object, or NULL if object is empty.
- @param[in] JsonValue JSON value
- @retval Iterator pointer
- **/
- VOID *
- EFIAPI
- JsonObjectIterator (
- IN EDKII_JSON_VALUE JsonValue
- )
- {
- return json_object_iter (JsonValue);
- }
- /**
- Extract the associated value from iterator.
- @param[in] Iterator Iterator pointer
- @retval EDKII_JSON_VALUE
- **/
- EDKII_JSON_VALUE
- EFIAPI
- JsonObjectIteratorValue (
- IN VOID *Iterator
- )
- {
- return json_object_iter_value (Iterator);
- }
- /**
- Returns an iterator pointing to the next key-value pair in object after iter,
- or NULL if the whole object has been iterated through.
- @param[in] JsonValue JSON value
- @param[in] Iterator Iterator pointer
- @retval Iterator pointer
- **/
- VOID *
- EFIAPI
- JsonObjectIteratorNext (
- IN EDKII_JSON_VALUE JsonValue,
- IN VOID *Iterator
- )
- {
- 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.
- @param[in] JsonValue JSON value
- @retval JSON type returned
- **/
- EDKII_JSON_TYPE
- EFIAPI
- JsonGetType (
- IN EDKII_JSON_VALUE JsonValue
- )
- {
- return ((json_t *)JsonValue)->type;
- }
|