public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [RestJsonStructureDxe PATCH v4 0/3] EFI REST JSON Structure Protocol
@ 2020-10-30  0:50 Abner Chang
  2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 1/3] MdePkg/Include: Definitions of " Abner Chang
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Abner Chang @ 2020-10-30  0:50 UTC (permalink / raw)
  To: devel

This is the implementation of EFI_REST_JSON_STRUCTURE_PROTOCOL,
refer to UEFI spec 2.8 Section 29.7.3 EFI REST JSON Resource to C Structure
Converter.

In v4: Address comments given by Nickle.
  - Uninstall protocol in RestJsonStructureUnload ().

In v3: Fix CI test errors,
  - Add RedfishPkg dependence in RedfishPkg.i.yaml.
  - Add ARM instrinsic libraries to RedfishPkg.dsc for ARM/AARCH64.

In v2:
  - Couple feedbacks given by Liming on patch 1/2 were addressed.
  - Cosmetics on the source code in patch 2/2.

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

Abner Chang (3):
  MdePkg/Include: Definitions of EFI REST JSON Structure Protocol
  RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol
  RedfishPkg: Changes on RedfishPkg for CI test

 MdePkg/Include/Protocol/RestJsonStructure.h   | 161 +++++
 MdePkg/MdePkg.dec                             |   3 +
 RedfishPkg/RedfishPkg.ci.yaml                 |   3 +-
 RedfishPkg/RedfishPkg.dsc                     |  11 +
 .../RestJsonStructureDxe.c                    | 586 ++++++++++++++++++
 .../RestJsonStructureDxe.inf                  |  39 ++
 .../RestJsonStructureInternal.h               |  33 +
 7 files changed, 835 insertions(+), 1 deletion(-)
 create mode 100644 MdePkg/Include/Protocol/RestJsonStructure.h
 create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c
 create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
 create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h

-- 
2.17.1


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

* [RestJsonStructureDxe PATCH v4 1/3] MdePkg/Include: Definitions of EFI REST JSON Structure Protocol
  2020-10-30  0:50 [RestJsonStructureDxe PATCH v4 0/3] EFI REST JSON Structure Protocol Abner Chang
@ 2020-10-30  0:50 ` Abner Chang
  2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 2/3] RedfishPkg/RestJsonStructureDxe: " Abner Chang
  2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 3/3] RedfishPkg: Changes on RedfishPkg for CI test Abner Chang
  2 siblings, 0 replies; 5+ messages in thread
From: Abner Chang @ 2020-10-30  0:50 UTC (permalink / raw)
  To: devel
  Cc: Michael D Kinney, Liming Gao, Zhiguang Liu, Jiaxin Wu, Siyuan Fu,
	Fan Wang, Jiewen Yao, Nickle Wang

Add definitions of EFI REST JSON Structure according to UEFI spec
2.8 Section 29.7.3 EFI REST JSON Resource to C Structure Converter.

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

Cc: Michael D Kinney <michael.d.kinney@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Zhiguang Liu <zhiguang.liu@intel.com>
Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Siyuan Fu <siyuan.fu@intel.com>
Cc: Fan Wang <fan.wang@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Nickle Wang <nickle.wang@hpe.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
---
 MdePkg/Include/Protocol/RestJsonStructure.h | 161 ++++++++++++++++++++
 MdePkg/MdePkg.dec                           |   3 +
 2 files changed, 164 insertions(+)
 create mode 100644 MdePkg/Include/Protocol/RestJsonStructure.h

diff --git a/MdePkg/Include/Protocol/RestJsonStructure.h b/MdePkg/Include/Protocol/RestJsonStructure.h
new file mode 100644
index 0000000000..c9e9a35a41
--- /dev/null
+++ b/MdePkg/Include/Protocol/RestJsonStructure.h
@@ -0,0 +1,161 @@
+/** @file
+  This file defines the EFI REST JSON Structure Protocol interface.
+
+  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+  @par Revision Reference:
+  This Protocol is introduced in UEFI Specification 2.8
+
+**/
+
+#ifndef EFI_REST_JSON_STRUCTURE_PROTOCOL_H_
+#define EFI_REST_JSON_STRUCTURE_PROTOCOL_H_
+
+///
+/// GUID definitions
+///
+#define EFI_REST_JSON_STRUCTURE_PROTOCOL_GUID \
+  { \
+    0xa9a048f6, 0x48a0, 0x4714, {0xb7, 0xda, 0xa9, 0xad,0x87, 0xd4, 0xda, 0xc9 } \
+  }
+
+typedef struct _EFI_REST_JSON_STRUCTURE_PROTOCOL EFI_REST_JSON_STRUCTURE_PROTOCOL;
+typedef CHAR8 * EFI_REST_JSON_RESOURCE_TYPE_DATATYPE;
+
+///
+/// Structure defintions of resource name space.
+///
+/// The fields declared in this structure define the
+/// name and revision of payload delievered throught
+/// REST API.
+///
+typedef struct _EFI_REST_JSON_RESOURCE_TYPE_NAMESPACE {
+  CHAR8 *ResourceTypeName;   ///< Resource type name
+  CHAR8 *MajorVersion;       ///< Resource major version
+  CHAR8 *MinorVersion;       ///< Resource minor version
+  CHAR8 *ErrataVersion;      ///< Resource errata version
+} EFI_REST_JSON_RESOURCE_TYPE_NAMESPACE;
+
+///
+/// REST resource type identifier
+///
+/// REST resource type consists of name space and data type.
+///
+typedef struct _EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER {
+  EFI_REST_JSON_RESOURCE_TYPE_NAMESPACE NameSpace; ///< Namespace of this resource type.
+  EFI_REST_JSON_RESOURCE_TYPE_DATATYPE DataType;   ///< Name of data type declared in this
+                                                   ///< resource type.
+} EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER;
+
+///
+/// List of JSON to C structure conversions which this convertor supports.
+///
+typedef struct _EFI_REST_JSON_STRUCTURE_SUPPORTED {
+  LIST_ENTRY NextSupportedRsrcInterp;                        ///< Linklist to next supported conversion.
+  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER RestResourceInterp; ///< JSON resource type this convertor supports.
+} EFI_REST_JSON_STRUCTURE_SUPPORTED;
+
+///
+/// The header file of JSON C structure
+///
+typedef struct _EFI_REST_JSON_STRUCTURE_HEADER {
+  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER    JsonRsrcIdentifier; ///< Resource identifier which use to
+                                                                ///< choice the proper interpreter.
+  ///< Follow by a pointer points to JSON structure, the content in the
+  ///< JSON structure is implementation-specific according to converter producer.
+  VOID  *JsonStructurePointer;
+} EFI_REST_JSON_STRUCTURE_HEADER;
+
+/**
+  JSON-IN C Structure-OUT function. Convert the given REST JSON resource into structure.
+
+  @param[in]    This                This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    JsonRsrcIdentifier  This indicates the resource type and version is given in
+                                    ResourceJsonText.
+  @param[in]    ResourceJsonText    REST JSON resource in text format.
+  @param[out]   JsonStructure       Pointer to receive the pointer to EFI_REST_JSON_STRUCTURE_HEADER
+
+  @retval EFI_SUCCESS
+  @retval Others
+--*/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_REST_JSON_STRUCTURE_TO_STRUCTURE)(
+  IN  EFI_REST_JSON_STRUCTURE_PROTOCOL        *This,
+  IN  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *JsonRsrcIdentifier OPTIONAL,
+  IN  CHAR8                                   *ResourceJsonText,
+  OUT  EFI_REST_JSON_STRUCTURE_HEADER         **JsonStructure
+);
+
+/**
+  Convert the given REST JSON structure into JSON text.
+
+  @param[in]    This                 This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    JsonStructureHeader  The point to EFI_REST_JSON_STRUCTURE_HEADER  structure.
+  @param[out]   ResourceJsonText     Pointer to receive REST JSON resource in text format.
+
+  @retval EFI_SUCCESS
+  @retval Others
+
+--*/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_REST_JSON_STRUCTURE_TO_JSON)(
+  IN EFI_REST_JSON_STRUCTURE_PROTOCOL     *This,
+  IN EFI_REST_JSON_STRUCTURE_HEADER       *JsonStructureHeader,
+  OUT CHAR8                               **ResourceJsonText
+);
+
+/**
+  This function destroys the REST JSON structure.
+
+  @param[in]    This                 This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    JsonStructureHeader  JSON structure to destroy.
+
+  @retval EFI_SUCCESS
+  @retval Others
+
+--*/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE)(
+  IN EFI_REST_JSON_STRUCTURE_PROTOCOL   *This,
+  IN EFI_REST_JSON_STRUCTURE_HEADER     *JsonStructureHeader
+);
+/**
+  This function provides REST JSON resource to structure converter registration.
+
+  @param[in]    This                     This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    JsonStructureSupported   The type and version of REST JSON resource which this converter
+                                         supports.
+  @param[in]    ToStructure              The function to convert REST JSON resource to structure.
+  @param[in]    ToJson                   The function to convert REST JSON structure to JSON in text format.
+  @param[out]    DestroyStructure         Destroy REST JSON structure returned in ToStructure() function.
+
+  @retval EFI_SUCCESS             Register successfully.
+  @retval Others                  Fail to register.
+
+--*/
+typedef
+EFI_STATUS
+(EFIAPI *EFI_REST_JSON_STRUCTURE_REGISTER)(
+  IN EFI_REST_JSON_STRUCTURE_PROTOCOL       *This,
+  IN EFI_REST_JSON_STRUCTURE_SUPPORTED      *JsonStructureSupported,
+  IN EFI_REST_JSON_STRUCTURE_TO_STRUCTURE   ToStructure,
+  IN EFI_REST_JSON_STRUCTURE_TO_JSON        ToJson,
+  IN EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure
+);
+
+///
+/// EFI REST JSON to C structure protocol definition.
+///
+struct _EFI_REST_JSON_STRUCTURE_PROTOCOL {
+  EFI_REST_JSON_STRUCTURE_REGISTER           Register;          ///< Register JSON to C structure convertor
+  EFI_REST_JSON_STRUCTURE_TO_STRUCTURE       ToStructure;       ///< The function to convert JSON to C structure
+  EFI_REST_JSON_STRUCTURE_TO_JSON            ToJson;            ///< The function to convert C structure to JSON
+  EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE  DestoryStructure;  ///< Destory C structure.
+};
+
+#endif
diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec
index 5205374d62..645f61b80e 100644
--- a/MdePkg/MdePkg.dec
+++ b/MdePkg/MdePkg.dec
@@ -1855,6 +1855,9 @@
   gEfiRestExProtocolGuid               = { 0x55648b91, 0xe7d, 0x40a3, { 0xa9, 0xb3, 0xa8, 0x15, 0xd7, 0xea, 0xdf, 0x97 }}
   gEfiRestExServiceBindingProtocolGuid = { 0x456bbe01, 0x99d0, 0x45ea, { 0xbb, 0x5f, 0x16, 0xd8, 0x4b, 0xed, 0xc5, 0x59 }}
 
+  ## Include/Protocol/RestJsonStructure.h
+  gEfiRestJsonStructureProtocolGuid  = { 0xa9a048f6, 0x48a0, 0x4714, {0xb7, 0xda, 0xa9, 0xad,0x87, 0xd4, 0xda, 0xc9 }}
+
   #
   # Protocols defined in Shell2.0
   #
-- 
2.17.1


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

* [RestJsonStructureDxe PATCH v4 2/3] RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol
  2020-10-30  0:50 [RestJsonStructureDxe PATCH v4 0/3] EFI REST JSON Structure Protocol Abner Chang
  2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 1/3] MdePkg/Include: Definitions of " Abner Chang
@ 2020-10-30  0:50 ` Abner Chang
  2020-11-02  3:39   ` Nickle Wang
  2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 3/3] RedfishPkg: Changes on RedfishPkg for CI test Abner Chang
  2 siblings, 1 reply; 5+ messages in thread
From: Abner Chang @ 2020-10-30  0:50 UTC (permalink / raw)
  To: devel; +Cc: Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao, Nickle Wang

Implementation of EFI_REST_JSON_STRUCTURE_PROTOCOL, refer to UEFI spec
2.8 Section 29.7.3 EFI REST JSON Resource to C Structure Converter.

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

Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Siyuan Fu <siyuan.fu@intel.com>
Cc: Fan Wang <fan.wang@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Nickle Wang <nickle.wang@hpe.com>
---
 RedfishPkg/RedfishPkg.dsc                     |  11 +
 .../RestJsonStructureDxe.c                    | 586 ++++++++++++++++++
 .../RestJsonStructureDxe.inf                  |  39 ++
 .../RestJsonStructureInternal.h               |  33 +
 4 files changed, 669 insertions(+)
 create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c
 create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
 create mode 100644 RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h

diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc
index 8acadddefc..f0c6740fac 100644
--- a/RedfishPkg/RedfishPkg.dsc
+++ b/RedfishPkg/RedfishPkg.dsc
@@ -38,3 +38,14 @@
   DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTableLib.inf
   DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
   ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/DxeReportStatusCodeLib.inf
+
+[LibraryClasses.ARM, LibraryClasses.AARCH64]
+  #
+  # This library provides the instrinsic functions generated by a given compiler.
+  #
+  NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
+  NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
+  ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf
+
+[Components]
+  RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c
new file mode 100644
index 0000000000..a3f4cd3c9a
--- /dev/null
+++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c
@@ -0,0 +1,586 @@
+/** @file
+
+  The implementation of EFI REST Resource JSON to C structure convertor
+  Protocol.
+
+  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Uefi.h>
+#include <Protocol/RestJsonStructure.h>
+#include "RestJsonStructureInternal.h"
+
+LIST_ENTRY mRestJsonStructureList;
+EFI_HANDLE mProtocolHandle;
+
+/**
+  This function registers Restful resource interpreter for the
+  specific schema.
+
+  @param[in]    This                     This is the EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    JsonStructureSupported   The type and version of REST JSON resource which this converter
+                                         supports.
+  @param[in]    ToStructure              The function to convert REST JSON resource to structure.
+  @param[in]    ToJson                   The function to convert REST JSON structure to JSON in text format.
+  @param[in]    DestroyStructure         Destroy REST JSON structure returned in ToStructure()  function.
+
+  @retval EFI_SUCCESS             Register successfully.
+  @retval Others                  Fail to register.
+
+**/
+EFI_STATUS
+EFIAPI
+RestJsonStructureRegister (
+  IN EFI_REST_JSON_STRUCTURE_PROTOCOL       *This,
+  IN EFI_REST_JSON_STRUCTURE_SUPPORTED      *JsonStructureSupported,
+  IN EFI_REST_JSON_STRUCTURE_TO_STRUCTURE   ToStructure,
+  IN EFI_REST_JSON_STRUCTURE_TO_JSON        ToJson,
+  IN EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure
+)
+{
+  UINTN NumberOfNS;
+  UINTN Index;
+  LIST_ENTRY *ThisList;
+  REST_JSON_STRUCTURE_INSTANCE *Instance;
+  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *CloneSupportedInterpId;
+  EFI_REST_JSON_STRUCTURE_SUPPORTED *ThisSupportedInterp;
+
+  if (This == NULL ||
+      ToStructure == NULL ||
+      ToJson == NULL ||
+      DestroyStructure == NULL ||
+      JsonStructureSupported == NULL
+      ) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  // Check how many name space interpreter can interpret.
+  //
+  ThisList = &JsonStructureSupported->NextSupportedRsrcInterp;
+  NumberOfNS = 1;
+  while (TRUE) {
+    if (ThisList->ForwardLink == &JsonStructureSupported->NextSupportedRsrcInterp) {
+      break;
+    } else {
+      ThisList = ThisList->ForwardLink;
+      NumberOfNS ++;
+    }
+  };
+
+  Instance =
+    (REST_JSON_STRUCTURE_INSTANCE *)AllocateZeroPool (sizeof (REST_JSON_STRUCTURE_INSTANCE) + NumberOfNS * sizeof (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER));
+  if (Instance == NULL) {
+    return EFI_OUT_OF_RESOURCES;
+  }
+  InitializeListHead (&Instance->NextRestJsonStructureInstance);
+  Instance->NumberOfNameSpaceToConvert = NumberOfNS;
+  Instance->SupportedRsrcIndentifier = (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *)((REST_JSON_STRUCTURE_INSTANCE *)Instance + 1);
+  //
+  // Copy supported resource identifer interpreter.
+  //
+  CloneSupportedInterpId = Instance->SupportedRsrcIndentifier;
+  ThisSupportedInterp = JsonStructureSupported;
+  for (Index = 0; Index < NumberOfNS; Index ++) {
+    CopyMem ((VOID *)CloneSupportedInterpId, (VOID *)&ThisSupportedInterp->RestResourceInterp, sizeof (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER));
+    ThisSupportedInterp = (EFI_REST_JSON_STRUCTURE_SUPPORTED *)ThisSupportedInterp->NextSupportedRsrcInterp.ForwardLink;
+    CloneSupportedInterpId ++;
+  }
+  Instance->JsonToStructure = ToStructure;
+  Instance->StructureToJson = ToJson;
+  Instance->DestroyStructure = DestroyStructure;
+  InsertTailList (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance);
+  return EFI_SUCCESS;
+}
+
+/**
+  This function check if this interpreter instance support the given namesapce.
+
+  @param[in]    This                EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    InterpreterInstance REST_JSON_STRUCTURE_INSTANCE
+  @param[in]    RsrcTypeIdentifier  Resource type identifier.
+  @param[in]    ResourceRaw         Given Restful resource.
+  @param[out]   RestJSonHeader      Property interpreted from given ResourceRaw.
+
+  @retval EFI_SUCCESS
+  @retval Others.
+
+**/
+EFI_STATUS
+InterpreterInstanceToStruct (
+  IN EFI_REST_JSON_STRUCTURE_PROTOCOL         *This,
+  IN REST_JSON_STRUCTURE_INSTANCE             *InterpreterInstance,
+  IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER   *RsrcTypeIdentifier OPTIONAL,
+  IN CHAR8                                    *ResourceRaw,
+  OUT EFI_REST_JSON_STRUCTURE_HEADER          **RestJSonHeader
+ )
+{
+  UINTN Index;
+  EFI_STATUS Status;
+  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId;
+
+  if (This == NULL ||
+      InterpreterInstance == NULL ||
+      ResourceRaw == NULL ||
+      RestJSonHeader == NULL
+      ) {
+      return EFI_INVALID_PARAMETER;
+  }
+
+  Status = EFI_UNSUPPORTED;
+  if (RsrcTypeIdentifier == NULL) {
+    //
+    // No resource type identifier, send to intepreter anyway.
+    // Interpreter may recognize this resource.
+    //
+    Status = InterpreterInstance->JsonToStructure (
+                This,
+                NULL,
+                ResourceRaw,
+                RestJSonHeader
+                );
+  } else {
+    //
+    // Check if the namesapce and version is supported by this interpreter.
+    //
+    ThisSupportedRsrcTypeId = InterpreterInstance->SupportedRsrcIndentifier;
+    for (Index = 0; Index < InterpreterInstance->NumberOfNameSpaceToConvert; Index ++){
+      if (AsciiStrCmp (
+            RsrcTypeIdentifier->NameSpace.ResourceTypeName,
+            ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){
+        if ((RsrcTypeIdentifier->NameSpace.MajorVersion == NULL) &&
+            (RsrcTypeIdentifier->NameSpace.MinorVersion == NULL) &&
+            (RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL)
+            ) {
+          //
+          // Don't check version of this resource type identifier.
+          //
+          Status = InterpreterInstance->JsonToStructure (
+                      This,
+                      RsrcTypeIdentifier,
+                      ResourceRaw,
+                      RestJSonHeader
+                      );
+          break;
+        } else {
+          //
+          // Check version.
+          //
+          if ((AsciiStrCmp (
+                RsrcTypeIdentifier->NameSpace.MajorVersion,
+                ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) &&
+              (AsciiStrCmp (
+                RsrcTypeIdentifier->NameSpace.MinorVersion,
+                ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) &&
+              (AsciiStrCmp (
+                RsrcTypeIdentifier->NameSpace.ErrataVersion,
+                ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) {
+            Status = InterpreterInstance->JsonToStructure (
+                      This,
+                      RsrcTypeIdentifier,
+                      ResourceRaw,
+                      RestJSonHeader
+                      );
+            break;
+          }
+        }
+      }
+      ThisSupportedRsrcTypeId ++;
+    }
+  }
+  return Status;
+}
+/**
+  This function converts JSON C structure to JSON property.
+
+  @param[in]    This                 EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    InterpreterInstance  REST_JSON_STRUCTURE_INSTANCE
+  @param[in]    RestJSonHeader       Resource type identifier.
+  @param[out]   ResourceRaw          Output in JSON text format.
+
+  @retval EFI_SUCCESS
+  @retval Others.
+
+**/
+EFI_STATUS
+InterpreterEfiStructToInstance (
+  IN EFI_REST_JSON_STRUCTURE_PROTOCOL   *This,
+  IN REST_JSON_STRUCTURE_INSTANCE       *InterpreterInstance,
+  IN EFI_REST_JSON_STRUCTURE_HEADER     *RestJSonHeader,
+  OUT CHAR8 **ResourceRaw
+)
+{
+  UINTN Index;
+  EFI_STATUS Status;
+  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId;
+  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier;
+
+  if (This == NULL ||
+      InterpreterInstance == NULL ||
+      RestJSonHeader == NULL ||
+      ResourceRaw == NULL
+      ) {
+    return EFI_INVALID_PARAMETER;
+  }
+  RsrcTypeIdentifier = &RestJSonHeader->JsonRsrcIdentifier;
+  if (RsrcTypeIdentifier == NULL ||
+      RsrcTypeIdentifier->NameSpace.ResourceTypeName == NULL ||
+      RsrcTypeIdentifier->NameSpace.MajorVersion == NULL ||
+      RsrcTypeIdentifier->NameSpace.MinorVersion == NULL ||
+      RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL
+      ) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  //
+  // Check if the namesapce and version is supported by this interpreter.
+  //
+  Status = EFI_UNSUPPORTED;
+  ThisSupportedRsrcTypeId = InterpreterInstance->SupportedRsrcIndentifier;
+  for (Index = 0; Index < InterpreterInstance->NumberOfNameSpaceToConvert; Index ++){
+    if (AsciiStrCmp (
+          RsrcTypeIdentifier->NameSpace.ResourceTypeName,
+          ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){
+      //
+      // Check version.
+      //
+      if ((AsciiStrCmp (
+            RsrcTypeIdentifier->NameSpace.MajorVersion,
+            ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) &&
+          (AsciiStrCmp (
+            RsrcTypeIdentifier->NameSpace.MinorVersion,
+            ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) &&
+          (AsciiStrCmp (
+            RsrcTypeIdentifier->NameSpace.ErrataVersion,
+            ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) {
+        Status = InterpreterInstance->StructureToJson (
+                  This,
+                  RestJSonHeader,
+                  ResourceRaw
+                  );
+        break;
+      }
+    }
+    ThisSupportedRsrcTypeId ++;
+  }
+  return Status;
+}
+
+/**
+  This function destory REST property structure.
+
+  @param[in]    This                 EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    InterpreterInstance  REST_JSON_STRUCTURE_INSTANCE
+  @param[in]    RestJSonHeader       Property interpreted from given ResourceRaw.
+
+  @retval EFI_SUCCESS
+  @retval Others.
+
+**/
+EFI_STATUS
+InterpreterInstanceDestoryJsonStruct (
+  IN EFI_REST_JSON_STRUCTURE_PROTOCOL       *This,
+  IN REST_JSON_STRUCTURE_INSTANCE           *InterpreterInstance,
+  IN EFI_REST_JSON_STRUCTURE_HEADER         *RestJSonHeader
+ )
+{
+  UINTN Index;
+  EFI_STATUS Status;
+  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId;
+
+  if (This == NULL ||
+      InterpreterInstance == NULL ||
+      RestJSonHeader == NULL
+      ) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  Status = EFI_UNSUPPORTED;
+  //
+  // Check if the namesapce and version is supported by this interpreter.
+  //
+  ThisSupportedRsrcTypeId = InterpreterInstance->SupportedRsrcIndentifier;
+  for (Index = 0; Index < InterpreterInstance->NumberOfNameSpaceToConvert; Index ++){
+    if (AsciiStrCmp (
+          RestJSonHeader->JsonRsrcIdentifier.NameSpace.ResourceTypeName,
+          ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0) {
+      if ((RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion == NULL) &&
+          (RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion == NULL) &&
+          (RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion == NULL)
+          ) {
+        //
+        // Don't check version of this resource type identifier.
+        //
+        Status = InterpreterInstance->DestroyStructure (
+                    This,
+                    RestJSonHeader
+                    );
+        break;
+      } else {
+        //
+        // Check version.
+        //
+        if ((AsciiStrCmp (
+              RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion,
+              ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) &&
+            (AsciiStrCmp (
+              RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion,
+              ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) &&
+            (AsciiStrCmp (
+              RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion,
+              ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) {
+          Status = InterpreterInstance->DestroyStructure (
+                    This,
+                    RestJSonHeader
+                    );
+          break;
+        }
+      }
+    }
+    ThisSupportedRsrcTypeId ++;
+  }
+  return Status;
+}
+
+/**
+  This function translates the given JSON text to JSON C Structure.
+
+  @param[in]    This                EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    RsrcTypeIdentifier  Resource type identifier.
+  @param[in]    ResourceJsonText    Given Restful resource.
+  @param[out]   JsonStructure       Property interpreted from given ResourceRaw.
+
+  @retval EFI_SUCCESS
+  @retval Others.
+
+**/
+EFI_STATUS
+EFIAPI
+RestJsonStructureToStruct (
+  IN EFI_REST_JSON_STRUCTURE_PROTOCOL       *This,
+  IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier OPTIONAL,
+  IN CHAR8                                  *ResourceJsonText,
+  OUT EFI_REST_JSON_STRUCTURE_HEADER        **JsonStructure
+)
+{
+  EFI_STATUS Status;
+  REST_JSON_STRUCTURE_INSTANCE *Instance;
+
+  if (This == NULL ||
+      ResourceJsonText == NULL ||
+      JsonStructure == NULL
+    ) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (IsListEmpty (&mRestJsonStructureList)) {
+    return EFI_UNSUPPORTED;
+  }
+  Status = EFI_SUCCESS;
+  Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList);
+  while (TRUE) {
+    Status = InterpreterInstanceToStruct (
+                This,
+                Instance,
+                RsrcTypeIdentifier,
+                ResourceJsonText,
+                JsonStructure
+              );
+    if (!EFI_ERROR (Status)) {
+      break;
+    }
+    if (IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) {
+      Status = EFI_UNSUPPORTED;
+      break;
+    }
+    Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance);
+  };
+  return Status;
+}
+
+/**
+  This function destory REST property EFI structure which returned in
+  JsonToStructure().
+
+  @param[in]    This            EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    RestJSonHeader  Property to destory.
+
+  @retval EFI_SUCCESS
+  @retval Others
+
+**/
+EFI_STATUS
+EFIAPI
+RestJsonStructureDestroyStruct (
+  IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This,
+  IN EFI_REST_JSON_STRUCTURE_HEADER  *RestJSonHeader
+)
+{
+  EFI_STATUS Status;
+  REST_JSON_STRUCTURE_INSTANCE *Instance;
+
+  if (This == NULL || RestJSonHeader == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (IsListEmpty (&mRestJsonStructureList)) {
+    return EFI_UNSUPPORTED;
+  }
+  Status = EFI_SUCCESS;
+  Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList);
+  while (TRUE) {
+    Status = InterpreterInstanceDestoryJsonStruct (
+                This,
+                Instance,
+                RestJSonHeader
+              );
+    if (!EFI_ERROR (Status)) {
+      break;
+    }
+    if (IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) {
+      Status = EFI_UNSUPPORTED;
+      break;
+    }
+    Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance);
+  };
+  return Status;
+}
+
+/**
+  This function translates the given JSON C Structure to JSON text.
+
+  @param[in]    This            EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
+  @param[in]    RestJSonHeader  Given Restful resource.
+  @param[out]   ResourceRaw     Resource in RESTfuls service oriented.
+
+  @retval EFI_SUCCESS
+  @retval Others             Fail to remove the entry
+
+**/
+EFI_STATUS
+EFIAPI
+RestJsonStructureToJson (
+  IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This,
+  IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader,
+  OUT CHAR8 **ResourceRaw
+)
+{
+  EFI_STATUS Status;
+  REST_JSON_STRUCTURE_INSTANCE *Instance;
+
+  if (This == NULL || RestJSonHeader == NULL || ResourceRaw == NULL) {
+    return EFI_INVALID_PARAMETER;
+  }
+
+  if (IsListEmpty (&mRestJsonStructureList)) {
+    return EFI_UNSUPPORTED;
+  }
+  Status = EFI_SUCCESS;
+  Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList);
+  while (TRUE) {
+    Status = InterpreterEfiStructToInstance (
+                This,
+                Instance,
+                RestJSonHeader,
+                ResourceRaw
+              );
+    if (!EFI_ERROR (Status)) {
+      break;
+    }
+    if (IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) {
+      Status = EFI_UNSUPPORTED;
+      break;
+    }
+    Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance);
+  };
+  return Status;
+}
+
+EFI_REST_JSON_STRUCTURE_PROTOCOL mRestJsonStructureProtocol = {
+  RestJsonStructureRegister,
+  RestJsonStructureToStruct,
+  RestJsonStructureToJson,
+  RestJsonStructureDestroyStruct
+};
+
+/**
+  This is the declaration of an EFI image entry point.
+
+  @param  ImageHandle           The firmware allocated handle for the UEFI image.
+  @param  SystemTable           A pointer to the EFI System Table.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval Others                An unexpected error occurred.
+**/
+EFI_STATUS
+EFIAPI
+RestJsonStructureEntryPoint (
+  IN EFI_HANDLE        ImageHandle,
+  IN EFI_SYSTEM_TABLE  *SystemTable
+  )
+{
+  EFI_STATUS Status;
+
+  InitializeListHead (&mRestJsonStructureList);
+  //
+  // Install the Restful Resource Interpreter Protocol.
+  //
+  mProtocolHandle = NULL;
+  Status = gBS->InstallProtocolInterface (
+                  &mProtocolHandle,
+                  &gEfiRestJsonStructureProtocolGuid,
+                  EFI_NATIVE_INTERFACE,
+                  (VOID *)&mRestJsonStructureProtocol
+                  );
+  return Status;
+}
+
+/**
+  This is the unload handle for Redfish discover module.
+
+  Disconnect the driver specified by ImageHandle from all the devices in the handle database.
+  Uninstall all the protocols installed in the driver entry point.
+
+  @param[in] ImageHandle           The drivers' driver image.
+
+  @retval    EFI_SUCCESS           The image is unloaded.
+  @retval    Others                Failed to unload the image.
+
+**/
+EFI_STATUS
+EFIAPI
+RestJsonStructureUnload (
+  IN EFI_HANDLE ImageHandle
+  )
+{
+  EFI_STATUS Status;
+  REST_JSON_STRUCTURE_INSTANCE *Instance;
+  REST_JSON_STRUCTURE_INSTANCE *NextInstance;
+
+  Status = gBS->UninstallProtocolInterface (
+                  mProtocolHandle,
+                  &gEfiRestJsonStructureProtocolGuid,
+                  (VOID *)&mRestJsonStructureProtocol
+                  );
+
+  if (IsListEmpty (&mRestJsonStructureList)) {
+    return Status;
+  }
+  //
+  // Free memory of REST_JSON_STRUCTURE_INSTANCE instance.
+  //
+  Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode (&mRestJsonStructureList);
+  do {
+    NextInstance = NULL;
+    if (!IsNodeAtEnd(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance)) {
+      NextInstance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance);
+    }
+    FreePool ((VOID *)Instance);
+    Instance = NextInstance;
+  } while (Instance != NULL);
+
+  return Status;
+}
diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
new file mode 100644
index 0000000000..61e6253d31
--- /dev/null
+++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
@@ -0,0 +1,39 @@
+## @file
+# Implementation of EFI REST JSON Structure Protocol.
+#
+#  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+  INF_VERSION               = 0x00010005
+  BASE_NAME                 = RestJsonStructureDxe
+  FILE_GUID                 = 83FAAFBF-FC4B-469F-892A-798E66A6F50A
+  MODULE_TYPE               = DXE_DRIVER
+  VERSION_STRING            = 1.0
+  ENTRY_POINT               = RestJsonStructureEntryPoint
+  UNLOAD_IMAGE              = RestJsonStructureUnload
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  RedfishPkg/RedfishPkg.dec
+
+[Sources]
+  RestJsonStructureDxe.c
+  RestJsonStructureInternal.h
+
+[LibraryClasses]
+  BaseLib
+  BaseMemoryLib
+  MemoryAllocationLib
+  UefiBootServicesTableLib
+  UefiDriverEntryPoint
+  UefiLib
+
+[Protocols]
+  gEfiRestJsonStructureProtocolGuid    ## Producing
+
+[Depex]
+  TRUE
+
diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h
new file mode 100644
index 0000000000..e8a3408404
--- /dev/null
+++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h
@@ -0,0 +1,33 @@
+/** @file
+  The internal definitions of EFI REST Resource JSON to C structure convertor
+  Protocol.
+
+  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef EFI_REST_JSON_STRUCTURE_INTERNAL_H_
+#define EFI_REST_JSON_STRUCTURE_INTERNAL_H_
+
+#include <Library/BaseLib.h>
+#include <Library/UefiLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+
+///
+/// Internal structure to maintain the information of JSON to
+/// C structure convertor.
+///
+typedef struct _REST_JSON_STRUCTURE_INSTANCE {
+  LIST_ENTRY NextRestJsonStructureInstance;  ///< Next convertor instance
+  UINTN NumberOfNameSpaceToConvert;          ///< Number of resource type this convertor supports.
+  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER     *SupportedRsrcIndentifier; ///< The resource type linklist
+  EFI_REST_JSON_STRUCTURE_TO_STRUCTURE        JsonToStructure;          ///< JSON to C structure function
+  EFI_REST_JSON_STRUCTURE_TO_JSON             StructureToJson;          ///< C structure to JSON function
+  EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE   DestroyStructure;         ///< Destory C struture function.
+} REST_JSON_STRUCTURE_INSTANCE;
+#endif
-- 
2.17.1


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

* [RestJsonStructureDxe PATCH v4 3/3] RedfishPkg: Changes on RedfishPkg for CI test
  2020-10-30  0:50 [RestJsonStructureDxe PATCH v4 0/3] EFI REST JSON Structure Protocol Abner Chang
  2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 1/3] MdePkg/Include: Definitions of " Abner Chang
  2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 2/3] RedfishPkg/RestJsonStructureDxe: " Abner Chang
@ 2020-10-30  0:50 ` Abner Chang
  2 siblings, 0 replies; 5+ messages in thread
From: Abner Chang @ 2020-10-30  0:50 UTC (permalink / raw)
  To: devel; +Cc: Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao, Nickle Wang

Add accepted dependency of RedfishPkg in RedfishPkg CI
yaml file.

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

Cc: Jiaxin Wu <jiaxin.wu@intel.com>
Cc: Siyuan Fu <siyuan.fu@intel.com>
Cc: Fan Wang <fan.wang@intel.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Nickle Wang <nickle.wang@hpe.com>
Reviewed-by: Nickle Wang <nickle.wang@hpe.com>
---
 RedfishPkg/RedfishPkg.ci.yaml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/RedfishPkg/RedfishPkg.ci.yaml b/RedfishPkg/RedfishPkg.ci.yaml
index 75c3b6a8ad..bb3b8b6746 100644
--- a/RedfishPkg/RedfishPkg.ci.yaml
+++ b/RedfishPkg/RedfishPkg.ci.yaml
@@ -29,7 +29,8 @@
         "AcceptableDependencies": [
             "MdePkg/MdePkg.dec",
             "MdeModulePkg/MdeModulePkg.dec",
-            "NetworkPkg/NetworkPkg.dec"
+            "NetworkPkg/NetworkPkg.dec",
+            "RedfishPkg/RedfishPkg.dec"
         ],
         # For host based unit tests
         "AcceptableDependencies-HOST_APPLICATION":[],
-- 
2.17.1


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

* Re: [RestJsonStructureDxe PATCH v4 2/3] RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol
  2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 2/3] RedfishPkg/RestJsonStructureDxe: " Abner Chang
@ 2020-11-02  3:39   ` Nickle Wang
  0 siblings, 0 replies; 5+ messages in thread
From: Nickle Wang @ 2020-11-02  3:39 UTC (permalink / raw)
  To: Chang, Abner (HPS SW/FW Technologist), devel@edk2.groups.io
  Cc: Jiaxin Wu, Siyuan Fu, Fan Wang, Jiewen Yao

Hi Abner,

Thanks for addressing my comment.

Reviewed-by: Nickle Wang <nickle.wang@hpe.com>

> -----Original Message-----
> From: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>
> Sent: Friday, October 30, 2020 8:51 AM
> To: devel@edk2.groups.io
> Cc: Jiaxin Wu <jiaxin.wu@intel.com>; Siyuan Fu <siyuan.fu@intel.com>; Fan
> Wang <fan.wang@intel.com>; Jiewen Yao <jiewen.yao@intel.com>; Wang,
> Nickle (HPS SW) <nickle.wang@hpe.com>
> Subject: [RestJsonStructureDxe PATCH v4 2/3]
> RedfishPkg/RestJsonStructureDxe: EFI REST JSON Structure Protocol
> 
> Implementation of EFI_REST_JSON_STRUCTURE_PROTOCOL, refer to UEFI
> spec
> 2.8 Section 29.7.3 EFI REST JSON Resource to C Structure Converter.
> 
> Signed-off-by: Abner Chang <abner.chang@hpe.com>
> 
> Cc: Jiaxin Wu <jiaxin.wu@intel.com>
> Cc: Siyuan Fu <siyuan.fu@intel.com>
> Cc: Fan Wang <fan.wang@intel.com>
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Nickle Wang <nickle.wang@hpe.com>
> ---
>  RedfishPkg/RedfishPkg.dsc                     |  11 +
>  .../RestJsonStructureDxe.c                    | 586 ++++++++++++++++++
>  .../RestJsonStructureDxe.inf                  |  39 ++
>  .../RestJsonStructureInternal.h               |  33 +
>  4 files changed, 669 insertions(+)
>  create mode 100644
> RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c
>  create mode 100644
> RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
>  create mode 100644
> RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h
> 
> diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc index
> 8acadddefc..f0c6740fac 100644
> --- a/RedfishPkg/RedfishPkg.dsc
> +++ b/RedfishPkg/RedfishPkg.dsc
> @@ -38,3 +38,14 @@
> 
> DxeServicesTableLib|MdePkg/Library/DxeServicesTableLib/DxeServicesTabl
> eLib.inf
>    DxeServicesLib|MdePkg/Library/DxeServicesLib/DxeServicesLib.inf
> 
> ReportStatusCodeLib|MdeModulePkg/Library/DxeReportStatusCodeLib/Dx
> eReportStatusCodeLib.inf
> +
> +[LibraryClasses.ARM, LibraryClasses.AARCH64]
> +  #
> +  # This library provides the instrinsic functions generated by a given
> compiler.
> +  #
> +  NULL|ArmPkg/Library/CompilerIntrinsicsLib/CompilerIntrinsicsLib.inf
> +  NULL|MdePkg/Library/BaseStackCheckLib/BaseStackCheckLib.inf
> +  ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf
> +
> +[Components]
> +  RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
> diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c
> b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c
> new file mode 100644
> index 0000000000..a3f4cd3c9a
> --- /dev/null
> +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.c
> @@ -0,0 +1,586 @@
> +/** @file
> +
> +  The implementation of EFI REST Resource JSON to C structure convertor
> + Protocol.
> +
> +  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include <Uefi.h>
> +#include <Protocol/RestJsonStructure.h> #include
> +"RestJsonStructureInternal.h"
> +
> +LIST_ENTRY mRestJsonStructureList;
> +EFI_HANDLE mProtocolHandle;
> +
> +/**
> +  This function registers Restful resource interpreter for the
> +  specific schema.
> +
> +  @param[in]    This                     This is the
> EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
> +  @param[in]    JsonStructureSupported   The type and version of REST JSON
> resource which this converter
> +                                         supports.
> +  @param[in]    ToStructure              The function to convert REST JSON
> resource to structure.
> +  @param[in]    ToJson                   The function to convert REST JSON structure
> to JSON in text format.
> +  @param[in]    DestroyStructure         Destroy REST JSON structure returned
> in ToStructure()  function.
> +
> +  @retval EFI_SUCCESS             Register successfully.
> +  @retval Others                  Fail to register.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RestJsonStructureRegister (
> +  IN EFI_REST_JSON_STRUCTURE_PROTOCOL       *This,
> +  IN EFI_REST_JSON_STRUCTURE_SUPPORTED      *JsonStructureSupported,
> +  IN EFI_REST_JSON_STRUCTURE_TO_STRUCTURE   ToStructure,
> +  IN EFI_REST_JSON_STRUCTURE_TO_JSON        ToJson,
> +  IN EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE DestroyStructure
> +)
> +{
> +  UINTN NumberOfNS;
> +  UINTN Index;
> +  LIST_ENTRY *ThisList;
> +  REST_JSON_STRUCTURE_INSTANCE *Instance;
> +  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *CloneSupportedInterpId;
> +  EFI_REST_JSON_STRUCTURE_SUPPORTED *ThisSupportedInterp;
> +
> +  if (This == NULL ||
> +      ToStructure == NULL ||
> +      ToJson == NULL ||
> +      DestroyStructure == NULL ||
> +      JsonStructureSupported == NULL
> +      ) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  //
> +  // Check how many name space interpreter can interpret.
> +  //
> +  ThisList = &JsonStructureSupported->NextSupportedRsrcInterp;
> +  NumberOfNS = 1;
> +  while (TRUE) {
> +    if (ThisList->ForwardLink == &JsonStructureSupported-
> >NextSupportedRsrcInterp) {
> +      break;
> +    } else {
> +      ThisList = ThisList->ForwardLink;
> +      NumberOfNS ++;
> +    }
> +  };
> +
> +  Instance =
> +    (REST_JSON_STRUCTURE_INSTANCE *)AllocateZeroPool (sizeof
> +(REST_JSON_STRUCTURE_INSTANCE) + NumberOfNS * sizeof
> +(EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER));
> +  if (Instance == NULL) {
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +  InitializeListHead (&Instance->NextRestJsonStructureInstance);
> +  Instance->NumberOfNameSpaceToConvert = NumberOfNS;
> +  Instance->SupportedRsrcIndentifier =
> +(EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER
> +*)((REST_JSON_STRUCTURE_INSTANCE *)Instance + 1);
> +  //
> +  // Copy supported resource identifer interpreter.
> +  //
> +  CloneSupportedInterpId = Instance->SupportedRsrcIndentifier;
> +  ThisSupportedInterp = JsonStructureSupported;
> +  for (Index = 0; Index < NumberOfNS; Index ++) {
> +    CopyMem ((VOID *)CloneSupportedInterpId, (VOID
> *)&ThisSupportedInterp->RestResourceInterp, sizeof
> (EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER));
> +    ThisSupportedInterp = (EFI_REST_JSON_STRUCTURE_SUPPORTED
> *)ThisSupportedInterp->NextSupportedRsrcInterp.ForwardLink;
> +    CloneSupportedInterpId ++;
> +  }
> +  Instance->JsonToStructure = ToStructure;
> +  Instance->StructureToJson = ToJson;
> +  Instance->DestroyStructure = DestroyStructure;
> +  InsertTailList (&mRestJsonStructureList,
> +&Instance->NextRestJsonStructureInstance);
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  This function check if this interpreter instance support the given
> namesapce.
> +
> +  @param[in]    This                EFI_REST_JSON_STRUCTURE_PROTOCOL
> instance.
> +  @param[in]    InterpreterInstance REST_JSON_STRUCTURE_INSTANCE
> +  @param[in]    RsrcTypeIdentifier  Resource type identifier.
> +  @param[in]    ResourceRaw         Given Restful resource.
> +  @param[out]   RestJSonHeader      Property interpreted from given
> ResourceRaw.
> +
> +  @retval EFI_SUCCESS
> +  @retval Others.
> +
> +**/
> +EFI_STATUS
> +InterpreterInstanceToStruct (
> +  IN EFI_REST_JSON_STRUCTURE_PROTOCOL         *This,
> +  IN REST_JSON_STRUCTURE_INSTANCE             *InterpreterInstance,
> +  IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER   *RsrcTypeIdentifier
> OPTIONAL,
> +  IN CHAR8                                    *ResourceRaw,
> +  OUT EFI_REST_JSON_STRUCTURE_HEADER          **RestJSonHeader
> + )
> +{
> +  UINTN Index;
> +  EFI_STATUS Status;
> +  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId;
> +
> +  if (This == NULL ||
> +      InterpreterInstance == NULL ||
> +      ResourceRaw == NULL ||
> +      RestJSonHeader == NULL
> +      ) {
> +      return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Status = EFI_UNSUPPORTED;
> +  if (RsrcTypeIdentifier == NULL) {
> +    //
> +    // No resource type identifier, send to intepreter anyway.
> +    // Interpreter may recognize this resource.
> +    //
> +    Status = InterpreterInstance->JsonToStructure (
> +                This,
> +                NULL,
> +                ResourceRaw,
> +                RestJSonHeader
> +                );
> +  } else {
> +    //
> +    // Check if the namesapce and version is supported by this interpreter.
> +    //
> +    ThisSupportedRsrcTypeId = InterpreterInstance-
> >SupportedRsrcIndentifier;
> +    for (Index = 0; Index < InterpreterInstance-
> >NumberOfNameSpaceToConvert; Index ++){
> +      if (AsciiStrCmp (
> +            RsrcTypeIdentifier->NameSpace.ResourceTypeName,
> +            ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){
> +        if ((RsrcTypeIdentifier->NameSpace.MajorVersion == NULL) &&
> +            (RsrcTypeIdentifier->NameSpace.MinorVersion == NULL) &&
> +            (RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL)
> +            ) {
> +          //
> +          // Don't check version of this resource type identifier.
> +          //
> +          Status = InterpreterInstance->JsonToStructure (
> +                      This,
> +                      RsrcTypeIdentifier,
> +                      ResourceRaw,
> +                      RestJSonHeader
> +                      );
> +          break;
> +        } else {
> +          //
> +          // Check version.
> +          //
> +          if ((AsciiStrCmp (
> +                RsrcTypeIdentifier->NameSpace.MajorVersion,
> +                ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) &&
> +              (AsciiStrCmp (
> +                RsrcTypeIdentifier->NameSpace.MinorVersion,
> +                ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) &&
> +              (AsciiStrCmp (
> +                RsrcTypeIdentifier->NameSpace.ErrataVersion,
> +                ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) {
> +            Status = InterpreterInstance->JsonToStructure (
> +                      This,
> +                      RsrcTypeIdentifier,
> +                      ResourceRaw,
> +                      RestJSonHeader
> +                      );
> +            break;
> +          }
> +        }
> +      }
> +      ThisSupportedRsrcTypeId ++;
> +    }
> +  }
> +  return Status;
> +}
> +/**
> +  This function converts JSON C structure to JSON property.
> +
> +  @param[in]    This                 EFI_REST_JSON_STRUCTURE_PROTOCOL
> instance.
> +  @param[in]    InterpreterInstance  REST_JSON_STRUCTURE_INSTANCE
> +  @param[in]    RestJSonHeader       Resource type identifier.
> +  @param[out]   ResourceRaw          Output in JSON text format.
> +
> +  @retval EFI_SUCCESS
> +  @retval Others.
> +
> +**/
> +EFI_STATUS
> +InterpreterEfiStructToInstance (
> +  IN EFI_REST_JSON_STRUCTURE_PROTOCOL   *This,
> +  IN REST_JSON_STRUCTURE_INSTANCE       *InterpreterInstance,
> +  IN EFI_REST_JSON_STRUCTURE_HEADER     *RestJSonHeader,
> +  OUT CHAR8 **ResourceRaw
> +)
> +{
> +  UINTN Index;
> +  EFI_STATUS Status;
> +  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId;
> +  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier;
> +
> +  if (This == NULL ||
> +      InterpreterInstance == NULL ||
> +      RestJSonHeader == NULL ||
> +      ResourceRaw == NULL
> +      ) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +  RsrcTypeIdentifier = &RestJSonHeader->JsonRsrcIdentifier;
> +  if (RsrcTypeIdentifier == NULL ||
> +      RsrcTypeIdentifier->NameSpace.ResourceTypeName == NULL ||
> +      RsrcTypeIdentifier->NameSpace.MajorVersion == NULL ||
> +      RsrcTypeIdentifier->NameSpace.MinorVersion == NULL ||
> +      RsrcTypeIdentifier->NameSpace.ErrataVersion == NULL
> +      ) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  //
> +  // Check if the namesapce and version is supported by this interpreter.
> +  //
> +  Status = EFI_UNSUPPORTED;
> +  ThisSupportedRsrcTypeId =
> +InterpreterInstance->SupportedRsrcIndentifier;
> +  for (Index = 0; Index < InterpreterInstance-
> >NumberOfNameSpaceToConvert; Index ++){
> +    if (AsciiStrCmp (
> +          RsrcTypeIdentifier->NameSpace.ResourceTypeName,
> +          ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0){
> +      //
> +      // Check version.
> +      //
> +      if ((AsciiStrCmp (
> +            RsrcTypeIdentifier->NameSpace.MajorVersion,
> +            ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) &&
> +          (AsciiStrCmp (
> +            RsrcTypeIdentifier->NameSpace.MinorVersion,
> +            ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) &&
> +          (AsciiStrCmp (
> +            RsrcTypeIdentifier->NameSpace.ErrataVersion,
> +            ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) {
> +        Status = InterpreterInstance->StructureToJson (
> +                  This,
> +                  RestJSonHeader,
> +                  ResourceRaw
> +                  );
> +        break;
> +      }
> +    }
> +    ThisSupportedRsrcTypeId ++;
> +  }
> +  return Status;
> +}
> +
> +/**
> +  This function destory REST property structure.
> +
> +  @param[in]    This                 EFI_REST_JSON_STRUCTURE_PROTOCOL
> instance.
> +  @param[in]    InterpreterInstance  REST_JSON_STRUCTURE_INSTANCE
> +  @param[in]    RestJSonHeader       Property interpreted from given
> ResourceRaw.
> +
> +  @retval EFI_SUCCESS
> +  @retval Others.
> +
> +**/
> +EFI_STATUS
> +InterpreterInstanceDestoryJsonStruct (
> +  IN EFI_REST_JSON_STRUCTURE_PROTOCOL       *This,
> +  IN REST_JSON_STRUCTURE_INSTANCE           *InterpreterInstance,
> +  IN EFI_REST_JSON_STRUCTURE_HEADER         *RestJSonHeader
> + )
> +{
> +  UINTN Index;
> +  EFI_STATUS Status;
> +  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *ThisSupportedRsrcTypeId;
> +
> +  if (This == NULL ||
> +      InterpreterInstance == NULL ||
> +      RestJSonHeader == NULL
> +      ) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  Status = EFI_UNSUPPORTED;
> +  //
> +  // Check if the namesapce and version is supported by this interpreter.
> +  //
> +  ThisSupportedRsrcTypeId =
> +InterpreterInstance->SupportedRsrcIndentifier;
> +  for (Index = 0; Index < InterpreterInstance-
> >NumberOfNameSpaceToConvert; Index ++){
> +    if (AsciiStrCmp (
> +          RestJSonHeader->JsonRsrcIdentifier.NameSpace.ResourceTypeName,
> +          ThisSupportedRsrcTypeId->NameSpace.ResourceTypeName) == 0) {
> +      if ((RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion ==
> NULL) &&
> +          (RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion ==
> NULL) &&
> +          (RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion ==
> NULL)
> +          ) {
> +        //
> +        // Don't check version of this resource type identifier.
> +        //
> +        Status = InterpreterInstance->DestroyStructure (
> +                    This,
> +                    RestJSonHeader
> +                    );
> +        break;
> +      } else {
> +        //
> +        // Check version.
> +        //
> +        if ((AsciiStrCmp (
> +              RestJSonHeader->JsonRsrcIdentifier.NameSpace.MajorVersion,
> +              ThisSupportedRsrcTypeId->NameSpace.MajorVersion) == 0) &&
> +            (AsciiStrCmp (
> +              RestJSonHeader->JsonRsrcIdentifier.NameSpace.MinorVersion,
> +              ThisSupportedRsrcTypeId->NameSpace.MinorVersion) == 0) &&
> +            (AsciiStrCmp (
> +              RestJSonHeader->JsonRsrcIdentifier.NameSpace.ErrataVersion,
> +              ThisSupportedRsrcTypeId->NameSpace.ErrataVersion) == 0)) {
> +          Status = InterpreterInstance->DestroyStructure (
> +                    This,
> +                    RestJSonHeader
> +                    );
> +          break;
> +        }
> +      }
> +    }
> +    ThisSupportedRsrcTypeId ++;
> +  }
> +  return Status;
> +}
> +
> +/**
> +  This function translates the given JSON text to JSON C Structure.
> +
> +  @param[in]    This                EFI_REST_JSON_STRUCTURE_PROTOCOL
> instance.
> +  @param[in]    RsrcTypeIdentifier  Resource type identifier.
> +  @param[in]    ResourceJsonText    Given Restful resource.
> +  @param[out]   JsonStructure       Property interpreted from given
> ResourceRaw.
> +
> +  @retval EFI_SUCCESS
> +  @retval Others.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RestJsonStructureToStruct (
> +  IN EFI_REST_JSON_STRUCTURE_PROTOCOL       *This,
> +  IN EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER *RsrcTypeIdentifier
> OPTIONAL,
> +  IN CHAR8                                  *ResourceJsonText,
> +  OUT EFI_REST_JSON_STRUCTURE_HEADER        **JsonStructure
> +)
> +{
> +  EFI_STATUS Status;
> +  REST_JSON_STRUCTURE_INSTANCE *Instance;
> +
> +  if (This == NULL ||
> +      ResourceJsonText == NULL ||
> +      JsonStructure == NULL
> +    ) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (IsListEmpty (&mRestJsonStructureList)) {
> +    return EFI_UNSUPPORTED;
> +  }
> +  Status = EFI_SUCCESS;
> +  Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode
> +(&mRestJsonStructureList);
> +  while (TRUE) {
> +    Status = InterpreterInstanceToStruct (
> +                This,
> +                Instance,
> +                RsrcTypeIdentifier,
> +                ResourceJsonText,
> +                JsonStructure
> +              );
> +    if (!EFI_ERROR (Status)) {
> +      break;
> +    }
> +    if (IsNodeAtEnd(&mRestJsonStructureList, &Instance-
> >NextRestJsonStructureInstance)) {
> +      Status = EFI_UNSUPPORTED;
> +      break;
> +    }
> +    Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode
> +(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance);
> +  };
> +  return Status;
> +}
> +
> +/**
> +  This function destory REST property EFI structure which returned in
> +  JsonToStructure().
> +
> +  @param[in]    This            EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
> +  @param[in]    RestJSonHeader  Property to destory.
> +
> +  @retval EFI_SUCCESS
> +  @retval Others
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RestJsonStructureDestroyStruct (
> +  IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This,
> +  IN EFI_REST_JSON_STRUCTURE_HEADER  *RestJSonHeader
> +)
> +{
> +  EFI_STATUS Status;
> +  REST_JSON_STRUCTURE_INSTANCE *Instance;
> +
> +  if (This == NULL || RestJSonHeader == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (IsListEmpty (&mRestJsonStructureList)) {
> +    return EFI_UNSUPPORTED;
> +  }
> +  Status = EFI_SUCCESS;
> +  Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode
> +(&mRestJsonStructureList);
> +  while (TRUE) {
> +    Status = InterpreterInstanceDestoryJsonStruct (
> +                This,
> +                Instance,
> +                RestJSonHeader
> +              );
> +    if (!EFI_ERROR (Status)) {
> +      break;
> +    }
> +    if (IsNodeAtEnd(&mRestJsonStructureList, &Instance-
> >NextRestJsonStructureInstance)) {
> +      Status = EFI_UNSUPPORTED;
> +      break;
> +    }
> +    Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode
> +(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance);
> +  };
> +  return Status;
> +}
> +
> +/**
> +  This function translates the given JSON C Structure to JSON text.
> +
> +  @param[in]    This            EFI_REST_JSON_STRUCTURE_PROTOCOL instance.
> +  @param[in]    RestJSonHeader  Given Restful resource.
> +  @param[out]   ResourceRaw     Resource in RESTfuls service oriented.
> +
> +  @retval EFI_SUCCESS
> +  @retval Others             Fail to remove the entry
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RestJsonStructureToJson (
> +  IN EFI_REST_JSON_STRUCTURE_PROTOCOL *This,
> +  IN EFI_REST_JSON_STRUCTURE_HEADER *RestJSonHeader,
> +  OUT CHAR8 **ResourceRaw
> +)
> +{
> +  EFI_STATUS Status;
> +  REST_JSON_STRUCTURE_INSTANCE *Instance;
> +
> +  if (This == NULL || RestJSonHeader == NULL || ResourceRaw == NULL) {
> +    return EFI_INVALID_PARAMETER;
> +  }
> +
> +  if (IsListEmpty (&mRestJsonStructureList)) {
> +    return EFI_UNSUPPORTED;
> +  }
> +  Status = EFI_SUCCESS;
> +  Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode
> +(&mRestJsonStructureList);
> +  while (TRUE) {
> +    Status = InterpreterEfiStructToInstance (
> +                This,
> +                Instance,
> +                RestJSonHeader,
> +                ResourceRaw
> +              );
> +    if (!EFI_ERROR (Status)) {
> +      break;
> +    }
> +    if (IsNodeAtEnd(&mRestJsonStructureList, &Instance-
> >NextRestJsonStructureInstance)) {
> +      Status = EFI_UNSUPPORTED;
> +      break;
> +    }
> +    Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode
> +(&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance);
> +  };
> +  return Status;
> +}
> +
> +EFI_REST_JSON_STRUCTURE_PROTOCOL mRestJsonStructureProtocol = {
> +  RestJsonStructureRegister,
> +  RestJsonStructureToStruct,
> +  RestJsonStructureToJson,
> +  RestJsonStructureDestroyStruct
> +};
> +
> +/**
> +  This is the declaration of an EFI image entry point.
> +
> +  @param  ImageHandle           The firmware allocated handle for the UEFI
> image.
> +  @param  SystemTable           A pointer to the EFI System Table.
> +
> +  @retval EFI_SUCCESS           The operation completed successfully.
> +  @retval Others                An unexpected error occurred.
> +**/
> +EFI_STATUS
> +EFIAPI
> +RestJsonStructureEntryPoint (
> +  IN EFI_HANDLE        ImageHandle,
> +  IN EFI_SYSTEM_TABLE  *SystemTable
> +  )
> +{
> +  EFI_STATUS Status;
> +
> +  InitializeListHead (&mRestJsonStructureList);
> +  //
> +  // Install the Restful Resource Interpreter Protocol.
> +  //
> +  mProtocolHandle = NULL;
> +  Status = gBS->InstallProtocolInterface (
> +                  &mProtocolHandle,
> +                  &gEfiRestJsonStructureProtocolGuid,
> +                  EFI_NATIVE_INTERFACE,
> +                  (VOID *)&mRestJsonStructureProtocol
> +                  );
> +  return Status;
> +}
> +
> +/**
> +  This is the unload handle for Redfish discover module.
> +
> +  Disconnect the driver specified by ImageHandle from all the devices in the
> handle database.
> +  Uninstall all the protocols installed in the driver entry point.
> +
> +  @param[in] ImageHandle           The drivers' driver image.
> +
> +  @retval    EFI_SUCCESS           The image is unloaded.
> +  @retval    Others                Failed to unload the image.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +RestJsonStructureUnload (
> +  IN EFI_HANDLE ImageHandle
> +  )
> +{
> +  EFI_STATUS Status;
> +  REST_JSON_STRUCTURE_INSTANCE *Instance;
> +  REST_JSON_STRUCTURE_INSTANCE *NextInstance;
> +
> +  Status = gBS->UninstallProtocolInterface (
> +                  mProtocolHandle,
> +                  &gEfiRestJsonStructureProtocolGuid,
> +                  (VOID *)&mRestJsonStructureProtocol
> +                  );
> +
> +  if (IsListEmpty (&mRestJsonStructureList)) {
> +    return Status;
> +  }
> +  //
> +  // Free memory of REST_JSON_STRUCTURE_INSTANCE instance.
> +  //
> +  Instance = (REST_JSON_STRUCTURE_INSTANCE *)GetFirstNode
> + (&mRestJsonStructureList);  do {
> +    NextInstance = NULL;
> +    if (!IsNodeAtEnd(&mRestJsonStructureList, &Instance-
> >NextRestJsonStructureInstance)) {
> +      NextInstance = (REST_JSON_STRUCTURE_INSTANCE *)GetNextNode
> (&mRestJsonStructureList, &Instance->NextRestJsonStructureInstance);
> +    }
> +    FreePool ((VOID *)Instance);
> +    Instance = NextInstance;
> +  } while (Instance != NULL);
> +
> +  return Status;
> +}
> diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
> b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
> new file mode 100644
> index 0000000000..61e6253d31
> --- /dev/null
> +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureDxe.inf
> @@ -0,0 +1,39 @@
> +## @file
> +# Implementation of EFI REST JSON Structure Protocol.
> +#
> +#  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> #
> +SPDX-License-Identifier: BSD-2-Clause-Patent ##
> +
> +[Defines]
> +  INF_VERSION               = 0x00010005
> +  BASE_NAME                 = RestJsonStructureDxe
> +  FILE_GUID                 = 83FAAFBF-FC4B-469F-892A-798E66A6F50A
> +  MODULE_TYPE               = DXE_DRIVER
> +  VERSION_STRING            = 1.0
> +  ENTRY_POINT               = RestJsonStructureEntryPoint
> +  UNLOAD_IMAGE              = RestJsonStructureUnload
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  MdeModulePkg/MdeModulePkg.dec
> +  RedfishPkg/RedfishPkg.dec
> +
> +[Sources]
> +  RestJsonStructureDxe.c
> +  RestJsonStructureInternal.h
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  MemoryAllocationLib
> +  UefiBootServicesTableLib
> +  UefiDriverEntryPoint
> +  UefiLib
> +
> +[Protocols]
> +  gEfiRestJsonStructureProtocolGuid    ## Producing
> +
> +[Depex]
> +  TRUE
> +
> diff --git a/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h
> b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h
> new file mode 100644
> index 0000000000..e8a3408404
> --- /dev/null
> +++ b/RedfishPkg/RestJsonStructureDxe/RestJsonStructureInternal.h
> @@ -0,0 +1,33 @@
> +/** @file
> +  The internal definitions of EFI REST Resource JSON to C structure
> +convertor
> +  Protocol.
> +
> +  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
> +
> +  SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#ifndef EFI_REST_JSON_STRUCTURE_INTERNAL_H_
> +#define EFI_REST_JSON_STRUCTURE_INTERNAL_H_
> +
> +#include <Library/BaseLib.h>
> +#include <Library/UefiLib.h>
> +#include <Library/UefiBootServicesTableLib.h>
> +#include <Library/UefiDriverEntryPoint.h> #include
> +<Library/BaseMemoryLib.h> #include <Library/MemoryAllocationLib.h>
> +
> +///
> +/// Internal structure to maintain the information of JSON to /// C
> +structure convertor.
> +///
> +typedef struct _REST_JSON_STRUCTURE_INSTANCE {
> +  LIST_ENTRY NextRestJsonStructureInstance;  ///< Next convertor instance
> +  UINTN NumberOfNameSpaceToConvert;          ///< Number of resource
> type this convertor supports.
> +  EFI_REST_JSON_RESOURCE_TYPE_IDENTIFIER
> *SupportedRsrcIndentifier; ///< The resource type linklist
> +  EFI_REST_JSON_STRUCTURE_TO_STRUCTURE        JsonToStructure;
> ///< JSON to C structure function
> +  EFI_REST_JSON_STRUCTURE_TO_JSON             StructureToJson;          ///< C
> structure to JSON function
> +  EFI_REST_JSON_STRUCTURE_DESTORY_STRUCTURE   DestroyStructure;
> ///< Destory C struture function.
> +} REST_JSON_STRUCTURE_INSTANCE;
> +#endif
> --
> 2.17.1


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

end of thread, other threads:[~2020-11-02  3:39 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-10-30  0:50 [RestJsonStructureDxe PATCH v4 0/3] EFI REST JSON Structure Protocol Abner Chang
2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 1/3] MdePkg/Include: Definitions of " Abner Chang
2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 2/3] RedfishPkg/RestJsonStructureDxe: " Abner Chang
2020-11-02  3:39   ` Nickle Wang
2020-10-30  0:50 ` [RestJsonStructureDxe PATCH v4 3/3] RedfishPkg: Changes on RedfishPkg for CI test Abner Chang

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