public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH 0/3] JsonLib: jansson edk2 port
@ 2020-11-23 13:47 Abner Chang
  2020-11-23 13:47 ` [PATCH 1/3] edk2: jansson submodule of JSON library Abner Chang
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Abner Chang @ 2020-11-23 13:47 UTC (permalink / raw)
  To: devel
  Cc: Jian J Wang, Hao A Wu, Andrew Fish, Laszlo Ersek, Leif Lindholm,
	Michael D Kinney, Nickle Wang, Peter O'Hanley

This set of pactehs is sent for the comments on edk2 JSON library.
edk2 JSON library is based on jansson open source
(https://github.com/akheron/jansson) and wrapped as an edk2
library. edk2 JsonLib will be used by edk2 Redfish feature
drivers (not contributed yet) and the edk2 port of libredfish
library (not contributed yet) based on DMTF GitHub
(https://github.com/DMTF/libredfish).

You will encounterred the build error with the jansson library
pointed in submoudle (v2.13.1) and the fix is already submitted to
jansson open source
(https://github.com/akheron/jansson/pull/558).

Signed-off-by: Abner Chang <abner.chang@hpe.com>

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Andrew Fish <afish@apple.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Nickle Wang <nickle.wang@hpe.com>
Cc: Peter O'Hanley <peter.ohanley@hpe.com>

Abner Chang (3):
  edk2: jansson submodule of JSON library
  MdeModulePkg/library: EDK2 port jansson library
  MdeModulePkg: Add EDK2 port jansson library

 .gitmodules                                   |   3 +
 MdeModulePkg/Include/Library/JsonLib.h        | 596 +++++++++++++
 .../Library/JsonLib/JanssonCrtLibSupport.c    | 705 +++++++++++++++
 .../Library/JsonLib/JanssonCrtLibSupport.h    | 198 +++++
 MdeModulePkg/Library/JsonLib/JsonLib.c        | 805 ++++++++++++++++++
 MdeModulePkg/Library/JsonLib/JsonLib.inf      |  81 ++
 MdeModulePkg/Library/JsonLib/JsonUtilities.c  | 417 +++++++++
 MdeModulePkg/Library/JsonLib/JsonUtilities.h  |  69 ++
 MdeModulePkg/Library/JsonLib/assert.h         |  11 +
 MdeModulePkg/Library/JsonLib/errno.h          |  11 +
 MdeModulePkg/Library/JsonLib/jansson          |   1 +
 MdeModulePkg/Library/JsonLib/jansson_config.h |  57 ++
 .../Library/JsonLib/jansson_private_config.h  |  19 +
 MdeModulePkg/Library/JsonLib/limits.h         |  11 +
 MdeModulePkg/Library/JsonLib/math.h           |  11 +
 MdeModulePkg/Library/JsonLib/stdarg.h         |  11 +
 MdeModulePkg/Library/JsonLib/stddef.h         |  11 +
 MdeModulePkg/Library/JsonLib/stdio.h          |  11 +
 MdeModulePkg/Library/JsonLib/stdlib.h         |  11 +
 MdeModulePkg/Library/JsonLib/string.h         |  11 +
 MdeModulePkg/Library/JsonLib/sys/time.h       |  11 +
 MdeModulePkg/Library/JsonLib/sys/types.h      |  10 +
 MdeModulePkg/Library/JsonLib/time.h           |  11 +
 MdeModulePkg/MdeModulePkg.dec                 |   7 +-
 MdeModulePkg/MdeModulePkg.dsc                 |   4 +-
 ReadMe.rst                                    |   1 +
 26 files changed, 3092 insertions(+), 2 deletions(-)
 create mode 100644 MdeModulePkg/Include/Library/JsonLib.h
 create mode 100644 MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c
 create mode 100644 MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h
 create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.c
 create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.inf
 create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.c
 create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.h
 create mode 100644 MdeModulePkg/Library/JsonLib/assert.h
 create mode 100644 MdeModulePkg/Library/JsonLib/errno.h
 create mode 160000 MdeModulePkg/Library/JsonLib/jansson
 create mode 100644 MdeModulePkg/Library/JsonLib/jansson_config.h
 create mode 100644 MdeModulePkg/Library/JsonLib/jansson_private_config.h
 create mode 100644 MdeModulePkg/Library/JsonLib/limits.h
 create mode 100644 MdeModulePkg/Library/JsonLib/math.h
 create mode 100644 MdeModulePkg/Library/JsonLib/stdarg.h
 create mode 100644 MdeModulePkg/Library/JsonLib/stddef.h
 create mode 100644 MdeModulePkg/Library/JsonLib/stdio.h
 create mode 100644 MdeModulePkg/Library/JsonLib/stdlib.h
 create mode 100644 MdeModulePkg/Library/JsonLib/string.h
 create mode 100644 MdeModulePkg/Library/JsonLib/sys/time.h
 create mode 100644 MdeModulePkg/Library/JsonLib/sys/types.h
 create mode 100644 MdeModulePkg/Library/JsonLib/time.h

-- 
2.17.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* [PATCH 1/3] edk2: jansson submodule of JSON library
  2020-11-23 13:47 [PATCH 0/3] JsonLib: jansson edk2 port Abner Chang
@ 2020-11-23 13:47 ` Abner Chang
  2020-11-23 23:32   ` Laszlo Ersek
  2020-11-23 13:47 ` [PATCH 2/3] MdeModulePkg/library: EDK2 port jansson library Abner Chang
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 12+ messages in thread
From: Abner Chang @ 2020-11-23 13:47 UTC (permalink / raw)
  To: devel
  Cc: Andrew Fish, Laszlo Ersek, Leif Lindholm, Michael D Kinney,
	Nickle Wang, Peter O'Hanley

Add jansson git submodule

Signed-off-by: Abner Chang <abner.chang@hpe.com>

Cc: Andrew Fish <afish@apple.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Nickle Wang <nickle.wang@hpe.com>
Cc: Peter O'Hanley <peter.ohanley@hpe.com>
---
 .gitmodules                          | 3 +++
 MdeModulePkg/Library/JsonLib/jansson | 1 +
 ReadMe.rst                           | 1 +
 3 files changed, 5 insertions(+)
 create mode 160000 MdeModulePkg/Library/JsonLib/jansson

diff --git a/.gitmodules b/.gitmodules
index c3a4e4aeca..77037b07b2 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -17,3 +17,6 @@
 	path = BaseTools/Source/C/BrotliCompress/brotli
 	url = https://github.com/google/brotli
 	ignore = untracked
+[submodule "MdeModulePkg/Library/JsonLib/jansson"]
+	path = MdeModulePkg/Library/JsonLib/jansson
+	url = https://github.com/akheron/jansson
diff --git a/MdeModulePkg/Library/JsonLib/jansson b/MdeModulePkg/Library/JsonLib/jansson
new file mode 160000
index 0000000000..e9ebfa7e77
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/jansson
@@ -0,0 +1 @@
+Subproject commit e9ebfa7e77a6bee77df44e096b100e7131044059
diff --git a/ReadMe.rst b/ReadMe.rst
index c3c8178373..259739b5a3 100644
--- a/ReadMe.rst
+++ b/ReadMe.rst
@@ -93,6 +93,7 @@ that are covered by additional licenses.
 -  `MdeModulePkg/Library/BrotliCustomDecompressLib/brotli <https://github.com/google/brotli/blob/666c3280cc11dc433c303d79a83d4ffbdd12cc8d/LICENSE>`__
 -  `MdeModulePkg/Universal/RegularExpressionDxe/oniguruma <https://github.com/kkos/oniguruma/blob/abfc8ff81df4067f309032467785e06975678f0d/COPYING>`__
 -  `UnitTestFrameworkPkg/Library/CmockaLib/cmocka <https://git.cryptomilk.org/projects/cmocka.git/tree/COPYING?h=cmocka-1.1.5&id=f5e2cd77c88d9f792562888d2b70c5a396bfbf7a>`__
+-  `MdeModulePkg/Library/JsonLib/jansson <https://github.com/akheron/jansson/blob/master/LICENSE>`__
 
 The EDK II Project is composed of packages. The maintainers for each package
 are listed in `Maintainers.txt <Maintainers.txt>`__.
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 2/3] MdeModulePkg/library: EDK2 port jansson library
  2020-11-23 13:47 [PATCH 0/3] JsonLib: jansson edk2 port Abner Chang
  2020-11-23 13:47 ` [PATCH 1/3] edk2: jansson submodule of JSON library Abner Chang
@ 2020-11-23 13:47 ` Abner Chang
  2020-11-23 13:47 ` [PATCH 3/3] MdeModulePkg: Add " Abner Chang
  2020-11-24  1:19 ` [PATCH 0/3] JsonLib: jansson edk2 port Wu, Hao A
  3 siblings, 0 replies; 12+ messages in thread
From: Abner Chang @ 2020-11-23 13:47 UTC (permalink / raw)
  To: devel; +Cc: Jian J Wang, Hao A Wu, Nickle Wang, Peter O'Hanley

This is the edk2 port of open source jansson library.
https://github.com/akheron/jansson

Signed-off-by: Abner Chang <abner.chang@hpe.com>

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Nickle Wang <nickle.wang@hpe.com>
Cc: Peter O'Hanley <peter.ohanley@hpe.com>
---
 MdeModulePkg/Include/Library/JsonLib.h        | 596 +++++++++++++
 .../Library/JsonLib/JanssonCrtLibSupport.c    | 705 +++++++++++++++
 .../Library/JsonLib/JanssonCrtLibSupport.h    | 198 +++++
 MdeModulePkg/Library/JsonLib/JsonLib.c        | 805 ++++++++++++++++++
 MdeModulePkg/Library/JsonLib/JsonLib.inf      |  81 ++
 MdeModulePkg/Library/JsonLib/JsonUtilities.c  | 417 +++++++++
 MdeModulePkg/Library/JsonLib/JsonUtilities.h  |  69 ++
 MdeModulePkg/Library/JsonLib/assert.h         |  11 +
 MdeModulePkg/Library/JsonLib/errno.h          |  11 +
 MdeModulePkg/Library/JsonLib/jansson_config.h |  57 ++
 .../Library/JsonLib/jansson_private_config.h  |  19 +
 MdeModulePkg/Library/JsonLib/limits.h         |  11 +
 MdeModulePkg/Library/JsonLib/math.h           |  11 +
 MdeModulePkg/Library/JsonLib/stdarg.h         |  11 +
 MdeModulePkg/Library/JsonLib/stddef.h         |  11 +
 MdeModulePkg/Library/JsonLib/stdio.h          |  11 +
 MdeModulePkg/Library/JsonLib/stdlib.h         |  11 +
 MdeModulePkg/Library/JsonLib/string.h         |  11 +
 MdeModulePkg/Library/JsonLib/sys/time.h       |  11 +
 MdeModulePkg/Library/JsonLib/sys/types.h      |  10 +
 MdeModulePkg/Library/JsonLib/time.h           |  11 +
 21 files changed, 3078 insertions(+)
 create mode 100644 MdeModulePkg/Include/Library/JsonLib.h
 create mode 100644 MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c
 create mode 100644 MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h
 create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.c
 create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.inf
 create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.c
 create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.h
 create mode 100644 MdeModulePkg/Library/JsonLib/assert.h
 create mode 100644 MdeModulePkg/Library/JsonLib/errno.h
 create mode 100644 MdeModulePkg/Library/JsonLib/jansson_config.h
 create mode 100644 MdeModulePkg/Library/JsonLib/jansson_private_config.h
 create mode 100644 MdeModulePkg/Library/JsonLib/limits.h
 create mode 100644 MdeModulePkg/Library/JsonLib/math.h
 create mode 100644 MdeModulePkg/Library/JsonLib/stdarg.h
 create mode 100644 MdeModulePkg/Library/JsonLib/stddef.h
 create mode 100644 MdeModulePkg/Library/JsonLib/stdio.h
 create mode 100644 MdeModulePkg/Library/JsonLib/stdlib.h
 create mode 100644 MdeModulePkg/Library/JsonLib/string.h
 create mode 100644 MdeModulePkg/Library/JsonLib/sys/time.h
 create mode 100644 MdeModulePkg/Library/JsonLib/sys/types.h
 create mode 100644 MdeModulePkg/Library/JsonLib/time.h

diff --git a/MdeModulePkg/Include/Library/JsonLib.h b/MdeModulePkg/Include/Library/JsonLib.h
new file mode 100644
index 0000000000..b140a8723c
--- /dev/null
+++ b/MdeModulePkg/Include/Library/JsonLib.h
@@ -0,0 +1,596 @@
+/** @file
+  APIs for JSON operations.
+
+  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#ifndef BASE_JSON_LIB_H_
+#define BASE_JSON_LIB_H_
+
+#include <Uefi.h>
+
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+typedef    VOID*    EDKII_JSON_VALUE;
+typedef    VOID*    EDKII_JSON_ARRAY;
+typedef    VOID*    EDKII_JSON_OBJECT;
+
+#define EDKII_JSON_ARRAY_FOREACH(Array, Index, Value) \
+  for(Index = 0; \
+    Index < JsonArrayCount(Array) && (Value = JsonArrayGetValue(Array, Index)); \
+    Index++)
+
+/**
+  The function is used to convert a NULL terminated UTF8 encoded 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]   Text             The NULL terminated UTF8 encoded string to convert
+
+  @retval      Array JSON value or object JSON value, or NULL when any error occurs.
+
+**/
+EDKII_JSON_VALUE
+EFIAPI
+TextToJson (
+  IN    CHAR8*    Text
+  );
+
+/**
+  The function is used to convert the JSON root value to a UTF8 encoded string which
+  is terminated by NULL, or return NULL on error.
+
+  Only array JSON value or object JSON value is valid for converting, and caller is
+  responsible for free converted string.
+
+  @param[in]   Json               The JSON value to be converted
+
+  @retval      The JSON value converted UTF8 string or NULL.
+
+**/
+CHAR8*
+EFIAPI
+JsonToText (
+  IN    EDKII_JSON_VALUE    Json
+  );
+
+/**
+  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.
+
+**/
+EDKII_JSON_VALUE
+EFIAPI
+JsonValueInitArray (
+  VOID
+  );
+
+/**
+  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.
+
+**/
+EDKII_JSON_VALUE
+EFIAPI
+JsonValueInitObject (
+  VOID
+  );
+
+/**
+  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    CHAR8    *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
+  );
+
+/**
+  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 number or NULL.
+
+**/
+EDKII_JSON_VALUE
+EFIAPI
+JsonValueInitNumber (
+  IN    INT64    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
+  );
+
+/**
+  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
+  );
+
+/**
+  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.
+
+  @param[in]   Json             The JSON value to be freed.
+
+**/
+VOID
+EFIAPI
+JsonValueFree (
+  IN    EDKII_JSON_VALUE    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
+  );
+
+/**
+  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
+  );
+
+/**
+  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
+  );
+
+/**
+  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
+  );
+
+/**
+  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
+  );
+
+/**
+  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
+  );
+
+/**
+  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
+  );
+
+/**
+  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
+  );
+
+/**
+  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
+  );
+
+/**
+  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.
+
+**/
+CHAR8*
+EFIAPI
+JsonValueGetAsciiString (
+  IN    EDKII_JSON_VALUE    Json
+  );
+
+/**
+  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.
+
+  @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
+  );
+
+/**
+  The function is used to retrieve the associated integer in a number type JSON value.
+
+  The input JSON value should not be NULL or contain no JSON number, otherwise it will
+  ASSERT() and return 0.
+
+  @param[in]   Json             The provided JSON value.
+
+  @retval      Return the associated number in JSON value.
+
+**/
+INT64
+EFIAPI
+JsonValueGetNumber (
+  IN    EDKII_JSON_VALUE    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
+  );
+
+/**
+  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
+  );
+
+/**
+  The function is used to enumerate all keys in a JSON object.
+
+  Caller should be responsible to free the returned key array refference. 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.
+
+**/
+CHAR8**
+JsonObjectGetKeys (
+  IN    EDKII_JSON_OBJECT    JsonObj,
+  OUT   UINTN                *KeyCount
+  );
+
+/**
+  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    EDKII_JSON_OBJECT    JsonObj,
+  IN    CHAR8                *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    CHAR8                *Key,
+  IN    EDKII_JSON_VALUE     Json
+  );
+
+/**
+  The function is used to get the number of elements in a JSON array, or 0 if it 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
+  );
+
+/**
+  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.
+
+**/
+EDKII_JSON_VALUE
+EFIAPI
+JsonArrayGetValue (
+  IN    EDKII_JSON_ARRAY    JsonArray,
+  IN    UINTN               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
+  );
+
+/**
+  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
+  );
+
+#endif
diff --git a/MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c b/MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c
new file mode 100644
index 0000000000..907634a05b
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c
@@ -0,0 +1,705 @@
+/** @file
+  CRT wrapper functions for Jansson system call.
+
+  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+
+int  errno = 0;
+
+/**
+  Determine if a particular character is an alphanumeric character
+  @return  Returns 1 if c is an alphanumeric character, otherwise returns 0.
+**/
+int isalnum (int c)
+{
+  //
+  // <alnum> ::= [0-9] | [a-z] | [A-Z]
+  //
+  return ((('0' <= (c)) && ((c) <= '9')) ||
+          (('a' <= (c)) && ((c) <= 'z')) ||
+          (('A' <= (c)) && ((c) <= 'Z')));
+}
+
+/**
+  Determine if a particular character is a digital character
+
+  @return  Returns 1 if c is an digital character, otherwise returns 0.
+**/
+int isdchar (int c)
+{
+  //
+  // [0-9] | [e +-.]
+  //
+  return ((('0' <= (c)) && ((c) <= '9')) ||
+          (c == 'e') || (c == 'E') ||
+          (c == '+') || (c == '-') ||
+          (c == '.'));
+}
+
+/**
+  Determine if a particular character is a space character
+
+  @return  Returns 1 if c is a space character
+**/
+int isspace (int c)
+{
+  //
+  // <space> ::= [ ]
+  //
+  return ((c) == ' ') || ((c) == '\t') || ((c) == '\r') || ((c) == '\n') || ((c) == '\v')  || ((c) == '\f');
+}
+
+/**
+  Allocates memory blocks
+*/
+void *malloc (size_t size)
+{
+  return AllocatePool ((UINTN) size);
+}
+
+/**
+  De-allocates or frees a memory block
+*/
+void free (void *ptr)
+{
+  //
+  // In Standard C, free() handles a null pointer argument transparently. This
+  // is not true of FreePool() below, so protect it.
+  //
+  if (ptr != NULL) {
+    FreePool (ptr);
+  }
+}
+
+/**
+  NetBSD Compatibility Function strdup creates a duplicate copy of a string.
+
+  @return  Returns the pointer to duplicated string.
+**/
+char * strdup(const char *str)
+{
+  size_t len;
+  char *copy;
+
+  len = strlen(str) + 1;
+  if ((copy = malloc(len)) == NULL)
+    return (NULL);
+  memcpy(copy, str, len);
+  return (copy);
+}
+
+/** The toupper function converts a lowercase letter to a corresponding
+    uppercase letter.
+
+    @param[in]    c   The character to be converted.
+
+    @return   If the argument is a character for which islower is true and
+              there are one or more corresponding characters, as specified by
+              the current locale, for which isupper is true, the toupper
+              function returns one of the corresponding characters (always the
+              same one for any given locale); otherwise, the argument is
+              returned unchanged.
+**/
+int
+toupper(
+  IN  int c
+  )
+{
+  if ( (c >= 'a') && (c <= 'z') ) {
+    c = c - ('a' - 'A');
+  }
+  return c;
+}
+
+/**
+  Digit to a value.
+
+  @return  Returns the value of digit.
+**/
+int
+Digit2Val( int c)
+{
+  if (((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z'))) {  /* If c is one of [A-Za-z]... */
+    c = toupper(c) - 7;   // Adjust so 'A' is ('9' + 1)
+  }
+  return c - '0';   // Value returned is between 0 and 35, inclusive.
+}
+
+
+/** The strtoll function converts the initial portion of the string pointed to
+    by nptr to long long int representation.
+
+    See the description for strtol for more information.
+
+  @return   The strtoll function returns the converted value, if any. If no
+            conversion could be performed, zero is returned. If the correct
+            value is outside the range of representable values, LLONG_MIN or
+            LLONG_MAX is returned (according to the sign of the value, if any),
+            and the value of the macro ERANGE is stored in errno.
+**/
+long long
+strtoll(const char * nptr, char ** endptr, int base)
+{
+  const char *pEnd;
+  long long   Result = 0;
+  long long   Previous;
+  int         temp;
+  BOOLEAN     Negative = FALSE;
+
+  pEnd = nptr;
+
+  if((base < 0) || (base == 1) || (base > 36)) {
+    if(endptr != NULL) {
+    *endptr = NULL;
+    }
+    return 0;
+  }
+  // Skip leading spaces.
+  while(isspace(*nptr))   ++nptr;
+
+  // Process Subject sequence: optional sign followed by digits.
+  if(*nptr == '+') {
+    Negative = FALSE;
+    ++nptr;
+  }
+  else if(*nptr == '-') {
+    Negative = TRUE;
+    ++nptr;
+  }
+
+  if(*nptr == '0') {  /* Might be Octal or Hex */
+    if(toupper(nptr[1]) == 'X') {   /* Looks like Hex */
+      if((base == 0) || (base == 16)) {
+        nptr += 2;  /* Skip the "0X"      */
+        base = 16;  /* In case base was 0 */
+      }
+    }
+    else {    /* Looks like Octal */
+      if((base == 0) || (base == 8)) {
+        ++nptr;     /* Skip the leading "0" */
+        base = 8;   /* In case base was 0   */
+      }
+    }
+  }
+  if(base == 0) {   /* If still zero then must be decimal */
+    base = 10;
+  }
+  if(*nptr  == '0') {
+    for( ; *nptr == '0'; ++nptr);  /* Skip any remaining leading zeros */
+    pEnd = nptr;
+  }
+
+  while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) {
+    Previous = Result;
+    Result = MultS64x64 (Result, base) + (long long int)temp;
+    if( Result <= Previous) {   // Detect Overflow
+      if(Negative) {
+        Result = LLONG_MIN;
+      }
+      else {
+        Result = LLONG_MAX;
+      }
+      Negative = FALSE;
+      errno = ERANGE;
+      break;
+    }
+    pEnd = ++nptr;
+  }
+  if(Negative) {
+    Result = -Result;
+  }
+
+  // Save pointer to final sequence
+  if(endptr != NULL) {
+    *endptr = (char *)pEnd;
+  }
+  return Result;
+}
+
+/** The strtol, strtoll, strtoul, and strtoull functions convert the initial
+    portion of the string pointed to by nptr to long int, long long int,
+    unsigned long int, and unsigned long long int representation, respectively.
+    First, they decompose the input string into three parts: an initial,
+    possibly empty, sequence of white-space characters (as specified by the
+    isspace function), a subject sequence resembling an integer represented in
+    some radix determined by the value of base, and a final string of one or
+    more unrecognized characters, including the terminating null character of
+    the input string. Then, they attempt to convert the subject sequence to an
+    integer, and return the result.
+
+    If the value of base is zero, the expected form of the subject sequence is
+    that of an integer constant, optionally preceded
+    by a plus or minus sign, but not including an integer suffix. If the value
+    of base is between 2 and 36 (inclusive), the expected form of the subject
+    sequence is a sequence of letters and digits representing an integer with
+    the radix specified by base, optionally preceded by a plus or minus sign,
+    but not including an integer suffix. The letters from a (or A) through z
+    (or Z) are ascribed the values 10 through 35; only letters and digits whose
+    ascribed values are less than that of base are permitted. If the value of
+    base is 16, the characters 0x or 0X may optionally precede the sequence of
+    letters and digits, following the sign if present.
+
+    The subject sequence is defined as the longest initial subsequence of the
+    input string, starting with the first non-white-space character, that is of
+    the expected form. The subject sequence contains no characters if the input
+    string is empty or consists entirely of white space, or if the first
+    non-white-space character is other than a sign or a permissible letter or digit.
+
+    If the subject sequence has the expected form and the value of base is
+    zero, the sequence of characters starting with the first digit is
+    interpreted as an integer constant. If the subject sequence has the
+    expected form and the value of base is between 2 and 36, it is used as the
+    base for conversion, ascribing to each letter its value as given above. If
+    the subject sequence begins with a minus sign, the value resulting from the
+    conversion is negated (in the return type). A pointer to the final string
+    is stored in the object pointed to by endptr, provided that endptr is
+    not a null pointer.
+
+    In other than the "C" locale, additional locale-specific subject sequence
+    forms may be accepted.
+
+    If the subject sequence is empty or does not have the expected form, no
+    conversion is performed; the value of nptr is stored in the object pointed
+    to by endptr, provided that endptr is not a null pointer.
+
+  @return   The strtol, strtoll, strtoul, and strtoull functions return the
+            converted value, if any. If no conversion could be performed, zero
+            is returned. If the correct value is outside the range of
+            representable values, LONG_MIN, LONG_MAX, LLONG_MIN, LLONG_MAX,
+            ULONG_MAX, or ULLONG_MAX is returned (according to the return type
+            and sign of the value, if any), and the value of the macro ERANGE
+            is stored in errno.
+**/
+long
+strtol(const char * nptr, char ** endptr, int base)
+{
+  const char *pEnd;
+  long        Result = 0;
+  long        Previous;
+  int         temp;
+  BOOLEAN     Negative = FALSE;
+
+  pEnd = nptr;
+
+  if((base < 0) || (base == 1) || (base > 36)) {
+    if(endptr != NULL) {
+    *endptr = NULL;
+    }
+    return 0;
+  }
+  // Skip leading spaces.
+  while(isspace(*nptr))   ++nptr;
+
+  // Process Subject sequence: optional sign followed by digits.
+  if(*nptr == '+') {
+    Negative = FALSE;
+    ++nptr;
+  }
+  else if(*nptr == '-') {
+    Negative = TRUE;
+    ++nptr;
+  }
+
+  if(*nptr == '0') {  /* Might be Octal or Hex */
+    if(toupper(nptr[1]) == 'X') {   /* Looks like Hex */
+      if((base == 0) || (base == 16)) {
+        nptr += 2;  /* Skip the "0X"      */
+        base = 16;  /* In case base was 0 */
+      }
+    }
+    else {    /* Looks like Octal */
+      if((base == 0) || (base == 8)) {
+        ++nptr;     /* Skip the leading "0" */
+        base = 8;   /* In case base was 0   */
+      }
+    }
+  }
+  if(base == 0) {   /* If still zero then must be decimal */
+    base = 10;
+  }
+  if(*nptr  == '0') {
+    for( ; *nptr == '0'; ++nptr);  /* Skip any remaining leading zeros */
+    pEnd = nptr;
+  }
+
+  while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) {
+    Previous = Result;
+    Result = (Result * base) + (long int)temp;
+    if( Result <= Previous) {   // Detect Overflow
+      if(Negative) {
+        Result = LONG_MIN;
+      }
+      else {
+        Result = LONG_MAX;
+      }
+      Negative = FALSE;
+      errno = ERANGE;
+      break;
+    }
+    pEnd = ++nptr;
+  }
+  if(Negative) {
+    Result = -Result;
+  }
+
+  // Save pointer to final sequence
+  if(endptr != NULL) {
+    *endptr = (char *)pEnd;
+  }
+  return Result;
+}
+
+/** The strtoull function converts the initial portion of the string pointed to
+    by nptr to unsigned long long int representation.
+
+    See the description for strtol for more information.
+
+  @return   The strtoull function returns the converted value, if any. If no
+            conversion could be performed, zero is returned. If the correct
+            value is outside the range of representable values, ULLONG_MAX is
+            returned and the value of the macro ERANGE is stored in errno.
+**/
+unsigned long long
+strtoull(const char * nptr, char ** endptr, int base)
+{
+  const char           *pEnd;
+  unsigned long long    Result = 0;
+  unsigned long long    Previous;
+  int                   temp;
+
+  pEnd = nptr;
+
+  if((base < 0) || (base == 1) || (base > 36)) {
+    if(endptr != NULL) {
+    *endptr = NULL;
+    }
+    return 0;
+  }
+  // Skip leading spaces.
+  while(isspace(*nptr))   ++nptr;
+
+  // Process Subject sequence: optional + sign followed by digits.
+  if(*nptr == '+') {
+    ++nptr;
+  }
+
+  if(*nptr == '0') {  /* Might be Octal or Hex */
+    if(toupper(nptr[1]) == 'X') {   /* Looks like Hex */
+      if((base == 0) || (base == 16)) {
+        nptr += 2;  /* Skip the "0X"      */
+        base = 16;  /* In case base was 0 */
+      }
+    }
+    else {    /* Looks like Octal */
+      if((base == 0) || (base == 8)) {
+        ++nptr;     /* Skip the leading "0" */
+        base = 8;   /* In case base was 0   */
+      }
+    }
+  }
+  if(base == 0) {   /* If still zero then must be decimal */
+    base = 10;
+  }
+  if(*nptr  == '0') {
+    for( ; *nptr == '0'; ++nptr);  /* Skip any remaining leading zeros */
+    pEnd = nptr;
+  }
+
+  while( isalnum(*nptr) && ((temp = Digit2Val(*nptr)) < base)) {
+    Previous = Result;
+    Result = DivU64x32 (Result, base) + (unsigned long long)temp;
+    if( Result < Previous)  {   // If we overflowed
+      Result = ULLONG_MAX;
+      errno = ERANGE;
+      break;
+    }
+    pEnd = ++nptr;
+  }
+
+  // Save pointer to final sequence
+  if(endptr != NULL) {
+    *endptr = (char *)pEnd;
+  }
+  return Result;
+}
+
+/**
+  edk2 Jansson port does not support doubles, simply return 0.
+
+  These conversion functions convert the initial portion of the string
+  pointed to by nptr to double, float, and long double representation,
+  respectively.
+
+  The strtod(), strtof(), and strtold() functions return the converted
+  value, if any.
+
+  If endptr is not NULL, a pointer to the character after the last charac-
+  ter used in the conversion is stored in the location referenced by
+  endptr.
+
+  If no conversion is performed, zero is returned and the value of nptr is
+  stored in the location referenced by endptr.
+
+  If the correct value would cause overflow, plus or minus HUGE_VAL,
+  HUGE_VALF, or HUGE_VALL is returned (according to the sign and type of
+  the return value), and ERANGE is stored in errno.  If the correct value
+  would cause underflow, zero is returned and ERANGE is stored in errno.
+
+  @return  Return 0.
+**/
+double
+strtod (const char * __restrict nptr, char ** __restrict endptr) {
+    if(endptr)
+      *endptr = (char *)(nptr + strlen(nptr));
+
+    return (double)0;
+}
+
+/**
+  Allocate and zero-initialize array.
+**/
+void *
+calloc(size_t Num, size_t Size)
+{
+  void       *RetVal;
+  size_t      NumSize;
+
+  NumSize = Num * Size;
+  RetVal  = NULL;
+  if (NumSize != 0) {
+  RetVal = malloc(NumSize);
+  if( RetVal != NULL) {
+    (VOID)ZeroMem( RetVal, NumSize);
+  }
+  }
+  DEBUG((DEBUG_POOL, "0x%p = calloc(%d, %d)\n", RetVal, Num, Size));
+
+  return RetVal;
+}
+
+//
+//  The arrays give the cumulative number of days up to the first of the
+//  month number used as the index (1 -> 12) for regular and leap years.
+//  The value at index 13 is for the whole year.
+//
+UINTN CumulativeDays[2][14] = {
+  {
+    0,
+    0,
+    31,
+    31 + 28,
+    31 + 28 + 31,
+    31 + 28 + 31 + 30,
+    31 + 28 + 31 + 30 + 31,
+    31 + 28 + 31 + 30 + 31 + 30,
+    31 + 28 + 31 + 30 + 31 + 30 + 31,
+    31 + 28 + 31 + 30 + 31 + 30 + 31 + 31,
+    31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30,
+    31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
+    31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,
+    31 + 28 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31
+  },
+  {
+    0,
+    0,
+    31,
+    31 + 29,
+    31 + 29 + 31,
+    31 + 29 + 31 + 30,
+    31 + 29 + 31 + 30 + 31,
+    31 + 29 + 31 + 30 + 31 + 30,
+    31 + 29 + 31 + 30 + 31 + 30 + 31,
+    31 + 29 + 31 + 30 + 31 + 30 + 31 + 31,
+    31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30,
+    31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31,
+    31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30,
+    31 + 29 + 31 + 30 + 31 + 30 + 31 + 31 + 30 + 31 + 30 + 31
+  }
+};
+
+#define IsLeap(y)   (((y) % 4) == 0 && (((y) % 100) != 0 || ((y) % 400) == 0))
+#define SECSPERMIN  (60)
+#define SECSPERHOUR (60 * 60)
+#define SECSPERDAY  (24 * SECSPERHOUR)
+
+/**
+  Get the system time as seconds elapsed since midnight, January 1, 1970.
+**/
+time_t time (time_t *timer)
+{
+  EFI_TIME  Time;
+  time_t    CalTime;
+  UINTN     Year;
+
+  //
+  // Get the current time and date information
+  //
+  gRT->GetTime (&Time, NULL);
+
+  //
+  // Years Handling
+  // UTime should now be set to 00:00:00 on Jan 1 of the current year.
+  //
+  for (Year = 1970, CalTime = 0; Year != Time.Year; Year++) {
+    CalTime = CalTime + (time_t)(CumulativeDays[IsLeap(Year)][13] * SECSPERDAY);
+  }
+
+  //
+  // Add in number of seconds for current Month, Day, Hour, Minute, Seconds, and TimeZone adjustment
+  //
+  CalTime = CalTime +
+            (time_t)((Time.TimeZone != EFI_UNSPECIFIED_TIMEZONE) ? (Time.TimeZone * 60) : 0) +
+            (time_t)(CumulativeDays[IsLeap(Time.Year)][Time.Month] * SECSPERDAY) +
+            (time_t)(((Time.Day > 0) ? Time.Day - 1 : 0) * SECSPERDAY) +
+            (time_t)(Time.Hour * SECSPERHOUR) +
+            (time_t)(Time.Minute * 60) +
+            (time_t)Time.Second;
+
+  if (timer != NULL) {
+    *timer = CalTime;
+  }
+
+  return CalTime;
+}
+
+typedef
+int
+(*SORT_COMPARE)(
+  IN  VOID  *Buffer1,
+  IN  VOID  *Buffer2
+  );
+
+/**
+  Duplicated from EDKII BaseSortLib for qsort() wrapper
+  @param[in, out] BufferToSort   on call a Buffer of (possibly sorted) elements
+                                 on return a buffer of sorted elements
+  @param[in] Count               the number of elements in the buffer to sort
+  @param[in] ElementSize         Size of an element in bytes
+  @param[in] CompareFunction     The function to call to perform the comparison
+                                 of any 2 elements
+  @param[in] Buffer              Buffer of size ElementSize for use in swapping
+**/
+STATIC
+VOID
+QuickSortWorker (
+  IN OUT    VOID          *BufferToSort,
+  IN CONST  UINTN         Count,
+  IN CONST  UINTN         ElementSize,
+  IN        SORT_COMPARE  CompareFunction,
+  IN        VOID          *Buffer
+  )
+{
+  VOID        *Pivot;
+  UINTN       LoopCount;
+  UINTN       NextSwapLocation;
+
+  ASSERT(BufferToSort    != NULL);
+  ASSERT(CompareFunction != NULL);
+  ASSERT(Buffer          != NULL);
+
+  if (Count < 2 || ElementSize  < 1) {
+    return;
+  }
+
+  NextSwapLocation = 0;
+
+  //
+  // Pick a pivot (we choose last element)
+  //
+  Pivot = ((UINT8 *)BufferToSort + ((Count - 1) * ElementSize));
+
+  //
+  // Now get the pivot such that all on "left" are below it
+  // and everything "right" are above it
+  //
+  for (LoopCount = 0; LoopCount < Count - 1;  LoopCount++)
+  {
+    //
+    // If the element is less than the pivot
+    //
+    if (CompareFunction ((VOID *)((UINT8 *)BufferToSort + ((LoopCount) * ElementSize)), Pivot) <= 0) {
+      //
+      // Swap
+      //
+      CopyMem (Buffer, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);
+      CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), (UINT8 *)BufferToSort + ((LoopCount) * ElementSize), ElementSize);
+      CopyMem ((UINT8 *)BufferToSort + ((LoopCount) * ElementSize), Buffer, ElementSize);
+
+      //
+      // Increment NextSwapLocation
+      //
+      NextSwapLocation++;
+    }
+  }
+  //
+  // Swap pivot to it's final position (NextSwapLocaiton)
+  //
+  CopyMem (Buffer, Pivot, ElementSize);
+  CopyMem (Pivot, (UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), ElementSize);
+  CopyMem ((UINT8 *)BufferToSort + (NextSwapLocation * ElementSize), Buffer, ElementSize);
+
+  //
+  // Now recurse on 2 paritial lists.  Neither of these will have the 'pivot' element.
+  // IE list is sorted left half, pivot element, sorted right half...
+  //
+  QuickSortWorker (
+    BufferToSort,
+    NextSwapLocation,
+    ElementSize,
+    CompareFunction,
+    Buffer
+    );
+
+  QuickSortWorker (
+    (UINT8 *)BufferToSort + (NextSwapLocation + 1) * ElementSize,
+    Count - NextSwapLocation - 1,
+    ElementSize,
+    CompareFunction,
+    Buffer
+    );
+
+  return;
+}
+
+/**
+  Performs a quick sort
+**/
+void qsort (void *base, size_t num, size_t width, int (*compare)(const void *, const void *))
+{
+  VOID  *Buffer;
+
+  ASSERT (base    != NULL);
+  ASSERT (compare != NULL);
+
+  //
+  // Use CRT-style malloc to cover BS and RT memory allocation.
+  //
+  Buffer = malloc (width);
+  ASSERT (Buffer != NULL);
+
+  //
+  // Re-use PerformQuickSort() function Implementation in EDKII BaseSortLib.
+  //
+  QuickSortWorker (base, (UINTN)num, (UINTN)width, (SORT_COMPARE)compare, Buffer);
+
+  free (Buffer);
+  return;
+}
+
+/**
+  Get character from stream, we don't support file operastion on edk2 JSON library.
+
+  @return Returns the character currently pointed by the internal file position indicator of the specified stream
+
+**/
+int fgetc(FILE * _File){
+   return 0;
+}
diff --git a/MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h b/MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h
new file mode 100644
index 0000000000..f17ee6397f
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h
@@ -0,0 +1,198 @@
+/** @file
+  CRT wrapper head functions for jansson system call.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef JANSSON_CRT_LIB_SUPPORT_H_
+#define JANSSON_CRT_LIB_SUPPORT_H_
+
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PrintLib.h>
+
+#define MAX_STRING_SIZE  0x10000000
+
+// Minimum value for an object of type long long int.
+#define LLONG_MIN   (-9223372036854775807LL - 1LL)  // -(2^63 - 1)
+
+// Maximum value for an object of type long long int.
+#define LLONG_MAX   9223372036854775807LL // 2^63 - 1
+
+// We dont support double on edk2
+#define HUGE_VAL    0
+
+#if defined(MDE_CPU_X64) || defined(MDE_CPU_AARCH64) || defined(MDE_CPU_IA64)
+//
+// With GCC we would normally use SIXTY_FOUR_BIT_LONG, but MSVC needs
+// SIXTY_FOUR_BIT, because 'long' is 32-bit and only 'long long' is
+// 64-bit. Since using 'long long' works fine on GCC too, just do that.
+//
+#define SIXTY_FOUR_BIT
+#elif defined(MDE_CPU_IA32) || defined(MDE_CPU_ARM) || defined(MDE_CPU_EBC)
+#define THIRTY_TWO_BIT
+#else
+#error Unknown target architecture
+#endif
+
+//
+// Map all va_xxxx elements to VA_xxx defined in MdePkg/Include/Base.h
+//
+#if !defined(__CC_ARM) // if va_list is not already defined
+#define va_list   VA_LIST
+#define va_arg    VA_ARG
+#define va_start  VA_START
+#define va_end    VA_END
+#else // __CC_ARM
+#define va_start(Marker, Parameter)   __va_start(Marker, Parameter)
+#define va_arg(Marker, TYPE)          __va_arg(Marker, TYPE)
+#define va_end(Marker)                ((void)0)
+#endif
+
+//
+// Definitions for global constants used by CRT library routines
+//
+#define EINVAL       22               /* Invalid argument */
+#define INT_MAX      0x7FFFFFFF       /* Maximum (signed) int value */
+#define LONG_MAX     0X7FFFFFFFL      /* max value for a long */
+#define LONG_MIN     (-LONG_MAX-1)    /* min value for a long */
+#define ULONG_MAX    0xFFFFFFFF       /* Maximum unsigned long value */
+#define CHAR_BIT     8                /* Number of bits in a char */
+
+// Maximum value for an object of type unsigned long long int.
+#define ULLONG_MAX  0xFFFFFFFFFFFFFFFFULL // 2^64 - 1
+// Maximum value for an object of type unsigned char.
+#define UCHAR_MAX   255  // 2^8 - 1
+
+//
+// Basic types mapping
+//
+typedef UINTN          size_t;
+typedef INTN           ssize_t;
+typedef INT32          time_t;
+typedef UINT8          __uint8_t;
+typedef UINT8          sa_family_t;
+typedef UINT32         uid_t;
+typedef UINT32         gid_t;
+typedef INT32          int32_t;
+typedef UINT32         uint32_t;
+typedef UINT16         uint16_t;
+typedef UINT8          uint8_t;
+typedef enum {false, true} bool;
+
+//
+// File operations are not required for EFI building,
+// so FILE is mapped to VOID * to pass build
+//
+typedef VOID  *FILE;
+
+//
+// Global variables
+//
+extern int  errno;
+extern FILE *stderr;
+
+//
+// Function prototypes of CRT Library routines
+//
+void           *malloc     (size_t);
+void           *realloc    (void *, size_t);
+void           *calloc     (size_t Num, size_t Size);
+void           free        (void *);
+void           *memset     (void *, int, size_t);
+int            memcmp      (const void *, const void *, size_t);
+int            isdigit     (int);
+int            isspace     (int);
+int            tolower     (int);
+int            isupper     (int);
+int            isxdigit    (int);
+int            isalnum     (int);
+void           *memcpy     (void *, const void *, size_t);
+void           *memset     (void *, int, size_t);
+void           *memchr     (const void *, int, size_t);
+int            memcmp      (const void *, const void *, size_t);
+void           *memmove    (void *, const void *, size_t);
+int            strcmp      (const char *, const char *);
+int            strncmp     (const char *, const char *, size_t);
+char           *strcpy     (char *, const char *);
+size_t         strlen      (const char *);
+char           *strcat     (char *, const char *);
+char           *strchr     (const char *, int);
+int            strcasecmp  (const char *, const char *);
+int            strncasecmp (const char *, const char *, size_t);
+char           *strncpy    (char *, size_t, const char *, size_t);
+int            strncmp     (const char *, const char *, size_t);
+char           *strrchr    (const char *, int);
+unsigned long  strtoul     (const char *, char **, int);
+char *         strstr      (const char *s1 , const char *s2);
+long           strtol      (const char *, char **, int);
+char           *strerror   (int);
+size_t         strspn      (const char *, const char *);
+char *         strdup      (const char *str);
+char *         strpbrk     (const char *s1, const char *s2);
+unsigned long long strtoull(const char * nptr, char ** endptr, int base);
+long long      strtoll     (const char * nptr, char ** endptr, int base);
+long           strtol      (const char * nptr, char ** endptr, int base);
+double         strtod      (const char * __restrict nptr, char ** __restrict endptr);
+size_t         strcspn     (const char *, const char *);
+int            printf      (const char *, ...);
+int            sscanf      (const char *, const char *, ...);
+FILE           *fopen      (const char *, const char *);
+size_t         fread       (void *, size_t, size_t, FILE *);
+size_t         fwrite      (const void *, size_t, size_t, FILE *);
+int            fclose      (FILE *);
+int            fprintf     (FILE *, const char *, ...);
+int            fgetc       (FILE * _File);
+uid_t          getuid      (void);
+uid_t          geteuid     (void);
+gid_t          getgid      (void);
+gid_t          getegid     (void);
+void           qsort       (void *, size_t, size_t, int (*)(const void *, const void *));
+char           *getenv     (const char *);
+#if defined(__GNUC__) && (__GNUC__ >= 2)
+void           abort       (void) __attribute__((__noreturn__));
+#else
+void           abort       (void);
+#endif
+int            toupper     (int);
+int            Digit2Val   (int);
+time_t         time        (time_t *);
+
+//
+// Macros that directly map functions to BaseLib, BaseMemoryLib, and DebugLib functions
+//
+#define strcmp                            AsciiStrCmp
+#define memcpy(dest,source,count)         CopyMem(dest,source,(UINTN)(count))
+#define memset(dest,ch,count)             SetMem(dest,(UINTN)(count),(UINT8)(ch))
+#define memchr(buf,ch,count)              ScanMem8(buf,(UINTN)(count),(UINT8)ch)
+#define memcmp(buf1,buf2,count)           (int)(CompareMem(buf1,buf2,(UINTN)(count)))
+#define memmove(dest,source,count)        CopyMem(dest,source,(UINTN)(count))
+#define strlen(str)                       (size_t)(AsciiStrnLenS(str,MAX_STRING_SIZE))
+#define strcpy(strDest,strSource)         AsciiStrCpyS(strDest,(strlen(strSource)+1),strSource)
+#define strncpy(strDest,strSource,count)  AsciiStrnCpyS(strDest,(UINTN)count,strSource,(UINTN)count)
+#define strncpys(strDest, DestLen, strSource,count)  AsciiStrnCpyS(strDest,DestLen,strSource,(UINTN)count)
+#define strcat(strDest,strSource)         AsciiStrCatS(strDest,(strlen(strSource)+strlen(strDest)+1),strSource)
+#define strchr(str,ch)                    ScanMem8((VOID *)(str),AsciiStrSize(str),(UINT8)ch)
+#define strncmp(string1,string2,count)    (int)(AsciiStrnCmp(string1,string2,(UINTN)(count)))
+#define strcasecmp(str1,str2)             (int)AsciiStriCmp(str1,str2)
+#define strstr(s1,s2)                     AsciiStrStr(s1,s2)
+#define sprintf(buf,...)                  AsciiSPrint(buf,MAX_STRING_SIZE,__VA_ARGS__)
+#define snprintf(buf,len,...)             AsciiSPrint(buf,len,__VA_ARGS__)
+#define vsnprintf(buf,len,format,marker)  AsciiVSPrint((buf),(len),(format),(marker))
+#define assert(expression)
+#define atoi(nptr)                        AsciiStrDecimalToUintn(nptr)
+#define fabs(x) (((x)<0.0)?(-x):(x))
+#define offsetof(type,member)             OFFSET_OF(type,member)
+
+#define EOF (-1)
+
+extern int  errno;
+
+#define ERANGE   34                /* 34   Result too large */
+
+#endif
diff --git a/MdeModulePkg/Library/JsonLib/JsonLib.c b/MdeModulePkg/Library/JsonLib/JsonLib.c
new file mode 100644
index 0000000000..8cf276c892
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/JsonLib.c
@@ -0,0 +1,805 @@
+/** @file
+  APIs for JSON operations.
+
+  Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <Library/JsonLib.h>
+#include "JsonUtilities.h"
+
+/**
+  The function is used to convert a NULL terminated UTF8 encoded 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]   Text             The NULL terminated UTF8 encoded string to convert
+
+  @retval      Array JSON value or object JSON value, or NULL when any error occurs.
+
+**/
+EDKII_JSON_VALUE
+EFIAPI
+TextToJson (
+  IN    CHAR8*    Text
+  )
+{
+  json_error_t    JsonError;
+
+  return (EDKII_JSON_VALUE) json_loads (Text, 0, &JsonError);
+}
+
+/**
+  The function is used to convert the JSON root value to a UTF8 encoded string which
+  is terminated by NULL, or return NULL on error.
+
+  Only array JSON value or object JSON value is valid for converting, and caller is
+  responsible for free converted string.
+
+  @param[in]   Json               The JSON value to be converted
+
+  @retval      The JSON value converted UTF8 string or NULL.
+
+**/
+CHAR8*
+EFIAPI
+JsonToText (
+  IN    EDKII_JSON_VALUE    Json
+  )
+{
+  if (!JsonValueIsArray (Json) && !JsonValueIsObject (Json)) {
+    return NULL;
+  }
+
+  return json_dumps ((json_t *) Json, 0);
+}
+
+/**
+  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.
+
+**/
+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.
+
+**/
+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    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 number or NULL.
+
+**/
+EDKII_JSON_VALUE
+EFIAPI
+JsonValueInitNumber (
+  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 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 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_integer ((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 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.
+
+**/
+CHAR8*
+EFIAPI
+JsonValueGetAsciiString (
+  IN    EDKII_JSON_VALUE    Json
+  )
+{
+  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.
+
+  @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;
+
+  Utf8Str = json_string_value ((json_t *) Json);
+  if (Utf8Str == NULL) {
+    return NULL;
+  }
+
+  Status = UTF8StrToUCS2 (Utf8Str, &Ucs2Str);
+  if (EFI_ERROR (Status)) {
+    return NULL;
+  }
+
+  return Ucs2Str;
+}
+
+/**
+  The function is used to retrieve the associated integer in a number type JSON value.
+
+  The input JSON value should not be NULL or contain no JSON number, otherwise it will
+  ASSERT() and return 0.
+
+  @param[in]   Json             The provided JSON value.
+
+  @retval      Return the associated number in JSON value.
+
+**/
+INT64
+EFIAPI
+JsonValueGetNumber (
+  IN    EDKII_JSON_VALUE    Json
+  )
+{
+  ASSERT (Json != NULL && JsonValueIsNumber (Json));
+  if (Json == NULL || !JsonValueIsNumber (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 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 refference. 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.
+
+**/
+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 = (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 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    EDKII_JSON_OBJECT    JsonObj,
+  IN    CHAR8                *Key
+  )
+{
+  return (EDKII_JSON_VALUE) json_object_get ((json_t *) JsonObj, 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    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, or 0 if it 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.
+
+**/
+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;
+  }
+}
diff --git a/MdeModulePkg/Library/JsonLib/JsonLib.inf b/MdeModulePkg/Library/JsonLib/JsonLib.inf
new file mode 100644
index 0000000000..d411a2ae86
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/JsonLib.inf
@@ -0,0 +1,81 @@
+## @file
+# Thirty party Jansson library for JSON operations.
+#
+# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+# (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+#
+#    SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x0001001b
+  BASE_NAME                      = JanssonLib
+  FILE_GUID                      = F5E36815-305A-4C5A-9D75-4F2149E45255
+  MODULE_TYPE                    = UEFI_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = JanssonLib | DXE_DRIVER DXE_RUNTIME_DRIVER UEFI_APPLICATION UEFI_DRIVER
+
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
+#
+
+[Sources]
+  #
+  # Below are the source code of third
+  # party jansson library.
+  #
+  jansson/src/dump.c
+  jansson/src/error.c
+  jansson/src/hashtable.c
+  jansson/src/hashtable_seed.c
+  jansson/src/load.c
+  jansson/src/memory.c
+  jansson/src/pack_unpack.c
+  jansson/src/strbuffer.c
+  jansson/src/strconv.c
+  jansson/src/utf.c
+  jansson/src/value.c
+  jansson/src/version.c
+  #
+  # Below are the source of edk2 JsonLib.
+  #
+  JsonLib.c
+  JsonUtilities.c
+  JsonUtilities.h
+  JanssonCrtLibSupport.c
+  JanssonCrtLibSupport.h
+  jansson_config.h
+  jansson_private_config.h
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+  UefiLib
+  BaseLib
+  BaseMemoryLib
+  MemoryAllocationLib
+  UefiRuntimeServicesTableLib
+  DebugLib
+  PrintLib
+
+[BuildOptions]
+  #
+  # Disables the following Visual Studio compiler warnings
+  # so we do not break the build with /WX option:
+  #   C4090: 'function' : different 'const' qualifiers
+  #   C4244: conversion from type1 to type2, possible loss of data
+  #   C4702: unreachable code
+  #   C4706: assignment within conditional expression
+  #   C4456: declaration hides previous local declaration
+  #   C4334: 32-bit shift implicitly converted to 64-bit
+  #   C4204: nonstandard extension used: non-constant aggregate initializer
+  #   C4267: 'var' : conversion from 'size_t' to 'type', possible loss of data
+  #
+  # Define macro HAVE_CONFIG_H to include jansson_private_config.h to build.
+  # Undefined _WIN32 macro
+  #
+  MSFT:*_*_*_CC_FLAGS = /wd4204 /wd4267 /wd4702 /wd4706 /wd4244 /wd4090 /wd4456 /wd4334 /DHAVE_CONFIG_H=1 /U_WIN32 /UWIN64 /U_MSC_VER
+
diff --git a/MdeModulePkg/Library/JsonLib/JsonUtilities.c b/MdeModulePkg/Library/JsonLib/JsonUtilities.c
new file mode 100644
index 0000000000..f84a133219
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/JsonUtilities.c
@@ -0,0 +1,417 @@
+/** @file
+  Utility functions for JSON operations.
+
+  Copyright (c) 2018 - 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include "JsonUtilities.h"
+
+/**
+  Since each UCS2 character can be represented by 1-3 UTF8 encoded characters,
+  this function is used to retrieve the UTF8 encoding size for a UCS2 character.
+
+  @param[in]   Utf8Buffer       The buffer for UTF8 encoded data.
+
+  @retval      Return the size of UTF8 encoding string or 0 if it is not for
+               UCS2 format.
+
+**/
+UINT8
+GetUTF8SizeForUCS2 (
+  IN    CHAR8      *Utf8Buffer
+  )
+{
+  CHAR8    TempChar;
+  UINT8    Utf8Size;
+
+  ASSERT (Utf8Buffer != NULL);
+
+  TempChar = *Utf8Buffer;
+  if ((TempChar & 0xF0) == 0xF0) {
+
+    //
+    // This format is not for UCS2.
+    //
+    return 0;
+  }
+
+  Utf8Size = 1;
+  if ((TempChar & 0x80) == 0x80) {
+    if ((TempChar & 0xC0) == 0xC0) {
+
+      Utf8Size ++;
+      if ((TempChar & 0xE0) == 0xE0) {
+
+        Utf8Size ++;
+      }
+    }
+  }
+
+  return Utf8Size;
+}
+
+/**
+  Since each UCS2 character can be represented by the format: \uXXXX, this function
+  is used to retrieve the UCS2 character from a Unicode format.
+  Call MUST make sure there are at least 6 Bytes in the input UTF8 buffer.
+
+  @param[in]    Utf8Buffer             The buffer for UTF8 encoded data.
+  @param[out]   Ucs2Char               The converted UCS2 character.
+
+  @retval       EFI_INVALID_PARAMETER  Non-Ascii characters found in the hexadecimal
+                                       digits string, and can't be converted to a UCS2
+                                       character.
+  @retval       EFI_SUCCESS            The UCS2 character has been retrieved.
+
+**/
+EFI_STATUS
+GetUCS2CharByFormat (
+  IN    CHAR8      *Utf8Buffer,
+  OUT   CHAR16     *Ucs2Char
+  )
+{
+  UINT8     Num1;
+  UINT8     Num2;
+  UINT8     Index;
+  CHAR8     Ucs2CharFormat[JSON_UNICODE_FORMAT_CHAR_SIZE];  /// two Hexadecimal digits Ascii string, like "3F"
+
+  for (Index = 0; Index < 4; Index ++) {
+    if ((*(Utf8Buffer + 2 + Index) & 0x80) != 0x00) {
+      return EFI_INVALID_PARAMETER;
+    }
+  }
+
+  ZeroMem (Ucs2CharFormat, JSON_UNICODE_FORMAT_CHAR_SIZE);
+
+  //
+  // Get the First Number, Offset is 2
+  //
+  CopyMem (Ucs2CharFormat, Utf8Buffer + 2, JSON_UNICODE_FORMAT_CHAR_LEN);
+  Num1 = (UINT8) AsciiStrHexToUintn (Ucs2CharFormat);
+
+  //
+  // Get the Second Number, Offset is 4
+  //
+  CopyMem (Ucs2CharFormat, Utf8Buffer + 4, JSON_UNICODE_FORMAT_CHAR_LEN);
+  Num2 = (UINT8) AsciiStrHexToUintn (Ucs2CharFormat);
+
+  //
+  // Ucs2Char is Little-Endian
+  //
+  *((CHAR8 *) Ucs2Char)        = Num2;
+  *(((CHAR8 *) Ucs2Char) + 1) = Num1;
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Convert a UCS2 character to UTF8 encoding string.
+
+  @param[in]    Ucs2Char               The provided UCS2 character.
+  @param[out]   Utf8Buffer             The converted UTF8 encoded data.
+
+  @retval      Return the size of UTF8 encoding data for this UCS2 character.
+
+**/
+UINT8
+UCS2CharToUTF8 (
+  IN  CHAR16     Ucs2Char,
+  OUT CHAR8      *Utf8Buffer
+  )
+{
+  UINT16    Ucs2Number;
+
+  ASSERT (Utf8Buffer != NULL);
+
+  Ucs2Number = (UINT16) Ucs2Char;
+  if (Ucs2Number <= 0x007F) {
+
+    //
+    // UTF8 format: 0xxxxxxx
+    //
+    *Utf8Buffer = Ucs2Char & 0x7F;
+    return 1;
+
+  } else if (Ucs2Number >= 0x0080 && Ucs2Number <= 0x07FF) {
+
+    //
+    // UTF8 format: 110xxxxx 10xxxxxx
+    //
+    *(Utf8Buffer + 1) = (Ucs2Char & 0x3F) | 0x80;
+    *Utf8Buffer       = ((Ucs2Char >> 6) & 0x1F) | 0xC0;
+    return 2;
+
+  } else {  /// Ucs2Number >= 0x0800 && Ucs2Number <= 0xFFFF
+
+    //
+    // UTF8 format: 1110xxxx 10xxxxxx 10xxxxxx
+    //
+    *(Utf8Buffer + 2) = (Ucs2Char & 0x3F) | 0x80;
+    *(Utf8Buffer + 1) = ((Ucs2Char >> 6) & 0x3F) | 0x80;
+    *Utf8Buffer       = ((Ucs2Char >> 12) & 0x0F) | 0xE0;
+    return 3;
+  }
+}
+
+/**
+  Convert a UTF8 encoded data to a UCS2 character.
+
+  @param[in]    Utf8Buffer             The provided UTF8 encoded data.
+  @param[out]   Ucs2Char               The converted UCS2 character.
+
+  @retval       EFI_INVALID_PARAMETER  The UTF8 encoded string is not valid or
+                                       not for UCS2 character.
+  @retval       EFI_SUCCESS            The converted UCS2 character.
+
+**/
+EFI_STATUS
+UTF8ToUCS2Char (
+  IN   CHAR8      *Utf8Buffer,
+  OUT  CHAR16     *Ucs2Char
+  )
+{
+  UINT8    Utf8Size;
+  CHAR8    *Ucs2Buffer;
+  CHAR8    TempChar1;
+  CHAR8    TempChar2;
+  CHAR8    TempChar3;
+
+  ASSERT (Utf8Buffer != NULL && Ucs2Char != NULL);
+  ZeroMem (Ucs2Char, sizeof (CHAR16));
+  Ucs2Buffer = (CHAR8 *) Ucs2Char;
+
+  Utf8Size = GetUTF8SizeForUCS2 (Utf8Buffer);
+  switch (Utf8Size) {
+
+    case 1:
+
+      //
+      // UTF8 format: 0xxxxxxx
+      //
+      TempChar1 = *Utf8Buffer;
+      if ((TempChar1 & 0x80) != 0x00) {
+        return EFI_INVALID_PARAMETER;
+      }
+
+      *Ucs2Buffer       = TempChar1;
+      *(Ucs2Buffer + 1) = 0;
+      break;
+
+    case 2:
+
+      //
+      // UTF8 format: 110xxxxx 10xxxxxx
+      //
+      TempChar1 = *Utf8Buffer;
+      if ((TempChar1 & 0xE0) != 0xC0) {
+        return EFI_INVALID_PARAMETER;
+      }
+
+      TempChar2 = *(Utf8Buffer + 1);
+      if ((TempChar2 & 0xC0) != 0x80) {
+        return EFI_INVALID_PARAMETER;
+      }
+
+      *Ucs2Buffer       = (TempChar1 << 6) + (TempChar2 & 0x3F);
+      *(Ucs2Buffer + 1) = (TempChar1 >> 2) & 0x07;
+      break;
+
+    case 3:
+
+      //
+      // UTF8 format: 1110xxxx 10xxxxxx 10xxxxxx
+      //
+      TempChar1 = *Utf8Buffer;
+      if ((TempChar1 & 0xF0) != 0xE0) {
+        return EFI_INVALID_PARAMETER;
+      }
+
+      TempChar2 = *(Utf8Buffer + 1);
+      if ((TempChar2 & 0xC0) != 0x80) {
+        return EFI_INVALID_PARAMETER;
+      }
+
+      TempChar3 = *(Utf8Buffer + 2);
+      if ((TempChar3 & 0xC0) != 0x80) {
+        return EFI_INVALID_PARAMETER;
+      }
+
+      *Ucs2Buffer       = (TempChar2 << 6) + (TempChar3 & 0x3F);
+      *(Ucs2Buffer + 1) = (TempChar1 << 4) + ((TempChar2 >> 2) & 0x0F);
+
+      break;
+
+    default:
+
+      return EFI_INVALID_PARAMETER;
+  }
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Convert a UCS2 string to a UTF8 encoded string.
+
+  @param[in]    Ucs2Str                The provided UCS2 string.
+  @param[out]   Utf8StrAddr            The converted UTF8 string address. Caller
+                                       is responsible for Free this string.
+
+  @retval       EFI_INVALID_PARAMETER  One or more parameters are invalid.
+  @retval       EFI_OUT_OF_RESOURCES   System runs out of resources.
+  @retval       EFI_SUCCESS            The UTF8 encoded string has been converted.
+
+**/
+EFI_STATUS
+UCS2StrToUTF8 (
+  IN  CHAR16     *Ucs2Str,
+  OUT CHAR8      **Utf8StrAddr
+  )
+{
+  UINTN    Ucs2StrIndex;
+  UINTN    Ucs2StrLength;
+  CHAR8    *Utf8Str;
+  UINTN    Utf8StrLength;
+  UINTN    Utf8StrIndex;
+  CHAR8    Utf8Buffer[UTF8_BUFFER_FOR_UCS2_MAX_SIZE];
+  UINT8    Utf8BufferSize;
+
+  if (Ucs2Str == NULL || Utf8StrAddr == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Ucs2StrLength = StrLen (Ucs2Str);
+  Utf8StrLength = 0;
+
+  for (Ucs2StrIndex = 0; Ucs2StrIndex < Ucs2StrLength; Ucs2StrIndex ++) {
+
+    ZeroMem (Utf8Buffer, sizeof (Utf8Buffer));
+    Utf8BufferSize = UCS2CharToUTF8 (Ucs2Str[Ucs2StrIndex], Utf8Buffer);
+    Utf8StrLength += Utf8BufferSize;
+  }
+
+  Utf8Str = AllocateZeroPool (Utf8StrLength + 1);
+  if (Utf8Str == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  Utf8StrIndex = 0;
+  for (Ucs2StrIndex = 0; Ucs2StrIndex < Ucs2StrLength; Ucs2StrIndex ++) {
+
+    ZeroMem (Utf8Buffer, sizeof (Utf8Buffer));
+    Utf8BufferSize = UCS2CharToUTF8 (Ucs2Str[Ucs2StrIndex], Utf8Buffer);
+
+    CopyMem (Utf8Str + Utf8StrIndex, Utf8Buffer, Utf8BufferSize);
+    Utf8StrIndex += Utf8BufferSize;
+  }
+
+  Utf8Str[Utf8StrIndex] = '\0';
+  *Utf8StrAddr = Utf8Str;
+
+  return EFI_SUCCESS;
+}
+
+/**
+  Convert a UTF8 encoded string to a UCS2 string.
+
+  @param[in]    Utf8Str                The provided UTF8 encoded string.
+  @param[out]   Ucs2StrAddr            The converted UCS2 string address. Caller
+                                       is responsible for Free this string.
+
+  @retval       EFI_INVALID_PARAMETER  The UTF8 encoded string is not valid to
+                                       convert to UCS2 string.
+                                       One or more parameters are invalid.
+  @retval       EFI_OUT_OF_RESOURCES   System runs out of resources.
+  @retval       EFI_SUCCESS            The UCS2 string has been converted.
+
+**/
+EFI_STATUS
+UTF8StrToUCS2 (
+  IN  CHAR8      *Utf8Str,
+  OUT CHAR16     **Ucs2StrAddr
+  )
+{
+  EFI_STATUS    Status;
+  UINTN         Utf8StrIndex;
+  UINTN         Utf8StrLength;
+  UINTN         Ucs2StrIndex;
+  UINT8         Utf8BufferSize;
+  CHAR16        *Ucs2StrTemp;
+
+  if (Utf8Str == NULL || Ucs2StrAddr == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  // It is not an Ascii string, calculate string length.
+  //
+  Utf8StrLength = 0;
+  while (*(Utf8Str + Utf8StrLength) != '\0') {
+    Utf8StrLength ++;
+  }
+
+  //
+  // UCS2 string shall not be longer than the UTF8 string.
+  //
+  Ucs2StrTemp = AllocateZeroPool ((Utf8StrLength + 1) * sizeof (CHAR16));
+  if (Ucs2StrTemp == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  Utf8StrIndex = 0;
+  Ucs2StrIndex = 0;
+  while (Utf8Str[Utf8StrIndex] != '\0') {
+
+    if (CompareMem (Utf8Str + Utf8StrIndex, "\\u", 2) == 0 &&
+      Utf8StrLength - Utf8StrIndex >= JSON_UNICODE_FORMAT_LEN) {
+
+      Status = GetUCS2CharByFormat (Utf8Str + Utf8StrIndex, Ucs2StrTemp + Ucs2StrIndex);
+      if (!EFI_ERROR (Status)) {
+
+        Utf8StrIndex += JSON_UNICODE_FORMAT_LEN;
+        Ucs2StrIndex ++;
+      } else {
+
+        StrCpyS (Ucs2StrTemp + Ucs2StrIndex, 3, L"\\u");
+
+        Ucs2StrIndex += 2;
+        Utf8StrIndex += 2;
+      }
+    } else {
+
+      Utf8BufferSize = GetUTF8SizeForUCS2 (Utf8Str + Utf8StrIndex);
+      if (Utf8BufferSize == 0 || Utf8StrLength - Utf8StrIndex < Utf8BufferSize) {
+
+        FreePool (Ucs2StrTemp);
+        return EFI_INVALID_PARAMETER;
+      }
+
+      Status = UTF8ToUCS2Char (Utf8Str + Utf8StrIndex, Ucs2StrTemp + Ucs2StrIndex);
+      if (EFI_ERROR (Status)) {
+
+        FreePool (Ucs2StrTemp);
+        return EFI_INVALID_PARAMETER;
+      }
+
+      Ucs2StrIndex ++;
+      Utf8StrIndex += Utf8BufferSize;
+    }
+  }
+
+  *Ucs2StrAddr = AllocateZeroPool ((Ucs2StrIndex + 1) * sizeof (CHAR16));
+  if (*Ucs2StrAddr == NULL) {
+
+    FreePool (Ucs2StrTemp);
+    return EFI_OUT_OF_RESOURCES;
+  }
+
+  StrCpyS (*Ucs2StrAddr, Ucs2StrIndex + 1, Ucs2StrTemp);
+  *(*Ucs2StrAddr + Ucs2StrIndex) = L'\0';
+  FreePool (Ucs2StrTemp);
+
+  return EFI_SUCCESS;
+}
+
diff --git a/MdeModulePkg/Library/JsonLib/JsonUtilities.h b/MdeModulePkg/Library/JsonLib/JsonUtilities.h
new file mode 100644
index 0000000000..3a3bd092ab
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/JsonUtilities.h
@@ -0,0 +1,69 @@
+/** @file
+  Utility functions for JSON operations.
+
+  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef REDFISH_JSON_UTILITIES_H_
+#define REDFISH_JSON_UTILITIES_H_
+
+#include <Base.h>
+#include <Uefi.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PrintLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include "jansson.h"
+
+#define JSON_UNICODE_FORMAT_LEN    6       ///  L"\u0000"
+#define JSON_UNICODE_FORMAT_SIZE   7
+
+#define JSON_UNICODE_FORMAT_CHAR_LEN    2
+#define JSON_UNICODE_FORMAT_CHAR_SIZE   3
+
+#define UTF8_BUFFER_FOR_UCS2_MAX_SIZE   3
+
+/**
+  Convert a UCS2 string to a UTF8 encoded string.
+
+  @param[in]    Ucs2Str                The provided UCS2 string.
+  @param[out]   Utf8StrAddr            The converted UTF8 string address. Caller
+                                       is responsible for Free this string.
+
+  @retval       EFI_INVALID_PARAMETER  One or more parameters are invalid.
+  @retval       EFI_OUT_OF_RESOURCES   System runs out of resources.
+  @retval       EFI_SUCCESS            The UTF8 encoded string has been converted.
+
+**/
+EFI_STATUS
+UCS2StrToUTF8 (
+  IN  CHAR16     *Ucs2Str,
+  OUT CHAR8      **Utf8StrAddr
+  );
+
+/**
+  Convert a UTF8 encoded string to a UCS2 string.
+
+  @param[in]    Utf8Str                The provided UTF8 encoded string.
+  @param[out]   Ucs2StrAddr            The converted UCS2 string address. Caller
+                                       is responsible for Free this string.
+
+  @retval       EFI_INVALID_PARAMETER  The UTF8 encoded string is not valid to
+                                       convert to UCS2 string.
+                                       One or more parameters are invalid.
+  @retval       EFI_OUT_OF_RESOURCES   System runs out of resources.
+  @retval       EFI_SUCCESS            The UCS2 string has been converted.
+
+**/
+EFI_STATUS
+UTF8StrToUCS2 (
+  IN  CHAR8      *Utf8Str,
+  OUT CHAR16     **Ucs2StrAddr
+  );
+
+#endif
diff --git a/MdeModulePkg/Library/JsonLib/assert.h b/MdeModulePkg/Library/JsonLib/assert.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/assert.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/errno.h b/MdeModulePkg/Library/JsonLib/errno.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/errno.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/jansson_config.h b/MdeModulePkg/Library/JsonLib/jansson_config.h
new file mode 100644
index 0000000000..d445f4bc91
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/jansson_config.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2010-2016 Petri Lehtinen <petri@digip.org>
+ *
+ * Jansson is free software; you can redistribute it and/or modify
+ * it under the terms of the MIT license. See LICENSE for details.
+ *
+ *
+ * This file specifies a part of the site-specific configuration for
+ * Jansson, namely those things that affect the public API in
+ * jansson.h.
+ *
+ * The configure script copies this file to jansson_config.h and
+ * replaces @var@ substitutions by values that fit your system. If you
+ * cannot run the configure script, you can do the value substitution
+ * by hand.
+
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+ */
+
+#ifndef JANSSON_CONFIG_H
+#define JANSSON_CONFIG_H
+
+/* If your compiler supports the inline keyword in C, JSON_INLINE is
+   defined to `inline', otherwise empty. In C++, the inline is always
+   supported. */
+#ifdef __cplusplus
+#define JSON_INLINE inline
+#else
+#define JSON_INLINE
+#endif
+
+/* If your compiler supports the `long long` type and the strtoll()
+   library function, JSON_INTEGER_IS_LONG_LONG is defined to 1,
+   otherwise to 0. */
+#define JSON_INTEGER_IS_LONG_LONG 1
+
+/* If locale.h and localeconv() are available, define to 1,
+   otherwise to 0. */
+#define JSON_HAVE_LOCALECONV 0
+
+/* If __atomic builtins are available they will be used to manage
+   reference counts of json_t. */
+#define JSON_HAVE_ATOMIC_BUILTINS 0
+
+/* If __atomic builtins are not available we try using __sync builtins
+   to manage reference counts of json_t. */
+#define JSON_HAVE_SYNC_BUILTINS 0
+
+/* Maximum recursion depth for parsing JSON input.
+   This limits the depth of e.g. array-within-array constructions. */
+#define JSON_PARSER_MAX_DEPTH 2048
+
+#define SUPPORT_JANSSON_JSON_REAL 1
+
+#endif
diff --git a/MdeModulePkg/Library/JsonLib/jansson_private_config.h b/MdeModulePkg/Library/JsonLib/jansson_private_config.h
new file mode 100644
index 0000000000..268f91ef8a
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/jansson_private_config.h
@@ -0,0 +1,19 @@
+/** @file
+  Jansson private configurations for UEFI support.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef JANSSON_PRIVATE_CONFIG_H_
+#define JANSSON_PRIVATE_CONFIG_H_
+
+#define HAVE_SYS_TIME_H 1
+#define HAVE_SYS_TYPES_H 1
+
+#define INITIAL_HASHTABLE_ORDER 3
+
+#endif
diff --git a/MdeModulePkg/Library/JsonLib/limits.h b/MdeModulePkg/Library/JsonLib/limits.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/limits.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/math.h b/MdeModulePkg/Library/JsonLib/math.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/math.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/stdarg.h b/MdeModulePkg/Library/JsonLib/stdarg.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/stdarg.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/stddef.h b/MdeModulePkg/Library/JsonLib/stddef.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/stddef.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/stdio.h b/MdeModulePkg/Library/JsonLib/stdio.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/stdio.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/stdlib.h b/MdeModulePkg/Library/JsonLib/stdlib.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/stdlib.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/string.h b/MdeModulePkg/Library/JsonLib/string.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/string.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/sys/time.h b/MdeModulePkg/Library/JsonLib/sys/time.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/sys/time.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/sys/types.h b/MdeModulePkg/Library/JsonLib/sys/types.h
new file mode 100644
index 0000000000..9e27294a82
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/sys/types.h
@@ -0,0 +1,10 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#include <JanssonCrtLibSupport.h>
diff --git a/MdeModulePkg/Library/JsonLib/time.h b/MdeModulePkg/Library/JsonLib/time.h
new file mode 100644
index 0000000000..5bc7ccd7e5
--- /dev/null
+++ b/MdeModulePkg/Library/JsonLib/time.h
@@ -0,0 +1,11 @@
+/** @file
+  Include file to support building the third-party jansson library.
+
+ Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+ (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+    SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <JanssonCrtLibSupport.h>
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [PATCH 3/3] MdeModulePkg: Add EDK2 port jansson library
  2020-11-23 13:47 [PATCH 0/3] JsonLib: jansson edk2 port Abner Chang
  2020-11-23 13:47 ` [PATCH 1/3] edk2: jansson submodule of JSON library Abner Chang
  2020-11-23 13:47 ` [PATCH 2/3] MdeModulePkg/library: EDK2 port jansson library Abner Chang
@ 2020-11-23 13:47 ` Abner Chang
  2020-11-24  1:19 ` [PATCH 0/3] JsonLib: jansson edk2 port Wu, Hao A
  3 siblings, 0 replies; 12+ messages in thread
From: Abner Chang @ 2020-11-23 13:47 UTC (permalink / raw)
  To: devel; +Cc: Jian J Wang, Hao A Wu, Nickle Wang, Peter O'Hanley

Add EDK2 port jansson library (JsonLib) to MdeModulePkg

Signed-off-by: Abner Chang <abner.chang@hpe.com>

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Hao A Wu <hao.a.wu@intel.com>
Cc: Nickle Wang <nickle.wang@hpe.com>
Cc: Peter O'Hanley <peter.ohanley@hpe.com>
---
 MdeModulePkg/MdeModulePkg.dec | 7 ++++++-
 MdeModulePkg/MdeModulePkg.dsc | 4 +++-
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec
index 9b52b34494..fb755425a8 100644
--- a/MdeModulePkg/MdeModulePkg.dec
+++ b/MdeModulePkg/MdeModulePkg.dec
@@ -6,7 +6,7 @@
 # Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
 # Copyright (c) 2007 - 2020, Intel Corporation. All rights reserved.<BR>
 # Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
-# (C) Copyright 2016 - 2019 Hewlett Packard Enterprise Development LP<BR>
+# (C) Copyright 2016 - 2020 Hewlett Packard Enterprise Development LP<BR>
 # Copyright (c) 2017, AMD Incorporated. All rights reserved.<BR>
 # Copyright (c) Microsoft Corporation.<BR>
 # SPDX-License-Identifier: BSD-2-Clause-Patent
@@ -154,6 +154,11 @@
   #
   VariablePolicyHelperLib|Include/Library/VariablePolicyHelperLib.h
 
+  ## @libraryclass  Provides the library functions based on third party
+  # jansson library to manipulate JSON data structure.
+  #
+  JsonLib|Include/Library/JsonLib.h
+
 [Guids]
   ## MdeModule package token space guid
   # Include/Guid/MdeModulePkgTokenSpace.h
diff --git a/MdeModulePkg/MdeModulePkg.dsc b/MdeModulePkg/MdeModulePkg.dsc
index 90165ca443..a1325370a9 100644
--- a/MdeModulePkg/MdeModulePkg.dsc
+++ b/MdeModulePkg/MdeModulePkg.dsc
@@ -1,7 +1,7 @@
 ## @file
 # EFI/PI Reference Module Package for All Architectures
 #
-# (C) Copyright 2014 Hewlett-Packard Development Company, L.P.<BR>
+# (C) Copyright 2014 - 2020 Hewlett-Packard Development Company, L.P.<BR>
 # Copyright (c) 2007 - 2019, Intel Corporation. All rights reserved.<BR>
 # Copyright (c) Microsoft Corporation.
 #
@@ -100,6 +100,7 @@
   SafeIntLib|MdePkg/Library/BaseSafeIntLib/BaseSafeIntLib.inf
   DisplayUpdateProgressLib|MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProgressLibGraphics.inf
   VariablePolicyHelperLib|MdeModulePkg/Library/VariablePolicyHelperLib/VariablePolicyHelperLib.inf
+  JsonLib|MdeModulePkg/Library/JsonLib/JsonLib.inf
 
 [LibraryClasses.EBC.PEIM]
   IoLib|MdePkg/Library/PeiIoLibCpuIo/PeiIoLibCpuIo.inf
@@ -329,6 +330,7 @@
   MdeModulePkg/Library/BaseBmpSupportLib/BaseBmpSupportLib.inf
   MdeModulePkg/Library/DisplayUpdateProgressLibGraphics/DisplayUpdateProgressLibGraphics.inf
   MdeModulePkg/Library/DisplayUpdateProgressLibText/DisplayUpdateProgressLibText.inf
+  MdeModulePkg/Library/JsonLib/JsonLib.inf
 
   MdeModulePkg/Universal/BdsDxe/BdsDxe.inf
   MdeModulePkg/Application/BootManagerMenuApp/BootManagerMenuApp.inf
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [PATCH 1/3] edk2: jansson submodule of JSON library
  2020-11-23 13:47 ` [PATCH 1/3] edk2: jansson submodule of JSON library Abner Chang
@ 2020-11-23 23:32   ` Laszlo Ersek
  2020-11-24  1:13     ` [edk2-devel] " Abner Chang
  0 siblings, 1 reply; 12+ messages in thread
From: Laszlo Ersek @ 2020-11-23 23:32 UTC (permalink / raw)
  To: Abner Chang, devel
  Cc: Andrew Fish, Leif Lindholm, Michael D Kinney, Nickle Wang,
	Peter O'Hanley

On 11/23/20 14:47, Abner Chang wrote:
> Add jansson git submodule
> 
> Signed-off-by: Abner Chang <abner.chang@hpe.com>
> 
> Cc: Andrew Fish <afish@apple.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Leif Lindholm <leif@nuviainc.com>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Nickle Wang <nickle.wang@hpe.com>
> Cc: Peter O'Hanley <peter.ohanley@hpe.com>
> ---
>  .gitmodules                          | 3 +++
>  MdeModulePkg/Library/JsonLib/jansson | 1 +
>  ReadMe.rst                           | 1 +
>  3 files changed, 5 insertions(+)
>  create mode 160000 MdeModulePkg/Library/JsonLib/jansson
> 
> diff --git a/.gitmodules b/.gitmodules
> index c3a4e4aeca..77037b07b2 100644
> --- a/.gitmodules
> +++ b/.gitmodules
> @@ -17,3 +17,6 @@
>  	path = BaseTools/Source/C/BrotliCompress/brotli
>  	url = https://github.com/google/brotli
>  	ignore = untracked
> +[submodule "MdeModulePkg/Library/JsonLib/jansson"]
> +	path = MdeModulePkg/Library/JsonLib/jansson
> +	url = https://github.com/akheron/jansson
> diff --git a/MdeModulePkg/Library/JsonLib/jansson b/MdeModulePkg/Library/JsonLib/jansson
> new file mode 160000
> index 0000000000..e9ebfa7e77
> --- /dev/null
> +++ b/MdeModulePkg/Library/JsonLib/jansson
> @@ -0,0 +1 @@
> +Subproject commit e9ebfa7e77a6bee77df44e096b100e7131044059
> diff --git a/ReadMe.rst b/ReadMe.rst
> index c3c8178373..259739b5a3 100644
> --- a/ReadMe.rst
> +++ b/ReadMe.rst
> @@ -93,6 +93,7 @@ that are covered by additional licenses.
>  -  `MdeModulePkg/Library/BrotliCustomDecompressLib/brotli <https://github.com/google/brotli/blob/666c3280cc11dc433c303d79a83d4ffbdd12cc8d/LICENSE>`__
>  -  `MdeModulePkg/Universal/RegularExpressionDxe/oniguruma <https://github.com/kkos/oniguruma/blob/abfc8ff81df4067f309032467785e06975678f0d/COPYING>`__
>  -  `UnitTestFrameworkPkg/Library/CmockaLib/cmocka <https://git.cryptomilk.org/projects/cmocka.git/tree/COPYING?h=cmocka-1.1.5&id=f5e2cd77c88d9f792562888d2b70c5a396bfbf7a>`__
> +-  `MdeModulePkg/Library/JsonLib/jansson <https://github.com/akheron/jansson/blob/master/LICENSE>`__

(1) The link to the license file should not include a branch reference,
such as "master", given that "master" is a moving target, and if the
license of the subproject changes, we shouldn't silently advance to
that, even with a documentation link like the one above.

Instead, the link should point into the specific tree that our submodule
actually references (namely the tree at commit
e9ebfa7e77a6bee77df44e096b100e7131044059).

The right link for that seems to be:

https://github.com/akheron/jansson/blob/e9ebfa7e77a6bee77df44e096b100e7131044059/LICENSE

(2) The commit message is nearly useless. It should state what we need
the library for, and it should also highlight its license (MIT).


The rest is for the MdeModulePkg reviewers to check. You forgot to CC
them -- please use "BaseTools/Scripts/GetMaintainer.py".

Thanks
Laszlo


>  
>  The EDK II Project is composed of packages. The maintainers for each package
>  are listed in `Maintainers.txt <Maintainers.txt>`__.
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [edk2-devel] [PATCH 1/3] edk2: jansson submodule of JSON library
  2020-11-23 23:32   ` Laszlo Ersek
@ 2020-11-24  1:13     ` Abner Chang
  0 siblings, 0 replies; 12+ messages in thread
From: Abner Chang @ 2020-11-24  1:13 UTC (permalink / raw)
  To: devel@edk2.groups.io, lersek@redhat.com
  Cc: Andrew Fish, Leif Lindholm, Michael D Kinney,
	Wang, Nickle (HPS SW), O'Hanley, Peter (EXL)



> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Laszlo Ersek
> Sent: Tuesday, November 24, 2020 7:32 AM
> To: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>;
> devel@edk2.groups.io
> Cc: Andrew Fish <afish@apple.com>; Leif Lindholm <leif@nuviainc.com>;
> Michael D Kinney <michael.d.kinney@intel.com>; Wang, Nickle (HPS SW)
> <nickle.wang@hpe.com>; O'Hanley, Peter (EXL) <peter.ohanley@hpe.com>
> Subject: Re: [edk2-devel] [PATCH 1/3] edk2: jansson submodule of JSON
> library
> 
> On 11/23/20 14:47, Abner Chang wrote:
> > Add jansson git submodule
> >
> > Signed-off-by: Abner Chang <abner.chang@hpe.com>
> >
> > Cc: Andrew Fish <afish@apple.com>
> > Cc: Laszlo Ersek <lersek@redhat.com>
> > Cc: Leif Lindholm <leif@nuviainc.com>
> > Cc: Michael D Kinney <michael.d.kinney@intel.com>
> > Cc: Nickle Wang <nickle.wang@hpe.com>
> > Cc: Peter O'Hanley <peter.ohanley@hpe.com>
> > ---
> >  .gitmodules                          | 3 +++
> >  MdeModulePkg/Library/JsonLib/jansson | 1 +
> >  ReadMe.rst                           | 1 +
> >  3 files changed, 5 insertions(+)
> >  create mode 160000 MdeModulePkg/Library/JsonLib/jansson
> >
> > diff --git a/.gitmodules b/.gitmodules index c3a4e4aeca..77037b07b2
> > 100644
> > --- a/.gitmodules
> > +++ b/.gitmodules
> > @@ -17,3 +17,6 @@
> >  	path = BaseTools/Source/C/BrotliCompress/brotli
> >  	url = https://github.com/google/brotli
> >  	ignore = untracked
> > +[submodule "MdeModulePkg/Library/JsonLib/jansson"]
> > +	path = MdeModulePkg/Library/JsonLib/jansson
> > +	url = https://github.com/akheron/jansson
> > diff --git a/MdeModulePkg/Library/JsonLib/jansson
> > b/MdeModulePkg/Library/JsonLib/jansson
> > new file mode 160000
> > index 0000000000..e9ebfa7e77
> > --- /dev/null
> > +++ b/MdeModulePkg/Library/JsonLib/jansson
> > @@ -0,0 +1 @@
> > +Subproject commit e9ebfa7e77a6bee77df44e096b100e7131044059
> > diff --git a/ReadMe.rst b/ReadMe.rst
> > index c3c8178373..259739b5a3 100644
> > --- a/ReadMe.rst
> > +++ b/ReadMe.rst
> > @@ -93,6 +93,7 @@ that are covered by additional licenses.
> >  -  `MdeModulePkg/Library/BrotliCustomDecompressLib/brotli
> >
> <https://github.com/google/brotli/blob/666c3280cc11dc433c303d79a83d4ff
> > bdd12cc8d/LICENSE>`__
> >  -  `MdeModulePkg/Universal/RegularExpressionDxe/oniguruma
> >
> <https://github.com/kkos/oniguruma/blob/abfc8ff81df4067f309032467785e
> 0
> > 6975678f0d/COPYING>`__
> >  -  `UnitTestFrameworkPkg/Library/CmockaLib/cmocka
> > <INVALID URI REMOVED
> > rg_projects_cmocka.git_tree_COPYING-3Fh-3Dcmocka-2D1.1.5-26id-
> 3Df5e2cd
> >
> 77c88d9f792562888d2b70c5a396bfbf7a&d=DwICaQ&c=C5b8zRQO1miGmBeV
> Z2LFWg&r
> >
> =_SN6FZBN4Vgi4Ulkskz6qU3NYRO03nHp9P7Z5q59A3E&m=w2vLHoLT1tVVDc
> 7zgKcnNxx
> > 7xzUcHhtfCzTH3R6_Yz8&s=savDVHnEb-
> _rtZe8RuqFKHVzAyD1e_a0jM7VbuimIjo&e=
> > >`__
> > +-  `MdeModulePkg/Library/JsonLib/jansson
> > +<https://github.com/akheron/jansson/blob/master/LICENSE>`__
> 
> (1) The link to the license file should not include a branch reference, such as
> "master", given that "master" is a moving target, and if the license of the
> subproject changes, we shouldn't silently advance to that, even with a
> documentation link like the one above.
> 
> Instead, the link should point into the specific tree that our submodule
> actually references (namely the tree at commit
> e9ebfa7e77a6bee77df44e096b100e7131044059).
> 
> The right link for that seems to be:
> 
> https://github.com/akheron/jansson/blob/e9ebfa7e77a6bee77df44e096b10
> 0e7131044059/LICENSE
Ok. 
> 
> (2) The commit message is nearly useless. It should state what we need the
> library for, and it should also highlight its license (MIT).
> 
> 
> The rest is for the MdeModulePkg reviewers to check. You forgot to CC them
> -- please use "BaseTools/Scripts/GetMaintainer.py".
I missed MdeModulePkg owner for the jansson lib. Will resend it.
> 
> Thanks
> Laszlo
> 
> 
> >
> >  The EDK II Project is composed of packages. The maintainers for each
> > package  are listed in `Maintainers.txt <Maintainers.txt>`__.
> >
> 
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [PATCH 0/3] JsonLib: jansson edk2 port
  2020-11-23 13:47 [PATCH 0/3] JsonLib: jansson edk2 port Abner Chang
                   ` (2 preceding siblings ...)
  2020-11-23 13:47 ` [PATCH 3/3] MdeModulePkg: Add " Abner Chang
@ 2020-11-24  1:19 ` Wu, Hao A
  2020-11-24  1:30   ` [edk2-devel] " Abner Chang
  3 siblings, 1 reply; 12+ messages in thread
From: Wu, Hao A @ 2020-11-24  1:19 UTC (permalink / raw)
  To: Abner Chang, devel@edk2.groups.io
  Cc: Wang, Jian J, Andrew Fish, Laszlo Ersek, Leif Lindholm,
	Kinney, Michael D, Nickle Wang, Peter O'Hanley

> -----Original Message-----
> From: Abner Chang <abner.chang@hpe.com>
> Sent: Monday, November 23, 2020 9:47 PM
> To: devel@edk2.groups.io
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A <hao.a.wu@intel.com>;
> Andrew Fish <afish@apple.com>; Laszlo Ersek <lersek@redhat.com>; Leif
> Lindholm <leif@nuviainc.com>; Kinney, Michael D
> <michael.d.kinney@intel.com>; Nickle Wang <nickle.wang@hpe.com>;
> Peter O'Hanley <peter.ohanley@hpe.com>
> Subject: [PATCH 0/3] JsonLib: jansson edk2 port
> 
> This set of pactehs is sent for the comments on edk2 JSON library.
> edk2 JSON library is based on jansson open source
> (https://github.com/akheron/jansson) and wrapped as an edk2 library. edk2
> JsonLib will be used by edk2 Redfish feature drivers (not contributed yet)


Hello,

Sorry for possibly missing previous discussions on the Redfish feature.
I am wondering is it more straight-forward to put the JsonLib together with the Readfish codes under RedfishPkg?

Best Regards,
Hao Wu


> and the edk2 port of libredfish library (not contributed yet) based on DMTF
> GitHub (https://github.com/DMTF/libredfish).
> 
> You will encounterred the build error with the jansson library pointed in
> submoudle (v2.13.1) and the fix is already submitted to jansson open source
> (https://github.com/akheron/jansson/pull/558).
> 
> Signed-off-by: Abner Chang <abner.chang@hpe.com>
> 
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Hao A Wu <hao.a.wu@intel.com>
> Cc: Andrew Fish <afish@apple.com>
> Cc: Laszlo Ersek <lersek@redhat.com>
> Cc: Leif Lindholm <leif@nuviainc.com>
> Cc: Michael D Kinney <michael.d.kinney@intel.com>
> Cc: Nickle Wang <nickle.wang@hpe.com>
> Cc: Peter O'Hanley <peter.ohanley@hpe.com>
> 
> Abner Chang (3):
>   edk2: jansson submodule of JSON library
>   MdeModulePkg/library: EDK2 port jansson library
>   MdeModulePkg: Add EDK2 port jansson library
> 
>  .gitmodules                                   |   3 +
>  MdeModulePkg/Include/Library/JsonLib.h        | 596 +++++++++++++
>  .../Library/JsonLib/JanssonCrtLibSupport.c    | 705 +++++++++++++++
>  .../Library/JsonLib/JanssonCrtLibSupport.h    | 198 +++++
>  MdeModulePkg/Library/JsonLib/JsonLib.c        | 805 ++++++++++++++++++
>  MdeModulePkg/Library/JsonLib/JsonLib.inf      |  81 ++
>  MdeModulePkg/Library/JsonLib/JsonUtilities.c  | 417 +++++++++
> MdeModulePkg/Library/JsonLib/JsonUtilities.h  |  69 ++
>  MdeModulePkg/Library/JsonLib/assert.h         |  11 +
>  MdeModulePkg/Library/JsonLib/errno.h          |  11 +
>  MdeModulePkg/Library/JsonLib/jansson          |   1 +
>  MdeModulePkg/Library/JsonLib/jansson_config.h |  57
> ++  .../Library/JsonLib/jansson_private_config.h  |  19 +
>  MdeModulePkg/Library/JsonLib/limits.h         |  11 +
>  MdeModulePkg/Library/JsonLib/math.h           |  11 +
>  MdeModulePkg/Library/JsonLib/stdarg.h         |  11 +
>  MdeModulePkg/Library/JsonLib/stddef.h         |  11 +
>  MdeModulePkg/Library/JsonLib/stdio.h          |  11 +
>  MdeModulePkg/Library/JsonLib/stdlib.h         |  11 +
>  MdeModulePkg/Library/JsonLib/string.h         |  11 +
>  MdeModulePkg/Library/JsonLib/sys/time.h       |  11 +
>  MdeModulePkg/Library/JsonLib/sys/types.h      |  10 +
>  MdeModulePkg/Library/JsonLib/time.h           |  11 +
>  MdeModulePkg/MdeModulePkg.dec                 |   7 +-
>  MdeModulePkg/MdeModulePkg.dsc                 |   4 +-
>  ReadMe.rst                                    |   1 +
>  26 files changed, 3092 insertions(+), 2 deletions(-)  create mode 100644
> MdeModulePkg/Include/Library/JsonLib.h
>  create mode 100644
> MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c
>  create mode 100644
> MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.c
>  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.inf
>  create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.c
>  create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/assert.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/errno.h
>  create mode 160000 MdeModulePkg/Library/JsonLib/jansson
>  create mode 100644 MdeModulePkg/Library/JsonLib/jansson_config.h
>  create mode 100644
> MdeModulePkg/Library/JsonLib/jansson_private_config.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/limits.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/math.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/stdarg.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/stddef.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/stdio.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/stdlib.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/string.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/sys/time.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/sys/types.h
>  create mode 100644 MdeModulePkg/Library/JsonLib/time.h
> 
> --
> 2.17.1


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
  2020-11-24  1:19 ` [PATCH 0/3] JsonLib: jansson edk2 port Wu, Hao A
@ 2020-11-24  1:30   ` Abner Chang
  2020-11-24  1:50     ` Wu, Hao A
  0 siblings, 1 reply; 12+ messages in thread
From: Abner Chang @ 2020-11-24  1:30 UTC (permalink / raw)
  To: devel@edk2.groups.io, hao.a.wu@intel.com
  Cc: Wang, Jian J, Andrew Fish, Laszlo Ersek, Leif Lindholm,
	Kinney, Michael D, Wang, Nickle (HPS SW),
	O'Hanley, Peter (EXL)



> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Wu, Hao A
> Sent: Tuesday, November 24, 2020 9:20 AM
> To: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>;
> devel@edk2.groups.io
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish <afish@apple.com>;
> Laszlo Ersek <lersek@redhat.com>; Leif Lindholm <leif@nuviainc.com>;
> Kinney, Michael D <michael.d.kinney@intel.com>; Wang, Nickle (HPS SW)
> <nickle.wang@hpe.com>; O'Hanley, Peter (EXL) <peter.ohanley@hpe.com>
> Subject: Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> 
> > -----Original Message-----
> > From: Abner Chang <abner.chang@hpe.com>
> > Sent: Monday, November 23, 2020 9:47 PM
> > To: devel@edk2.groups.io
> > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > <hao.a.wu@intel.com>; Andrew Fish <afish@apple.com>; Laszlo Ersek
> > <lersek@redhat.com>; Leif Lindholm <leif@nuviainc.com>; Kinney,
> > Michael D <michael.d.kinney@intel.com>; Nickle Wang
> > <nickle.wang@hpe.com>; Peter O'Hanley <peter.ohanley@hpe.com>
> > Subject: [PATCH 0/3] JsonLib: jansson edk2 port
> >
> > This set of pactehs is sent for the comments on edk2 JSON library.
> > edk2 JSON library is based on jansson open source
> > (https://github.com/akheron/jansson) and wrapped as an edk2 library.
> > edk2 JsonLib will be used by edk2 Redfish feature drivers (not
> > contributed yet)
> 
> 
> Hello,
> 
> Sorry for possibly missing previous discussions on the Redfish feature.
> I am wondering is it more straight-forward to put the JsonLib together with
> the Readfish codes under RedfishPkg?
Hi Hao, 
The idea is JSON is not the representation of data payload for Redfish only and JsonLib could be not only for Redfish neither. Any applications which use JSON as data payload can leverage JsonLib.

Thanks
Abner
> 
> Best Regards,
> Hao Wu
> 
> 
> > and the edk2 port of libredfish library (not contributed yet) based on
> > DMTF GitHub (https://github.com/DMTF/libredfish).
> >
> > You will encounterred the build error with the jansson library pointed
> > in submoudle (v2.13.1) and the fix is already submitted to jansson
> > open source (https://github.com/akheron/jansson/pull/558).
> >
> > Signed-off-by: Abner Chang <abner.chang@hpe.com>
> >
> > Cc: Jian J Wang <jian.j.wang@intel.com>
> > Cc: Hao A Wu <hao.a.wu@intel.com>
> > Cc: Andrew Fish <afish@apple.com>
> > Cc: Laszlo Ersek <lersek@redhat.com>
> > Cc: Leif Lindholm <leif@nuviainc.com>
> > Cc: Michael D Kinney <michael.d.kinney@intel.com>
> > Cc: Nickle Wang <nickle.wang@hpe.com>
> > Cc: Peter O'Hanley <peter.ohanley@hpe.com>
> >
> > Abner Chang (3):
> >   edk2: jansson submodule of JSON library
> >   MdeModulePkg/library: EDK2 port jansson library
> >   MdeModulePkg: Add EDK2 port jansson library
> >
> >  .gitmodules                                   |   3 +
> >  MdeModulePkg/Include/Library/JsonLib.h        | 596 +++++++++++++
> >  .../Library/JsonLib/JanssonCrtLibSupport.c    | 705 +++++++++++++++
> >  .../Library/JsonLib/JanssonCrtLibSupport.h    | 198 +++++
> >  MdeModulePkg/Library/JsonLib/JsonLib.c        | 805
> ++++++++++++++++++
> >  MdeModulePkg/Library/JsonLib/JsonLib.inf      |  81 ++
> >  MdeModulePkg/Library/JsonLib/JsonUtilities.c  | 417 +++++++++
> > MdeModulePkg/Library/JsonLib/JsonUtilities.h  |  69 ++
> >  MdeModulePkg/Library/JsonLib/assert.h         |  11 +
> >  MdeModulePkg/Library/JsonLib/errno.h          |  11 +
> >  MdeModulePkg/Library/JsonLib/jansson          |   1 +
> >  MdeModulePkg/Library/JsonLib/jansson_config.h |  57
> > ++  .../Library/JsonLib/jansson_private_config.h  |  19 +
> >  MdeModulePkg/Library/JsonLib/limits.h         |  11 +
> >  MdeModulePkg/Library/JsonLib/math.h           |  11 +
> >  MdeModulePkg/Library/JsonLib/stdarg.h         |  11 +
> >  MdeModulePkg/Library/JsonLib/stddef.h         |  11 +
> >  MdeModulePkg/Library/JsonLib/stdio.h          |  11 +
> >  MdeModulePkg/Library/JsonLib/stdlib.h         |  11 +
> >  MdeModulePkg/Library/JsonLib/string.h         |  11 +
> >  MdeModulePkg/Library/JsonLib/sys/time.h       |  11 +
> >  MdeModulePkg/Library/JsonLib/sys/types.h      |  10 +
> >  MdeModulePkg/Library/JsonLib/time.h           |  11 +
> >  MdeModulePkg/MdeModulePkg.dec                 |   7 +-
> >  MdeModulePkg/MdeModulePkg.dsc                 |   4 +-
> >  ReadMe.rst                                    |   1 +
> >  26 files changed, 3092 insertions(+), 2 deletions(-)  create mode
> > 100644 MdeModulePkg/Include/Library/JsonLib.h
> >  create mode 100644
> > MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c
> >  create mode 100644
> > MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.c
> >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.inf
> >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.c
> >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/assert.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/errno.h
> >  create mode 160000 MdeModulePkg/Library/JsonLib/jansson
> >  create mode 100644 MdeModulePkg/Library/JsonLib/jansson_config.h
> >  create mode 100644
> > MdeModulePkg/Library/JsonLib/jansson_private_config.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/limits.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/math.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/stdarg.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/stddef.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/stdio.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/stdlib.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/string.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/sys/time.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/sys/types.h
> >  create mode 100644 MdeModulePkg/Library/JsonLib/time.h
> >
> > --
> > 2.17.1
> 
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
  2020-11-24  1:30   ` [edk2-devel] " Abner Chang
@ 2020-11-24  1:50     ` Wu, Hao A
  2020-11-24  2:02       ` Abner Chang
  0 siblings, 1 reply; 12+ messages in thread
From: Wu, Hao A @ 2020-11-24  1:50 UTC (permalink / raw)
  To: Chang, Abner (HPS SW/FW Technologist), devel@edk2.groups.io
  Cc: Wang, Jian J, Andrew Fish, Laszlo Ersek, Leif Lindholm,
	Kinney, Michael D, Wang, Nickle (HPS SW),
	O'Hanley, Peter (EXL)

> -----Original Message-----
> From: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>
> Sent: Tuesday, November 24, 2020 9:31 AM
> To: devel@edk2.groups.io; Wu, Hao A <hao.a.wu@intel.com>
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish <afish@apple.com>;
> Laszlo Ersek <lersek@redhat.com>; Leif Lindholm <leif@nuviainc.com>;
> Kinney, Michael D <michael.d.kinney@intel.com>; Wang, Nickle (HPS SW)
> <nickle.wang@hpe.com>; O'Hanley, Peter (EXL) <peter.ohanley@hpe.com>
> Subject: RE: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> 
> 
> 
> > -----Original Message-----
> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> > Wu, Hao A
> > Sent: Tuesday, November 24, 2020 9:20 AM
> > To: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>;
> > devel@edk2.groups.io
> > Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish
> > <afish@apple.com>; Laszlo Ersek <lersek@redhat.com>; Leif Lindholm
> > <leif@nuviainc.com>; Kinney, Michael D <michael.d.kinney@intel.com>;
> > Wang, Nickle (HPS SW) <nickle.wang@hpe.com>; O'Hanley, Peter (EXL)
> > <peter.ohanley@hpe.com>
> > Subject: Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> >
> > > -----Original Message-----
> > > From: Abner Chang <abner.chang@hpe.com>
> > > Sent: Monday, November 23, 2020 9:47 PM
> > > To: devel@edk2.groups.io
> > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > > <hao.a.wu@intel.com>; Andrew Fish <afish@apple.com>; Laszlo Ersek
> > > <lersek@redhat.com>; Leif Lindholm <leif@nuviainc.com>; Kinney,
> > > Michael D <michael.d.kinney@intel.com>; Nickle Wang
> > > <nickle.wang@hpe.com>; Peter O'Hanley <peter.ohanley@hpe.com>
> > > Subject: [PATCH 0/3] JsonLib: jansson edk2 port
> > >
> > > This set of pactehs is sent for the comments on edk2 JSON library.
> > > edk2 JSON library is based on jansson open source
> > > (https://github.com/akheron/jansson) and wrapped as an edk2 library.
> > > edk2 JsonLib will be used by edk2 Redfish feature drivers (not
> > > contributed yet)
> >
> >
> > Hello,
> >
> > Sorry for possibly missing previous discussions on the Redfish feature.
> > I am wondering is it more straight-forward to put the JsonLib together
> > with the Readfish codes under RedfishPkg?
> Hi Hao,
> The idea is JSON is not the representation of data payload for Redfish only
> and JsonLib could be not only for Redfish neither. Any applications which use
> JSON as data payload can leverage JsonLib.


Thanks,

My concern is for the case of adding a common library/module, MdeModulePkg
usually seems to be the destination. But since MdeModulePkg is already a huge
and complex package, I am not sure if this is the right way to go.

I would like to get the inputs on other reviewers for putting the JsonLib under
MdeModulePkg.

If this is the right direction, could you help to add an item in the
Maintainers.txt for the Json related stuff in MdeModulePkg and list you
(and 1 more person will be appreciated) as the reviewer?

Thanks in advance.

Best Regards,
Hao Wu


> 
> Thanks
> Abner
> >
> > Best Regards,
> > Hao Wu
> >
> >
> > > and the edk2 port of libredfish library (not contributed yet) based
> > > on DMTF GitHub (https://github.com/DMTF/libredfish).
> > >
> > > You will encounterred the build error with the jansson library
> > > pointed in submoudle (v2.13.1) and the fix is already submitted to
> > > jansson open source (https://github.com/akheron/jansson/pull/558).
> > >
> > > Signed-off-by: Abner Chang <abner.chang@hpe.com>
> > >
> > > Cc: Jian J Wang <jian.j.wang@intel.com>
> > > Cc: Hao A Wu <hao.a.wu@intel.com>
> > > Cc: Andrew Fish <afish@apple.com>
> > > Cc: Laszlo Ersek <lersek@redhat.com>
> > > Cc: Leif Lindholm <leif@nuviainc.com>
> > > Cc: Michael D Kinney <michael.d.kinney@intel.com>
> > > Cc: Nickle Wang <nickle.wang@hpe.com>
> > > Cc: Peter O'Hanley <peter.ohanley@hpe.com>
> > >
> > > Abner Chang (3):
> > >   edk2: jansson submodule of JSON library
> > >   MdeModulePkg/library: EDK2 port jansson library
> > >   MdeModulePkg: Add EDK2 port jansson library
> > >
> > >  .gitmodules                                   |   3 +
> > >  MdeModulePkg/Include/Library/JsonLib.h        | 596 +++++++++++++
> > >  .../Library/JsonLib/JanssonCrtLibSupport.c    | 705 +++++++++++++++
> > >  .../Library/JsonLib/JanssonCrtLibSupport.h    | 198 +++++
> > >  MdeModulePkg/Library/JsonLib/JsonLib.c        | 805
> > ++++++++++++++++++
> > >  MdeModulePkg/Library/JsonLib/JsonLib.inf      |  81 ++
> > >  MdeModulePkg/Library/JsonLib/JsonUtilities.c  | 417 +++++++++
> > > MdeModulePkg/Library/JsonLib/JsonUtilities.h  |  69 ++
> > >  MdeModulePkg/Library/JsonLib/assert.h         |  11 +
> > >  MdeModulePkg/Library/JsonLib/errno.h          |  11 +
> > >  MdeModulePkg/Library/JsonLib/jansson          |   1 +
> > >  MdeModulePkg/Library/JsonLib/jansson_config.h |  57
> > > ++  .../Library/JsonLib/jansson_private_config.h  |  19 +
> > >  MdeModulePkg/Library/JsonLib/limits.h         |  11 +
> > >  MdeModulePkg/Library/JsonLib/math.h           |  11 +
> > >  MdeModulePkg/Library/JsonLib/stdarg.h         |  11 +
> > >  MdeModulePkg/Library/JsonLib/stddef.h         |  11 +
> > >  MdeModulePkg/Library/JsonLib/stdio.h          |  11 +
> > >  MdeModulePkg/Library/JsonLib/stdlib.h         |  11 +
> > >  MdeModulePkg/Library/JsonLib/string.h         |  11 +
> > >  MdeModulePkg/Library/JsonLib/sys/time.h       |  11 +
> > >  MdeModulePkg/Library/JsonLib/sys/types.h      |  10 +
> > >  MdeModulePkg/Library/JsonLib/time.h           |  11 +
> > >  MdeModulePkg/MdeModulePkg.dec                 |   7 +-
> > >  MdeModulePkg/MdeModulePkg.dsc                 |   4 +-
> > >  ReadMe.rst                                    |   1 +
> > >  26 files changed, 3092 insertions(+), 2 deletions(-)  create mode
> > > 100644 MdeModulePkg/Include/Library/JsonLib.h
> > >  create mode 100644
> > > MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c
> > >  create mode 100644
> > > MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.c
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.inf
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.c
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/assert.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/errno.h
> > >  create mode 160000 MdeModulePkg/Library/JsonLib/jansson
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/jansson_config.h
> > >  create mode 100644
> > > MdeModulePkg/Library/JsonLib/jansson_private_config.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/limits.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/math.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdarg.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/stddef.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdio.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdlib.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/string.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/sys/time.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/sys/types.h
> > >  create mode 100644 MdeModulePkg/Library/JsonLib/time.h
> > >
> > > --
> > > 2.17.1
> >
> >
> >
> > 
> >
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
  2020-11-24  1:50     ` Wu, Hao A
@ 2020-11-24  2:02       ` Abner Chang
  2020-11-25  3:19         ` 回复: " gaoliming
  0 siblings, 1 reply; 12+ messages in thread
From: Abner Chang @ 2020-11-24  2:02 UTC (permalink / raw)
  To: devel@edk2.groups.io, hao.a.wu@intel.com
  Cc: Wang, Jian J, Andrew Fish, Laszlo Ersek, Leif Lindholm,
	Kinney, Michael D, Wang, Nickle (HPS SW),
	O'Hanley, Peter (EXL)



> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Wu, Hao A
> Sent: Tuesday, November 24, 2020 9:50 AM
> To: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>;
> devel@edk2.groups.io
> Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish <afish@apple.com>;
> Laszlo Ersek <lersek@redhat.com>; Leif Lindholm <leif@nuviainc.com>;
> Kinney, Michael D <michael.d.kinney@intel.com>; Wang, Nickle (HPS SW)
> <nickle.wang@hpe.com>; O'Hanley, Peter (EXL) <peter.ohanley@hpe.com>
> Subject: Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> 
> > -----Original Message-----
> > From: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>
> > Sent: Tuesday, November 24, 2020 9:31 AM
> > To: devel@edk2.groups.io; Wu, Hao A <hao.a.wu@intel.com>
> > Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish
> > <afish@apple.com>; Laszlo Ersek <lersek@redhat.com>; Leif Lindholm
> > <leif@nuviainc.com>; Kinney, Michael D <michael.d.kinney@intel.com>;
> > Wang, Nickle (HPS SW) <nickle.wang@hpe.com>; O'Hanley, Peter (EXL)
> > <peter.ohanley@hpe.com>
> > Subject: RE: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> >
> >
> >
> > > -----Original Message-----
> > > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf
> > > Of Wu, Hao A
> > > Sent: Tuesday, November 24, 2020 9:20 AM
> > > To: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>;
> > > devel@edk2.groups.io
> > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish
> > > <afish@apple.com>; Laszlo Ersek <lersek@redhat.com>; Leif Lindholm
> > > <leif@nuviainc.com>; Kinney, Michael D <michael.d.kinney@intel.com>;
> > > Wang, Nickle (HPS SW) <nickle.wang@hpe.com>; O'Hanley, Peter (EXL)
> > > <peter.ohanley@hpe.com>
> > > Subject: Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> > >
> > > > -----Original Message-----
> > > > From: Abner Chang <abner.chang@hpe.com>
> > > > Sent: Monday, November 23, 2020 9:47 PM
> > > > To: devel@edk2.groups.io
> > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > > > <hao.a.wu@intel.com>; Andrew Fish <afish@apple.com>; Laszlo Ersek
> > > > <lersek@redhat.com>; Leif Lindholm <leif@nuviainc.com>; Kinney,
> > > > Michael D <michael.d.kinney@intel.com>; Nickle Wang
> > > > <nickle.wang@hpe.com>; Peter O'Hanley <peter.ohanley@hpe.com>
> > > > Subject: [PATCH 0/3] JsonLib: jansson edk2 port
> > > >
> > > > This set of pactehs is sent for the comments on edk2 JSON library.
> > > > edk2 JSON library is based on jansson open source
> > > > (https://github.com/akheron/jansson) and wrapped as an edk2 library.
> > > > edk2 JsonLib will be used by edk2 Redfish feature drivers (not
> > > > contributed yet)
> > >
> > >
> > > Hello,
> > >
> > > Sorry for possibly missing previous discussions on the Redfish feature.
> > > I am wondering is it more straight-forward to put the JsonLib
> > > together with the Readfish codes under RedfishPkg?
> > Hi Hao,
> > The idea is JSON is not the representation of data payload for Redfish
> > only and JsonLib could be not only for Redfish neither. Any
> > applications which use JSON as data payload can leverage JsonLib.
> 
> 
> Thanks,
> 
> My concern is for the case of adding a common library/module,
> MdeModulePkg usually seems to be the destination. But since
> MdeModulePkg is already a huge and complex package, I am not sure if this
> is the right way to go.
> 
> I would like to get the inputs on other reviewers for putting the JsonLib
> under MdeModulePkg.
> 
> If this is the right direction, could you help to add an item in the
> Maintainers.txt for the Json related stuff in MdeModulePkg and list you (and
> 1 more person will be appreciated) as the reviewer?
That's no problem. We are pleased to be the reviewer of JSON lib.

Yes, see others input for JsonLib location.

Thanks
Abner
> 
> Thanks in advance.
> 
> Best Regards,
> Hao Wu
> 
> 
> >
> > Thanks
> > Abner
> > >
> > > Best Regards,
> > > Hao Wu
> > >
> > >
> > > > and the edk2 port of libredfish library (not contributed yet)
> > > > based on DMTF GitHub (https://github.com/DMTF/libredfish).
> > > >
> > > > You will encounterred the build error with the jansson library
> > > > pointed in submoudle (v2.13.1) and the fix is already submitted to
> > > > jansson open source (https://github.com/akheron/jansson/pull/558).
> > > >
> > > > Signed-off-by: Abner Chang <abner.chang@hpe.com>
> > > >
> > > > Cc: Jian J Wang <jian.j.wang@intel.com>
> > > > Cc: Hao A Wu <hao.a.wu@intel.com>
> > > > Cc: Andrew Fish <afish@apple.com>
> > > > Cc: Laszlo Ersek <lersek@redhat.com>
> > > > Cc: Leif Lindholm <leif@nuviainc.com>
> > > > Cc: Michael D Kinney <michael.d.kinney@intel.com>
> > > > Cc: Nickle Wang <nickle.wang@hpe.com>
> > > > Cc: Peter O'Hanley <peter.ohanley@hpe.com>
> > > >
> > > > Abner Chang (3):
> > > >   edk2: jansson submodule of JSON library
> > > >   MdeModulePkg/library: EDK2 port jansson library
> > > >   MdeModulePkg: Add EDK2 port jansson library
> > > >
> > > >  .gitmodules                                   |   3 +
> > > >  MdeModulePkg/Include/Library/JsonLib.h        | 596 +++++++++++++
> > > >  .../Library/JsonLib/JanssonCrtLibSupport.c    | 705 +++++++++++++++
> > > >  .../Library/JsonLib/JanssonCrtLibSupport.h    | 198 +++++
> > > >  MdeModulePkg/Library/JsonLib/JsonLib.c        | 805
> > > ++++++++++++++++++
> > > >  MdeModulePkg/Library/JsonLib/JsonLib.inf      |  81 ++
> > > >  MdeModulePkg/Library/JsonLib/JsonUtilities.c  | 417 +++++++++
> > > > MdeModulePkg/Library/JsonLib/JsonUtilities.h  |  69 ++
> > > >  MdeModulePkg/Library/JsonLib/assert.h         |  11 +
> > > >  MdeModulePkg/Library/JsonLib/errno.h          |  11 +
> > > >  MdeModulePkg/Library/JsonLib/jansson          |   1 +
> > > >  MdeModulePkg/Library/JsonLib/jansson_config.h |  57
> > > > ++  .../Library/JsonLib/jansson_private_config.h  |  19 +
> > > >  MdeModulePkg/Library/JsonLib/limits.h         |  11 +
> > > >  MdeModulePkg/Library/JsonLib/math.h           |  11 +
> > > >  MdeModulePkg/Library/JsonLib/stdarg.h         |  11 +
> > > >  MdeModulePkg/Library/JsonLib/stddef.h         |  11 +
> > > >  MdeModulePkg/Library/JsonLib/stdio.h          |  11 +
> > > >  MdeModulePkg/Library/JsonLib/stdlib.h         |  11 +
> > > >  MdeModulePkg/Library/JsonLib/string.h         |  11 +
> > > >  MdeModulePkg/Library/JsonLib/sys/time.h       |  11 +
> > > >  MdeModulePkg/Library/JsonLib/sys/types.h      |  10 +
> > > >  MdeModulePkg/Library/JsonLib/time.h           |  11 +
> > > >  MdeModulePkg/MdeModulePkg.dec                 |   7 +-
> > > >  MdeModulePkg/MdeModulePkg.dsc                 |   4 +-
> > > >  ReadMe.rst                                    |   1 +
> > > >  26 files changed, 3092 insertions(+), 2 deletions(-)  create mode
> > > > 100644 MdeModulePkg/Include/Library/JsonLib.h
> > > >  create mode 100644
> > > > MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c
> > > >  create mode 100644
> > > > MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.c
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.inf
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.c
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/assert.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/errno.h
> > > >  create mode 160000 MdeModulePkg/Library/JsonLib/jansson
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/jansson_config.h
> > > >  create mode 100644
> > > > MdeModulePkg/Library/JsonLib/jansson_private_config.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/limits.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/math.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdarg.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stddef.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdio.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdlib.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/string.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/sys/time.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/sys/types.h
> > > >  create mode 100644 MdeModulePkg/Library/JsonLib/time.h
> > > >
> > > > --
> > > > 2.17.1
> > >
> > >
> > >
> > >
> > >
> >
> 
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

* 回复: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
  2020-11-24  2:02       ` Abner Chang
@ 2020-11-25  3:19         ` gaoliming
  2020-11-26  0:40           ` Abner Chang
  0 siblings, 1 reply; 12+ messages in thread
From: gaoliming @ 2020-11-25  3:19 UTC (permalink / raw)
  To: devel, abner.chang, hao.a.wu
  Cc: 'Wang, Jian J', 'Andrew Fish',
	'Laszlo Ersek', 'Leif Lindholm',
	'Kinney, Michael D', 'Wang, Nickle (HPS SW)',
	'O'Hanley, Peter (EXL)'

Abner:
  I agree JsonLib is the generic module. But now, we know its consumer is
only RedFish. 
  So, I suggest to place it into RedFishPkg. If there is more usage model,
we can consider to move it later. 

Thanks
Liming
> -----邮件原件-----
> 发件人: bounce+27952+67861+4905953+8761045@groups.io
> <bounce+27952+67861+4905953+8761045@groups.io> 代表 Abner Chang
> 发送时间: 2020年11月24日 10:03
> 收件人: devel@edk2.groups.io; hao.a.wu@intel.com
> 抄送: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish <afish@apple.com>;
> Laszlo Ersek <lersek@redhat.com>; Leif Lindholm <leif@nuviainc.com>;
> Kinney, Michael D <michael.d.kinney@intel.com>; Wang, Nickle (HPS SW)
> <nickle.wang@hpe.com>; O'Hanley, Peter (EXL) <peter.ohanley@hpe.com>
> 主题: Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> 
> 
> 
> > -----Original Message-----
> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> > Wu, Hao A
> > Sent: Tuesday, November 24, 2020 9:50 AM
> > To: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>;
> > devel@edk2.groups.io
> > Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish <afish@apple.com>;
> > Laszlo Ersek <lersek@redhat.com>; Leif Lindholm <leif@nuviainc.com>;
> > Kinney, Michael D <michael.d.kinney@intel.com>; Wang, Nickle (HPS SW)
> > <nickle.wang@hpe.com>; O'Hanley, Peter (EXL) <peter.ohanley@hpe.com>
> > Subject: Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> >
> > > -----Original Message-----
> > > From: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>
> > > Sent: Tuesday, November 24, 2020 9:31 AM
> > > To: devel@edk2.groups.io; Wu, Hao A <hao.a.wu@intel.com>
> > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish
> > > <afish@apple.com>; Laszlo Ersek <lersek@redhat.com>; Leif Lindholm
> > > <leif@nuviainc.com>; Kinney, Michael D <michael.d.kinney@intel.com>;
> > > Wang, Nickle (HPS SW) <nickle.wang@hpe.com>; O'Hanley, Peter (EXL)
> > > <peter.ohanley@hpe.com>
> > > Subject: RE: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> > >
> > >
> > >
> > > > -----Original Message-----
> > > > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf
> > > > Of Wu, Hao A
> > > > Sent: Tuesday, November 24, 2020 9:20 AM
> > > > To: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>;
> > > > devel@edk2.groups.io
> > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish
> > > > <afish@apple.com>; Laszlo Ersek <lersek@redhat.com>; Leif Lindholm
> > > > <leif@nuviainc.com>; Kinney, Michael D <michael.d.kinney@intel.com>;
> > > > Wang, Nickle (HPS SW) <nickle.wang@hpe.com>; O'Hanley, Peter (EXL)
> > > > <peter.ohanley@hpe.com>
> > > > Subject: Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> > > >
> > > > > -----Original Message-----
> > > > > From: Abner Chang <abner.chang@hpe.com>
> > > > > Sent: Monday, November 23, 2020 9:47 PM
> > > > > To: devel@edk2.groups.io
> > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > > > > <hao.a.wu@intel.com>; Andrew Fish <afish@apple.com>; Laszlo Ersek
> > > > > <lersek@redhat.com>; Leif Lindholm <leif@nuviainc.com>; Kinney,
> > > > > Michael D <michael.d.kinney@intel.com>; Nickle Wang
> > > > > <nickle.wang@hpe.com>; Peter O'Hanley <peter.ohanley@hpe.com>
> > > > > Subject: [PATCH 0/3] JsonLib: jansson edk2 port
> > > > >
> > > > > This set of pactehs is sent for the comments on edk2 JSON library.
> > > > > edk2 JSON library is based on jansson open source
> > > > > (https://github.com/akheron/jansson) and wrapped as an edk2
library.
> > > > > edk2 JsonLib will be used by edk2 Redfish feature drivers (not
> > > > > contributed yet)
> > > >
> > > >
> > > > Hello,
> > > >
> > > > Sorry for possibly missing previous discussions on the Redfish
feature.
> > > > I am wondering is it more straight-forward to put the JsonLib
> > > > together with the Readfish codes under RedfishPkg?
> > > Hi Hao,
> > > The idea is JSON is not the representation of data payload for Redfish
> > > only and JsonLib could be not only for Redfish neither. Any
> > > applications which use JSON as data payload can leverage JsonLib.
> >
> >
> > Thanks,
> >
> > My concern is for the case of adding a common library/module,
> > MdeModulePkg usually seems to be the destination. But since
> > MdeModulePkg is already a huge and complex package, I am not sure if
this
> > is the right way to go.
> >
> > I would like to get the inputs on other reviewers for putting the
JsonLib
> > under MdeModulePkg.
> >
> > If this is the right direction, could you help to add an item in the
> > Maintainers.txt for the Json related stuff in MdeModulePkg and list you
(and
> > 1 more person will be appreciated) as the reviewer?
> That's no problem. We are pleased to be the reviewer of JSON lib.
> 
> Yes, see others input for JsonLib location.
> 
> Thanks
> Abner
> >
> > Thanks in advance.
> >
> > Best Regards,
> > Hao Wu
> >
> >
> > >
> > > Thanks
> > > Abner
> > > >
> > > > Best Regards,
> > > > Hao Wu
> > > >
> > > >
> > > > > and the edk2 port of libredfish library (not contributed yet)
> > > > > based on DMTF GitHub (https://github.com/DMTF/libredfish).
> > > > >
> > > > > You will encounterred the build error with the jansson library
> > > > > pointed in submoudle (v2.13.1) and the fix is already submitted to
> > > > > jansson open source (https://github.com/akheron/jansson/pull/558).
> > > > >
> > > > > Signed-off-by: Abner Chang <abner.chang@hpe.com>
> > > > >
> > > > > Cc: Jian J Wang <jian.j.wang@intel.com>
> > > > > Cc: Hao A Wu <hao.a.wu@intel.com>
> > > > > Cc: Andrew Fish <afish@apple.com>
> > > > > Cc: Laszlo Ersek <lersek@redhat.com>
> > > > > Cc: Leif Lindholm <leif@nuviainc.com>
> > > > > Cc: Michael D Kinney <michael.d.kinney@intel.com>
> > > > > Cc: Nickle Wang <nickle.wang@hpe.com>
> > > > > Cc: Peter O'Hanley <peter.ohanley@hpe.com>
> > > > >
> > > > > Abner Chang (3):
> > > > >   edk2: jansson submodule of JSON library
> > > > >   MdeModulePkg/library: EDK2 port jansson library
> > > > >   MdeModulePkg: Add EDK2 port jansson library
> > > > >
> > > > >  .gitmodules                                   |   3 +
> > > > >  MdeModulePkg/Include/Library/JsonLib.h        | 596
> +++++++++++++
> > > > >  .../Library/JsonLib/JanssonCrtLibSupport.c    | 705
> +++++++++++++++
> > > > >  .../Library/JsonLib/JanssonCrtLibSupport.h    | 198 +++++
> > > > >  MdeModulePkg/Library/JsonLib/JsonLib.c        | 805
> > > > ++++++++++++++++++
> > > > >  MdeModulePkg/Library/JsonLib/JsonLib.inf      |  81 ++
> > > > >  MdeModulePkg/Library/JsonLib/JsonUtilities.c  | 417 +++++++++
> > > > > MdeModulePkg/Library/JsonLib/JsonUtilities.h  |  69 ++
> > > > >  MdeModulePkg/Library/JsonLib/assert.h         |  11 +
> > > > >  MdeModulePkg/Library/JsonLib/errno.h          |  11 +
> > > > >  MdeModulePkg/Library/JsonLib/jansson          |   1 +
> > > > >  MdeModulePkg/Library/JsonLib/jansson_config.h |  57
> > > > > ++  .../Library/JsonLib/jansson_private_config.h  |  19 +
> > > > >  MdeModulePkg/Library/JsonLib/limits.h         |  11 +
> > > > >  MdeModulePkg/Library/JsonLib/math.h           |  11 +
> > > > >  MdeModulePkg/Library/JsonLib/stdarg.h         |  11 +
> > > > >  MdeModulePkg/Library/JsonLib/stddef.h         |  11 +
> > > > >  MdeModulePkg/Library/JsonLib/stdio.h          |  11 +
> > > > >  MdeModulePkg/Library/JsonLib/stdlib.h         |  11 +
> > > > >  MdeModulePkg/Library/JsonLib/string.h         |  11 +
> > > > >  MdeModulePkg/Library/JsonLib/sys/time.h       |  11 +
> > > > >  MdeModulePkg/Library/JsonLib/sys/types.h      |  10 +
> > > > >  MdeModulePkg/Library/JsonLib/time.h           |  11 +
> > > > >  MdeModulePkg/MdeModulePkg.dec                 |   7 +-
> > > > >  MdeModulePkg/MdeModulePkg.dsc                 |   4 +-
> > > > >  ReadMe.rst                                    |   1 +
> > > > >  26 files changed, 3092 insertions(+), 2 deletions(-)  create mode
> > > > > 100644 MdeModulePkg/Include/Library/JsonLib.h
> > > > >  create mode 100644
> > > > > MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c
> > > > >  create mode 100644
> > > > > MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.c
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.inf
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.c
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonUtilities.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/assert.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/errno.h
> > > > >  create mode 160000 MdeModulePkg/Library/JsonLib/jansson
> > > > >  create mode 100644
> MdeModulePkg/Library/JsonLib/jansson_config.h
> > > > >  create mode 100644
> > > > > MdeModulePkg/Library/JsonLib/jansson_private_config.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/limits.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/math.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdarg.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stddef.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdio.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdlib.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/string.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/sys/time.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/sys/types.h
> > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/time.h
> > > > >
> > > > > --
> > > > > 2.17.1
> > > >
> > > >
> > > >
> > > >
> > > >
> > >
> >
> >
> >
> >
> >
> 
> 
> 
> 
> 




^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
  2020-11-25  3:19         ` 回复: " gaoliming
@ 2020-11-26  0:40           ` Abner Chang
  0 siblings, 0 replies; 12+ messages in thread
From: Abner Chang @ 2020-11-26  0:40 UTC (permalink / raw)
  To: devel@edk2.groups.io, gaoliming@byosoft.com.cn,
	hao.a.wu@intel.com
  Cc: 'Wang, Jian J', 'Andrew Fish',
	'Laszlo Ersek', 'Leif Lindholm',
	'Kinney, Michael D', Wang, Nickle (HPS SW),
	O'Hanley, Peter (EXL)

Ok, Liming. Let's move this to under RedfishPkg.

> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> gaoliming
> Sent: Wednesday, November 25, 2020 11:20 AM
> To: devel@edk2.groups.io; Chang, Abner (HPS SW/FW Technologist)
> <abner.chang@hpe.com>; hao.a.wu@intel.com
> Cc: 'Wang, Jian J' <jian.j.wang@intel.com>; 'Andrew Fish' <afish@apple.com>;
> 'Laszlo Ersek' <lersek@redhat.com>; 'Leif Lindholm' <leif@nuviainc.com>;
> 'Kinney, Michael D' <michael.d.kinney@intel.com>; Wang, Nickle (HPS SW)
> <nickle.wang@hpe.com>; O'Hanley, Peter (EXL) <peter.ohanley@hpe.com>
> Subject: 回复: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> 
> Abner:
>   I agree JsonLib is the generic module. But now, we know its consumer is
> only RedFish.
>   So, I suggest to place it into RedFishPkg. If there is more usage model, we
> can consider to move it later.
> 
> Thanks
> Liming
> > -----邮件原件-----
> > 发件人: bounce+27952+67861+4905953+8761045@groups.io
> > <bounce+27952+67861+4905953+8761045@groups.io> 代表 Abner Chang
> > 发送时间: 2020年11月24日 10:03
> > 收件人: devel@edk2.groups.io; hao.a.wu@intel.com
> > 抄送: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish
> > <afish@apple.com>; Laszlo Ersek <lersek@redhat.com>; Leif Lindholm
> > <leif@nuviainc.com>; Kinney, Michael D <michael.d.kinney@intel.com>;
> > Wang, Nickle (HPS SW) <nickle.wang@hpe.com>; O'Hanley, Peter (EXL)
> > <peter.ohanley@hpe.com>
> > 主题: Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> >
> >
> >
> > > -----Original Message-----
> > > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf
> > > Of Wu, Hao A
> > > Sent: Tuesday, November 24, 2020 9:50 AM
> > > To: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>;
> > > devel@edk2.groups.io
> > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish
> > > <afish@apple.com>; Laszlo Ersek <lersek@redhat.com>; Leif Lindholm
> > > <leif@nuviainc.com>; Kinney, Michael D <michael.d.kinney@intel.com>;
> > > Wang, Nickle (HPS SW) <nickle.wang@hpe.com>; O'Hanley, Peter (EXL)
> > > <peter.ohanley@hpe.com>
> > > Subject: Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> > >
> > > > -----Original Message-----
> > > > From: Chang, Abner (HPS SW/FW Technologist)
> <abner.chang@hpe.com>
> > > > Sent: Tuesday, November 24, 2020 9:31 AM
> > > > To: devel@edk2.groups.io; Wu, Hao A <hao.a.wu@intel.com>
> > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish
> > > > <afish@apple.com>; Laszlo Ersek <lersek@redhat.com>; Leif Lindholm
> > > > <leif@nuviainc.com>; Kinney, Michael D
> > > > <michael.d.kinney@intel.com>; Wang, Nickle (HPS SW)
> > > > <nickle.wang@hpe.com>; O'Hanley, Peter (EXL)
> > > > <peter.ohanley@hpe.com>
> > > > Subject: RE: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> > > >
> > > >
> > > >
> > > > > -----Original Message-----
> > > > > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On
> > > > > Behalf Of Wu, Hao A
> > > > > Sent: Tuesday, November 24, 2020 9:20 AM
> > > > > To: Chang, Abner (HPS SW/FW Technologist)
> <abner.chang@hpe.com>;
> > > > > devel@edk2.groups.io
> > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Andrew Fish
> > > > > <afish@apple.com>; Laszlo Ersek <lersek@redhat.com>; Leif
> > > > > Lindholm <leif@nuviainc.com>; Kinney, Michael D
> > > > > <michael.d.kinney@intel.com>; Wang, Nickle (HPS SW)
> > > > > <nickle.wang@hpe.com>; O'Hanley, Peter (EXL)
> > > > > <peter.ohanley@hpe.com>
> > > > > Subject: Re: [edk2-devel] [PATCH 0/3] JsonLib: jansson edk2 port
> > > > >
> > > > > > -----Original Message-----
> > > > > > From: Abner Chang <abner.chang@hpe.com>
> > > > > > Sent: Monday, November 23, 2020 9:47 PM
> > > > > > To: devel@edk2.groups.io
> > > > > > Cc: Wang, Jian J <jian.j.wang@intel.com>; Wu, Hao A
> > > > > > <hao.a.wu@intel.com>; Andrew Fish <afish@apple.com>; Laszlo
> > > > > > Ersek <lersek@redhat.com>; Leif Lindholm <leif@nuviainc.com>;
> > > > > > Kinney, Michael D <michael.d.kinney@intel.com>; Nickle Wang
> > > > > > <nickle.wang@hpe.com>; Peter O'Hanley
> <peter.ohanley@hpe.com>
> > > > > > Subject: [PATCH 0/3] JsonLib: jansson edk2 port
> > > > > >
> > > > > > This set of pactehs is sent for the comments on edk2 JSON library.
> > > > > > edk2 JSON library is based on jansson open source
> > > > > > (https://github.com/akheron/jansson) and wrapped as an edk2
> library.
> > > > > > edk2 JsonLib will be used by edk2 Redfish feature drivers (not
> > > > > > contributed yet)
> > > > >
> > > > >
> > > > > Hello,
> > > > >
> > > > > Sorry for possibly missing previous discussions on the Redfish
> feature.
> > > > > I am wondering is it more straight-forward to put the JsonLib
> > > > > together with the Readfish codes under RedfishPkg?
> > > > Hi Hao,
> > > > The idea is JSON is not the representation of data payload for
> > > > Redfish only and JsonLib could be not only for Redfish neither.
> > > > Any applications which use JSON as data payload can leverage JsonLib.
> > >
> > >
> > > Thanks,
> > >
> > > My concern is for the case of adding a common library/module,
> > > MdeModulePkg usually seems to be the destination. But since
> > > MdeModulePkg is already a huge and complex package, I am not sure if
> this
> > > is the right way to go.
> > >
> > > I would like to get the inputs on other reviewers for putting the
> JsonLib
> > > under MdeModulePkg.
> > >
> > > If this is the right direction, could you help to add an item in the
> > > Maintainers.txt for the Json related stuff in MdeModulePkg and list
> > > you
> (and
> > > 1 more person will be appreciated) as the reviewer?
> > That's no problem. We are pleased to be the reviewer of JSON lib.
> >
> > Yes, see others input for JsonLib location.
> >
> > Thanks
> > Abner
> > >
> > > Thanks in advance.
> > >
> > > Best Regards,
> > > Hao Wu
> > >
> > >
> > > >
> > > > Thanks
> > > > Abner
> > > > >
> > > > > Best Regards,
> > > > > Hao Wu
> > > > >
> > > > >
> > > > > > and the edk2 port of libredfish library (not contributed yet)
> > > > > > based on DMTF GitHub (https://github.com/DMTF/libredfish).
> > > > > >
> > > > > > You will encounterred the build error with the jansson library
> > > > > > pointed in submoudle (v2.13.1) and the fix is already
> > > > > > submitted to jansson open source
> (https://github.com/akheron/jansson/pull/558).
> > > > > >
> > > > > > Signed-off-by: Abner Chang <abner.chang@hpe.com>
> > > > > >
> > > > > > Cc: Jian J Wang <jian.j.wang@intel.com>
> > > > > > Cc: Hao A Wu <hao.a.wu@intel.com>
> > > > > > Cc: Andrew Fish <afish@apple.com>
> > > > > > Cc: Laszlo Ersek <lersek@redhat.com>
> > > > > > Cc: Leif Lindholm <leif@nuviainc.com>
> > > > > > Cc: Michael D Kinney <michael.d.kinney@intel.com>
> > > > > > Cc: Nickle Wang <nickle.wang@hpe.com>
> > > > > > Cc: Peter O'Hanley <peter.ohanley@hpe.com>
> > > > > >
> > > > > > Abner Chang (3):
> > > > > >   edk2: jansson submodule of JSON library
> > > > > >   MdeModulePkg/library: EDK2 port jansson library
> > > > > >   MdeModulePkg: Add EDK2 port jansson library
> > > > > >
> > > > > >  .gitmodules                                   |   3 +
> > > > > >  MdeModulePkg/Include/Library/JsonLib.h        | 596
> > +++++++++++++
> > > > > >  .../Library/JsonLib/JanssonCrtLibSupport.c    | 705
> > +++++++++++++++
> > > > > >  .../Library/JsonLib/JanssonCrtLibSupport.h    | 198 +++++
> > > > > >  MdeModulePkg/Library/JsonLib/JsonLib.c        | 805
> > > > > ++++++++++++++++++
> > > > > >  MdeModulePkg/Library/JsonLib/JsonLib.inf      |  81 ++
> > > > > >  MdeModulePkg/Library/JsonLib/JsonUtilities.c  | 417 +++++++++
> > > > > > MdeModulePkg/Library/JsonLib/JsonUtilities.h  |  69 ++
> > > > > >  MdeModulePkg/Library/JsonLib/assert.h         |  11 +
> > > > > >  MdeModulePkg/Library/JsonLib/errno.h          |  11 +
> > > > > >  MdeModulePkg/Library/JsonLib/jansson          |   1 +
> > > > > >  MdeModulePkg/Library/JsonLib/jansson_config.h |  57
> > > > > > ++  .../Library/JsonLib/jansson_private_config.h  |  19 +
> > > > > >  MdeModulePkg/Library/JsonLib/limits.h         |  11 +
> > > > > >  MdeModulePkg/Library/JsonLib/math.h           |  11 +
> > > > > >  MdeModulePkg/Library/JsonLib/stdarg.h         |  11 +
> > > > > >  MdeModulePkg/Library/JsonLib/stddef.h         |  11 +
> > > > > >  MdeModulePkg/Library/JsonLib/stdio.h          |  11 +
> > > > > >  MdeModulePkg/Library/JsonLib/stdlib.h         |  11 +
> > > > > >  MdeModulePkg/Library/JsonLib/string.h         |  11 +
> > > > > >  MdeModulePkg/Library/JsonLib/sys/time.h       |  11 +
> > > > > >  MdeModulePkg/Library/JsonLib/sys/types.h      |  10 +
> > > > > >  MdeModulePkg/Library/JsonLib/time.h           |  11 +
> > > > > >  MdeModulePkg/MdeModulePkg.dec                 |   7 +-
> > > > > >  MdeModulePkg/MdeModulePkg.dsc                 |   4 +-
> > > > > >  ReadMe.rst                                    |   1 +
> > > > > >  26 files changed, 3092 insertions(+), 2 deletions(-)  create
> > > > > > mode
> > > > > > 100644 MdeModulePkg/Include/Library/JsonLib.h
> > > > > >  create mode 100644
> > > > > > MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.c
> > > > > >  create mode 100644
> > > > > > MdeModulePkg/Library/JsonLib/JanssonCrtLibSupport.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.c
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/JsonLib.inf
> > > > > >  create mode 100644
> > > > > > MdeModulePkg/Library/JsonLib/JsonUtilities.c
> > > > > >  create mode 100644
> > > > > > MdeModulePkg/Library/JsonLib/JsonUtilities.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/assert.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/errno.h
> > > > > >  create mode 160000 MdeModulePkg/Library/JsonLib/jansson
> > > > > >  create mode 100644
> > MdeModulePkg/Library/JsonLib/jansson_config.h
> > > > > >  create mode 100644
> > > > > > MdeModulePkg/Library/JsonLib/jansson_private_config.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/limits.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/math.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdarg.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stddef.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdio.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/stdlib.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/string.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/sys/time.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/sys/types.h
> > > > > >  create mode 100644 MdeModulePkg/Library/JsonLib/time.h
> > > > > >
> > > > > > --
> > > > > > 2.17.1
> > > > >
> > > > >
> > > > >
> > > > >
> > > > >
> > > >
> > >
> > >
> > >
> > >
> > >
> >
> >
> >
> >
> >
> 
> 
> 
> 
> 
> 
> 


^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2020-11-26  0:41 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-11-23 13:47 [PATCH 0/3] JsonLib: jansson edk2 port Abner Chang
2020-11-23 13:47 ` [PATCH 1/3] edk2: jansson submodule of JSON library Abner Chang
2020-11-23 23:32   ` Laszlo Ersek
2020-11-24  1:13     ` [edk2-devel] " Abner Chang
2020-11-23 13:47 ` [PATCH 2/3] MdeModulePkg/library: EDK2 port jansson library Abner Chang
2020-11-23 13:47 ` [PATCH 3/3] MdeModulePkg: Add " Abner Chang
2020-11-24  1:19 ` [PATCH 0/3] JsonLib: jansson edk2 port Wu, Hao A
2020-11-24  1:30   ` [edk2-devel] " Abner Chang
2020-11-24  1:50     ` Wu, Hao A
2020-11-24  2:02       ` Abner Chang
2020-11-25  3:19         ` 回复: " gaoliming
2020-11-26  0:40           ` Abner Chang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox