]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.c
Add comments for functions.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / UefiIfrDefault.c
index 12dd3be0b1c2bd91a187c9dad889a6f7034d9131..34d6cba6f878aab9176130596574e7ae7d4aa43e 100644 (file)
@@ -24,6 +24,7 @@
 #include <Library/MemoryAllocationLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 \r
+#include "HiiDatabase.h"\r
 #include "UefiIfrParser.h"\r
 #include "UefiIfrDefault.h"\r
 \r
@@ -35,216 +36,6 @@ extern CONST EFI_HII_IMAGE_PROTOCOL               *mHiiImageProtocol;
 extern CONST EFI_HII_STRING_PROTOCOL              *mHiiStringProtocol;\r
 extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mHiiConfigRoutingProtocol;\r
 \r
-extern EFI_GUID          gZeroGuid;\r
-\r
-/**\r
-  Fetch the Ifr binary data of a FormSet.\r
-\r
-  @param  Handle                 PackageList Handle\r
-  @param  FormSetGuid            GUID of a formset. If not specified (NULL or zero\r
-                                 GUID), take the first FormSet found in package\r
-                                 list.\r
-  @param  BinaryLength           The length of the FormSet IFR binary.\r
-  @param  BinaryData             The buffer designed to receive the FormSet.\r
-\r
-  @retval EFI_SUCCESS            Buffer filled with the requested FormSet.\r
-                                 BufferLength was updated.\r
-  @retval EFI_INVALID_PARAMETER  The handle is unknown.\r
-  @retval EFI_NOT_FOUND          A form or FormSet on the requested handle cannot\r
-                                 be found with the requested FormId.\r
-\r
-**/\r
-EFI_STATUS\r
-GetIfrBinaryData (\r
-  IN  EFI_HII_HANDLE   Handle,\r
-  IN OUT EFI_GUID      *FormSetGuid,\r
-  OUT UINTN            *BinaryLength,\r
-  OUT UINT8            **BinaryData\r
-  )\r
-{\r
-  EFI_STATUS                   Status;\r
-  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
-  UINTN                        BufferSize;\r
-  UINT8                        *Package;\r
-  UINT8                        *OpCodeData;\r
-  UINT32                       Offset;\r
-  UINT32                       Offset2;\r
-  BOOLEAN                      ReturnDefault;\r
-  UINT32                       PackageListLength;\r
-  EFI_HII_PACKAGE_HEADER       PackageHeader;\r
-\r
-  OpCodeData = NULL;\r
-  Package = NULL;\r
-  ZeroMem (&PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));;\r
-\r
-  //\r
-  // if FormSetGuid is NULL or zero GUID, return first FormSet in the package list\r
-  //\r
-  if (FormSetGuid == NULL || CompareGuid (FormSetGuid, &gZeroGuid)) {\r
-    ReturnDefault = TRUE;\r
-  } else {\r
-    ReturnDefault = FALSE;\r
-  }\r
-\r
-  //\r
-  // Get HII PackageList\r
-  //\r
-  BufferSize = 0;\r
-  HiiPackageList = NULL;\r
-  Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    HiiPackageList = AllocatePool (BufferSize);\r
-    ASSERT (HiiPackageList != NULL);\r
-\r
-    Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-  }\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Get Form package from this HII package List\r
-  //\r
-  Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
-  Offset2 = 0;\r
-  CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));\r
-\r
-  while (Offset < PackageListLength) {\r
-    Package = ((UINT8 *) HiiPackageList) + Offset;\r
-    CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
-\r
-    if (PackageHeader.Type == EFI_HII_PACKAGE_FORM) {\r
-      //\r
-      // Search FormSet in this Form Package\r
-      //\r
-      Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
-      while (Offset2 < PackageHeader.Length) {\r
-        OpCodeData = Package + Offset2;\r
-\r
-        if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
-          //\r
-          // Check whether return default FormSet\r
-          //\r
-          if (ReturnDefault) {\r
-            break;\r
-          }\r
-\r
-          //\r
-          // FormSet GUID is specified, check it\r
-          //\r
-          if (CompareGuid (FormSetGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
-            break;\r
-          }\r
-        }\r
-\r
-        Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
-      }\r
-\r
-      if (Offset2 < PackageHeader.Length) {\r
-        //\r
-        // Target formset found\r
-        //\r
-        break;\r
-      }\r
-    }\r
-\r
-    Offset += PackageHeader.Length;\r
-  }\r
-\r
-  if (Offset >= PackageListLength) {\r
-    //\r
-    // Form package not found in this Package List\r
-    //\r
-    gBS->FreePool (HiiPackageList);\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  if (ReturnDefault && FormSetGuid != NULL) {\r
-    //\r
-    // Return the default FormSet GUID\r
-    //\r
-    CopyMem (FormSetGuid, &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
-  }\r
-\r
-  //\r
-  // To determine the length of a whole FormSet IFR binary, one have to parse all the Opcodes\r
-  // in this FormSet; So, here just simply copy the data from start of a FormSet to the end\r
-  // of the Form Package.\r
-  //\r
-  *BinaryLength = PackageHeader.Length - Offset2;\r
-  *BinaryData = AllocateCopyPool (*BinaryLength, OpCodeData);\r
-\r
-  gBS->FreePool (HiiPackageList);\r
-\r
-  if (*BinaryData == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Initialize the internal data structure of a FormSet.\r
-\r
-  @param  Handle                 PackageList Handle\r
-  @param  FormSetGuid            GUID of a formset. If not specified (NULL or zero\r
-                                 GUID), take the first FormSet found in package\r
-                                 list.\r
-  @param  FormSet                FormSet data structure.\r
-\r
-  @retval EFI_SUCCESS            The function completed successfully.\r
-  @retval EFI_NOT_FOUND          The specified FormSet could not be found.\r
-\r
-**/\r
-EFI_STATUS\r
-InitializeFormSet (\r
-  IN  EFI_HII_HANDLE                   Handle,\r
-  IN OUT EFI_GUID                      *FormSetGuid,\r
-  OUT FORM_BROWSER_FORMSET             *FormSet\r
-  )\r
-{\r
-  EFI_STATUS                Status;\r
-  EFI_HANDLE                DriverHandle;\r
-\r
-  Status = GetIfrBinaryData (Handle, FormSetGuid, &FormSet->IfrBinaryLength, &FormSet->IfrBinaryData);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  FormSet->HiiHandle = Handle;\r
-  CopyMem (&FormSet->Guid, FormSetGuid, sizeof (EFI_GUID));\r
-\r
-  //\r
-  // Retrieve ConfigAccess Protocol associated with this HiiPackageList\r
-  //\r
-  Status = mHiiDatabase->GetPackageListHandle (mHiiDatabase, Handle, &DriverHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  FormSet->DriverHandle = DriverHandle;\r
-  Status = gBS->HandleProtocol (\r
-                  DriverHandle,\r
-                  &gEfiHiiConfigAccessProtocolGuid,\r
-                  (VOID **) &FormSet->ConfigAccess\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    //\r
-    // Configuration Driver don't attach ConfigAccess protocol to its HII package\r
-    // list, then there will be no configuration action required\r
-    //\r
-    FormSet->ConfigAccess = NULL;\r
-  }\r
-\r
-  //\r
-  // Parse the IFR binary OpCodes\r
-  //\r
-  Status = ParseOpCodes (FormSet);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  return Status;\r
-}\r
-\r
 /**\r
   Set the data position at Offset with Width in Node->Buffer based \r
   the value passed in.\r
@@ -275,6 +66,11 @@ SetNodeBuffer (
 /**\r
   Reset Question to its default value.\r
 \r
+  Note Framework 0.92's HII Implementation does not support for default value for these opcodes:\r
+  EFI_IFR_ORDERED_LIST_OP:\r
+  EFI_IFR_PASSWORD_OP:\r
+  EFI_IFR_STRING_OP:\r
+\r
   @param  FormSet                FormSet data structure.\r
   @param  DefaultId              The Class of the default.\r
 \r
@@ -329,22 +125,10 @@ GetQuestionDefault (
       Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
 \r
       if (Default->DefaultId == DefaultId) {\r
-        if (Default->ValueExpression != NULL) {\r
-          //\r
-          // Default is provided by an Expression, evaluate it\r
-          //\r
-          Status = EvaluateExpression (FormSet, Form, Default->ValueExpression);\r
-          if (EFI_ERROR (Status)) {\r
-            return Status;\r
-          }\r
-\r
-          CopyMem (HiiValue, &Default->ValueExpression->Result, sizeof (EFI_HII_VALUE));\r
-        } else {\r
-          //\r
-          // Default value is embedded in EFI_IFR_DEFAULT\r
-          //\r
-          CopyMem (HiiValue, &Default->Value, sizeof (EFI_HII_VALUE));\r
-        }\r
+        //\r
+        // Default value is embedded in EFI_IFR_DEFAULT\r
+        //\r
+        CopyMem (HiiValue, &Default->Value, sizeof (EFI_HII_VALUE));\r
        \r
         SetNodeBuffer (Node, HiiValue, Question->VarStoreInfo.VarOffset, Question->StorageWidth);\r
         return EFI_SUCCESS;\r
@@ -461,9 +245,9 @@ DestroyDefaultNode (
   IN UEFI_IFR_BUFFER_STORAGE_NODE        *Node\r
   )\r
 {\r
-  SafeFreePool (Node->Buffer);\r
-  SafeFreePool (Node->Name);\r
-  SafeFreePool (Node);\r
+  FreePool (Node->Buffer);\r
+  FreePool (Node->Name);\r
+  FreePool (Node);\r
 }\r
 \r
 \r
@@ -555,6 +339,7 @@ GetBufferTypeDefaultId (
 \r
     if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
       Status = GetBufferTypeDefaultIdAndStorageId (DefaultStore, Storage, FormSet, UefiDefaultsListHead);\r
+      ASSERT_EFI_ERROR (Status);\r
     }\r
 \r
     StorageLink = GetNextNode (&FormSet->StorageListHead, StorageLink);\r
@@ -579,41 +364,30 @@ GetBufferTypeDefaultId (
 **/\r
 EFI_STATUS\r
 UefiIfrGetBufferTypeDefaults (\r
-  IN  EFI_HII_HANDLE      UefiHiiHandle,\r
+  IN  HII_THUNK_CONTEXT   *ThunkContext,\r
   OUT LIST_ENTRY          **UefiDefaults\r
   )\r
 {\r
-  FORM_BROWSER_FORMSET *FormSet;\r
-  EFI_GUID              FormSetGuid;\r
   LIST_ENTRY            *DefaultLink;\r
   FORMSET_DEFAULTSTORE  *DefaultStore;\r
   EFI_STATUS            Status;\r
 \r
   ASSERT (UefiDefaults != NULL);\r
 \r
-  FormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET));    \r
-  ASSERT (FormSet != NULL);\r
-\r
-  CopyGuid (&FormSetGuid, &gZeroGuid);\r
-  Status = InitializeFormSet (UefiHiiHandle, &FormSetGuid, FormSet);\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
   *UefiDefaults = AllocateZeroPool (sizeof (LIST_ENTRY));\r
   ASSERT (UefiDefaults != NULL);\r
   InitializeListHead (*UefiDefaults);\r
 \r
-  DefaultLink = GetFirstNode (&FormSet->DefaultStoreListHead);\r
-  while (!IsNull (&FormSet->DefaultStoreListHead, DefaultLink)) {\r
+  DefaultLink = GetFirstNode (&ThunkContext->FormSet->DefaultStoreListHead);\r
+  while (!IsNull (&ThunkContext->FormSet->DefaultStoreListHead, DefaultLink)) {\r
     DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink);\r
 \r
-    Status = GetBufferTypeDefaultId (DefaultStore, FormSet, *UefiDefaults);\r
+    Status = GetBufferTypeDefaultId (DefaultStore, ThunkContext->FormSet, *UefiDefaults);\r
     ASSERT_EFI_ERROR (Status);\r
 \r
-    DefaultLink = GetNextNode (&FormSet->DefaultStoreListHead, DefaultLink);    \r
+    DefaultLink = GetNextNode (&ThunkContext->FormSet->DefaultStoreListHead, DefaultLink);    \r
   }\r
 \r
-  DestroyFormSet (FormSet);\r
-  \r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -641,6 +415,7 @@ EFI_STATUS
 UefiDefaultsToFwDefaults (\r
   IN     LIST_ENTRY                  *ListHead,\r
   IN     UINTN                       DefaultMask,\r
+  IN     EFI_VARSTORE_ID             UefiFormSetDefaultVarStoreId,\r
   OUT    EFI_HII_VARIABLE_PACK_LIST  **VariablePackList\r
   )\r
 {\r
@@ -651,6 +426,7 @@ UefiDefaultsToFwDefaults (
   UINT16                            DefaultId;\r
   EFI_HII_VARIABLE_PACK             *Pack;\r
   EFI_HII_VARIABLE_PACK_LIST        *PackList;\r
+  UINTN                             Index;\r
 \r
   if (DefaultMask == FRAMEWORK_EFI_IFR_FLAG_DEFAULT) {\r
     DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
@@ -684,6 +460,11 @@ UefiDefaultsToFwDefaults (
     List = GetNextNode (ListHead, List);  \r
   }\r
 \r
+  if (Count == 0) {\r
+    *VariablePackList = NULL;\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
   Size = Size + Count * (sizeof (EFI_HII_VARIABLE_PACK_LIST) + sizeof (EFI_HII_VARIABLE_PACK));\r
   \r
   *VariablePackList = AllocateZeroPool (Size);\r
@@ -693,6 +474,7 @@ UefiDefaultsToFwDefaults (
 \r
   PackList = (EFI_HII_VARIABLE_PACK_LIST *) *VariablePackList;\r
   Pack     = (EFI_HII_VARIABLE_PACK *) (PackList + 1);\r
+  Index = 0;\r
   while (!IsNull (ListHead, List)) {\r
     Node = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(List);\r
 \r
@@ -705,9 +487,9 @@ UefiDefaultsToFwDefaults (
       //\r
       // In UEFI, 0 is defined to be invalid for EFI_IFR_VARSTORE.VarStoreId.\r
       // So the default storage of Var Store in VFR from a Framework module \r
-      // should be translated to 0xFFEE.\r
+      // should be translated to the default Varstore ID.\r
       //\r
-      if (Node->StoreId == RESERVED_VARSTORE_ID) {\r
+      if (Node->StoreId == UefiFormSetDefaultVarStoreId) {\r
         Pack->VariableId = 0;\r
       } else {\r
         Pack->VariableId = Node->StoreId;\r
@@ -726,10 +508,13 @@ UefiDefaultsToFwDefaults (
       Size += sizeof (EFI_HII_VARIABLE_PACK_LIST);\r
 \r
       //\r
-      // initialize EFI_HII_VARIABLE_PACK_LIST\r
+      // Initialize EFI_HII_VARIABLE_PACK_LIST\r
       //\r
       PackList->VariablePack = Pack;\r
-      PackList->NextVariablePack = (EFI_HII_VARIABLE_PACK_LIST *)((UINT8 *) PackList + Size);\r
+      Index++;\r
+      if (Index < Count) {\r
+        PackList->NextVariablePack = (EFI_HII_VARIABLE_PACK_LIST *)((UINT8 *) PackList + Size);\r
+      }\r
             \r
     }\r
     \r
@@ -759,16 +544,14 @@ FreeDefaultList (
   LIST_ENTRY *Link;\r
   UEFI_IFR_BUFFER_STORAGE_NODE *Default;\r
 \r
-  Link = GetFirstNode (ListHead);\r
-  \r
-  while (!IsNull (ListHead, Link)) {\r
+  while (!IsListEmpty (ListHead)) {\r
+    Link = GetFirstNode (ListHead);\r
+    \r
     Default = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(Link);\r
 \r
     RemoveEntryList (Link);\r
    \r
     DestroyDefaultNode (Default);\r
-    \r
-    Link = GetNextNode (ListHead, Link);\r
   }\r
 \r
   FreePool (ListHead);\r