]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c
1) Add in support for Framework VFR file which specify all VAR Store correctly. This...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / Forms.c
index fb0a6900b8d4f3c556dbc00a9e3058ff5ecdb2b4..c302cf56f0dc02e765d48d61894e24a03d2602a5 100644 (file)
@@ -55,6 +55,8 @@ FW_HII_FORMSET_TEMPLATE FormSetTemplate = {
 };\r
 \r
 \r
+EFI_GUID  mTianoHiiIfrGuid              = EFI_IFR_TIANO_GUID;\r
+\r
 /**\r
 \r
   This thunk module only handles UEFI HII packages. The caller of this function \r
@@ -144,10 +146,12 @@ HiiGetForms (
   CopyMem (OutputFormSet, &FormSetTemplate, sizeof (FW_HII_FORMSET_TEMPLATE));\r
   CopyMem (&OutputFormSet->FormSet.Guid, &ThunkContext->TagGuid, sizeof (EFI_GUID)); \r
 \r
-  OutputFormSet->FormSet.Class = ThunkContext->FormSetClass;\r
-  OutputFormSet->FormSet.SubClass = ThunkContext->FormSetSubClass;\r
-  OutputFormSet->FormSet.Help     = ThunkContext->FormSetHelp;\r
-  OutputFormSet->FormSet.FormSetTitle = ThunkContext->FormSetTitle;\r
+  if (ThunkContext->FormSet != NULL) {\r
+    OutputFormSet->FormSet.Class = ThunkContext->FormSet->Class;\r
+    OutputFormSet->FormSet.SubClass = ThunkContext->FormSet->SubClass;\r
+    OutputFormSet->FormSet.Help     = ThunkContext->FormSet->Help;\r
+    OutputFormSet->FormSet.FormSetTitle = ThunkContext->FormSet->FormSetTitle;\r
+  }\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -182,25 +186,25 @@ HiiGetDefaultImage (
   )\r
 {\r
   LIST_ENTRY        *UefiDefaults;\r
-  EFI_HII_HANDLE    UefiHiiHandle;\r
   EFI_STATUS        Status;\r
   HII_THUNK_PRIVATE_DATA *Private;\r
+  HII_THUNK_CONTEXT *ThunkContext;\r
 \r
   Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
-  UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
-  if (UefiHiiHandle == NULL) {\r
+  ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
+  if (ThunkContext == NULL) {\r
     ASSERT (FALSE);\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
   UefiDefaults = NULL;\r
-  Status = UefiIfrGetBufferTypeDefaults (UefiHiiHandle, &UefiDefaults);\r
+  Status = UefiIfrGetBufferTypeDefaults (ThunkContext, &UefiDefaults);\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
 \r
-  Status = UefiDefaultsToFwDefaults (UefiDefaults, DefaultMask, VariablePackList);\r
+  Status = UefiDefaultsToFwDefaults (UefiDefaults, DefaultMask, ThunkContext->FormSet->DefaultVarStoreId, VariablePackList);\r
 \r
 Done:\r
   FreeDefaultList (UefiDefaults);\r
@@ -209,12 +213,15 @@ Done:
 }\r
 \r
 /**\r
-  EDES_TODO: Add function description.\r
+  This function update the FormCallbackProtocol cached in Config Access\r
+  private context data.\r
 \r
-  @param CallbackHandle  EDES_TODO: Add parameter description\r
-  @param ThunkContext  EDES_TODO: Add parameter description\r
+  @param CallbackHandle  The EFI Handle on which the Framework FormCallbackProtocol is \r
+                         installed.\r
+  @param ThunkContext    The Thunk Context.\r
 \r
-  @return EDES_TODO: Add description for return value\r
+  @retval EFI_SUCCESS             The update is successful.\r
+  @retval EFI_INVALID_PARAMETER   If no Framework FormCallbackProtocol is located on CallbackHandle.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -260,17 +267,17 @@ UpdateFormCallBack (
 \r
 \r
 /**\r
-  EDES_TODO: Add function description.\r
+  Get the package data from the Package List.\r
 \r
-  @param HiiPackageList  EDES_TODO: Add parameter description\r
-  @param PackageIndex    EDES_TODO: Add parameter description\r
-  @param BufferLen       EDES_TODO: Add parameter description\r
-  @param Buffer          EDES_TODO: Add parameter description\r
+  @param HiiPackageList  Package List.\r
+  @param PackageIndex    The index of the Package in the Package List.\r
+  @param BufferLen       The Length of the Pacage data.\r
+  @param Buffer          On output, the Package data.\r
 \r
-  @return EDES_TODO: Add description for return value\r
+  @return EFI_NOT_FOUND  No Package is found for PackageIndex.\r
+  @return EFI_SUCCESS    The package data is returned.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 GetPackageData (\r
   IN  EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList,\r
@@ -317,10 +324,16 @@ GetPackageData (
 }\r
 \r
 /**\r
-  Check if Label exist in the IFR form package.\r
+  Check if Label exist in the IFR form package and return the FormSet GUID\r
+  and Form ID.\r
 \r
-  @param \r
+  @param Package      The Package Header.\r
+  @param Label        The Label ID.\r
+  @param FormsetGuid  Returns the FormSet GUID.\r
+  @param FormId       Returns the Form ID.\r
 \r
+  @retval EFI_SUCCESS     The FORM ID is found.\r
+  @retval EFI_NOT_FOUND   The FORM ID is not found.\r
 **/\r
 EFI_STATUS\r
 LocateLabel (\r
@@ -332,12 +345,11 @@ LocateLabel (
 {\r
   UINTN                     Offset;\r
   EFI_IFR_OP_HEADER         *IfrOpHdr;\r
-  UINT8                     ExtendOpCode;\r
-  UINT16                    LabelNumber;\r
   EFI_GUID                  InternalFormSetGuid;\r
   EFI_FORM_ID               InternalFormId;\r
   BOOLEAN                   GetFormSet;\r
   BOOLEAN                   GetForm;\r
+  EFI_IFR_GUID_LABEL        *LabelOpcode;\r
 \r
   IfrOpHdr   = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + sizeof (EFI_HII_PACKAGE_HEADER));\r
   Offset     = sizeof (EFI_HII_PACKAGE_HEADER);\r
@@ -360,26 +372,18 @@ LocateLabel (
       break;\r
 \r
     case EFI_IFR_GUID_OP :\r
-      ExtendOpCode = ((EFI_IFR_GUID_LABEL *) IfrOpHdr)->ExtendOpCode;\r
-      \r
-      if (ExtendOpCode != EFI_IFR_EXTEND_OP_LABEL) {\r
-        //\r
-        // Go to the next Op-Code\r
-        //\r
-        Offset   += IfrOpHdr->Length;\r
-        IfrOpHdr = (EFI_IFR_OP_HEADER *) ((CHAR8 *) (IfrOpHdr) + IfrOpHdr->Length);\r
-        continue;\r
-      }\r
-      \r
-      CopyMem (&LabelNumber, &((EFI_IFR_GUID_LABEL *)IfrOpHdr)->Number, sizeof (UINT16));\r
-      if (LabelNumber == Label) {\r
-        ASSERT (GetForm && GetFormSet);\r
-        CopyGuid (FormsetGuid, &InternalFormSetGuid);\r
-        *FormId = InternalFormId;\r
-        return EFI_SUCCESS;\r
+      LabelOpcode = (EFI_IFR_GUID_LABEL *) IfrOpHdr;\r
+      //\r
+      // If it is an Label opcode.\r
+      //\r
+      if ((LabelOpcode->ExtendOpCode == EFI_IFR_EXTEND_OP_LABEL) && (CompareMem (&LabelOpcode->Guid, &mTianoHiiIfrGuid, sizeof (EFI_GUID)) == 0)) {\r
+        if (CompareMem (&Label, &LabelOpcode->Number, sizeof (UINT16)) == 0) {\r
+          ASSERT (GetForm && GetFormSet);\r
+          CopyGuid (FormsetGuid, &InternalFormSetGuid);\r
+          *FormId = InternalFormId;\r
+          return EFI_SUCCESS;\r
+        }\r
       }\r
-      \r
-\r
       break;\r
     default :\r
       break;\r
@@ -462,6 +466,7 @@ Done:
   \r
   return Status;\r
 }\r
+\r
 /**\r
   This function allows the caller to update a form that has\r
   previously been registered with the EFI HII database.\r
@@ -539,10 +544,10 @@ HiiUpdateForm (
     if (Data->DataCount != 0) {\r
 \r
       ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
-      Status = FwUpdateDataToUefiUpdateData (ThunkContext, Data, AddData, &UefiHiiUpdateData);\r
+      Status = FwUpdateDataToUefiUpdateData (ThunkContext, Data, &UefiHiiUpdateData);\r
       ASSERT_EFI_ERROR (Status);\r
 \r
-      Status = IfrLibUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, Label, AddData, UefiHiiUpdateData);\r
+      Status = IfrLibUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, Label, TRUE, UefiHiiUpdateData);\r
       ASSERT_EFI_ERROR (Status);\r
       \r
     } \r