]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Bug fixes for FrameworkHiiToUefiHiiThunk;
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 18 Aug 2008 05:56:23 +0000 (05:56 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 18 Aug 2008 05:56:23 +0000 (05:56 +0000)
1) Update variable name to better names.
2) Change List Entry in all data structure to "Link".
3) Update to use proper list manipulation functions in BaseLib.
4) Add in more comments and clean up HiiNewString.
5) Clean up for HiiNewPack, HiiRemovePack and the notify functions.
6) Create better name such as GetPackageCount and AssignFrameworkHiiHandle
7) Clean up the InitializeHiiDatabase entry point.
8) Remove the confusing data field in the HII_THUNK_ENTRY HiiDatabase.h.
9) Add in cleanup code for DestoryThunkContext
10) Add in code to handle the save of browser data after invoke callback
11) Map the UEFI One Of Option code to Framework One Of Option code before calling Framework Callback.
12) Add in CreatePopUp support.
13) Add in SendForm support.
14) HiiGetPrimaryLanguages and HiiGetSecondaryLanguages should support language code in RFC639 format from Caller. Then, they should conver them to 3066 format before calling UEFI HII interfaces.
15) Make ResetStrings a NOP.
16) Remove the unnecessary dependency.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5659 6f19259b-4bc3-4df7-8a09-765794883524

19 files changed:
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/ConfigAccess.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Fonts.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/OpcodeCreation.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/SetupBrowser.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Strings.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrDefault.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrParser.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrParser.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/UefiIfrParserInternal.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h

index bac07de530819a2dfd6b73f8710e6524e299faad..88565d128ca8eac685379062e191ec6bd6b6e891 100644 (file)
@@ -16,15 +16,18 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "HiiDatabase.h"\r
 \r
-HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE ConfigAccessProtocolInstanceTempate = {\r
-  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE,\r
+BOOLEAN            mHiiPackageListUpdated;\r
+\r
+CONFIG_ACCESS_PRIVATE gConfigAccessPrivateTempate = {\r
+  CONFIG_ACCESS_PRIVATE_SIGNATURE,\r
   {\r
     ThunkExtractConfig,\r
     ThunkRouteConfig,\r
     ThunkCallback\r
   }, //ConfigAccessProtocol\r
-  NULL, //FrameworkFormCallbackProtocol\r
-  {NULL, NULL} //ConfigAccessStorageListHead\r
+  NULL, //FormCallbackProtocol\r
+  {NULL, NULL}, //ConfigAccessStorageListHead\r
+  NULL \r
 };\r
 \r
 /**\r
@@ -40,11 +43,10 @@ HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE ConfigAccessProtocolInstanceTempate =
    Framework Module which does not include packages introduced by UEFI Specification\r
    or packages that is not supported by Thunk layer.\r
     \r
-   @param Packages    The Framework Package List\r
+   @param Packages                  The Framework Package List\r
    \r
-   @retval EFI_HII_PACKAGE_HEADER* Return the Package Header of\r
-                                                          Form Package.\r
-   @retval NULL                                    If no Form Package is found.\r
+   @retval EFI_HII_PACKAGE_HEADER* Return the Package Header of Form Package.\r
+   @retval NULL                    If no Form Package is found.\r
 **/\r
 EFI_HII_PACKAGE_HEADER *\r
 GetIfrFormSet (\r
@@ -100,11 +102,10 @@ GetIfrFormSet (
   If FormSetPackage is not EFI_HII_PACKAGE_FORM, then ASSERT.\r
   If there is no linear buffer storage in this formset, then ASSERT.\r
 \r
-   @param FormSetPackage            The Form Package header.\r
+   @param FormSetPackage           The Form Package header.\r
    @param BufferStorageListHead    The link list for the VARSTORE found in the form package.\r
    \r
-   @retval  EFI_SUCCESS                     The function scan the form set and find one or more \r
-                                                          VARSTOREs.\r
+   @retval  EFI_SUCCESS            The function scan the form set and find one or more VARSTOREs.\r
    @retval  EFI_OUT_OF_RESOURCES    There is not enough memory to complete the function.\r
 **/\r
 EFI_STATUS\r
@@ -118,11 +119,15 @@ GetBufferStorage  (
   UINT8                   *OpCodeData;\r
   UINT8                   Operand;\r
   EFI_IFR_VARSTORE        *VarStoreOpCode;\r
-  HII_TRHUNK_BUFFER_STORAGE_KEY *BufferStorageKey;\r
+  BUFFER_STORAGE_ENTRY *BufferStorage;\r
 \r
   ASSERT (FormSetPackage->Type == EFI_HII_PACKAGE_FORM);\r
 \r
   OpCodeOffset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+  //\r
+  // Scan all opcode for the FormSet Package for \r
+  // EFI_IFR_VARSTORE_OP opcode.\r
+  //\r
   while (OpCodeOffset < FormSetPackage->Length) {\r
     OpCodeData = (UINT8 *) FormSetPackage + OpCodeOffset;\r
 \r
@@ -132,27 +137,31 @@ GetBufferStorage  (
 \r
     if (Operand == EFI_IFR_VARSTORE_OP) {\r
       VarStoreOpCode = (EFI_IFR_VARSTORE *)OpCodeData;\r
-      BufferStorageKey = AllocateZeroPool (sizeof (*BufferStorageKey));\r
-      if (BufferStorageKey == NULL) {\r
+      BufferStorage = AllocateZeroPool (sizeof (*BufferStorage));\r
+      if (BufferStorage == NULL) {\r
         return EFI_OUT_OF_RESOURCES;\r
       }\r
-      CopyMem (&BufferStorageKey->Guid, &VarStoreOpCode->Guid, sizeof (EFI_GUID));\r
+      //\r
+      // Record the attributes: GUID, Name, VarStoreId and Size.\r
+      //\r
+      CopyMem (&BufferStorage->Guid, &VarStoreOpCode->Guid, sizeof (EFI_GUID));\r
       \r
-      BufferStorageKey->Name = AllocateZeroPool (AsciiStrSize (VarStoreOpCode->Name) * 2);\r
-      AsciiStrToUnicodeStr (VarStoreOpCode->Name, BufferStorageKey->Name);\r
+      BufferStorage->Name = AllocateZeroPool (AsciiStrSize (VarStoreOpCode->Name) * 2);\r
+      AsciiStrToUnicodeStr (VarStoreOpCode->Name, BufferStorage->Name);\r
 \r
-      BufferStorageKey->VarStoreId = VarStoreOpCode->VarStoreId;\r
+      BufferStorage->VarStoreId = VarStoreOpCode->VarStoreId;\r
 \r
-      BufferStorageKey->Size = VarStoreOpCode->Size;\r
-      BufferStorageKey->Signature = HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE;\r
+      BufferStorage->Size = VarStoreOpCode->Size;\r
+      BufferStorage->Signature = BUFFER_STORAGE_ENTRY_SIGNATURE;\r
 \r
-      InsertTailList (BufferStorageListHead, &BufferStorageKey->List);\r
+      InsertTailList (BufferStorageListHead, &BufferStorage->Link);\r
     }\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
-  \r
+\r
+\r
 /**\r
   This function installs a EFI_CONFIG_ACCESS_PROTOCOL instance for a form package registered\r
   by a module using Framework HII Protocol Interfaces.\r
@@ -160,30 +169,31 @@ GetBufferStorage  (
    UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\r
    that Setup Utility can load the Buffer Storage using this protocol.\r
    \r
-   @param Packages          The framework package list.\r
-   @param MapEntry          The Thunk Layer Handle Mapping Database Entry.\r
+   @param Packages             The framework package list.\r
+   @param ThunkContext             The Thunk Layer Handle Mapping Database Entry.\r
    \r
-   @retval  EFI_SUCCESS             The Config Access Protocol is installed successfully.\r
-   @retval  EFI_OUT_RESOURCE    There is not enough memory.\r
+   @retval  EFI_SUCCESS        The Config Access Protocol is installed successfully.\r
+   @retval  EFI_OUT_RESOURCE   There is not enough memory.\r
    \r
 **/\r
 EFI_STATUS\r
-InstallDefaultUefiConfigAccessProtocol (\r
-  IN  CONST EFI_HII_PACKAGES                         *Packages,\r
-  IN  OUT   HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry\r
+InstallDefaultConfigAccessProtocol (\r
+  IN  CONST EFI_HII_PACKAGES                    *Packages,\r
+  IN  OUT   HII_THUNK_CONTEXT                   *ThunkContext\r
   )\r
 {\r
   EFI_HII_PACKAGE_HEADER                      *FormSetPackage;\r
   EFI_STATUS                                  Status;\r
-  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE  *ConfigAccessInstance;\r
+  CONFIG_ACCESS_PRIVATE                       *ConfigAccessInstance;\r
 \r
-  Status = HiiLibCreateHiiDriverHandle (&MapEntry->UefiHiiDriverHandle);\r
+  Status = HiiLibCreateHiiDriverHandle (&ThunkContext->UefiHiiDriverHandle);\r
   ConfigAccessInstance = AllocateCopyPool (\r
-                           sizeof (HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE), \r
-                           &ConfigAccessProtocolInstanceTempate\r
+                           sizeof (CONFIG_ACCESS_PRIVATE), \r
+                           &gConfigAccessPrivateTempate\r
                            );\r
   ASSERT (ConfigAccessInstance != NULL);\r
-  InitializeListHead (&ConfigAccessInstance->ConfigAccessBufferStorageListHead);\r
+  \r
+  InitializeListHead (&ConfigAccessInstance->BufferStorageListHead);\r
 \r
   //\r
   // We assume there is only one formset package in each Forms Package\r
@@ -191,7 +201,7 @@ InstallDefaultUefiConfigAccessProtocol (
   FormSetPackage = GetIfrFormSet (Packages);\r
   ASSERT (FormSetPackage != NULL);\r
   \r
-  Status = GetBufferStorage (FormSetPackage, &ConfigAccessInstance->ConfigAccessBufferStorageListHead);\r
+  Status = GetBufferStorage (FormSetPackage, &ConfigAccessInstance->BufferStorageListHead);\r
   if (EFI_ERROR (Status)) {\r
     FreePool (ConfigAccessInstance);\r
     ASSERT (FALSE);\r
@@ -199,70 +209,95 @@ InstallDefaultUefiConfigAccessProtocol (
   }\r
 \r
   Status = gBS->InstallMultipleProtocolInterfaces (\r
-          &MapEntry->UefiHiiDriverHandle,\r
+          &ThunkContext->UefiHiiDriverHandle,\r
           &gEfiHiiConfigAccessProtocolGuid,\r
           &ConfigAccessInstance->ConfigAccessProtocol,\r
           NULL\r
           );\r
+  //\r
+  //BUGBUG: Remove when done.\r
+  //\r
   ASSERT_EFI_ERROR (Status);\r
+  \r
   if (EFI_ERROR (Status)) {\r
     FreePool  (ConfigAccessInstance);\r
     return Status;\r
   }\r
+\r
+  ConfigAccessInstance->ThunkContext = ThunkContext;\r
   \r
   return EFI_SUCCESS;\r
 }\r
 \r
-/**\r
+VOID\r
+DestroyBufferStorageList (\r
+  IN      LIST_ENTRY  *ListHead\r
+  )\r
+{\r
+  LIST_ENTRY              *Link;\r
+  BUFFER_STORAGE_ENTRY    *Entry;\r
 \r
-   Wrap EFI_HII_CONFIG_ACCESS_PROTOCOL.RouteConfig to a call to EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
-   \r
-   @param BufferStorageKey               The key with all attributes needed to call EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
-   @param FrameworkFormCallBack     The EFI_FORM_CALLBACK_PROTOCOL registered by Framework HII module.\r
-   @param Data                                  The data to be saved.\r
-   @param DataSize                            The size of data.\r
-   \r
-   @retval EFI_STATUS                       The status returned by the EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
- **/\r
-EFI_STATUS\r
-RouteConfigToFrameworkFormCallBack (\r
-  IN       HII_TRHUNK_BUFFER_STORAGE_KEY              *BufferStorageKey,\r
-  IN       EFI_FORM_CALLBACK_PROTOCOL                 *FrameworkFormCallBack,\r
-  IN       VOID                                       *Data,\r
-  IN       UINTN                                      DataSize\r
+  while (!IsListEmpty (ListHead)) {\r
+    Link = GetFirstNode (ListHead);\r
+    \r
+    Entry = BUFFER_STORAGE_ENTRY_FROM_LINK(Link);\r
+\r
+    FreePool (Entry->Name);\r
+    Link = RemoveEntryList (Link);\r
+\r
+    FreePool (Entry);\r
+  }\r
+}\r
+\r
+VOID\r
+UninstallDefaultConfigAccessProtocol (\r
+  IN  HII_THUNK_CONTEXT                   *ThunkContext\r
   )\r
 {\r
-  EFI_STATUS          Status;\r
-  BOOLEAN             ResetRequired;\r
+  EFI_STATUS                      Status;\r
+  EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
+  CONFIG_ACCESS_PRIVATE           *ConfigAccessInstance;\r
+  \r
+  HiiLibDestroyHiiDriverHandle (ThunkContext->UefiHiiDriverHandle);\r
+\r
+  Status = gBS->HandleProtocol (\r
+                  ThunkContext->UefiHiiDriverHandle,\r
+                  &gEfiHiiConfigAccessProtocolGuid,\r
+                  (VOID **) &ConfigAccess\r
+                  );\r
+\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = gBS->UninstallProtocolInterface (\r
+                  ThunkContext->UefiHiiDriverHandle,\r
+                  &gEfiHiiConfigAccessProtocolGuid,\r
+                  ConfigAccess\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  ConfigAccessInstance = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (ConfigAccess);\r
+\r
+  DestroyBufferStorageList (&ConfigAccessInstance->BufferStorageListHead);\r
 \r
-  Status = FrameworkFormCallBack->NvWrite (\r
-              FrameworkFormCallBack,  \r
-              BufferStorageKey->Name,\r
-              &BufferStorageKey->Guid,\r
-              EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-              DataSize,\r
-              Data,\r
-              &ResetRequired\r
-              );\r
-  return Status;\r
 }\r
+  \r
 \r
 /**\r
    Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig to a call to EFI_FORM_CALLBACK_PROTOCOL.NvRead.\r
    \r
-   @param BufferStorageKey               The key with all attributes needed to call EFI_FORM_CALLBACK_PROTOCOL.NvRead.\r
-   @param FrameworkFormCallBack     The EFI_FORM_CALLBACK_PROTOCOL registered by Framework HII module.\r
-   @param Data                                  The data read.\r
-   @param DataSize                            The size of data.\r
+   @param BufferStorage         The key with all attributes needed to call EFI_FORM_CALLBACK_PROTOCOL.NvRead.\r
+   @param FwFormCallBack    The EFI_FORM_CALLBACK_PROTOCOL registered by Framework HII module.\r
+   @param Data                     The data read.\r
+   @param DataSize                 The size of data.\r
    \r
-   @retval EFI_STATUS                       The status returned by the EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
+   @retval EFI_STATUS              The status returned by the EFI_FORM_CALLBACK_PROTOCOL.NvWrite.\r
    @retval EFI_INVALID_PARAMETER   If the EFI_FORM_CALLBACK_PROTOCOL.NvRead return the size information of the data\r
-                                                        does not match what has been recorded early in he HII_TRHUNK_BUFFER_STORAGE_KEY.\r
+                                   does not match what has been recorded early in he BUFFER_STORAGE_ENTRY.\r
  **/\r
 EFI_STATUS\r
-ExtractConfigFromFrameworkFormCallBack (\r
-  IN       HII_TRHUNK_BUFFER_STORAGE_KEY              *BufferStorageKey,\r
-  IN       EFI_FORM_CALLBACK_PROTOCOL                 *FrameworkFormCallBack,\r
+CallFormCallBack (\r
+  IN       BUFFER_STORAGE_ENTRY              *BufferStorage,\r
+  IN       EFI_FORM_CALLBACK_PROTOCOL                 *FwFormCallBack,\r
   OUT      VOID                                       **Data,\r
   OUT      UINTN                                      *DataSize\r
   )\r
@@ -272,16 +307,16 @@ ExtractConfigFromFrameworkFormCallBack (
   *DataSize = 0;\r
   *Data     = NULL;\r
   \r
-  Status = FrameworkFormCallBack->NvRead (\r
-              FrameworkFormCallBack,  \r
-              BufferStorageKey->Name,\r
-              &BufferStorageKey->Guid,\r
+  Status = FwFormCallBack->NvRead (\r
+              FwFormCallBack,  \r
+              BufferStorage->Name,\r
+              &BufferStorage->Guid,\r
               NULL,\r
               DataSize,\r
               *Data\r
               );\r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    if (BufferStorageKey->Size != *DataSize) {\r
+    if (BufferStorage->Size != *DataSize) {\r
       ASSERT (FALSE);\r
       return EFI_INVALID_PARAMETER;\r
     }\r
@@ -291,10 +326,10 @@ ExtractConfigFromFrameworkFormCallBack (
       return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
-    FrameworkFormCallBack->NvRead (\r
-                  FrameworkFormCallBack,  \r
-                  BufferStorageKey->Name,\r
-                  &BufferStorageKey->Guid,\r
+    FwFormCallBack->NvRead (\r
+                  FwFormCallBack,  \r
+                  BufferStorage->Name,\r
+                  &BufferStorage->Guid,\r
                   NULL,\r
                   DataSize,\r
                   *Data\r
@@ -304,52 +339,26 @@ ExtractConfigFromFrameworkFormCallBack (
   return Status;\r
 }\r
 \r
-/**\r
-   Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig to a call to UEFI Variable Set Service.\r
-   \r
-   @param BufferStorageKey               The key with all attributes needed to call a UEFI Variable Get Service.\r
-   @param Data                                  The data read.\r
-   @param DataSize                            The size of data.\r
-\r
-   @retval EFI_STATUS                       The status returned by the UEFI Variable Set Service.\r
-   \r
- **/\r
-EFI_STATUS\r
-RouteConfigToUefiVariable (\r
-  IN       HII_TRHUNK_BUFFER_STORAGE_KEY              *BufferStorageKey,\r
-  IN       VOID                                       *Data,\r
-  IN       UINTN                                      DataSize\r
-  )\r
-{\r
-  return gRT->SetVariable (\r
-                  BufferStorageKey->Name,\r
-                  &BufferStorageKey->Guid,\r
-                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                  DataSize,\r
-                  Data\r
-                  );\r
-  \r
-}\r
 \r
 /**\r
    Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.ExtractConfig to a call to UEFI Variable Get Service.\r
    \r
-   @param BufferStorageKey               The key with all attributes needed to call a UEFI Variable Get Service.\r
-   @param Data                                  The data read.\r
-   @param DataSize                            The size of data.\r
+   @param BufferStorage        The key with all attributes needed to call a UEFI Variable Get Service.\r
+   @param Data                    The data read.\r
+   @param DataSize                The size of data.\r
 \r
    If the UEFI Variable Get Service return the size information of the data\r
-   does not match what has been recorded early in he HII_TRHUNK_BUFFER_STORAGE_KEY.\r
+   does not match what has been recorded early in he BUFFER_STORAGE_ENTRY.\r
    then ASSERT.\r
                                                         \r
-   @retval EFI_STATUS                       The status returned by the UEFI Variable Get Service.\r
+   @retval EFI_STATUS              The status returned by the UEFI Variable Get Service.\r
    @retval EFI_INVALID_PARAMETER   If the UEFI Variable Get Service return the size information of the data\r
-                                                        does not match what has been recorded early in he HII_TRHUNK_BUFFER_STORAGE_KEY.\r
+                                   does not match what has been recorded early in he BUFFER_STORAGE_ENTRY.\r
  **/\r
 \r
 EFI_STATUS\r
-ExtractConfigFromUefiVariable (\r
-  IN       HII_TRHUNK_BUFFER_STORAGE_KEY              *BufferStorageKey,\r
+GetUefiVariable (\r
+  IN       BUFFER_STORAGE_ENTRY              *BufferStorage,\r
   OUT      VOID                                       **Data,\r
   OUT      UINTN                                      *DataSize\r
   )\r
@@ -359,15 +368,15 @@ ExtractConfigFromUefiVariable (
   *DataSize = 0;\r
   *Data = NULL;\r
   Status = gRT->GetVariable (\r
-              BufferStorageKey->Name,\r
-              &BufferStorageKey->Guid,\r
+              BufferStorage->Name,\r
+              &BufferStorage->Guid,\r
               NULL,\r
               DataSize,\r
               *Data\r
               );\r
   if (Status == EFI_BUFFER_TOO_SMALL) {\r
 \r
-    if (BufferStorageKey->Size != *DataSize) {\r
+    if (BufferStorage->Size != *DataSize) {\r
       ASSERT (FALSE);\r
       return EFI_INVALID_PARAMETER;\r
     }\r
@@ -378,8 +387,8 @@ ExtractConfigFromUefiVariable (
     }\r
 \r
     Status = gRT->GetVariable (\r
-                BufferStorageKey->Name,\r
-                &BufferStorageKey->Guid,\r
+                BufferStorage->Name,\r
+                &BufferStorage->Guid,\r
                 NULL,\r
                 DataSize,\r
                 *Data\r
@@ -395,22 +404,22 @@ ExtractConfigFromUefiVariable (
   so that data can be read from the data storage such as UEFI Variable or module's\r
   customized storage exposed by EFI_FRAMEWORK_CALLBACK.\r
 \r
-   @param This          Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
+   @param This        Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
    @param Request     A null-terminated Unicode string in <ConfigRequest> format. Note that this\r
-                                includes the routing information as well as the configurable name / value pairs. It is\r
-                                invalid for this string to be in <MultiConfigRequest> format.\r
+                      includes the routing information as well as the configurable name / value pairs. It is\r
+                      invalid for this string to be in <MultiConfigRequest> format.\r
 \r
-   @param Progress   On return, points to a character in the Request string. Points to the string's null\r
-                               terminator if request was successful. Points to the most recent '&' before the first\r
-                                failing name / value pair (or the beginning of the string if the failure is in the first\r
-                                name / value pair) if the request was not successful\r
+   @param Progress    On return, points to a character in the Request string. Points to the string's null\r
+                      terminator if request was successful. Points to the most recent '&' before the first\r
+                      failing name / value pair (or the beginning of the string if the failure is in the first\r
+                      name / value pair) if the request was not successful\r
    @param Results     A null-terminated Unicode string in <ConfigAltResp> format which has all\r
-                              values filled in for the names in the Request string. String to be allocated by the called\r
-                              function.\r
+                      values filled in for the names in the Request string. String to be allocated by the called\r
+                      function.\r
    \r
    @retval EFI_INVALID_PARAMETER   If there is no Buffer Storage for this Config Access instance.\r
-   @retval EFI_SUCCESS                    The setting is retrived successfully.\r
-   @retval !EFI_SUCCESS                  The error returned by UEFI Get Variable or Framework Form Callback Nvread.\r
+   @retval EFI_SUCCESS             The setting is retrived successfully.\r
+   @retval !EFI_SUCCESS            The error returned by UEFI Get Variable or Framework Form Callback Nvread.\r
  **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -422,37 +431,37 @@ ThunkExtractConfig (
   )\r
 {\r
   EFI_STATUS                                  Status;\r
-  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE  *ConfigaAccessInstance;\r
-  LIST_ENTRY                                  *ListEntry;\r
-  HII_TRHUNK_BUFFER_STORAGE_KEY               *BufferStorageKey;\r
+  CONFIG_ACCESS_PRIVATE                       *ConfigAccess;\r
+  LIST_ENTRY                                  *Link;\r
+  BUFFER_STORAGE_ENTRY               *BufferStorage;\r
   VOID                                        *Data;\r
   UINTN                                       DataSize;\r
 \r
   Data = NULL;\r
-  ConfigaAccessInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This);\r
+  ConfigAccess = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (This);\r
 \r
   //\r
   // For now, only one var varstore is supported so that we don't need to parse the Configuration string.\r
   //\r
-  ListEntry = GetFirstNode (&ConfigaAccessInstance->ConfigAccessBufferStorageListHead);\r
-  if (ListEntry == NULL) {\r
+  Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
+  if (Link == NULL) {\r
     ASSERT (FALSE);\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   \r
-  BufferStorageKey = HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY (ListEntry);\r
+  BufferStorage = BUFFER_STORAGE_ENTRY_FROM_LINK (Link);\r
 \r
-  if (ConfigaAccessInstance->FrameworkFormCallbackProtocol == NULL ||\r
-      ConfigaAccessInstance->FrameworkFormCallbackProtocol->NvRead == NULL) {\r
-    Status = ExtractConfigFromUefiVariable (\r
-               BufferStorageKey,\r
+  if (ConfigAccess->FormCallbackProtocol == NULL ||\r
+      ConfigAccess->FormCallbackProtocol->NvRead == NULL) {\r
+    Status = GetUefiVariable (\r
+               BufferStorage,\r
                &Data,\r
                &DataSize\r
                );\r
   } else {\r
-    Status = ExtractConfigFromFrameworkFormCallBack (\r
-               BufferStorageKey,\r
-               ConfigaAccessInstance->FrameworkFormCallbackProtocol,\r
+    Status = CallFormCallBack (\r
+               BufferStorage,\r
+               ConfigAccess->FormCallbackProtocol,\r
                 &Data,\r
                 &DataSize\r
                );\r
@@ -479,15 +488,15 @@ ThunkExtractConfig (
   so that data can be written to the data storage such as UEFI Variable or module's\r
   customized storage exposed by EFI_FRAMEWORK_CALLBACK.\r
    \r
-   @param This              Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
-   @param Configuration A null-terminated Unicode string in <ConfigResp> format.\r
+   @param This             Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
+   @param Configuration    A null-terminated Unicode string in <ConfigResp> format.\r
    @param Progress         A pointer to a string filled in with the offset of the most recent '&' before the first\r
-                                     failing name / value pair (or the beginning of the string if the failure is in the first\r
-                                     name / value pair) or the terminating NULL if all was successful.\r
+                           failing name / value pair (or the beginning of the string if the failure is in the first\r
+                           name / value pair) or the terminating NULL if all was successful.\r
    \r
    @retval EFI_INVALID_PARAMETER   If there is no Buffer Storage for this Config Access instance.\r
-   @retval EFI_SUCCESS                    The setting is saved successfully.\r
-   @retval !EFI_SUCCESS                  The error returned by UEFI Set Variable or Framework Form Callback Nvwrite.\r
+   @retval EFI_SUCCESS             The setting is saved successfully.\r
+   @retval !EFI_SUCCESS            The error returned by UEFI Set Variable or Framework Form Callback Nvwrite.\r
 **/   \r
 EFI_STATUS\r
 EFIAPI\r
@@ -498,31 +507,61 @@ ThunkRouteConfig (
   )\r
 {\r
   EFI_STATUS                                  Status;\r
-  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE  *ConfigaAccessInstance;\r
-  LIST_ENTRY                                  *ListEntry;\r
-  HII_TRHUNK_BUFFER_STORAGE_KEY               *BufferStorageKey;\r
-  VOID                                        *Data;\r
+  CONFIG_ACCESS_PRIVATE                       *ConfigAccess;\r
+  LIST_ENTRY                                  *Link;\r
+  BUFFER_STORAGE_ENTRY                        *BufferStorage;\r
+  UINT8                                       *Data;\r
   UINTN                                       DataSize;\r
+  UINTN                                       DataSize2;\r
   UINTN                                       LastModifiedByteIndex;\r
+  BOOLEAN                                     ResetRequired;\r
+  BOOLEAN                                     DataAllocated;\r
 \r
   Data = NULL;\r
-  ConfigaAccessInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This);\r
+  DataAllocated = TRUE;\r
+  ConfigAccess = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (This);\r
 \r
   //\r
   // For now, only one var varstore is supported so that we don't need to parse the Configuration string.\r
   //\r
-  ListEntry = GetFirstNode (&ConfigaAccessInstance->ConfigAccessBufferStorageListHead);\r
-  if (ListEntry == NULL) {\r
+  Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
+  if (Link == NULL) {\r
     ASSERT (FALSE);\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  BufferStorageKey = HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY (ListEntry);\r
-\r
-  Data = AllocateZeroPool (BufferStorageKey->Size);\r
-  if (Data == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+  BufferStorage = BUFFER_STORAGE_ENTRY_FROM_LINK (Link);\r
+  DataSize2     = BufferStorage->Size;\r
+  if (ConfigAccess->ThunkContext->NvMapOverride == NULL) {\r
+    if (ConfigAccess->FormCallbackProtocol == NULL ||\r
+        ConfigAccess->FormCallbackProtocol->NvRead == NULL) {\r
+      Status = GetUefiVariable (\r
+                 BufferStorage,\r
+                 &Data,\r
+                 &DataSize\r
+                 );\r
+      ASSERT (DataSize == DataSize2);\r
+      \r
+    } else {\r
+      Status = CallFormCallBack (\r
+                 BufferStorage,\r
+                 ConfigAccess->FormCallbackProtocol,\r
+                  &Data,\r
+                  &DataSize\r
+                 );\r
+      ASSERT (DataSize == DataSize2);\r
+      \r
+    }\r
+  } else {\r
+    Status = EFI_SUCCESS;\r
+    Data = ConfigAccess->ThunkContext->NvMapOverride;\r
+    DataSize      = DataSize2;\r
+    DataAllocated = FALSE;\r
+  }  \r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
   }\r
+\r
   Status = mHiiConfigRoutingProtocol->ConfigToBlock (\r
                                           mHiiConfigRoutingProtocol,\r
                                           Configuration,\r
@@ -530,54 +569,209 @@ ThunkRouteConfig (
                                           &LastModifiedByteIndex,\r
                                           Progress\r
                                           );\r
-\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
 \r
-  DataSize = BufferStorageKey->Size;\r
-  if (ConfigaAccessInstance->FrameworkFormCallbackProtocol == NULL ||\r
-      ConfigaAccessInstance->FrameworkFormCallbackProtocol->NvRead == NULL) {\r
-    Status = RouteConfigToUefiVariable (\r
-               BufferStorageKey,\r
-               Data,\r
-               DataSize\r
-               );\r
+  if (ConfigAccess->FormCallbackProtocol == NULL ||\r
+      ConfigAccess->FormCallbackProtocol->NvWrite == NULL) {\r
+    Status = gRT->SetVariable (\r
+                  BufferStorage->Name,\r
+                  &BufferStorage->Guid,\r
+                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+                  DataSize,\r
+                  Data\r
+                  );\r
   } else {\r
-    Status = RouteConfigToFrameworkFormCallBack (\r
-               BufferStorageKey,\r
-               ConfigaAccessInstance->FrameworkFormCallbackProtocol,\r
-               Data,\r
-               DataSize\r
-               );\r
+    Status = ConfigAccess->FormCallbackProtocol->NvWrite (\r
+                  ConfigAccess->FormCallbackProtocol,  \r
+                  BufferStorage->Name,\r
+                  &BufferStorage->Guid,\r
+                  EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+                  DataSize,\r
+                  Data,\r
+                  &ResetRequired\r
+                  );\r
+    \r
   }\r
 \r
-Done:  \r
-  SafeFreePool (Data);\r
+Done: \r
+  if (DataAllocated && (Data != NULL)) {\r
+    FreePool (Data);\r
+  }\r
+  \r
   return Status;\r
 }\r
 \r
+FRAMEWORK_EFI_IFR_DATA_ARRAY *\r
+CreateIfrDataArray (\r
+  IN    CONFIG_ACCESS_PRIVATE         *ConfigAccess,\r
+  IN    EFI_QUESTION_ID               QuestionId,\r
+  IN    UINT8                         Type,\r
+  IN    EFI_IFR_TYPE_VALUE            *Value,\r
+  OUT   BOOLEAN                       *NvMapAllocated\r
+  )\r
+{\r
+  FRAMEWORK_EFI_IFR_DATA_ARRAY      *IfrDataArray;\r
+  FRAMEWORK_EFI_IFR_DATA_ENTRY      *IfrDataEntry;\r
+  UINTN                             BrowserDataSize;\r
+  BUFFER_STORAGE_ENTRY              *BufferStorageEntry;\r
+  LIST_ENTRY                        *Link;\r
+\r
+  IfrDataArray = AllocateZeroPool (0x100);\r
+  ASSERT (IfrDataArray != NULL);\r
+\r
+  if (ConfigAccess->ThunkContext->NvMapOverride == NULL) {\r
+    Link = GetFirstNode (&ConfigAccess->BufferStorageListHead);\r
+\r
+    ASSERT (!IsNull (&ConfigAccess->BufferStorageListHead, Link));\r
+\r
+    BufferStorageEntry = BUFFER_STORAGE_ENTRY_FROM_LINK(Link);\r
+\r
+    BrowserDataSize = BufferStorageEntry->Size;\r
+    *NvMapAllocated = TRUE;\r
+    IfrDataArray->NvRamMap = AllocateZeroPool (BrowserDataSize);\r
+    GetBrowserData (NULL, NULL, &BrowserDataSize, IfrDataArray->NvRamMap);\r
+  } else {\r
+    *NvMapAllocated = FALSE;\r
+    IfrDataArray->NvRamMap = ConfigAccess->ThunkContext->NvMapOverride;\r
+  }\r
+\r
+  IfrDataEntry = (FRAMEWORK_EFI_IFR_DATA_ENTRY *) (IfrDataArray + 1);\r
+\r
+  switch (Type) {\r
+    case EFI_IFR_TYPE_NUM_SIZE_8:\r
+    case EFI_IFR_TYPE_NUM_SIZE_16:\r
+    case EFI_IFR_TYPE_NUM_SIZE_32:\r
+    case EFI_IFR_TYPE_NUM_SIZE_64:\r
+    case EFI_IFR_TYPE_BOOLEAN:\r
+      CopyMem (&IfrDataEntry->Data, &(Value->u8), sizeof (*Value));\r
+      break;\r
+\r
+    default:\r
+      ASSERT (FALSE);\r
+      break;\r
+  }\r
+\r
+  return IfrDataArray;\r
+}\r
+\r
+VOID\r
+DestroyIfrDataArray (\r
+  IN  FRAMEWORK_EFI_IFR_DATA_ARRAY *Array,\r
+  IN  BOOLEAN                      NvMapAllocated\r
+  )\r
+{\r
+  if (NvMapAllocated) {\r
+    FreePool (Array->NvRamMap);\r
+  }\r
+\r
+  FreePool (Array);\r
+}\r
+\r
+\r
+ONE_OF_OPTION_MAP_ENTRY *\r
+GetOneOfOptionMapEntry (\r
+  IN  HII_THUNK_CONTEXT              *ThunkContext,\r
+  IN  EFI_QUESTION_ID                QuestionId,\r
+  IN  UINT8                          Type,\r
+  IN  EFI_IFR_TYPE_VALUE             *Value\r
+  )\r
+{\r
+  LIST_ENTRY              *Link;\r
+  LIST_ENTRY              *Link2;\r
+  ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
+  ONE_OF_OPTION_MAP       *OneOfOptionMap;\r
+\r
+  Link = GetFirstNode (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+  while (!IsNull (&ThunkContext->OneOfOptionMapListHead, Link)) {\r
+    OneOfOptionMap = ONE_OF_OPTION_MAP_FROM_LINK(Link);\r
+    if (OneOfOptionMap->QuestionId == QuestionId) {\r
+      ASSERT (OneOfOptionMap->ValueType == Type);\r
+\r
+      Link2 = GetFirstNode (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
+\r
+      while (!IsNull (&OneOfOptionMap->OneOfOptionMapEntryListHead, Link2)) {\r
+        OneOfOptionMapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
+\r
+        if (CompareMem (Value, &OneOfOptionMapEntry->Value, sizeof (EFI_IFR_TYPE_VALUE)) == 0) {\r
+          return OneOfOptionMapEntry;\r
+        }\r
+\r
+        Link2 = GetNextNode (&OneOfOptionMap->OneOfOptionMapEntryListHead, Link2);\r
+      }\r
+    }\r
+\r
+    Link = GetNextNode (&ThunkContext->OneOfOptionMapListHead, Link);\r
+  }\r
+\r
+\r
+  return NULL;\r
+}\r
+\r
+/**\r
+  Functions which are registered to receive notification of\r
+  database events have this prototype. The actual event is encoded\r
+  in NotifyType. The following table describes how PackageType,\r
+  PackageGuid, Handle, and Package are used for each of the\r
+  notification types.\r
+\r
+  @param PackageType  Package type of the notification.\r
+\r
+  @param PackageGuid  If PackageType is\r
+                      EFI_HII_PACKAGE_TYPE_GUID, then this is\r
+                      the pointer to the GUID from the Guid\r
+                      field of EFI_HII_PACKAGE_GUID_HEADER.\r
+                      Otherwise, it must be NULL.\r
+\r
+  @param Package  Points to the package referred to by the\r
+                  notification Handle The handle of the package\r
+                  list which contains the specified package.\r
+\r
+  @param Handle       The HII handle.\r
+\r
+  @param NotifyType   The type of change concerning the\r
+                      database. See\r
+                      EFI_HII_DATABASE_NOTIFY_TYPE.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+FormUpdateNotify (\r
+  IN UINT8                              PackageType,\r
+  IN CONST EFI_GUID                     *PackageGuid,\r
+  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
+  )\r
+{\r
+  mHiiPackageListUpdated = TRUE;\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 /**\r
   Wrap the EFI_HII_CONFIG_ACCESS_PROTOCOL.CallBack to EFI_FORM_CALLBACK_PROTOCOL.Callback. Therefor,\r
   the framework HII module willl do no porting (except some porting works needed for callback for EFI_ONE_OF_OPTION opcode)\r
   and still work with a UEFI HII SetupBrowser.\r
    \r
-   @param This                          Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-   @param Action                       Specifies the type of action taken by the browser. See EFI_BROWSER_ACTION_x.\r
+   @param This                      Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+   @param Action                    Specifies the type of action taken by the browser. See EFI_BROWSER_ACTION_x.\r
    @param QuestionId                A unique value which is sent to the original exporting driver so that it can identify the\r
-                                                type of data to expect. The format of the data tends to vary based on the opcode that\r
-                                                generated the callback.\r
-   @param Type                         The type of value for the question. See EFI_IFR_TYPE_x in\r
-                                                EFI_IFR_ONE_OF_OPTION.\r
-   @param Value                        A pointer to the data being sent to the original exporting driver. The type is specified\r
-                                                by Type. Type EFI_IFR_TYPE_VALUE is defined in\r
-                                                EFI_IFR_ONE_OF_OPTION.\r
+                                    type of data to expect. The format of the data tends to vary based on the opcode that\r
+                                    generated the callback.\r
+   @param Type                      The type of value for the question. See EFI_IFR_TYPE_x in\r
+                                    EFI_IFR_ONE_OF_OPTION.\r
+   @param Value                     A pointer to the data being sent to the original exporting driver. The type is specified\r
+                                    by Type. Type EFI_IFR_TYPE_VALUE is defined in\r
+                                    EFI_IFR_ONE_OF_OPTION.\r
    @param ActionRequest             On return, points to the action requested by the callback function. Type\r
-                                                EFI_BROWSER_ACTION_REQUEST is specified in SendForm() in the Form\r
-                                                Browser Protocol.\r
+                                    EFI_BROWSER_ACTION_REQUEST is specified in SendForm() in the Form\r
+                                    Browser Protocol.\r
    \r
-   @retval EFI_UNSUPPORTED      If the Framework HII module does not register Callback although it specify the opcode under\r
-                                                focuse to be INTERRACTIVE.\r
+   @retval EFI_UNSUPPORTED        If the Framework HII module does not register Callback although it specify the opcode under\r
+                                  focuse to be INTERRACTIVE.\r
    @retval EFI_SUCCESS            The callback complete successfully.\r
    @retval !EFI_SUCCESS           The error code returned by EFI_FORM_CALLBACK_PROTOCOL.Callback.\r
    \r
@@ -594,12 +788,16 @@ ThunkCallback (
   )\r
 {\r
   EFI_STATUS                                  Status;\r
-  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE  *ConfigaAccessInstance;\r
-  EFI_FORM_CALLBACK_PROTOCOL                  *FrameworkFormCallbackProtocol;\r
+  CONFIG_ACCESS_PRIVATE                       *ConfigAccess;\r
+  EFI_FORM_CALLBACK_PROTOCOL                  *FormCallbackProtocol;\r
   EFI_HII_CALLBACK_PACKET                     *Packet;\r
-  FRAMEWORK_EFI_IFR_DATA_ARRAY                Data;\r
+  FRAMEWORK_EFI_IFR_DATA_ARRAY                *Data;\r
   FRAMEWORK_EFI_IFR_DATA_ENTRY                *DataEntry;\r
-  EFI_FORM_CALLBACK                           Callback; \r
+  UINT16                                      KeyValue;\r
+  ONE_OF_OPTION_MAP_ENTRY                     *OneOfOptionMapEntry;\r
+  EFI_HANDLE                                  NotifyHandle;\r
+  EFI_INPUT_KEY                               Key;  \r
+  BOOLEAN                                     NvMapAllocated;\r
 \r
   ASSERT (This != NULL);\r
   ASSERT (Value != NULL);\r
@@ -607,43 +805,111 @@ ThunkCallback (
 \r
   *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
 \r
-  ConfigaAccessInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (This);\r
+  ConfigAccess = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (This);\r
 \r
-  FrameworkFormCallbackProtocol = ConfigaAccessInstance->FrameworkFormCallbackProtocol;\r
-  if (FrameworkFormCallbackProtocol == NULL) {\r
+  FormCallbackProtocol = ConfigAccess->FormCallbackProtocol;\r
+  if (FormCallbackProtocol == NULL) {\r
+    ASSERT (FALSE);\r
     return EFI_UNSUPPORTED;\r
   }\r
-  Callback = FrameworkFormCallbackProtocol->Callback;\r
 \r
-  Status = Callback (\r
-              FrameworkFormCallbackProtocol,\r
-              QuestionId,\r
-              &Data,\r
+  //\r
+  // Check if the QuestionId match a OneOfOption.\r
+  //\r
+  OneOfOptionMapEntry = GetOneOfOptionMapEntry (ConfigAccess->ThunkContext, QuestionId, Type, Value);\r
+\r
+  if (OneOfOptionMapEntry == NULL) {\r
+    //\r
+    // This is not a One-Of-Option opcode. QuestionId is the KeyValue\r
+    //\r
+    KeyValue = QuestionId;\r
+  } else {\r
+    KeyValue = OneOfOptionMapEntry->FwKey;\r
+  }\r
+\r
+  //\r
+  // Build the FRAMEWORK_EFI_IFR_DATA_ARRAY\r
+  //\r
+  Data = CreateIfrDataArray (ConfigAccess, QuestionId, Type, Value, &NvMapAllocated);\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_FORM,\r
+                           NULL,\r
+                           FormUpdateNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
+                           &NotifyHandle\r
+                           );\r
+  //\r
+  //\r
+  //\r
+  Packet =  NULL;\r
+  Status =  FormCallbackProtocol->Callback (\r
+              FormCallbackProtocol,\r
+              KeyValue,\r
+              Data,\r
               &Packet\r
               );\r
 \r
   //\r
   // Callback require browser to perform action\r
   //\r
-  if (Packet != NULL) {\r
-    if (Packet->DataArray.EntryCount  == 1 && Packet->DataArray.NvRamMap == NULL) {\r
-      DataEntry = (FRAMEWORK_EFI_IFR_DATA_ENTRY *) ((UINT8 *) Packet + sizeof (FRAMEWORK_EFI_IFR_DATA_ARRAY));\r
-      switch (DataEntry->Flags) {\r
-        case EXIT_REQUIRED:\r
-          *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
-          break;\r
-        case SAVE_REQUIRED:\r
-          *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
-          break;\r
-        case RESET_REQUIRED:\r
-            *ActionRequest = EFI_BROWSER_ACTION_REQUEST_RESET;\r
-            break;\r
-        default:\r
-            *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
-            break;  \r
-      }\r
+  if (EFI_ERROR (Status)) {\r
+    if (Packet != NULL) {\r
+      //\r
+      // BUGBUG: need to restore the changing question to default value\r
+      //\r
+\r
+      do {\r
+        IfrLibCreatePopUp (1, &Key, Packet->String);\r
+\r
+      } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+      \r
     }\r
+\r
+    //\r
+    // Error Code in Status is discarded.\r
+    //\r
+  } else {\r
+    if (Packet != NULL) {\r
+        if (Packet->DataArray.EntryCount  == 1 && Packet->DataArray.NvRamMap == NULL) {\r
+          DataEntry = (FRAMEWORK_EFI_IFR_DATA_ENTRY *) ((UINT8 *) Packet + sizeof (FRAMEWORK_EFI_IFR_DATA_ARRAY));\r
+          if ((DataEntry->Flags & EXIT_REQUIRED) == EXIT_REQUIRED) {\r
+              *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;\r
+          }\r
+\r
+          if ((DataEntry->Flags & SAVE_REQUIRED) == SAVE_REQUIRED) {\r
+            Status = ConfigAccess->ConfigAccessProtocol.RouteConfig (\r
+                                      &ConfigAccess->ConfigAccessProtocol,\r
+                                      NULL,\r
+                                      NULL\r
+                                      );\r
+          }\r
+        }\r
+        FreePool (Packet);\r
+    }\r
+  }\r
+\r
+  //\r
+  // Unregister notify for Form package update\r
+  //\r
+  Status = mHiiDatabase->UnregisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           NotifyHandle\r
+                           );\r
+  //\r
+  // UEFI SetupBrowser handles scenario differently with Framework SetupBrowser when call back function \r
+  // update any forms in HII database. UEFI SetupBrowser will re-parse the displaying form package and load\r
+  // the values from variable storages. Framework SetupBrowser will only re-parse the displaying form packages.\r
+  // To make sure customer's previous changes is saved and the changing question behaves as expected, we\r
+  // issue a EFI_BROWSER_ACTION_REQUEST_SUBMIT to ask UEFI SetupBrowser to save the changes proceed to re-parse\r
+  // the form and load all the variable storages.\r
+  //\r
+  if (*ActionRequest == EFI_BROWSER_ACTION_REQUEST_NONE && mHiiPackageListUpdated) {\r
+    *ActionRequest = EFI_BROWSER_ACTION_REQUEST_SUBMIT;\r
   }\r
+\r
+  DestroyIfrDataArray (Data, NvMapAllocated);\r
   \r
   return Status;\r
 }\r
index 67f9b7ca9d9a7cd06aba42efaf803ab4355fbbab..fb728074d1e2ce079c60cfee40534b8826abae00 100644 (file)
@@ -25,16 +25,22 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
    that Setup Utility can load the Buffer Storage using this protocol.\r
    \r
    @param Packages          The framework package list.\r
-   @param MapEntry          The Thunk Layer Handle Mapping Database Entry.\r
+   @param ThunkContext          The Thunk Layer Handle Mapping Database Entry.\r
    \r
-   @retval  EFI_SUCCESS             The Config Access Protocol is installed successfully.\r
+   @retval  EFI_SUCCESS         The Config Access Protocol is installed successfully.\r
    @retval  EFI_OUT_RESOURCE    There is not enough memory.\r
    \r
 **/\r
 EFI_STATUS\r
-InstallDefaultUefiConfigAccessProtocol (\r
+InstallDefaultConfigAccessProtocol (\r
   IN  CONST EFI_HII_PACKAGES                         *Packages,\r
-  IN  OUT   HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *MapEntry\r
+  IN  OUT   HII_THUNK_CONTEXT *ThunkContext\r
+  )\r
+;\r
+\r
+VOID\r
+UninstallDefaultConfigAccessProtocol (\r
+  IN  HII_THUNK_CONTEXT                   *ThunkContext\r
   )\r
 ;\r
 \r
@@ -44,22 +50,22 @@ InstallDefaultUefiConfigAccessProtocol (
   so that data can be read from the data storage such as UEFI Variable or module's\r
   customized storage exposed by EFI_FRAMEWORK_CALLBACK.\r
 \r
-   @param This          Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
+   @param This        Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
    @param Request     A null-terminated Unicode string in <ConfigRequest> format. Note that this\r
-                                includes the routing information as well as the configurable name / value pairs. It is\r
-                                invalid for this string to be in <MultiConfigRequest> format.\r
+                      includes the routing information as well as the configurable name / value pairs. It is\r
+                      invalid for this string to be in <MultiConfigRequest> format.\r
 \r
-   @param Progress   On return, points to a character in the Request string. Points to the string's null\r
-                               terminator if request was successful. Points to the most recent '&' before the first\r
-                                failing name / value pair (or the beginning of the string if the failure is in the first\r
-                                name / value pair) if the request was not successful\r
+   @param Progress    On return, points to a character in the Request string. Points to the string's null\r
+                      terminator if request was successful. Points to the most recent '&' before the first\r
+                      failing name / value pair (or the beginning of the string if the failure is in the first\r
+                      name / value pair) if the request was not successful\r
    @param Results     A null-terminated Unicode string in <ConfigAltResp> format which has all\r
-                              values filled in for the names in the Request string. String to be allocated by the called\r
-                              function.\r
+                      values filled in for the names in the Request string. String to be allocated by the called\r
+                      function.\r
    \r
    @retval EFI_INVALID_PARAMETER   If there is no Buffer Storage for this Config Access instance.\r
-   @retval EFI_SUCCESS                    The setting is retrived successfully.\r
-   @retval !EFI_SUCCESS                  The error returned by UEFI Get Variable or Framework Form Callback Nvread.\r
+   @retval EFI_SUCCESS             The setting is retrived successfully.\r
+   @retval !EFI_SUCCESS            The error returned by UEFI Get Variable or Framework Form Callback Nvread.\r
  **/\r
 EFI_STATUS\r
 EFIAPI\r
@@ -79,14 +85,14 @@ ThunkExtractConfig (
   customized storage exposed by EFI_FRAMEWORK_CALLBACK.\r
    \r
    @param This              Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL\r
-   @param Configuration A null-terminated Unicode string in <ConfigResp> format.\r
-   @param Progress         A pointer to a string filled in with the offset of the most recent '&' before the first\r
-                                     failing name / value pair (or the beginning of the string if the failure is in the first\r
-                                     name / value pair) or the terminating NULL if all was successful.\r
+   @param Configuration     A null-terminated Unicode string in <ConfigResp> format.\r
+   @param Progress          A pointer to a string filled in with the offset of the most recent '&' before the first\r
+                            failing name / value pair (or the beginning of the string if the failure is in the first\r
+                            name / value pair) or the terminating NULL if all was successful.\r
    \r
    @retval EFI_INVALID_PARAMETER   If there is no Buffer Storage for this Config Access instance.\r
-   @retval EFI_SUCCESS                    The setting is saved successfully.\r
-   @retval !EFI_SUCCESS                  The error returned by UEFI Set Variable or Framework Form Callback Nvwrite.\r
+   @retval EFI_SUCCESS             The setting is saved successfully.\r
+   @retval !EFI_SUCCESS            The error returned by UEFI Set Variable or Framework Form Callback Nvwrite.\r
 **/  \r
 EFI_STATUS\r
 EFIAPI\r
@@ -102,24 +108,24 @@ ThunkRouteConfig (
   the framework HII module willl do no porting (except some porting works needed for callback for EFI_ONE_OF_OPTION opcode)\r
   and still work with a UEFI HII SetupBrowser.\r
    \r
-   @param This                          Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
-   @param Action                       Specifies the type of action taken by the browser. See EFI_BROWSER_ACTION_x.\r
-   @param QuestionId                A unique value which is sent to the original exporting driver so that it can identify the\r
-                                                type of data to expect. The format of the data tends to vary based on the opcode that\r
-                                                generated the callback.\r
-   @param Type                         The type of value for the question. See EFI_IFR_TYPE_x in\r
-                                                EFI_IFR_ONE_OF_OPTION.\r
-   @param Value                        A pointer to the data being sent to the original exporting driver. The type is specified\r
-                                                by Type. Type EFI_IFR_TYPE_VALUE is defined in\r
-                                                EFI_IFR_ONE_OF_OPTION.\r
-   @param ActionRequest             On return, points to the action requested by the callback function. Type\r
-                                                EFI_BROWSER_ACTION_REQUEST is specified in SendForm() in the Form\r
-                                                Browser Protocol.\r
+   @param This                  Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL.\r
+   @param Action                Specifies the type of action taken by the browser. See EFI_BROWSER_ACTION_x.\r
+   @param QuestionId            A unique value which is sent to the original exporting driver so that it can identify the\r
+                                type of data to expect. The format of the data tends to vary based on the opcode that\r
+                                generated the callback.\r
+   @param Type                  The type of value for the question. See EFI_IFR_TYPE_x in\r
+                                EFI_IFR_ONE_OF_OPTION.\r
+   @param Value                 A pointer to the data being sent to the original exporting driver. The type is specified\r
+                                by Type. Type EFI_IFR_TYPE_VALUE is defined in\r
+                                EFI_IFR_ONE_OF_OPTION.\r
+   @param ActionRequest         On return, points to the action requested by the callback function. Type\r
+                                EFI_BROWSER_ACTION_REQUEST is specified in SendForm() in the Form\r
+                                Browser Protocol.\r
    \r
    @retval EFI_UNSUPPORTED      If the Framework HII module does not register Callback although it specify the opcode under\r
-                                                focuse to be INTERRACTIVE.\r
-   @retval EFI_SUCCESS            The callback complete successfully.\r
-   @retval !EFI_SUCCESS           The error code returned by EFI_FORM_CALLBACK_PROTOCOL.Callback.\r
+                                focuse to be INTERRACTIVE.\r
+   @retval EFI_SUCCESS          The callback complete successfully.\r
+   @retval !EFI_SUCCESS         The error code returned by EFI_FORM_CALLBACK_PROTOCOL.Callback.\r
    \r
  **/\r
 EFI_STATUS\r
index 29914064e54118b0f20e953b7a6af6a35c53bf9a..1d58dcd90849193c2cff1dd0e02ce2425d40e068 100644 (file)
@@ -19,6 +19,23 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 UINT8 mGlyphBuffer[EFI_GLYPH_WIDTH * 2 * EFI_GLYPH_HEIGHT];\r
 \r
+/**\r
+  This function is only called by Graphics Console module and GraphicsLib. \r
+  EDK II provides a UEFI Graphics Console module. ECP provides a GraphicsLib \r
+  complying to UEFI HII.\r
+  \r
+  This function will ASSERT and return EFI_UNSUPPORTED.\r
+\r
+  @param This            N.A.\r
+  @param Source          N.A.\r
+  @param Index           N.A.\r
+  @param GlyphBuffer     N.A.\r
+  @param BitWidth        N.A.\r
+  @param InternalStatus  N.A.\r
+\r
+  @return EFI_UNSUPPORTED N.A.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 HiiGetGlyph (\r
@@ -29,30 +46,30 @@ HiiGetGlyph (
   OUT    UINT16             *BitWidth,\r
   IN OUT UINT32             *InternalStatus\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  Translates a Unicode character into the corresponding font glyph.\r
-  If the Source was pointing to a non-spacing character, the next Source[*Index]\r
-  character will be parsed and OR'd to the GlyphBuffer until a spacing character\r
-  is found in the Source.  Since non-spacing characters are considered to be the\r
-  same pixel width as a regular character their BitWidth will be reflected correctly\r
-  however due to their special attribute, they are considered to be zero advancing width.\r
-  This basically means that the cursor would not advance, thus the character that follows\r
-  it would overlay the non-spacing character.  The Index is modified to reflect both the\r
-  incoming array entry into the Source string but also the outgoing array entry after having\r
-  parsed the equivalent of a single Glyph's worth of data.\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
 {\r
   ASSERT (FALSE);\r
   return EFI_UNSUPPORTED;\r
 }\r
 \r
+/**\r
+  This function is only called by Graphics Console module and GraphicsLib. \r
+  EDK II provides a UEFI Graphics Console module. ECP provides a GraphicsLib \r
+  complying to UEFI HII.\r
+  \r
+  This function will ASSERT and return EFI_UNSUPPORTED.\r
+\r
+  @param This            N.A.\r
+  @param GlyphBuffer     N.A.\r
+  @param Foreground      N.A.\r
+  @param Background      N.A.\r
+  @param Count           N.A.\r
+  @param Width           N.A.\r
+  @param Height          N.A.\r
+  @param BltBuffer       N.A.\r
+\r
+  @return EFI_UNSUPPORTED N.A.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 HiiGlyphToBlt (\r
index 8d15e82841f1ea1fb69784e01d445b71ecbcc698..45ccfdb1717536ffc364f858611731a04893695f 100644 (file)
@@ -17,42 +17,20 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "UefiIfrDefault.h"\r
 #include "OpcodeCreation.h"\r
 \r
-EFI_STATUS\r
-EFIAPI\r
-HiiExportDatabase (\r
-  IN     EFI_HII_PROTOCOL *This,\r
-  IN     FRAMEWORK_EFI_HII_HANDLE    Handle,\r
-  IN OUT UINTN            *BufferSize,\r
-  OUT    VOID             *Buffer\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  This function allows a program to extract a form or form package that has\r
-  previously been registered with the EFI HII database.\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
-  ASSERT (FALSE);\r
-  return EFI_UNSUPPORTED;\r
-}\r
-\r
+//\r
+// This structure is only intended to be used in this file.\r
+//\r
 #pragma pack(push, 1)\r
 typedef struct {\r
   EFI_HII_PACK_HEADER            PackageHeader;\r
   FRAMEWORK_EFI_IFR_FORM_SET     FormSet;\r
   FRAMEWORK_EFI_IFR_END_FORM_SET EndFormSet;\r
-} FRAMEWORK_HII_FORMSET_TEMPLATE;\r
+} FW_HII_FORMSET_TEMPLATE;\r
 #pragma pack(pop)\r
 \r
-FRAMEWORK_HII_FORMSET_TEMPLATE FormSetTemplate = {\r
+FW_HII_FORMSET_TEMPLATE FormSetTemplate = {\r
   {\r
-    sizeof (FRAMEWORK_HII_FORMSET_TEMPLATE),\r
+    sizeof (FW_HII_FORMSET_TEMPLATE),\r
     EFI_HII_IFR\r
   },\r
   {\r
@@ -77,115 +55,141 @@ FRAMEWORK_HII_FORMSET_TEMPLATE FormSetTemplate = {
   }\r
 };\r
 \r
-EFI_STATUS\r
-EFIAPI\r
-HiiGetForms (\r
-  IN     EFI_HII_PROTOCOL   *This,\r
-  IN     FRAMEWORK_EFI_HII_HANDLE      Handle,\r
-  IN     EFI_FORM_ID        FormId,\r
-  IN OUT UINTN              *BufferLengthTemp,\r
-  OUT    UINT8              *Buffer\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
 \r
-  This function allows a program to extract a form or form package that has\r
-  previously been registered with the EFI HII database.\r
+/**\r
 \r
-Arguments:\r
-  This         - A pointer to the EFI_HII_PROTOCOL instance.\r
+  This thunk module only handles UEFI HII packages. The caller of this function \r
+  won¡¯t be able to parse the content. Therefore, it is not supported.\r
+  \r
+  This function will ASSERT and return EFI_UNSUPPORTED.\r
 \r
-  Handle       - Handle on which the form resides. Type FRAMEWORK_EFI_HII_HANDLE  is defined in\r
-                 EFI_HII_PROTOCOL.NewPack() in the Packages section.\r
+  @param This            N.A.\r
+  @param Handle          N.A.\r
+  @param BufferSize      N.A.\r
+  @param Buffer          N.A.\r
 \r
-  FormId       - The ID of the form to return. If the ID is zero, the entire form package is returned.\r
-                 Type EFI_FORM_ID is defined in "Related Definitions" below.\r
+  @retval EFI_UNSUPPORTED\r
 \r
-  BufferLength - On input, the length of the Buffer. On output, the length of the returned buffer, if\r
-                 the length was sufficient and, if it was not, the length that is required to fit the\r
-                 requested form(s).\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiExportDatabase (\r
+  IN     EFI_HII_PROTOCOL *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE    Handle,\r
+  IN OUT UINTN            *BufferSize,\r
+  OUT    VOID             *Buffer\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_UNSUPPORTED;\r
+}\r
 \r
-  Buffer       - The buffer designed to receive the form(s).\r
 \r
-Returns:\r
+/**\r
+  This function allows a program to extract a form or form package that has\r
+  previously been registered with the EFI HII database.\r
 \r
-  EFI_SUCCESS           -  Buffer filled with the requested forms. BufferLength\r
-                           was updated.\r
+  In this thunk module, this function will create a IFR Package with only \r
+  one Formset. Effectively, only the GUID of the Formset is updated and return\r
+  in this IFR package to caller. This is enable the Framework modules which call \r
+  a API named GetStringFromToken. GetStringFromToken retieves a String based on\r
+  a String Token from a Package List known only by the Formset GUID.\r
+  \r
 \r
-  EFI_INVALID_PARAMETER -  The handle is unknown.\r
 \r
-  EFI_NOT_FOUND         -  A form on the requested handle cannot be found with the\r
-                           requested FormId.\r
+  @param This             A pointer to the EFI_HII_PROTOCOL instance.\r
+  @param Handle           Handle on which the form resides. Type FRAMEWORK_EFI_HII_HANDLE  is defined in\r
+                          EFI_HII_PROTOCOL.NewPack() in the Packages section.\r
+  @param FormId           Ignored by this implementation.\r
+  @param BufferLengthTemp On input, the size of input buffer. On output, it\r
+                          is the size of FW_HII_FORMSET_TEMPLATE.\r
+  @param Buffer           The buffer designed to receive the form(s).\r
 \r
-  EFI_BUFFER_TOO_SMALL  - The buffer provided was not large enough to allow the form to be stored.\r
+  @retval  EFI_SUCCESS            Buffer filled with the requested forms. BufferLength\r
+                                  was updated.\r
+  @retval  EFI_INVALID_PARAMETER  The handle is unknown.\r
+  @retval  EFI_NOT_FOUND          A form on the requested handle cannot be found with the\r
+                                  requested FormId.\r
+  @retval  EFI_BUFFER_TOO_SMALL   The buffer provided was not large enough to allow the form to be stored.\r
 \r
---*/\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetForms (\r
+  IN     EFI_HII_PROTOCOL   *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE      Handle,\r
+  IN     EFI_FORM_ID        FormId,\r
+  IN OUT UINTN              *BufferLengthTemp,\r
+  OUT    UINT8              *Buffer\r
+  )\r
 {\r
-  EFI_HII_THUNK_PRIVATE_DATA                *Private;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *MapEntry;\r
-  FRAMEWORK_HII_FORMSET_TEMPLATE            *OutputFormSet;\r
+  HII_THUNK_PRIVATE_DATA                *Private;\r
+  HII_THUNK_CONTEXT  *ThunkContext;\r
+  FW_HII_FORMSET_TEMPLATE            *OutputFormSet;\r
 \r
-  if (*BufferLengthTemp < sizeof(FRAMEWORK_HII_FORMSET_TEMPLATE)) {\r
-    *BufferLengthTemp = sizeof(FRAMEWORK_HII_FORMSET_TEMPLATE);\r
+  if (*BufferLengthTemp < sizeof(FW_HII_FORMSET_TEMPLATE)) {\r
+    *BufferLengthTemp = sizeof(FW_HII_FORMSET_TEMPLATE);\r
     return EFI_BUFFER_TOO_SMALL;\r
   }\r
   \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
-  MapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
+  ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
 \r
-  if (MapEntry == NULL) {\r
+  if (ThunkContext == NULL) {\r
     return EFI_NOT_FOUND;\r
   }\r
 \r
-  OutputFormSet = (FRAMEWORK_HII_FORMSET_TEMPLATE *) Buffer;\r
-  \r
-  CopyMem (OutputFormSet, &FormSetTemplate, sizeof (FRAMEWORK_HII_FORMSET_TEMPLATE));\r
-  CopyMem (&OutputFormSet->FormSet.Guid, &MapEntry->TagGuid, sizeof (EFI_GUID)); \r
+  OutputFormSet = (FW_HII_FORMSET_TEMPLATE *) Buffer;\r
   \r
+  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
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
 \r
-EFI_STATUS\r
-EFIAPI\r
-HiiGetDefaultImage (\r
-  IN     EFI_HII_PROTOCOL            *This,\r
-  IN     FRAMEWORK_EFI_HII_HANDLE    Handle,\r
-  IN     UINTN                       DefaultMask,\r
-  OUT    EFI_HII_VARIABLE_PACK_LIST  **VariablePackList\r
-  )\r
-/*++\r
-\r
-  Routine Description:\r
+/**\r
 \r
   This function allows a program to extract the NV Image\r
   that represents the default storage image\r
 \r
-  Arguments:\r
-    This             - A pointer to the EFI_HII_PROTOCOL instance.\r
-    Handle           - The HII handle from which will have default data retrieved.\r
-    UINTN            - Mask used to retrieve the default image.\r
-    VariablePackList - Callee allocated, tightly-packed, link list data\r
+\r
+  @param This            A pointer to the EFI_HII_PROTOCOL instance.\r
+  @param Handle          The HII handle from which will have default data retrieved.\r
+                         UINTN            - Mask used to retrieve the default image.\r
+  @param DefaultMask     EDES_TODO: Add parameter description\r
+  @param VariablePackList Callee allocated, tightly-packed, link list data\r
                          structure that contain all default varaible packs\r
                          from the Hii Database.\r
 \r
-  Returns:\r
-    EFI_NOT_FOUND         - If Hii database does not contain any default images.\r
-    EFI_INVALID_PARAMETER - Invalid input parameter.\r
-    EFI_SUCCESS           - Operation successful.\r
+  @retval  EFI_NOT_FOUND          If Hii database does not contain any default images.\r
+  @retval  EFI_INVALID_PARAMETER  Invalid input parameter.\r
+  @retval  EFI_SUCCESS            Operation successful.\r
 \r
---*/\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetDefaultImage (\r
+  IN     EFI_HII_PROTOCOL            *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE    Handle,\r
+  IN     UINTN                       DefaultMask,\r
+  OUT    EFI_HII_VARIABLE_PACK_LIST  **VariablePackList\r
+  )\r
 {\r
   LIST_ENTRY        *UefiDefaults;\r
   EFI_HII_HANDLE    UefiHiiHandle;\r
   EFI_STATUS        Status;\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+  HII_THUNK_PRIVATE_DATA *Private;\r
 \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
-  UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
+  UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
   if (UefiHiiHandle == NULL) {\r
     ASSERT (FALSE);\r
     return EFI_INVALID_PARAMETER;\r
@@ -197,7 +201,7 @@ HiiGetDefaultImage (
     goto Done;\r
   }\r
 \r
-  Status = UefiDefaultsToFrameworkDefaults (UefiDefaults, DefaultMask, VariablePackList);\r
+  Status = UefiDefaultsToFwDefaults (UefiDefaults, DefaultMask, VariablePackList);\r
 \r
 Done:\r
   FreeDefaultList (UefiDefaults);\r
@@ -205,22 +209,31 @@ Done:
   return Status;\r
 }\r
 \r
+/**\r
+  EDES_TODO: Add function description.\r
+\r
+  @param CallbackHandle  EDES_TODO: Add parameter description\r
+  @param ThunkContext  EDES_TODO: Add parameter description\r
+\r
+  @return EDES_TODO: Add description for return value\r
+\r
+**/\r
 EFI_STATUS\r
-ThunkUpdateFormCallBack (\r
+UpdateFormCallBack (\r
   IN       EFI_HANDLE                                CallbackHandle,\r
-  IN CONST HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry\r
+  IN CONST HII_THUNK_CONTEXT                         *ThunkContext\r
   )\r
 {\r
   EFI_STATUS                                Status;\r
-  EFI_FORM_CALLBACK_PROTOCOL                *FrameworkFormCallbackProtocol;\r
+  EFI_FORM_CALLBACK_PROTOCOL                *FormCallbackProtocol;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL            *ConfigAccessProtocol;\r
   EFI_HANDLE                                UefiDriverHandle;\r
-  HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE *ConfigAccessProtocolInstance;\r
+  CONFIG_ACCESS_PRIVATE                     *ConfigAccessPrivate;\r
   \r
   Status = gBS->HandleProtocol (\r
                    CallbackHandle,\r
                    &gEfiFormCallbackProtocolGuid,\r
-                   (VOID **) &FrameworkFormCallbackProtocol\r
+                   (VOID **) &FormCallbackProtocol\r
                    );\r
   if (EFI_ERROR (Status)) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -228,7 +241,7 @@ ThunkUpdateFormCallBack (
   \r
   Status = mHiiDatabase->GetPackageListHandle (\r
                                         mHiiDatabase,\r
-                                        HandleMapEntry->UefiHiiHandle,\r
+                                        ThunkContext->UefiHiiHandle,\r
                                         &UefiDriverHandle\r
                                         );\r
   ASSERT_EFI_ERROR (Status);\r
@@ -239,17 +252,28 @@ ThunkUpdateFormCallBack (
                    );\r
   ASSERT_EFI_ERROR (Status);\r
   \r
-  ConfigAccessProtocolInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (ConfigAccessProtocol);\r
+  ConfigAccessPrivate = CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL (ConfigAccessProtocol);\r
   \r
-  ConfigAccessProtocolInstance->FrameworkFormCallbackProtocol = FrameworkFormCallbackProtocol;\r
+  ConfigAccessPrivate->FormCallbackProtocol = FormCallbackProtocol;\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
 \r
+/**\r
+  EDES_TODO: Add function description.\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
+\r
+  @return EDES_TODO: Add description for return value\r
+\r
+**/\r
 STATIC\r
 EFI_STATUS\r
-GetPackageDataFromPackageList (\r
+GetPackageData (\r
   IN  EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList,\r
   IN  UINT32                      PackageIndex,\r
   OUT UINT32                      *BufferLen,\r
@@ -390,7 +414,7 @@ LocateLabel (
   @retval EFI_SUCCESS       The first found Form ID is returned in FormId.\r
 **/\r
 EFI_STATUS\r
-ThunkLocateFormId (\r
+LocateFormId (\r
   IN  EFI_HII_HANDLE Handle,\r
   IN  EFI_FORM_LABEL Label,\r
   OUT EFI_GUID       *FormsetGuid,\r
@@ -419,7 +443,7 @@ ThunkLocateFormId (
   }\r
 \r
   for (Index = 0; ; Index++) {\r
-    Status = GetPackageDataFromPackageList (HiiPackageList, Index, &PackageLength, &Package);\r
+    Status = GetPackageData (HiiPackageList, Index, &PackageLength, &Package);\r
     if (!EFI_ERROR (Status)) {\r
       CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
       if (PackageHeader.Type == EFI_HII_PACKAGE_FORM) {\r
@@ -439,77 +463,87 @@ Done:
   \r
   return Status;\r
 }\r
+/**\r
+  This function allows the caller to update a form that has\r
+  previously been registered with the EFI HII database.\r
+\r
+\r
+  @param This            EDES_TODO: Add parameter description\r
+  @param Handle          Hii Handle associated with the Formset to modify\r
+  @param Label           Update information starting immediately after this label in the IFR\r
+  @param AddData         If TRUE, add data.  If FALSE, remove data\r
+  @param Data            If adding data, this is the pointer to the data to add\r
+\r
+  @retval  EFI_SUCCESS  Update success.\r
+  @retval  Other        Update fail.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 HiiUpdateForm (\r
-  IN EFI_HII_PROTOCOL       *This,\r
+  IN EFI_HII_PROTOCOL                  *This,\r
   IN FRAMEWORK_EFI_HII_HANDLE          Handle,\r
-  IN EFI_FORM_LABEL         Label,\r
-  IN BOOLEAN                AddData,\r
+  IN EFI_FORM_LABEL                    Label,\r
+  IN BOOLEAN                           AddData,\r
   IN FRAMEWORK_EFI_HII_UPDATE_DATA    *Data\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-  This function allows the caller to update a form that has\r
-  previously been registered with the EFI HII database.\r
-\r
-Arguments:\r
-  Handle     - Hii Handle associated with the Formset to modify\r
-  Label      - Update information starting immediately after this label in the IFR\r
-  AddData    - If TRUE, add data.  If FALSE, remove data\r
-  Data       - If adding data, this is the pointer to the data to add\r
-\r
-Returns:\r
-  EFI_SUCCESS - Update success.\r
-  Other       - Update fail.\r
-\r
---*/\r
 {\r
   EFI_STATUS                                Status;\r
-  EFI_HII_THUNK_PRIVATE_DATA                *Private;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
+  HII_THUNK_PRIVATE_DATA                    *Private;\r
+  HII_THUNK_CONTEXT                          *ThunkContext;\r
   EFI_HII_UPDATE_DATA                       *UefiHiiUpdateData;\r
   EFI_HII_HANDLE                            UefiHiiHandle;\r
   EFI_GUID                                  FormsetGuid;\r
   EFI_FORM_ID                               FormId;\r
+  EFI_TPL                                   OldTpl;\r
 \r
+  OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
+  \r
+  mInFrameworkUpdatePakcage = TRUE;\r
   Status = EFI_SUCCESS;\r
+  UefiHiiUpdateData = NULL;\r
 \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
-  HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
-  if (HandleMapEntry == NULL) {\r
-    return EFI_NOT_FOUND;\r
+  ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
+\r
+  if (ThunkContext == NULL) {\r
+    Status = EFI_NOT_FOUND;\r
+    goto Done;\r
   }\r
   \r
   if (Data->FormSetUpdate) {\r
-    Status = ThunkUpdateFormCallBack ((EFI_HANDLE) (UINTN) Data->FormCallbackHandle, HandleMapEntry);\r
+    Status = UpdateFormCallBack ((EFI_HANDLE) (UINTN) Data->FormCallbackHandle, ThunkContext);\r
     if (EFI_ERROR (Status)) {\r
-      return Status;\r
+      goto Done;\r
     }\r
   }\r
 \r
-  if (HandleMapEntry->IsPackageListWithOnlyStringPackages) {\r
-    UefiHiiHandle = TagGuidToUefiIfrHiiHandle (Private, &HandleMapEntry->TagGuid);\r
+  if ((ThunkContext->IfrPackageCount == 0) && (ThunkContext->StringPackageCount != 0)) {\r
+    UefiHiiHandle = TagGuidToUefiHiiHandle (Private, &ThunkContext->TagGuid);\r
   \r
     if (UefiHiiHandle == NULL) {\r
-      return EFI_INVALID_PARAMETER;\r
+      Status = EFI_INVALID_PARAMETER;\r
+      goto Done;\r
     }\r
   } else {\r
-    UefiHiiHandle = HandleMapEntry->UefiHiiHandle;\r
+    UefiHiiHandle = ThunkContext->UefiHiiHandle;\r
   }\r
 \r
-  UefiHiiUpdateData = NULL;\r
+  Status = LocateFormId (UefiHiiHandle, Label, &FormsetGuid, &FormId);\r
+  if (EFI_ERROR (Status)) {\r
+    //\r
+    // Can't find the label.\r
+    //\r
+    goto Done;\r
+  }\r
 \r
   if (AddData) {\r
     if (Data->DataCount != 0) {\r
-      \r
-      Status = ThunkFrameworkUpdateDataToUefiUpdateData (Data, AddData, &UefiHiiUpdateData);\r
-      ASSERT_EFI_ERROR (Status);\r
 \r
-      Status = ThunkLocateFormId (UefiHiiHandle, Label, &FormsetGuid, &FormId);\r
+      ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
+      Status = FwUpdateDataToUefiUpdateData (ThunkContext, Data, AddData, &UefiHiiUpdateData);\r
       ASSERT_EFI_ERROR (Status);\r
 \r
       Status = IfrLibUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, Label, AddData, UefiHiiUpdateData);\r
@@ -517,9 +551,6 @@ Returns:
       \r
     } \r
   } else {\r
-    Status = ThunkLocateFormId (UefiHiiHandle, Label, &FormsetGuid, &FormId);\r
-    ASSERT_EFI_ERROR (Status);\r
-\r
     //\r
     // Delete Opcode starting from Labe in FormId found\r
     //\r
@@ -529,10 +560,15 @@ Returns:
     ASSERT_EFI_ERROR (Status);\r
   }\r
 \r
+Done:\r
   if (UefiHiiUpdateData != NULL) {\r
     SafeFreePool (UefiHiiUpdateData->Data);\r
     SafeFreePool (UefiHiiUpdateData);\r
   }\r
 \r
+  mInFrameworkUpdatePakcage = FALSE; \r
+\r
+  gBS->RestoreTPL (OldTpl);\r
+\r
   return Status;\r
 }\r
index 8085587794b81506e4d7c60102cb518b7dba1f37..88f05ad3a1522541a2784fafea67aaa7e2c6835d 100644 (file)
@@ -37,6 +37,8 @@
 #\r
 \r
 [Sources.common]\r
+  ConfigAccess.c\r
+  ConfigAccess.h\r
   OpcodeCreation.c\r
   OpcodeCreation.h\r
   UefiIfrParserInternal.h\r
   Forms.c\r
   HiiDatabase.h\r
   HiiDatabase.c\r
-  ConfigAccess.c\r
-  ConfigAccess.h\r
   Utility.c\r
   Utility.h\r
+\r
+  SetupBrowser.c\r
  \r
 \r
 [Packages]\r
   gEfiFormBrowserProtocolGuid\r
 \r
 [Depex]\r
-  gEfiHiiImageProtocolGuid AND\r
   gEfiHiiDatabaseProtocolGuid AND\r
   gEfiHiiStringProtocolGuid AND\r
-  gEfiHiiFontProtocolGuid AND\r
   gEfiHiiConfigRoutingProtocolGuid\r
 \r
 \r
index e33b2e277281db7306221a55c39b77b61e2acf5a..50b902a952cd08b01b8cb3eb79c2a36b06df983b 100644 (file)
@@ -15,16 +15,12 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "HiiDatabase.h"\r
 \r
-EFI_HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
-\r
-EFI_HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {\r
-  //Signature\r
-  EFI_HII_THUNK_DRIVER_DATA_SIGNATURE \r
-  ,\r
-  //Handle\r
-  (EFI_HANDLE) NULL\r
-  ,\r
-  { //Hii\r
+HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
+\r
+HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {\r
+  HII_THUNK_PRIVATE_DATA_SIGNATURE,\r
+  (EFI_HANDLE) NULL,\r
+  {\r
     HiiNewPack,\r
     HiiRemovePack,\r
     HiiFindHandles,\r
@@ -46,18 +42,21 @@ EFI_HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {
     \r
     HiiGetKeyboardLayout\r
   },\r
+\r
+  //\r
   //StaticHiiHandle\r
   //The FRAMEWORK_EFI_HII_HANDLE starts from 1 \r
   // and increase upwords untill reach the value of StaticPureUefiHiiHandle. \r
   // The code will assert to prevent overflow.\r
-  (FRAMEWORK_EFI_HII_HANDLE) 1 \r
-  ,\r
+  (FRAMEWORK_EFI_HII_HANDLE) 1,\r
+\r
+  //\r
   //StaticPureUefiHiiHandle\r
   //The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF \r
   // and decrease downwords untill reach the value of StaticHiiHandle. \r
   // The code will assert to prevent overflow.\r
-  (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF \r
-  ,\r
+  //\r
+  (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF,\r
   {\r
     NULL, NULL                  //HiiHandleLinkList\r
   },\r
@@ -66,6 +65,7 @@ EFI_HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {
 EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {\r
   EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE,\r
   (EFI_HANDLE) NULL,\r
+  (HII_THUNK_PRIVATE_DATA *) NULL,\r
   {\r
     ThunkSendForm,\r
     ThunkCreatePopUp\r
@@ -74,276 +74,15 @@ EFI_FORMBROWSER_THUNK_PRIVATE_DATA mBrowserThunkPrivateDataTemplate = {
 \r
 \r
 CONST EFI_HII_DATABASE_PROTOCOL            *mHiiDatabase;\r
-CONST EFI_HII_FONT_PROTOCOL                *mHiiFontProtocol;\r
 CONST EFI_HII_IMAGE_PROTOCOL               *mHiiImageProtocol;\r
 CONST EFI_HII_STRING_PROTOCOL              *mHiiStringProtocol;\r
 CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mHiiConfigRoutingProtocol;\r
+CONST EFI_FORM_BROWSER2_PROTOCOL           *mFormBrowser2Protocol;\r
 \r
-EFI_STATUS\r
-RegisterUefiHiiHandle (\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private,\r
-  EFI_HII_HANDLE             UefiHiiHandle\r
- )\r
-{\r
-  EFI_STATUS     Status;\r
-  EFI_GUID       PackageGuid;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMappingEntry;\r
-\r
-  HandleMappingEntry = AllocateZeroPool (sizeof (*HandleMappingEntry));\r
-  HandleMappingEntry->Signature = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE;\r
-\r
-  Status = AssignPureUefiHiiHandle (Private, &HandleMappingEntry->FrameworkHiiHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  \r
-  HandleMappingEntry->UefiHiiHandle = UefiHiiHandle;\r
-  Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
-  ASSERT_EFI_ERROR (Status);\r
-  \r
-  CopyGuid(&HandleMappingEntry->TagGuid, &PackageGuid);\r
-  \r
-  InsertTailList (&Private->HiiThunkHandleMappingDBListHead, &HandleMappingEntry->List);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-EFI_STATUS\r
-UnRegisterUefiHiiHandle (\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private,\r
-  EFI_HII_HANDLE UefiHiiHandle\r
- )\r
-{\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY     *MapEntry;\r
-\r
-  MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, UefiHiiHandle);\r
-  ASSERT (MapEntry != NULL);\r
-  \r
-  RemoveEntryList (&MapEntry->List);\r
 \r
-  FreePool (MapEntry);\r
-    \r
-  return EFI_SUCCESS;\r
-}\r
 \r
-EFI_STATUS\r
-EFIAPI\r
-AddPackNotify (\r
-  IN UINT8                              PackageType,\r
-  IN CONST EFI_GUID                     *PackageGuid,\r
-  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
-  IN EFI_HII_HANDLE                     Handle,\r
-  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
-  )\r
-{\r
-  EFI_STATUS   Status;\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
-\r
-  ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
-  ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK);\r
-\r
-  Status  = EFI_SUCCESS;\r
-  Private = mHiiThunkPrivateData;\r
 \r
-  if (mInFrameworkHiiNewPack) {\r
-    return EFI_SUCCESS;\r
-  }\r
 \r
-  //\r
-  // We only create a MapEntry if the Uefi Hii Handle is only already registered\r
-  // by the HII Thunk Layer.\r
-  //\r
-  if (UefiHiiHandleToMapDatabaseEntry (Private, Handle) == NULL) {\r
-    Status = RegisterUefiHiiHandle (Private, Handle);\r
-  } \r
-\r
-  return Status;  \r
-}\r
-EFI_STATUS\r
-EFIAPI\r
-NewPackNotify (\r
-  IN UINT8                              PackageType,\r
-  IN CONST EFI_GUID                     *PackageGuid,\r
-  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
-  IN EFI_HII_HANDLE                     Handle,\r
-  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
-  )\r
-{\r
-  EFI_STATUS   Status;\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
-\r
-  ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
-  ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK);\r
-\r
-  if (mInFrameworkHiiNewPack) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  Status  = EFI_SUCCESS;\r
-  Private = mHiiThunkPrivateData;\r
-\r
-  //\r
-  // We only\r
-  //\r
-  if (UefiHiiHandleToMapDatabaseEntry (Private, Handle) == NULL) {\r
-    Status = RegisterUefiHiiHandle (Private, Handle);\r
-  } \r
-\r
-  return Status;\r
-}\r
-\r
-BOOLEAN\r
-IsLastStringPack (\r
-  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
-  IN EFI_HII_HANDLE                     Handle\r
-  )\r
-{\r
-  EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
-  UINTN                        BufferSize;\r
-  EFI_STATUS                   Status;\r
-  EFI_HII_PACKAGE_HEADER       *PackageHdrPtr;\r
-  EFI_HII_PACKAGE_HEADER       PackageHeader;\r
-  BOOLEAN                      Match;\r
-\r
-  Match = FALSE;\r
-  HiiPackageList = NULL;\r
-  BufferSize = 0;\r
-  Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-  ASSERT (Status != EFI_NOT_FOUND);\r
-  \r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    HiiPackageList = AllocateZeroPool (BufferSize);\r
-    ASSERT (HiiPackageList != NULL);\r
-\r
-    Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
-  }\r
-\r
-  \r
-  PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) HiiPackageList + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
-  CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  while (PackageHeader.Type != EFI_HII_PACKAGE_END) {\r
-    switch (PackageHeader.Type) {\r
-      case EFI_HII_PACKAGE_STRINGS:\r
-        if (CompareMem (Package, PackageHdrPtr, Package->Length) != 0) {\r
-          FreePool (HiiPackageList);\r
-          return FALSE;\r
-        }\r
-      break;      \r
-      default:\r
-        break;\r
-    }\r
-    //\r
-    // goto header of next package\r
-    //\r
-    PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHdrPtr + PackageHeader.Length);\r
-    CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
-  }\r
-\r
-  FreePool (HiiPackageList);\r
-  return TRUE;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-RemovePackNotify (\r
-  IN UINT8                              PackageType,\r
-  IN CONST EFI_GUID                     *PackageGuid,\r
-  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
-  IN EFI_HII_HANDLE                     Handle,\r
-  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
-  )\r
-{\r
-  EFI_STATUS   Status;\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY * MapEntry;\r
-\r
-  Status = EFI_SUCCESS;\r
-\r
-  ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
-  ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK);\r
-\r
-  if (mInFrameworkHiiRemovePack) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  Private = mHiiThunkPrivateData;\r
-\r
-  MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, Handle);\r
-\r
-  if (MapEntry->FrameworkHiiHandle > Private->StaticHiiHandle) {\r
-    //\r
-    // This is a PackageList registered using UEFI HII Protocol Instance.\r
-    // The MapEntry->TagGuid for this type of PackageList is a auto generated GUID\r
-    // to link StringPack with IfrPack.\r
-    // RemovePackNotify is only used to remove PackageList when it is removed by\r
-    // calling mHiiDatabase->RemovePackageList interface.\r
-    if (IsLastStringPack (Package, Handle)) {\r
-      Status = UnRegisterUefiHiiHandle (Private, Handle);\r
-    }\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-MapUefiHiiHandles (\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private\r
-  )\r
-{\r
-  UINTN          HandleBufferLength;\r
-  EFI_HII_HANDLE *HandleBuffer;\r
-  EFI_STATUS     Status;\r
-  UINTN          Index;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY * MapEntry;\r
-\r
-  HandleBufferLength = 0;\r
-  HandleBuffer       = NULL;\r
-  Status = mHiiDatabase->ListPackageLists (\r
-                            mHiiDatabase,\r
-                            EFI_HII_PACKAGE_TYPE_ALL,\r
-                            NULL,\r
-                            &HandleBufferLength,\r
-                            HandleBuffer\r
-                            );\r
-  if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
-    //\r
-    // As no package is registered to UEFI HII Database, EFI_SUCCESS is returned.\r
-    // \r
-    //\r
-    if (Status == EFI_NOT_FOUND) {\r
-      return EFI_SUCCESS;\r
-    } else {\r
-      return Status;\r
-    }\r
-  }\r
-\r
-  HandleBuffer = AllocateZeroPool (HandleBufferLength);\r
-  Status = mHiiDatabase->ListPackageLists (\r
-                            mHiiDatabase,\r
-                            EFI_HII_PACKAGE_TYPE_ALL,\r
-                            NULL,\r
-                            &HandleBufferLength,\r
-                            HandleBuffer\r
-                            );\r
-\r
-  for (Index = 0; Index < HandleBufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
-    MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, HandleBuffer[Index]);\r
-    //\r
-    // Only register those UEFI HII Handles that are registered using the UEFI HII database interface.\r
-    //\r
-    if (MapEntry == NULL) {\r
-      Status = RegisterUefiHiiHandle (Private, HandleBuffer[Index]);\r
-      ASSERT_EFI_ERROR (Status);\r
-    }\r
-  }\r
-\r
-  return EFI_SUCCESS;                  \r
-}\r
 \r
 EFI_STATUS\r
 EFIAPI\r
@@ -365,17 +104,21 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_HII_THUNK_PRIVATE_DATA *HiiData;\r
-  EFI_HANDLE                 Handle;\r
-  EFI_STATUS                 Status;\r
+  HII_THUNK_PRIVATE_DATA *Private;\r
+  EFI_HANDLE              Handle;\r
+  EFI_STATUS              Status;\r
+  UINTN                   BufferLength;\r
+  EFI_HII_HANDLE          *Buffer;\r
+  UINTN                   Index;\r
+  \r
 \r
   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
 \r
-  HiiData = AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
-  ASSERT (HiiData != NULL);\r
-  InitializeListHead (&HiiData->HiiThunkHandleMappingDBListHead);\r
+  Private = AllocateCopyPool (sizeof (HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
+  ASSERT (Private != NULL);\r
+  InitializeListHead (&Private->ThunkContextListHead);\r
 \r
-  mHiiThunkPrivateData = HiiData;\r
+  mHiiThunkPrivateData = Private;\r
 \r
   Status = gBS->LocateProtocol (\r
                   &gEfiHiiDatabaseProtocolGuid,\r
@@ -385,55 +128,58 @@ Returns:
   ASSERT_EFI_ERROR (Status);\r
 \r
   Status = gBS->LocateProtocol (\r
-                  &gEfiHiiFontProtocolGuid,\r
+                  &gEfiHiiStringProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &mHiiFontProtocol\r
+                  (VOID **) &mHiiStringProtocol\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
   Status = gBS->LocateProtocol (\r
-                  &gEfiHiiImageProtocolGuid,\r
+                  &gEfiHiiConfigRoutingProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &mHiiImageProtocol\r
+                  (VOID **) &mHiiConfigRoutingProtocol\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  Status = gBS->LocateProtocol (\r
-                  &gEfiHiiStringProtocolGuid,\r
-                  NULL,\r
-                  (VOID **) &mHiiStringProtocol\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
 \r
   Status = gBS->LocateProtocol (\r
-                  &gEfiHiiConfigRoutingProtocolGuid,\r
+                  &gEfiFormBrowser2ProtocolGuid,\r
                   NULL,\r
-                  (VOID **) &mHiiConfigRoutingProtocol\r
+                  (VOID **) &mFormBrowser2Protocol\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+\r
+  \r
+\r
   //\r
   // Install protocol interface\r
   //\r
-  Handle = NULL;\r
   Status = gBS->InstallProtocolInterface (\r
-                  &HiiData->Handle,\r
+                  &Private->Handle,\r
                   &gEfiHiiProtocolGuid,\r
                   EFI_NATIVE_INTERFACE,\r
-                  (VOID *) &HiiData->Hii\r
+                  (VOID *) &Private->Hii\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-  Status = MapUefiHiiHandles (HiiData);\r
-  ASSERT_EFI_ERROR (Status);\r
+  Status = HiiLibListPackageLists (EFI_HII_PACKAGE_STRINGS, NULL, &BufferLength, &Buffer);\r
+  if (Status == EFI_SUCCESS) {\r
+    for (Index = 0; Index < BufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
+      CreateThunkContextForUefiHiiHandle (Private, Buffer[Index]);\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
+\r
+    FreePool (Buffer);\r
+  }\r
 \r
   Status = mHiiDatabase->RegisterPackageNotify (\r
                            mHiiDatabase,\r
                            EFI_HII_PACKAGE_STRINGS,\r
                            NULL,\r
-                           NewPackNotify,\r
+                           NewOrAddPackNotify,\r
                            EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
-                           &HiiData->NewPackNotifyHandle\r
+                           &Handle\r
                            );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -441,9 +187,29 @@ Returns:
                            mHiiDatabase,\r
                            EFI_HII_PACKAGE_STRINGS,\r
                            NULL,\r
-                           AddPackNotify,\r
+                           NewOrAddPackNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
+                           &Handle\r
+                           );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_FORM,\r
+                           NULL,\r
+                           NewOrAddPackNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
+                           &Handle\r
+                           );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_FORM,\r
+                           NULL,\r
+                           NewOrAddPackNotify,\r
                            EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
-                           &HiiData->AddPackNotifyHandle\r
+                           &Handle\r
                            );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -453,10 +219,11 @@ Returns:
                            NULL,\r
                            RemovePackNotify,\r
                            EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
-                           &HiiData->RemovePackNotifyHandle\r
+                           &Handle\r
                            );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  mBrowserThunkPrivateDataTemplate.ThunkPrivate = Private;\r
   Status = gBS->InstallProtocolInterface (\r
                   &mBrowserThunkPrivateDataTemplate.Handle,\r
                   &gEfiFormBrowserProtocolGuid,\r
@@ -487,22 +254,24 @@ Returns:
 --*/\r
 {\r
   UINT16                                     Count;\r
-  LIST_ENTRY                                *ListEntry;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
-  EFI_HII_THUNK_PRIVATE_DATA               *Private;\r
+  LIST_ENTRY                                *Link;\r
+  HII_THUNK_CONTEXT *ThunkContext;\r
+  HII_THUNK_PRIVATE_DATA               *Private;\r
 \r
   if (HandleBufferLength == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);  \r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);  \r
 \r
+  //\r
+  // Count the number of handles.\r
+  //\r
   Count = 0;\r
-  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
-       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
-       ListEntry = ListEntry->ForwardLink\r
-       ) {\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
     Count++;\r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
   }\r
 \r
   if (Count > *HandleBufferLength) {\r
@@ -510,22 +279,71 @@ Returns:
     return EFI_BUFFER_TOO_SMALL;\r
   }\r
 \r
+  //\r
+  // Output the handles.\r
+  //\r
   Count = 0;\r
-  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
-       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
-       ListEntry = ListEntry->ForwardLink\r
-       ) {\r
-    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+\r
+    ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+    Handle[Count] = ThunkContext->FwHiiHandle;\r
 \r
-    Handle[Count] = HandleMapEntry->FrameworkHiiHandle;\r
-  \r
     Count++;\r
-  }  \r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
+\r
+  }\r
 \r
   *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
   return EFI_SUCCESS;\r
 }\r
 \r
+EFI_STATUS\r
+LangCodes3066To639 (\r
+  IN CHAR8 *LangCodes3066,\r
+  IN CHAR8 **LangCodes639\r
+  )\r
+{\r
+  CHAR8                      *AsciiLangCodes;\r
+  CHAR8                      Lang[RFC_3066_ENTRY_SIZE];\r
+  UINTN                      Index;\r
+  UINTN                      Count;\r
+  EFI_STATUS                 Status;\r
+\r
+  ASSERT (LangCodes3066 != NULL);\r
+  ASSERT (LangCodes639 != NULL);\r
+  \r
+  //\r
+  // Count the number of RFC 3066 language codes.\r
+  //\r
+  Index = 0;\r
+  AsciiLangCodes = LangCodes3066;\r
+  while (AsciiStrLen (AsciiLangCodes) != 0) {\r
+    HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
+    Index++;\r
+  }\r
+\r
+  Count = Index;\r
+\r
+  //\r
+  // \r
+  //\r
+  *LangCodes639 = AllocateZeroPool (ISO_639_2_ENTRY_SIZE * Count + 1);\r
+  if (*LangCodes639 == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  AsciiLangCodes = LangCodes3066;\r
+\r
+  for (Index = 0; Index < Count; Index++) {\r
+    HiiLibGetNextLanguage (&AsciiLangCodes, Lang);\r
+    Status = ConvertRfc3066LanguageToIso639Language (Lang, *LangCodes639 + Index * ISO_639_2_ENTRY_SIZE);\r
+    ASSERT_EFI_ERROR (Status);\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 HiiGetPrimaryLanguages (\r
@@ -545,46 +363,61 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+  HII_THUNK_PRIVATE_DATA     *Private;\r
   EFI_HII_HANDLE             UefiHiiHandle;\r
-  CHAR8                      *AsciiLanguageCodes;\r
-  CHAR16                     *UnicodeLanguageCodes;\r
+  CHAR8                      *LangCodes3066;\r
+  CHAR16                     *UnicodeLangCodes639;\r
+  CHAR8                      *LangCodes639;\r
+  EFI_STATUS                 Status;\r
 \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
-  \r
-  \r
-  UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
+  UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
   if (UefiHiiHandle == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  AsciiLanguageCodes = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
+  LangCodes3066 = HiiLibGetSupportedLanguages (UefiHiiHandle);\r
 \r
-  if (AsciiLanguageCodes == NULL) {\r
+  if (LangCodes3066 == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));\r
-  if (UnicodeLanguageCodes == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+\r
+  LangCodes639 = NULL;\r
+  Status = LangCodes3066To639 (LangCodes3066, &LangCodes639);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+  \r
+  UnicodeLangCodes639 = AllocateZeroPool (AsciiStrSize (LangCodes639) * sizeof (CHAR16));\r
+  if (UnicodeLangCodes639 == NULL) {\r
+    Status =  EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
   }\r
 \r
   //\r
-  // The language returned is in RFC 3066 format.\r
+  // The language returned is in RFC 639-2 format.\r
   //\r
-  *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);\r
+  AsciiStrToUnicodeStr (LangCodes639, UnicodeLangCodes639);\r
+  *LanguageString = UnicodeLangCodes639;\r
 \r
-  return EFI_SUCCESS;\r
+Done:\r
+  FreePool (LangCodes3066);\r
+  SafeFreePool (LangCodes639);\r
+\r
+  return Status;\r
 }\r
 \r
+\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 HiiGetSecondaryLanguages (\r
-  IN  EFI_HII_PROTOCOL      *This,\r
-  IN  FRAMEWORK_EFI_HII_HANDLE         Handle,\r
-  IN  CHAR16                *PrimaryLanguage,\r
-  OUT EFI_STRING            *LanguageString\r
+  IN  EFI_HII_PROTOCOL              *This,\r
+  IN  FRAMEWORK_EFI_HII_HANDLE      Handle,\r
+  IN  CHAR16                        *PrimaryLanguage,\r
+  OUT EFI_STRING                    *LanguageString\r
   )\r
 /*++\r
 \r
@@ -599,75 +432,68 @@ Returns:
 \r
 --*/\r
 {\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+  HII_THUNK_PRIVATE_DATA *Private;\r
   EFI_HII_HANDLE             UefiHiiHandle;\r
-  CHAR8                      *AsciiPrimaryLanguage;\r
-  CHAR8                      *AsciiLanguageCodes;\r
-  CHAR16                     *UnicodeLanguageCodes;\r
+  CHAR8                      PrimaryLang3066[RFC_3066_ENTRY_SIZE];\r
+  CHAR8                      *PrimaryLang639;\r
+  CHAR8                      *SecLangCodes3066;\r
+  CHAR8                      *SecLangCodes639;\r
+  CHAR16                     *UnicodeSecLangCodes639;\r
+  EFI_STATUS                 Status;\r
 \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
-  \r
-  \r
-  UefiHiiHandle = FrameworkHiiHandleToUefiHiiHandle (Private, Handle);\r
+  SecLangCodes639         = NULL;\r
+  SecLangCodes3066        = NULL;\r
+  UnicodeSecLangCodes639 = NULL;\r
+\r
+  UefiHiiHandle = FwHiiHandleToUefiHiiHandle (Private, Handle);\r
   if (UefiHiiHandle == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  AsciiPrimaryLanguage = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
+  PrimaryLang639 = AllocateZeroPool (StrLen (PrimaryLanguage) + 1);\r
+  if (PrimaryLang639 == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
+  }\r
 \r
-  UnicodeStrToAsciiStr (PrimaryLanguage, AsciiPrimaryLanguage);\r
+  UnicodeStrToAsciiStr (PrimaryLanguage, PrimaryLang639);\r
 \r
-  AsciiLanguageCodes = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, AsciiPrimaryLanguage);\r
+  Status = ConvertIso639LanguageToRfc3066Language (PrimaryLang639, PrimaryLang3066);\r
+  ASSERT_EFI_ERROR (Status);\r
 \r
-  if (AsciiLanguageCodes == NULL) {\r
-    return EFI_INVALID_PARAMETER;\r
+  SecLangCodes3066 = HiiLibGetSupportedSecondaryLanguages (UefiHiiHandle, PrimaryLang3066);\r
+\r
+  if (SecLangCodes3066 == NULL) {\r
+    Status =  EFI_INVALID_PARAMETER;\r
+    goto Done;\r
   }\r
 \r
-  UnicodeLanguageCodes = AllocateZeroPool (AsciiStrSize (AsciiLanguageCodes) * sizeof (CHAR16));\r
-  if (UnicodeLanguageCodes == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+  Status = LangCodes3066To639 (SecLangCodes3066, &SecLangCodes639);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+\r
+  UnicodeSecLangCodes639 = AllocateZeroPool (AsciiStrSize (SecLangCodes639) * sizeof (CHAR16));\r
+  if (UnicodeSecLangCodes639 == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto Done;\r
   }\r
 \r
   //\r
   // The language returned is in RFC 3066 format.\r
   //\r
-  *LanguageString = AsciiStrToUnicodeStr (AsciiLanguageCodes, UnicodeLanguageCodes);\r
+  *LanguageString = AsciiStrToUnicodeStr (SecLangCodes639, UnicodeSecLangCodes639);\r
 \r
-  return EFI_SUCCESS;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI \r
-ThunkSendForm (\r
-  IN  EFI_FORM_BROWSER_PROTOCOL       *This,\r
-  IN  BOOLEAN                         UseDatabase,\r
-  IN  FRAMEWORK_EFI_HII_HANDLE        *Handle,\r
-  IN  UINTN                           HandleCount,\r
-  IN  FRAMEWORK_EFI_IFR_PACKET                  *Packet, OPTIONAL\r
-  IN  EFI_HANDLE                      CallbackHandle, OPTIONAL\r
-  IN  UINT8                           *NvMapOverride, OPTIONAL\r
-  IN  FRAMEWORK_EFI_SCREEN_DESCRIPTOR            *ScreenDimensions, OPTIONAL\r
-  OUT BOOLEAN                         *ResetRequired OPTIONAL\r
-  )\r
-{\r
-  ASSERT (FALSE);\r
-  return EFI_UNSUPPORTED;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI \r
-ThunkCreatePopUp (\r
-  IN  UINTN                           NumberOfLines,\r
-  IN  BOOLEAN                         HotKey,\r
-  IN  UINTN                           MaximumStringSize,\r
-  OUT CHAR16                          *StringBuffer,\r
-  OUT EFI_INPUT_KEY                   *KeyValue,\r
-  IN  CHAR16                          *String,\r
-  ...\r
-  )\r
-{\r
-  ASSERT (FALSE);\r
-  return EFI_UNSUPPORTED;\r
+Done:\r
+  \r
+  SafeFreePool (PrimaryLang639);\r
+  SafeFreePool (SecLangCodes639);\r
+  SafeFreePool (SecLangCodes3066);\r
+  SafeFreePool (UnicodeSecLangCodes639);\r
+  \r
+  return Status;\r
 }\r
 \r
\r
index 85822ab17afda7f49d1ae334e6f479f2819afa69..3a0f09f0c81528cc04a567f15cce3263aa86c0f4 100644 (file)
@@ -43,7 +43,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/BaseMemoryLib.h>\r
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Library/UefiRuntimeServicesTableLib.h>\r
-//#include <Library/FrameworkIfrSupportLib.h>\r
 #include <Library/HiiLib.h>\r
 #include <Library/ExtendedHiiLib.h>\r
 \r
@@ -52,15 +51,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include <MdeModuleHii.h>\r
 \r
-//\r
-// Macros\r
-//\r
-\r
-\r
-//\r
-// Typedef\r
-//\r
-\r
 #pragma pack (push, 1)\r
 typedef struct {\r
   UINT32                  BinaryLength;\r
@@ -68,8 +58,8 @@ typedef struct {
 } TIANO_AUTOGEN_PACKAGES_HEADER;\r
 #pragma pack (pop)\r
 \r
-#define EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(Record)   CR(Record, EFI_HII_THUNK_PRIVATE_DATA, Hii, EFI_HII_THUNK_DRIVER_DATA_SIGNATURE)\r
-#define EFI_HII_THUNK_DRIVER_DATA_SIGNATURE            EFI_SIGNATURE_32 ('H', 'i', 'I', 'T')\r
+#define HII_THUNK_PRIVATE_DATA_FROM_THIS(Record)  CR(Record, HII_THUNK_PRIVATE_DATA, Hii, HII_THUNK_PRIVATE_DATA_SIGNATURE)\r
+#define HII_THUNK_PRIVATE_DATA_SIGNATURE            EFI_SIGNATURE_32 ('H', 'i', 'I', 'T')\r
 typedef struct {\r
   UINTN                    Signature;\r
   EFI_HANDLE               Handle;\r
@@ -78,75 +68,139 @@ typedef struct {
   FRAMEWORK_EFI_HII_HANDLE StaticPureUefiHiiHandle;\r
 \r
   //\r
-  // This LIST_ENTRY is the list head which has HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY type \r
-  // as list entry.\r
+  // The head of link list for all HII_THUNK_CONTEXT.\r
   //\r
-  LIST_ENTRY               HiiThunkHandleMappingDBListHead;\r
+  LIST_ENTRY               ThunkContextListHead;\r
 \r
-  EFI_HANDLE               NewPackNotifyHandle;\r
   EFI_HANDLE               RemovePackNotifyHandle;\r
   EFI_HANDLE               AddPackNotifyHandle;\r
-} EFI_HII_THUNK_PRIVATE_DATA;\r
+} HII_THUNK_PRIVATE_DATA;\r
+\r
 \r
 \r
-#define HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY(Record) CR(Record, HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY, List, HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE)\r
-#define HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE            EFI_SIGNATURE_32 ('H', 'T', 'H', 'M')\r
+#define ONE_OF_OPTION_MAP_ENTRY_FROM_LINK(Record) CR(Record, ONE_OF_OPTION_MAP_ENTRY, Link, ONE_OF_OPTION_MAP_ENTRY_SIGNATURE)\r
+#define ONE_OF_OPTION_MAP_ENTRY_SIGNATURE            EFI_SIGNATURE_32 ('O', 'O', 'M', 'E')\r
 typedef struct {\r
-  LIST_ENTRY                List;\r
+  UINT32          Signature;\r
+  LIST_ENTRY      Link;\r
+\r
+  UINT16             FwKey;\r
+  EFI_IFR_TYPE_VALUE Value;\r
+  \r
+} ONE_OF_OPTION_MAP_ENTRY;\r
+\r
+\r
+\r
+#define ONE_OF_OPTION_MAP_FROM_LINK(Record) CR(Record, ONE_OF_OPTION_MAP, Link, ONE_OF_OPTION_MAP_SIGNATURE)\r
+#define ONE_OF_OPTION_MAP_SIGNATURE            EFI_SIGNATURE_32 ('O', 'O', 'O', 'M')\r
+typedef struct {\r
+  UINT32          Signature;\r
+  LIST_ENTRY      Link;       \r
+\r
+  UINT8           ValueType; //EFI_IFR_TYPE_NUM_* \r
+\r
+  EFI_QUESTION_ID     QuestionId;\r
+\r
+  LIST_ENTRY      OneOfOptionMapEntryListHead; //ONE_OF_OPTION_MAP_ENTRY\r
+} ONE_OF_OPTION_MAP;\r
+\r
+\r
+\r
+#define QUESTION_ID_MAP_ENTRY_FROM_LINK(Record) CR(Record, QUESTION_ID_MAP_ENTRY, Link, QUESTION_ID_MAP_ENTRY_SIGNATURE)\r
+#define QUESTION_ID_MAP_ENTRY_SIGNATURE            EFI_SIGNATURE_32 ('Q', 'I', 'M', 'E')\r
+typedef struct {\r
+  UINT32            Signature;\r
+  LIST_ENTRY        Link;\r
+  UINT16            FwQId;\r
+  EFI_QUESTION_ID   UefiQid;\r
+} QUESTION_ID_MAP_ENTRY;\r
+\r
+\r
+\r
+#define QUESTION_ID_MAP_FROM_LINK(Record) CR(Record, QUESTION_ID_MAP, Link, QUESTION_ID_MAP_SIGNATURE)\r
+#define QUESTION_ID_MAP_SIGNATURE            EFI_SIGNATURE_32 ('Q', 'I', 'M', 'P')\r
+typedef struct {\r
+  UINT32            Signature;\r
+  LIST_ENTRY        Link;\r
+  UINT16            VarStoreId;\r
+  UINTN             VarSize;\r
+  LIST_ENTRY        MapEntryListHead;\r
+} QUESTION_ID_MAP;\r
+\r
+\r
+\r
+#define HII_THUNK_CONTEXT_FROM_LINK(Record) CR(Record, HII_THUNK_CONTEXT, Link, HII_THUNK_CONTEXT_SIGNATURE)\r
+#define HII_THUNK_CONTEXT_SIGNATURE            EFI_SIGNATURE_32 ('H', 'T', 'H', 'M')\r
+typedef struct {\r
+  LIST_ENTRY                Link;\r
   UINT32                    Signature;\r
-  FRAMEWORK_EFI_HII_HANDLE  FrameworkHiiHandle;\r
+  FRAMEWORK_EFI_HII_HANDLE  FwHiiHandle;\r
   EFI_HII_HANDLE            UefiHiiHandle;\r
   EFI_HANDLE                UefiHiiDriverHandle;\r
 \r
-  BOOLEAN                   IsPackageListWithOnlyStringPackages;\r
+  UINTN                     IfrPackageCount;\r
+  UINTN                     StringPackageCount;\r
+\r
   //\r
   // The field below is only valid if IsPackageListWithOnlyStringPack is TRUE.\r
   // The HII 0.92 version of HII data implementation in EDK 1.03 and 1.04 make an the following assumption\r
   // in both HII Database implementation and all modules that registering packages:\r
-  // If a Package List has only IFR package and no String Package, the String Package containing the strings \r
-  // referenced by this IFR package is in another Package List\r
-  // registered with the HII database with the same EFI_HII_PACKAGES.GuidId.\r
-  //\r
-  //\r
-  // Only valid if IsPackageListWithSingleStringPack is TRUE.\r
-  // UEFI Package List Head Pointer, pointing to a allocated buffer containing the package\r
-  //\r
-  EFI_HII_PACKAGE_LIST_HEADER *UefiStringPackageListHeader; //Only valid if IsStringPack is TRUE.\r
-                                                            //This UEFI Package list only consists of a list of string packages.\r
-\r
+  // If a Package List has only IFR package and no String Package, the IFR package will reference \r
+  // String in another Package List registered with the HII database with the same EFI_HII_PACKAGES.GuidId.\r
+  // TagGuid is the used to record this GuidId.\r
   EFI_GUID                   TagGuid;\r
-  //\r
-  // TRUE if the package list identified by UefiHiiHandle imports String Packages from \r
-  // other package list with IsPackageListWithOnlyStringPackages is TRUE.\r
-  //\r
-  BOOLEAN                    DoesPackageListImportStringPackages;\r
+\r
+  LIST_ENTRY                 QuestionIdMapListHead; //QUESTION_ID_MAP\r
+\r
+  LIST_ENTRY                 OneOfOptionMapListHead; //ONE_OF_OPTION_MAP\r
+\r
+  UINT8                      *NvMapOverride;\r
+\r
+  UINT16                     FormSetClass;\r
+  UINT16                     FormSetSubClass;\r
+  STRING_REF                 FormSetTitle;\r
+  STRING_REF                 FormSetHelp;\r
   \r
-} HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY;\r
+} HII_THUNK_CONTEXT;\r
+\r
 \r
-#define HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE              EFI_SIGNATURE_32 ('H', 'T', 's', 'k')\r
-#define HII_TRHUNK_BUFFER_STORAGE_KEY_FROM_LIST_ENTRY(Record) CR(Record, HII_TRHUNK_BUFFER_STORAGE_KEY, List, HII_TRHUNK_BUFFER_STORAGE_KEY_SIGNATURE)\r
+\r
+#define BUFFER_STORAGE_ENTRY_SIGNATURE              EFI_SIGNATURE_32 ('H', 'T', 's', 'k')\r
+#define BUFFER_STORAGE_ENTRY_FROM_LINK(Record) CR(Record, BUFFER_STORAGE_ENTRY, Link, BUFFER_STORAGE_ENTRY_SIGNATURE)\r
 typedef struct {\r
-  LIST_ENTRY List;\r
+  LIST_ENTRY Link;\r
   UINT32     Signature;\r
   EFI_GUID   Guid;\r
   CHAR16     *Name;\r
   UINTN      Size;\r
   UINT16     VarStoreId;\r
-} HII_TRHUNK_BUFFER_STORAGE_KEY;\r
+} BUFFER_STORAGE_ENTRY;\r
+\r
 \r
-#define HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE            EFI_SIGNATURE_32 ('H', 'T', 'c', 'a')\r
-#define HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL(Record) CR(Record, HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE, ConfigAccessProtocol, HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_SIGNATURE)\r
+\r
+#define CONFIG_ACCESS_PRIVATE_SIGNATURE            EFI_SIGNATURE_32 ('H', 'T', 'c', 'a')\r
+#define CONFIG_ACCESS_PRIVATE_FROM_PROTOCOL(Record) CR(Record, CONFIG_ACCESS_PRIVATE, ConfigAccessProtocol, CONFIG_ACCESS_PRIVATE_SIGNATURE)\r
 typedef struct {\r
   UINT32                         Signature;\r
   EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccessProtocol;\r
-  EFI_FORM_CALLBACK_PROTOCOL     *FrameworkFormCallbackProtocol;\r
-  LIST_ENTRY                     ConfigAccessBufferStorageListHead;\r
-} HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE;\r
+  //\r
+  // Framework's callback\r
+  //\r
+  EFI_FORM_CALLBACK_PROTOCOL     *FormCallbackProtocol;\r
+\r
+  LIST_ENTRY                     BufferStorageListHead;\r
+\r
+  HII_THUNK_CONTEXT              *ThunkContext;\r
+} CONFIG_ACCESS_PRIVATE;\r
+\r
+\r
 \r
 #define EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE            EFI_SIGNATURE_32 ('F', 'B', 'T', 'd')\r
+#define EFI_FORMBROWSER_THUNK_PRIVATE_DATA_FROM_THIS(Record)   CR(Record, EFI_FORMBROWSER_THUNK_PRIVATE_DATA, FormBrowser, EFI_FORMBROWSER_THUNK_PRIVATE_DATA_SIGNATURE)\r
 typedef struct {\r
   UINTN                     Signature;\r
   EFI_HANDLE                Handle;\r
+  HII_THUNK_PRIVATE_DATA    *ThunkPrivate;\r
   EFI_FORM_BROWSER_PROTOCOL FormBrowser;\r
 } EFI_FORMBROWSER_THUNK_PRIVATE_DATA;\r
 \r
@@ -155,13 +209,14 @@ typedef struct {
 // Extern Variables\r
 //\r
 extern CONST EFI_HII_DATABASE_PROTOCOL            *mHiiDatabase;\r
-extern CONST EFI_HII_FONT_PROTOCOL                *mHiiFontProtocol;\r
 extern CONST EFI_HII_IMAGE_PROTOCOL               *mHiiImageProtocol;\r
 extern CONST EFI_HII_STRING_PROTOCOL              *mHiiStringProtocol;\r
 extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mHiiConfigRoutingProtocol;\r
+extern CONST EFI_FORM_BROWSER2_PROTOCOL           *mFormBrowser2Protocol;\r
 \r
-extern BOOLEAN                                    mInFrameworkHiiNewPack;\r
-extern BOOLEAN                                    mInFrameworkHiiRemovePack;\r
+extern HII_THUNK_PRIVATE_DATA                     *mHiiThunkPrivateData;\r
+\r
+extern BOOLEAN                                    mInFrameworkUpdatePakcage;\r
 \r
 \r
 //\r
@@ -392,6 +447,28 @@ ThunkCreatePopUp (
   ...\r
   );\r
 \r
+EFI_STATUS\r
+EFIAPI\r
+RemovePackNotify (\r
+  IN UINT8                              PackageType,\r
+  IN CONST EFI_GUID                     *PackageGuid,\r
+  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+NewOrAddPackNotify (\r
+  IN UINT8                              PackageType,\r
+  IN CONST EFI_GUID                     *PackageGuid,\r
+  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
+  )\r
+;\r
+\r
 #include "Utility.h"\r
 #include "ConfigAccess.h"\r
 \r
index e71cb9d8b91c87c385f9bcad064d967cb267f140..87763853759a9aad049e126625d531914be54dcc 100644 (file)
@@ -44,6 +44,41 @@ AppendToUpdateBuffer (
   return EFI_SUCCESS;\r
 }\r
 \r
+\r
+\r
+EFI_STATUS\r
+FwQuestionIdToUefiQuestionId (\r
+  IN HII_THUNK_CONTEXT            *ThunkContext,\r
+  IN UINT16                       VarStoreId,\r
+  IN UINT16                       FwId,\r
+  OUT EFI_QUESTION_ID             *UefiQId\r
+  )\r
+{\r
+  LIST_ENTRY                *MapEntryListHead;\r
+  LIST_ENTRY                *Link;\r
+  QUESTION_ID_MAP_ENTRY     *MapEntry;\r
+\r
+  MapEntryListHead = GetMapEntryListHead (ThunkContext, VarStoreId);\r
+  ASSERT (MapEntryListHead != NULL);\r
+\r
+  Link = GetFirstNode (MapEntryListHead);\r
+\r
+  while (!IsNull (MapEntryListHead, Link)) {\r
+    MapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+    if (MapEntry->FwQId == FwId) {\r
+      *UefiQId = MapEntry->UefiQid;\r
+      return EFI_SUCCESS;\r
+    }\r
+\r
+    Link = GetNextNode (MapEntryListHead, Link);\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
+\r
+\r
 EFI_STATUS\r
 UCreateEndOfOpcode (\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
@@ -83,19 +118,39 @@ F2UCreateTextOpCode (
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
 {\r
-  EFI_IFR_TEXT UOpcode;\r
+  EFI_IFR_TEXT      UTextOpCode;\r
+  EFI_IFR_ACTION    UActionOpCode;\r
 \r
-  ZeroMem (&UOpcode, sizeof(UOpcode));\r
-  \r
-  UOpcode.Header.OpCode = EFI_IFR_TEXT_OP;\r
-  UOpcode.Header.Length = sizeof (EFI_IFR_TEXT);\r
+  if ((FwText->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) {\r
+    ZeroMem (&UTextOpCode, sizeof(UTextOpCode));\r
+    \r
+    UTextOpCode.Header.OpCode = EFI_IFR_TEXT_OP;\r
+    UTextOpCode.Header.Length = sizeof (EFI_IFR_TEXT);\r
 \r
-  UOpcode.Statement.Help   = FwText->Help;\r
+    UTextOpCode.Statement.Help   = FwText->Help;\r
 \r
-  UOpcode.Statement.Prompt = FwText->Text;\r
-  UOpcode.TextTwo          = FwText->TextTwo;\r
-  \r
-  return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
+    UTextOpCode.Statement.Prompt = FwText->Text;\r
+    UTextOpCode.TextTwo          = FwText->TextTwo;\r
+    \r
+    return AppendToUpdateBuffer ((UINT8 *) &UTextOpCode, sizeof(UTextOpCode), UefiData);\r
+  } else {\r
+    //\r
+    // Iteractive Text Opcode is EFI_IFR_ACTION\r
+    //\r
+\r
+    ZeroMem (&UActionOpCode, sizeof (UActionOpCode));\r
+\r
+    UActionOpCode.Header.OpCode = EFI_IFR_ACTION_OP;\r
+    UActionOpCode.Header.Length = sizeof (EFI_IFR_ACTION);\r
+\r
+    UActionOpCode.Question.Header.Prompt = FwText->Text;\r
+    UActionOpCode.Question.Header.Help  = FwText->Help;\r
+    UActionOpCode.Question.Flags      = EFI_IFR_FLAG_CALLBACK;\r
+    UActionOpCode.Question.QuestionId = FwText->Key;\r
+\r
+    return AppendToUpdateBuffer ((UINT8 *) &UActionOpCode, sizeof(UActionOpCode), UefiData);\r
+    \r
+  }\r
 }\r
 \r
 /*\r
@@ -267,21 +322,26 @@ typedef struct {
 \r
 EFI_STATUS\r
 F2UCreateOneOfOpCode (\r
+  IN       HII_THUNK_CONTEXT           *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_ONE_OF    *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData,\r
   OUT      FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
   OUT      UINTN                       *DataCount\r
   )\r
 {\r
-  EFI_STATUS     Status;\r
-  EFI_IFR_ONE_OF UOpcode;\r
-  FRAMEWORK_EFI_IFR_OP_HEADER *FwOpHeader;\r
-  FRAMEWORK_EFI_IFR_ONE_OF_OPTION *FwOneOfOp;\r
-  BOOLEAN        HasQuestionId;\r
+  EFI_STATUS                          Status;\r
+  EFI_IFR_ONE_OF                      UOpcode;\r
+  FRAMEWORK_EFI_IFR_OP_HEADER         *FwOpHeader;\r
+  FRAMEWORK_EFI_IFR_ONE_OF_OPTION     *FwOneOfOp;\r
+  ONE_OF_OPTION_MAP                   *OneOfOptionMap;\r
+  ONE_OF_OPTION_MAP_ENTRY             *OneOfOptionMapEntry;\r
 \r
   ASSERT (NextFwOpcode != NULL);\r
   ASSERT (DataCount != NULL);\r
 \r
+  OneOfOptionMap = NULL;\r
+\r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
   *DataCount = 0;\r
 \r
@@ -292,29 +352,78 @@ F2UCreateOneOfOpCode (
   UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
   UOpcode.Question.Header.Help = FwOpcode->Help;\r
  \r
-  Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-  *DataCount += 1;\r
-\r
   //\r
   // Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\r
   //\r
-  HasQuestionId = FALSE;\r
   FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
   while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
     ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);\r
     \r
     FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
-    if (((FwOneOfOp->Key & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) & !HasQuestionId) {\r
-      HasQuestionId = TRUE;\r
-      UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+    if ((FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
+      UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
+      \r
+      if (UOpcode.Question.QuestionId == 0) {\r
+        Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+        if (EFI_ERROR (Status)) {\r
+          UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+        }\r
+\r
+        OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
+        ASSERT (OneOfOptionMap != NULL);\r
+        OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
+        OneOfOptionMap->QuestionId = UOpcode.Question.QuestionId;\r
+        InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
+        switch (FwOpcode->Width) {\r
+        case 1:\r
+          OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+          break;\r
+        case 2:\r
+          OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_16;\r
+        default:\r
+          ASSERT (FALSE);\r
+          break;\r
+        }\r
+\r
+        InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
+      } else {      \r
+        OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
+        ASSERT (OneOfOptionMapEntry != NULL);\r
+\r
+        OneOfOptionMapEntry->FwKey = FwOneOfOp->Key;\r
+        OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
+        \r
+        CopyMem (&OneOfOptionMapEntry->Value, &FwOneOfOp->Value, FwOpcode->Width);\r
+\r
+        ASSERT (OneOfOptionMap != NULL);\r
+        InsertTailList (&OneOfOptionMap->OneOfOptionMapEntryListHead, &OneOfOptionMapEntry->Link);\r
+      }\r
+    }\r
+\r
+    if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
+      UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
     }\r
 \r
     FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
   }\r
 \r
+\r
+  if (UOpcode.Question.QuestionId == 0) {\r
+    //\r
+    // Assign QuestionId if still not assigned.\r
+    //\r
+    Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+    if (EFI_ERROR (Status)) {\r
+      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+    }\r
+  }\r
+  \r
+  Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof (UOpcode), UefiData);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  *DataCount += 1;\r
+\r
   //\r
   // Go over again the Framework IFR binary to build the UEFI One Of Option opcodes.\r
   //\r
@@ -367,6 +476,8 @@ typedef struct {
 */\r
 EFI_STATUS\r
 F2UCreateOrderedListOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData,\r
   OUT      FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
@@ -376,6 +487,7 @@ F2UCreateOrderedListOpCode (
   EFI_IFR_ORDERED_LIST              UOpcode;\r
   EFI_STATUS                        Status;\r
   FRAMEWORK_EFI_IFR_OP_HEADER       *FwOpHeader;\r
+  FRAMEWORK_EFI_IFR_ONE_OF_OPTION     *FwOneOfOp;\r
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
   *DataCount = 0;\r
@@ -386,8 +498,43 @@ F2UCreateOrderedListOpCode (
 \r
   UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
   UOpcode.Question.Header.Help = FwOpcode->Help;\r
+  UOpcode.Question.VarStoreId  = VarStoreId;\r
 \r
   UOpcode.MaxContainers = FwOpcode->MaxEntries;\r
+\r
+  //\r
+  // Go over the Framework IFR binary to get the QuestionId for generated UEFI One Of Option opcode\r
+  //\r
+  FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
+  while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
+    ASSERT (FwOpHeader->OpCode == FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP);\r
+    \r
+    FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
+    if ((FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) != 0) {\r
+      UOpcode.Question.Flags |= EFI_IFR_FLAG_CALLBACK;\r
+      \r
+      if (UOpcode.Question.QuestionId == 0) {\r
+        Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+        if (EFI_ERROR (Status)) {\r
+          UOpcode.Question.QuestionId = FwOneOfOp->Key;\r
+        }\r
+\r
+      }\r
+    }\r
+\r
+    if (FwOneOfOp->Flags & FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED) {\r
+      UOpcode.Question.Flags |= EFI_IFR_FLAG_RESET_REQUIRED;\r
+    }\r
+\r
+    FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
+  }\r
+\r
+  if (UOpcode.Question.QuestionId == 0) {\r
+    Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+    if (EFI_ERROR (Status)) {\r
+      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+    }\r
+  }\r
  \r
   Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiData);\r
   if (EFI_ERROR (Status)) {\r
@@ -397,7 +544,10 @@ F2UCreateOrderedListOpCode (
 \r
   FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpcode + FwOpcode->Header.Length);\r
   while (FwOpHeader->OpCode != FRAMEWORK_EFI_IFR_END_ONE_OF_OP) {\r
-    Status = F2UCreateOneOfOptionOpCode ((CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->MaxEntries, UefiData);\r
+    //\r
+    // Each entry of Order List in Framework HII is always 1 byte in size\r
+    //\r
+    Status = F2UCreateOneOfOptionOpCode ((CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, 1, UefiData);\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
@@ -450,10 +600,13 @@ typedef struct {
 \r
 EFI_STATUS\r
 F2UCreateCheckBoxOpCode (\r
+  IN       HII_THUNK_CONTEXT           *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_CHECKBOX  *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
 {\r
+  EFI_STATUS       Status;\r
   EFI_IFR_CHECKBOX UOpcode;\r
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
@@ -464,7 +617,18 @@ F2UCreateCheckBoxOpCode (
   UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
   UOpcode.Question.Header.Help = FwOpcode->Help;\r
 \r
-  UOpcode.Question.QuestionId    = FwOpcode->Key;\r
+  if (FwOpcode->Key == 0) {\r
+    Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+    if (EFI_ERROR (Status)) {\r
+      //\r
+      // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
+      //\r
+      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+    }\r
+  } else {\r
+    UOpcode.Question.QuestionId    = FwOpcode->Key;\r
+  }\r
+\r
   UOpcode.Question.VarStoreId    = RESERVED_VARSTORE_ID;\r
   UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
 \r
@@ -478,8 +642,8 @@ F2UCreateCheckBoxOpCode (
 \r
   //\r
   // We also map 2 flags:\r
-  //      FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE\r
-  //      FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED,\r
+  //      FRAMEWORK_EFI_IFR_FLAG_DEFAULT\r
+  //      FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING,\r
   // to UEFI IFR CheckBox Opcode default flags.\r
   //\r
   UOpcode.Flags           = (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING));\r
@@ -550,6 +714,8 @@ typedef struct {
 \r
 EFI_STATUS\r
 F2UCreateNumericOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_NUMERIC   *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
@@ -560,6 +726,18 @@ F2UCreateNumericOpCode (
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
 \r
+  if (FwOpcode->Key == 0) {\r
+    Status = FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+    if (EFI_ERROR (Status)) {\r
+      //\r
+      // Add a new opcode and it will not trigger call back. So we just reuse the FW QuestionId.\r
+      //\r
+      UOpcode.Question.QuestionId = FwOpcode->QuestionId;\r
+    }\r
+  } else {\r
+    UOpcode.Question.QuestionId    = FwOpcode->Key;\r
+  }\r
+\r
   UOpcode.Header.Length = sizeof(UOpcode);\r
   UOpcode.Header.OpCode = EFI_IFR_NUMERIC_OP;\r
   //\r
@@ -574,6 +752,9 @@ F2UCreateNumericOpCode (
   UOpcode.Question.Header.Help = FwOpcode->Help;\r
 \r
   UOpcode.Question.QuestionId    = FwOpcode->Key;\r
+  //\r
+  // BUGBUG RESERVED_VARSTORE_ID should be passed in.\r
+  //\r
   UOpcode.Question.VarStoreId    = RESERVED_VARSTORE_ID;\r
   UOpcode.Question.VarStoreInfo.VarOffset = FwOpcode->QuestionId;\r
 \r
@@ -684,6 +865,8 @@ typedef struct {
 \r
 EFI_STATUS\r
 F2UCreateStringOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_STRING    *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
@@ -692,6 +875,12 @@ F2UCreateStringOpCode (
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
 \r
+  if (FwOpcode->Key == 0) {\r
+    FwQuestionIdToUefiQuestionId (ThunkContext, VarStoreId, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+  } else {\r
+    UOpcode.Question.QuestionId    = FwOpcode->Key;\r
+  }\r
+\r
   UOpcode.Header.Length = sizeof(UOpcode);\r
   UOpcode.Header.OpCode = EFI_IFR_STRING_OP;\r
 \r
@@ -753,113 +942,116 @@ F2UCreateBannerOpCode (
 }\r
 \r
 \r
-\r
 EFI_STATUS\r
-ThunkFrameworkUpdateDataToUefiUpdateData (\r
+FwUpdateDataToUefiUpdateData (\r
+  IN       HII_THUNK_CONTEXT                 *ThunkContext,\r
   IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA    *Data,\r
   IN       BOOLEAN                          AddData,\r
   OUT      EFI_HII_UPDATE_DATA              **UefiData\r
   )\r
 {\r
-  FRAMEWORK_EFI_IFR_OP_HEADER          *FrameworkOpcodeBuffer;\r
-  FRAMEWORK_EFI_IFR_OP_HEADER          *NextFrameworkOpcodeBuffer;\r
-  EFI_HII_UPDATE_DATA                  *UefiUpdateDataBuffer;\r
+  FRAMEWORK_EFI_IFR_OP_HEADER          *FwOpCode;\r
+  FRAMEWORK_EFI_IFR_OP_HEADER          *NextFwOpCode;\r
+  EFI_HII_UPDATE_DATA                  *UefiOpCode;\r
   UINTN                                Index;\r
   EFI_STATUS                           Status;\r
   UINTN                                DataCount;\r
-  static UINTN                         mOneOfOptionWidth;\r
+  UINT16                               VarStoreId;\r
 \r
-  mOneOfOptionWidth = 0;\r
-  \r
+  //\r
+  // Assume all dynamic opcode created is using active variable with VarStoreId of 1.\r
+  //\r
+  VarStoreId = 1;\r
 \r
-  UefiUpdateDataBuffer = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
-  if (UefiUpdateDataBuffer == NULL) {\r
+  UefiOpCode = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
+  if (UefiOpCode == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
   \r
-  UefiUpdateDataBuffer->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
-  if (UefiUpdateDataBuffer->Data == NULL) {\r
+  UefiOpCode->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
+  if (UefiOpCode->Data == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  UefiUpdateDataBuffer->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
-  UefiUpdateDataBuffer->Offset = 0;\r
+  UefiOpCode->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
+  UefiOpCode->Offset = 0;\r
 \r
-  FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
+  FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
 \r
   for (Index = 0; Index < Data->DataCount; Index += DataCount) {\r
-    //\r
-    // By default Datacount is 1. For FRAMEWORK_EFI_IFR_ONE_OF_OP and FRAMEWORK_EFI_IFR_ORDERED_LIST_OP,\r
-    // DataCount maybe more than 1.\r
-    //\r
-    DataCount = 1;\r
-    switch (FrameworkOpcodeBuffer->OpCode) {\r
+    switch (FwOpCode->OpCode) {\r
       case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
-        Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE  *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);\r
+        Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE  *) FwOpCode, UefiOpCode);\r
+        DataCount = 1;\r
         break;\r
         \r
       case FRAMEWORK_EFI_IFR_TEXT_OP:\r
-        Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT  *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);  \r
+        Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT  *) FwOpCode, UefiOpCode);  \r
+        DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_REF_OP:\r
-        Status = F2UCreateGotoOpCode ((FRAMEWORK_EFI_IFR_REF *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);  \r
+        Status = F2UCreateGotoOpCode ((FRAMEWORK_EFI_IFR_REF *) FwOpCode, UefiOpCode);  \r
+        DataCount = 1;\r
         break;\r
         \r
       case FRAMEWORK_EFI_IFR_ONE_OF_OP:\r
-        Status = F2UCreateOneOfOpCode ((FRAMEWORK_EFI_IFR_ONE_OF *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer, &DataCount);\r
+        Status = F2UCreateOneOfOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
         if (!EFI_ERROR (Status)) {\r
-          FrameworkOpcodeBuffer = NextFrameworkOpcodeBuffer;\r
+          FwOpCode = NextFwOpCode;\r
           //\r
-          // F2UCreateOneOfOpCode has updated FrameworkOpcodeBuffer to point to the next opcode.\r
+          // FwOpCode is already updated to point to the next opcode.\r
           //\r
           continue;\r
         }\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP:\r
-        Status = F2UCreateOrderedListOpCode ((FRAMEWORK_EFI_IFR_ORDERED_LIST *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer, &NextFrameworkOpcodeBuffer, &DataCount);\r
+        Status = F2UCreateOrderedListOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
         if (!EFI_ERROR (Status)) {\r
-          FrameworkOpcodeBuffer = NextFrameworkOpcodeBuffer;\r
+          FwOpCode = NextFwOpCode;\r
           //\r
-          // F2UCreateOrderedListOpCode has updated FrameworkOpcodeBuffer to point to the next opcode.\r
+          // FwOpCode is already updated to point to the next opcode.\r
           //\r
           continue;\r
         }\r
         break;\r
         \r
       case FRAMEWORK_EFI_IFR_CHECKBOX_OP:\r
-        Status = F2UCreateCheckBoxOpCode ((FRAMEWORK_EFI_IFR_CHECKBOX *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);  \r
+        Status = F2UCreateCheckBoxOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode, UefiOpCode);  \r
+        DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_STRING_OP:\r
-        Status = F2UCreateStringOpCode ((FRAMEWORK_EFI_IFR_STRING *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);  \r
+        Status = F2UCreateStringOpCode (ThunkContext, VarStoreId, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode, UefiOpCode);  \r
+        DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_BANNER_OP:\r
-        Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);  \r
+        Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FwOpCode, UefiOpCode);  \r
+        DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_END_ONE_OF_OP:\r
-        Status = UCreateEndOfOpcode (UefiUpdateDataBuffer);\r
-        mOneOfOptionWidth = 0;\r
+        Status = UCreateEndOfOpcode (UefiOpCode);\r
+        DataCount = 1;\r
         break;\r
-        \r
+\r
       default:\r
         ASSERT (FALSE);\r
         return EFI_UNSUPPORTED;\r
     }\r
 \r
     if (EFI_ERROR (Status)) {\r
-      FreePool (UefiUpdateDataBuffer->Data);\r
-      FreePool (UefiUpdateDataBuffer);\r
+      FreePool (UefiOpCode->Data);\r
+      FreePool (UefiOpCode);\r
       return Status;\r
     }\r
 \r
-    FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FrameworkOpcodeBuffer + FrameworkOpcodeBuffer->Length);\r
+    FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length);\r
   }\r
 \r
-  *UefiData = UefiUpdateDataBuffer;\r
+  *UefiData = UefiOpCode;\r
   \r
   return EFI_SUCCESS;\r
 }\r
index 7324c908ce9799d21de40685ddf67060ebfd1dcd..0c662399ab2ce121694cf69a80258b3ac8b8f8b9 100644 (file)
@@ -54,6 +54,8 @@ F2UCreateOneOfOptionOpCode (
 \r
 EFI_STATUS\r
 F2UCreateOneOfOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_ONE_OF    *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData,\r
   OUT      FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
@@ -63,6 +65,8 @@ F2UCreateOneOfOpCode (
 \r
 EFI_STATUS\r
 F2UCreateOrderedListOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData,\r
   OUT      FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
@@ -73,6 +77,8 @@ F2UCreateOrderedListOpCode (
 \r
 EFI_STATUS\r
 F2UCreateCheckBoxOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_CHECKBOX  *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
@@ -81,6 +87,8 @@ F2UCreateCheckBoxOpCode (
 \r
 EFI_STATUS\r
 F2UCreateNumericOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_NUMERIC   *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
@@ -89,6 +97,8 @@ F2UCreateNumericOpCode (
 \r
 EFI_STATUS\r
 F2UCreateStringOpCode (\r
+  IN       HII_THUNK_CONTEXT               *ThunkContext,\r
+  IN       UINT16                      VarStoreId,\r
   IN CONST FRAMEWORK_EFI_IFR_STRING    *FwOpcode,\r
   OUT      EFI_HII_UPDATE_DATA         *UefiData\r
   )\r
@@ -103,7 +113,8 @@ F2UCreateBannerOpCode (
 ;\r
 \r
 EFI_STATUS\r
-ThunkFrameworkUpdateDataToUefiUpdateData (\r
+FwUpdateDataToUefiUpdateData (\r
+  IN       HII_THUNK_CONTEXT                 *ThunkContext,\r
   IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA    *Data,\r
   IN       BOOLEAN                          AddData,\r
   OUT      EFI_HII_UPDATE_DATA              **UefiData\r
index 847a8fbf574d2aa508e7c6c89f2d9e6914fefb6d..994c67b9a053a69b02e4f6d5f1efc36f40ff8571 100644 (file)
@@ -1,6 +1,5 @@
 /**@file\r
-\r
-  This file contains the keyboard processing code to the HII database.\r
+  Implement protocol interface related to package registrations.\r
 \r
 Copyright (c) 2006 - 2008, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
@@ -17,42 +16,44 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "HiiDatabase.h"\r
 \r
 \r
-BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
-BOOLEAN mInFrameworkHiiRemovePack = FALSE;\r
+STATIC BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
+STATIC BOOLEAN mInFrameworkHiiRemovePack = FALSE;\r
+BOOLEAN mInFrameworkUpdatePakcage = FALSE;\r
 \r
 \r
 EFI_STATUS\r
-GetIfrAndStringPackNum (\r
+GetPackageCount (\r
   IN CONST EFI_HII_PACKAGES               *Packages,\r
-  UINTN                                   *IfrPackNum,\r
-  UINTN                                   *StringPackNum\r
+  UINTN                                   *IfrPackageCount,\r
+  UINTN                                   *StringPackageCount\r
   )\r
 {\r
   UINTN                         Index;\r
   TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
 \r
   ASSERT (Packages != NULL);\r
-  ASSERT (IfrPackNum != NULL);\r
-  ASSERT (StringPackNum != NULL);\r
+  ASSERT (IfrPackageCount != NULL);\r
+  ASSERT (StringPackageCount != NULL);\r
 \r
-  *IfrPackNum = 0;\r
-  *StringPackNum = 0;\r
+  *IfrPackageCount = 0;\r
+  *StringPackageCount = 0;\r
 \r
   TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
+  \r
   for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
     //\r
     // BugBug: The current UEFI HII build tool generate a binary in the format defined in: \r
     // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
-    // this binary is with same package type. So the returned IfrPackNum and StringPackNum\r
+    // this binary is with same package type. So the returned IfrPackageCount and StringPackageCount\r
     // may not be the exact number of valid package number in the binary generated \r
     // by HII Build tool.\r
     //\r
     switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
       case EFI_HII_PACKAGE_FORM:\r
-        *IfrPackNum += 1;\r
+        *IfrPackageCount += 1;\r
         break;\r
       case EFI_HII_PACKAGE_STRINGS:\r
-        *StringPackNum += 1;\r
+        *StringPackageCount += 1;\r
         break;\r
 \r
       case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
@@ -74,71 +75,6 @@ GetIfrAndStringPackNum (
   return EFI_SUCCESS;\r
 }\r
 \r
-EFI_STATUS \r
-LibExportPackageLists (\r
-  IN EFI_HII_HANDLE                    UefiHiiHandle,\r
-  OUT EFI_HII_PACKAGE_LIST_HEADER      **PackageListHeader,\r
-  OUT UINTN                            *PackageListSize\r
-  )\r
-{\r
-  EFI_STATUS                       Status;\r
-  UINTN                            Size;\r
-  EFI_HII_PACKAGE_LIST_HEADER      *PackageListHdr;\r
-\r
-  ASSERT (PackageListSize != NULL);\r
-  ASSERT (PackageListHeader != NULL);\r
-\r
-  Size = 0;\r
-  PackageListHdr = NULL;\r
-  Status = mHiiDatabase->ExportPackageLists (\r
-                                      mHiiDatabase,\r
-                                      UefiHiiHandle,\r
-                                      &Size,\r
-                                      PackageListHdr\r
-                                      );\r
-  ASSERT_EFI_ERROR (Status == EFI_BUFFER_TOO_SMALL);\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    PackageListHdr = AllocateZeroPool (Size);\r
-    ASSERT (PackageListHdr != NULL);\r
-    \r
-    if (PackageListHeader == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
-    } else {\r
-      Status = mHiiDatabase->ExportPackageLists (\r
-                                          mHiiDatabase,\r
-                                          UefiHiiHandle,\r
-                                          &Size,\r
-                                          PackageListHdr\r
-                                           );\r
-      ASSERT_EFI_ERROR (Status);\r
-    }\r
-  }\r
-\r
-  if (!EFI_ERROR (Status)) {\r
-    *PackageListHeader = PackageListHdr;\r
-    *PackageListSize   = Size;\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-InsertStringPackagesToIfrPackageList (\r
-  IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader,\r
-  IN EFI_HII_HANDLE                    UefiHiiHandle  \r
- )\r
-{\r
-  EFI_STATUS                  Status;\r
-  Status = mHiiDatabase->UpdatePackageList (\r
-                                        mHiiDatabase,\r
-                                        UefiHiiHandle,\r
-                                        StringPackageListHeader\r
-                                        );\r
-\r
-  return Status;\r
-}\r
-\r
-\r
 /**\r
   Removes a node from a doubly linked list, and returns the node that follows\r
   the removed node.\r
@@ -161,27 +97,53 @@ InsertStringPackagesToIfrPackageList (
 \r
 **/\r
 EFI_STATUS\r
-AddStringPackagesToMatchingIfrPackageList (\r
-  IN       EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
+FindPackListWithOnlyIfrPackAndAddStringPack (\r
+  IN       HII_THUNK_PRIVATE_DATA      *Private,\r
+  IN       HII_THUNK_CONTEXT            *StringPackageThunkContext,\r
   IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader\r
   )\r
 {\r
   EFI_STATUS                 Status;\r
-  LIST_ENTRY                 *ListEntry;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
-\r
-  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
-       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
-       ListEntry = ListEntry->ForwardLink\r
-       ) {\r
-    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
-    if (CompareGuid (&StringPackageListHeader->PackageListGuid, &HandleMapEntry->TagGuid)) {\r
-      Status = InsertStringPackagesToIfrPackageList (StringPackageListHeader, HandleMapEntry->UefiHiiHandle);\r
+  LIST_ENTRY                 *Link;\r
+  HII_THUNK_CONTEXT *ThunkContext;\r
+\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+\r
+    ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+\r
+    if (StringPackageThunkContext != ThunkContext) {\r
+      //\r
+      // Skip the String Package Thunk Entry itself.\r
+      //\r
+    \r
+      if (CompareGuid (&StringPackageListHeader->PackageListGuid, &ThunkContext->TagGuid)) {\r
+\r
+        ASSERT (ThunkContext->StringPackageCount == 0 && ThunkContext->IfrPackageCount == 1);\r
+\r
+        ThunkContext->StringPackageCount = GetPackageCountByType (StringPackageListHeader, EFI_HII_PACKAGE_STRINGS);\r
+        \r
+        Status = mHiiDatabase->UpdatePackageList (\r
+                                              mHiiDatabase,\r
+                                              ThunkContext->UefiHiiHandle,\r
+                                              StringPackageListHeader\r
+                                              );\r
+        ASSERT (Status != EFI_NOT_FOUND);\r
+        \r
+        if (EFI_ERROR (Status)) {\r
+          return Status;\r
+        }\r
+      }\r
     }\r
+    \r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
   }\r
   \r
+\r
   return EFI_NOT_FOUND;\r
 }\r
+\r
+\r
 EFI_HII_PACKAGE_LIST_HEADER *\r
 PrepareUefiPackageListFromFrameworkHiiPackages (\r
   IN CONST EFI_HII_PACKAGES            *Packages,\r
@@ -260,41 +222,169 @@ GenerateGuidId (
 }\r
 \r
 EFI_STATUS\r
-FindAndAddStringPackageToIfrPackageList(\r
-  EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
-  EFI_GUID                    *GuidId,\r
-  EFI_HII_HANDLE              UefiIfrHiiHandle\r
+FindStringPackAndAddToPackListWithOnlyIfrPack(\r
+  IN HII_THUNK_PRIVATE_DATA          *Private,\r
+  IN HII_THUNK_CONTEXT                *IfrThunkContext\r
   )\r
 {\r
-  EFI_STATUS                 Status;\r
-  LIST_ENTRY                 *ListEntry;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
-  EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader;\r
-  UINTN                      Size;\r
-\r
-  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
-       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
-       ListEntry = ListEntry->ForwardLink\r
-       ) {\r
-    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
-    if (CompareGuid (GuidId, &HandleMapEntry->TagGuid) && (!HandleMapEntry->DoesPackageListImportStringPackages)) {\r
-      Status = LibExportPackageLists (HandleMapEntry->UefiHiiHandle, &StringPackageListHeader, &Size);\r
-      ASSERT_EFI_ERROR (Status);\r
+  EFI_STATUS                      Status;\r
+  LIST_ENTRY                      *Link;\r
+  EFI_HII_PACKAGE_LIST_HEADER     *StringPackageListHeader;\r
+  UINTN                           Size;\r
+  HII_THUNK_CONTEXT                *ThunkContext;\r
 \r
-      //\r
-      // Add Function to only get only String Packages from the Package List\r
-      //\r
+  \r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
+\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+\r
+    ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+\r
+    if (ThunkContext != IfrThunkContext) {\r
+      if (CompareGuid (&IfrThunkContext->TagGuid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount == 0)) {\r
+        Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &StringPackageListHeader, &Size);\r
+        ASSERT_EFI_ERROR (Status);\r
+\r
+        IfrThunkContext->StringPackageCount = GetPackageCountByType (StringPackageListHeader, EFI_HII_PACKAGE_STRINGS);\r
+        //\r
+        // Add Function to only get only String Packages from the Package List\r
+        //\r
+        Status = mHiiDatabase->UpdatePackageList (\r
+                                  mHiiDatabase,\r
+                                  IfrThunkContext->UefiHiiHandle,\r
+                                  StringPackageListHeader\r
+                                  );\r
+        ASSERT_EFI_ERROR (Status);\r
+        \r
+        FreePool (StringPackageListHeader);\r
+        return EFI_SUCCESS;\r
+      }\r
+    }\r
 \r
-      Status = InsertStringPackagesToIfrPackageList (StringPackageListHeader, UefiIfrHiiHandle);\r
-      ASSERT_EFI_ERROR (Status);\r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+\r
+}\r
+\r
+HII_THUNK_CONTEXT *\r
+CreateThunkContext (\r
+  IN  HII_THUNK_PRIVATE_DATA      *Private,\r
+  IN  UINTN                       StringPackageCount,\r
+  IN  UINTN                       IfrPackageCount\r
+  )\r
+{\r
+  EFI_STATUS                   Status;\r
+  HII_THUNK_CONTEXT            *ThunkContext;\r
+\r
+  ThunkContext = AllocateZeroPool (sizeof (HII_THUNK_CONTEXT));\r
+  ASSERT (ThunkContext != NULL);\r
+  \r
+  ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
+  ThunkContext->IfrPackageCount = IfrPackageCount;\r
+  ThunkContext->StringPackageCount = StringPackageCount;\r
+  Status = AssignFrameworkHiiHandle (Private, TRUE, &ThunkContext->FwHiiHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+\r
+  InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
+  InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+\r
+  return ThunkContext;\r
+     \r
+}\r
+\r
+VOID\r
+FreeFrameworkHiiHandle (\r
+  IN  HII_THUNK_PRIVATE_DATA      *Private,\r
+  IN  FRAMEWORK_EFI_HII_HANDLE    FwHandle\r
+  )\r
+{\r
+  //\r
+  // TODO: \r
+  //\r
+  \r
+  return;\r
+}\r
+\r
+VOID\r
+DestoryOneOfOptionMap (\r
+  IN LIST_ENTRY     *OneOfOptionMapListHead\r
+  )\r
+{\r
+  ONE_OF_OPTION_MAP         *Map;\r
+  ONE_OF_OPTION_MAP_ENTRY   *MapEntry;\r
+  LIST_ENTRY                *Link;\r
+  LIST_ENTRY                *Link2;\r
+\r
+  while (!IsListEmpty (OneOfOptionMapListHead)) {\r
+    Link = GetFirstNode (OneOfOptionMapListHead);\r
+    \r
+    Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+\r
+    while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
+      Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
       \r
-      FreePool (StringPackageListHeader);\r
-      return EFI_SUCCESS;\r
+      MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+      RemoveEntryList (Link2);\r
+\r
+      FreePool (MapEntry);\r
     }\r
+\r
+    RemoveEntryList (Link);\r
+    FreePool (Map);\r
   }\r
+}\r
 \r
-  return EFI_NOT_FOUND;\r
+VOID\r
+DestroyQuestionIdMap (\r
+  IN LIST_ENTRY     *QuestionIdMapListHead\r
+  )\r
+{\r
+  QUESTION_ID_MAP           *IdMap;\r
+  QUESTION_ID_MAP_ENTRY     *IdMapEntry;\r
+  LIST_ENTRY                *Link;\r
+  LIST_ENTRY                *Link2;\r
 \r
+  while (!IsListEmpty (QuestionIdMapListHead)) {\r
+    Link = GetFirstNode (QuestionIdMapListHead);\r
+    \r
+    IdMap = QUESTION_ID_MAP_FROM_LINK (Link);\r
+\r
+    while (!IsListEmpty (&IdMap->MapEntryListHead)) {\r
+      Link2 = GetFirstNode (&IdMap->MapEntryListHead);\r
+      \r
+      IdMapEntry = QUESTION_ID_MAP_ENTRY_FROM_LINK (Link);\r
+\r
+      RemoveEntryList (Link2);\r
+\r
+      FreePool (IdMapEntry);\r
+    }\r
+\r
+    RemoveEntryList (Link);\r
+    FreePool (IdMap);\r
+  }\r
+}\r
+\r
+VOID\r
+DestroyThunkContext (\r
+  IN  HII_THUNK_PRIVATE_DATA    *Private,\r
+  IN HII_THUNK_CONTEXT          *ThunkContext\r
+  )\r
+{\r
+  ASSERT (ThunkContext != NULL);\r
+\r
+  FreeFrameworkHiiHandle (Private, ThunkContext->FwHiiHandle);\r
+\r
+  DestroyQuestionIdMap (&ThunkContext->QuestionIdMapListHead);\r
+\r
+  DestoryOneOfOptionMap (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+  FreePool (ThunkContext);\r
 }\r
 \r
 CONST EFI_GUID mAGuid = \r
@@ -302,53 +392,59 @@ CONST EFI_GUID mAGuid =
 \r
 EFI_STATUS\r
 UefiRegisterPackageList(\r
-  EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
-  EFI_HII_PACKAGES            *Packages,\r
-  FRAMEWORK_EFI_HII_HANDLE    *Handle\r
+  IN  HII_THUNK_PRIVATE_DATA      *Private,\r
+  IN  EFI_HII_PACKAGES            *Packages,\r
+  OUT FRAMEWORK_EFI_HII_HANDLE    *Handle\r
   )\r
 {\r
   EFI_STATUS                  Status;\r
-  UINTN                       StringPackNum;\r
-  UINTN                       IfrPackNum;\r
-  EFI_HII_PACKAGE_LIST_HEADER *UefiPackageListHeader;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMappingEntry;\r
+  UINTN                       StringPackageCount;\r
+  UINTN                       IfrPackageCount;\r
+  EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
+  HII_THUNK_CONTEXT            *ThunkContext;\r
   EFI_GUID                    GuidId;\r
 \r
-  UefiPackageListHeader = NULL;\r
+  PackageListHeader = NULL;\r
 \r
-  Status = GetIfrAndStringPackNum (Packages, &IfrPackNum, &StringPackNum);\r
+  Status = GetPackageCount (Packages, &IfrPackageCount, &StringPackageCount);\r
   ASSERT_EFI_ERROR (Status);\r
-  //\r
-  // Thunk Layer only handle the following combinations of IfrPack, StringPkg and FontPack.\r
-  // Thunk Layer only allow zero or one IfrPack in the Package List.\r
-  //\r
-  if (IfrPackNum > 1) {\r
+  \r
+  if (IfrPackageCount > 1) {\r
+    //\r
+    // HII Thunk only handle package with 0 or 1 IFR package. \r
+    //\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
-  HandleMappingEntry = AllocateZeroPool (sizeof (*HandleMappingEntry));\r
-  ASSERT (HandleMappingEntry != NULL);\r
-  \r
-  HandleMappingEntry->Signature = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE;\r
-  Status = AssignHiiHandle (Private, &HandleMappingEntry->FrameworkHiiHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    goto Done;\r
+  ThunkContext = CreateThunkContext (Private, StringPackageCount, IfrPackageCount);\r
+  if (ThunkContext == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
-  //\r
-  // Packages->GuidId may be NULL. In such case, caller of FramworkHii->NewPack is registering\r
-  // package with StringPack and IfrPack.\r
-  //\r
   if (Packages->GuidId == NULL) {\r
+    //\r
+    // UEFI HII Database require Package List GUID must be unique.\r
+    //\r
+    // If Packages->GuidId is NULL, the caller of FramworkHii->NewPack is registering\r
+    // packages with at least 1 StringPack and 1 IfrPack. Therefore, Packages->GuidId is\r
+    // not used as the name of the package list.  A GUID is generated as a Package List\r
+    // GUID.\r
+    //\r
+    ASSERT (StringPackageCount >=1 && IfrPackageCount == 1);\r
     Packages->GuidId = &GuidId;\r
     GenerateGuidId (&mAGuid, Packages->GuidId);\r
   } else {\r
+    //BugBug We need fix this.\r
+    //ASSERT (StringPackageCount == 0 || IfrPackageCount == 0);\r
     CopyGuid (&GuidId, Packages->GuidId);\r
   }\r
-  \r
-  CopyGuid (&HandleMappingEntry->TagGuid, Packages->GuidId);\r
 \r
-  if ((StringPackNum == 0) && (IfrPackNum != 0)) {\r
+  //\r
+  // Record the Package List GUID, it is used as a name for the package list by Framework HII.\r
+  //\r
+  CopyGuid (&ThunkContext->TagGuid, Packages->GuidId);\r
+\r
+  if ((StringPackageCount == 0) && (IfrPackageCount != 0)) {\r
     //\r
     // UEFI HII database does not allow two package list with the same GUID.\r
     // In Framework HII implementation, Packages->GuidId is used as an identifier to associate \r
@@ -361,68 +457,65 @@ UefiRegisterPackageList(
   // UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\r
   // that Setup Utility can load the Buffer Storage using this protocol.\r
   //\r
-  if (IfrPackNum != 0) {\r
-    InstallDefaultUefiConfigAccessProtocol (Packages, HandleMappingEntry);\r
+  if (IfrPackageCount != 0) {\r
+    InstallDefaultConfigAccessProtocol (Packages, ThunkContext);\r
   }\r
-  UefiPackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &GuidId);\r
+  PackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, &GuidId);\r
   Status = mHiiDatabase->NewPackageList (\r
               mHiiDatabase,\r
-              UefiPackageListHeader,  \r
-              HandleMappingEntry->UefiHiiDriverHandle,\r
-              &HandleMappingEntry->UefiHiiHandle\r
+              PackageListHeader,  \r
+              ThunkContext->UefiHiiDriverHandle,\r
+              &ThunkContext->UefiHiiHandle\r
               );\r
+\r
+  //\r
+  // BUGBUG: Remove when development is done\r
+  //\r
   ASSERT_EFI_ERROR (Status);\r
   if (EFI_ERROR (Status)) {\r
     goto Done;\r
   }\r
   \r
-  if (IfrPackNum == 0) {\r
-    if (StringPackNum != 0) {\r
+  if (IfrPackageCount == 0) {\r
+    if (StringPackageCount != 0) {\r
       //\r
-      // Look for a package list with IFR Pack which has already registed with HII Database\r
+      // Find if there is Package List with only IFR Package in the databasee with the same\r
+      // tag. If found, add the String Package to this Package List.\r
       //\r
-      HandleMappingEntry->IsPackageListWithOnlyStringPackages = TRUE;\r
-      Status = AddStringPackagesToMatchingIfrPackageList (\r
+      Status = FindPackListWithOnlyIfrPackAndAddStringPack (\r
                   Private,\r
-                  UefiPackageListHeader\r
+                  ThunkContext,\r
+                  PackageListHeader\r
                 );\r
 \r
-      if (!EFI_ERROR (Status) || Status == EFI_NOT_FOUND) {\r
-\r
-        if (Status == EFI_NOT_FOUND) {\r
-          Status = EFI_SUCCESS;\r
-        }\r
+      if (Status == EFI_NOT_FOUND) {\r
+        Status = EFI_SUCCESS;\r
       }\r
     }\r
   } else {\r
-    if (StringPackNum == 0) {\r
+    CreateQuestionIdMap (ThunkContext);\r
+    \r
+    if (StringPackageCount == 0) {\r
       //\r
       // Register the Package List to UEFI HII first.\r
       //\r
-      Status = FindAndAddStringPackageToIfrPackageList (\r
+      Status = FindStringPackAndAddToPackListWithOnlyIfrPack (\r
                   Private,\r
-                  Packages->GuidId,\r
-                  HandleMappingEntry->UefiHiiHandle\r
+                  ThunkContext\r
                   );\r
       ASSERT_EFI_ERROR (Status);\r
-      if (!EFI_ERROR (Status)) {\r
-        HandleMappingEntry->DoesPackageListImportStringPackages = TRUE;\r
-      }\r
     }\r
   }\r
 \r
-  if (!EFI_ERROR (Status)) {\r
-    InsertTailList (&Private->HiiThunkHandleMappingDBListHead, &HandleMappingEntry->List);\r
-  }\r
-\r
 Done:\r
   if (EFI_ERROR (Status)) {\r
-    FreePool (HandleMappingEntry);\r
+    DestroyThunkContext (Private, ThunkContext);\r
   } else {\r
-    *Handle = HandleMappingEntry->FrameworkHiiHandle;\r
+    InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
+    *Handle = ThunkContext->FwHiiHandle;\r
   }\r
 \r
-  SafeFreePool (UefiPackageListHeader);\r
+  SafeFreePool (PackageListHeader);\r
   \r
   return Status;\r
 }\r
@@ -455,7 +548,7 @@ Returns:
 --*/\r
 {\r
   EFI_STATUS                 Status;\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+  HII_THUNK_PRIVATE_DATA *Private;\r
   EFI_TPL                    OldTpl;\r
 \r
   if (Handle == NULL) {\r
@@ -476,7 +569,7 @@ Returns:
   //\r
   mInFrameworkHiiNewPack = TRUE;\r
 \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
   Status = UefiRegisterPackageList (\r
               Private,\r
@@ -509,49 +602,32 @@ Returns:
 --*/\r
 {\r
   EFI_STATUS                 Status;\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+  HII_THUNK_PRIVATE_DATA *Private;\r
+  HII_THUNK_CONTEXT *ThunkContext;\r
   EFI_TPL                    OldTpl;\r
-  EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
 \r
   OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
 \r
   mInFrameworkHiiRemovePack = TRUE;\r
 \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
-  HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
+  ThunkContext = FwHiiHandleToThunkContext (Private, Handle);\r
 \r
-  if (HandleMapEntry != NULL) {\r
+  if (ThunkContext != NULL) {\r
     Status = mHiiDatabase->RemovePackageList (\r
                                           mHiiDatabase,\r
-                                          HandleMapEntry->UefiHiiHandle\r
+                                          ThunkContext->UefiHiiHandle\r
                                           );\r
     ASSERT_EFI_ERROR (Status);\r
 \r
-    HiiLibDestroyHiiDriverHandle (HandleMapEntry->UefiHiiHandle);\r
-\r
-    Status = gBS->HandleProtocol (\r
-                    HandleMapEntry->UefiHiiDriverHandle,\r
-                    &gEfiHiiConfigAccessProtocolGuid,\r
-                    (VOID **) &ConfigAccess\r
-                    );\r
-\r
-    if (!EFI_ERROR (Status)) {\r
-      Status = gBS->UninstallProtocolInterface (\r
-                      HandleMapEntry->UefiHiiDriverHandle,\r
-                      &gEfiHiiConfigAccessProtocolGuid,\r
-                      ConfigAccess\r
-                      );\r
-      ASSERT_EFI_ERROR (Status);\r
-    } else {\r
-      Status = EFI_SUCCESS;\r
+    if (ThunkContext->IfrPackageCount != 0) {\r
+      UninstallDefaultConfigAccessProtocol (ThunkContext);\r
     }\r
 \r
-    RemoveEntryList (&HandleMapEntry->List);\r
-\r
-    FreePool (HandleMapEntry);\r
+    RemoveEntryList (&ThunkContext->Link);\r
 \r
+    DestroyThunkContext (Private, ThunkContext);\r
   }else {\r
     Status = EFI_NOT_FOUND;\r
   }\r
@@ -562,3 +638,150 @@ Returns:
 \r
   return Status;\r
 }\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+NewOrAddPackNotify (\r
+  IN UINT8                              PackageType,\r
+  IN CONST EFI_GUID                     *PackageGuid,\r
+  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
+  )\r
+{\r
+  EFI_STATUS              Status;\r
+  HII_THUNK_PRIVATE_DATA  *Private;\r
+  HII_THUNK_CONTEXT       *ThunkContext;\r
+\r
+  ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS || PackageType == EFI_HII_PACKAGE_FORM);\r
+  ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK || NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK);\r
+\r
+  Status  = EFI_SUCCESS;\r
+  Private = mHiiThunkPrivateData;\r
+\r
+  if (mInFrameworkHiiNewPack || mInFrameworkUpdatePakcage) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  //\r
+  // We only create a ThunkContext if the Uefi Hii Handle is only already registered\r
+  // by the HII Thunk Layer.\r
+  //\r
+  ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);\r
+  if (ThunkContext == NULL) {\r
+    ThunkContext = CreateThunkContextForUefiHiiHandle (Private, Handle);\r
+    ASSERT (ThunkContext != NULL);\r
+  } \r
+\r
+\r
+  if (PackageType == EFI_HII_PACKAGE_FORM) {\r
+    Status = CreateQuestionIdMap (ThunkContext);\r
+  }\r
+\r
+  return Status;  \r
+}\r
+\r
+\r
+BOOLEAN\r
+IsRemovingLastStringPack (\r
+  IN EFI_HII_HANDLE                     Handle\r
+  )\r
+{\r
+  EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
+  UINTN                        BufferSize;\r
+  EFI_STATUS                   Status;\r
+  EFI_HII_PACKAGE_HEADER       *PackageHeader;\r
+  UINTN                        StringPackageCount;\r
+\r
+  HiiPackageList = NULL;\r
+  BufferSize = 0;\r
+  StringPackageCount = 0;\r
+\r
+  Status = HiiLibExportPackageLists (Handle, &HiiPackageList, &BufferSize);\r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
+  PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) HiiPackageList + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
+\r
+  while (PackageHeader->Type != EFI_HII_PACKAGE_END) {\r
+    switch (PackageHeader->Type) {\r
+      case EFI_HII_PACKAGE_STRINGS:\r
+        StringPackageCount++;\r
+\r
+        if (StringPackageCount > 1) {\r
+          //\r
+          // More than one String Pack in the package list\r
+          //\r
+          FreePool (HiiPackageList);\r
+          return FALSE;\r
+        }\r
+      break;      \r
+\r
+      default:\r
+        break;\r
+    }\r
+    //\r
+    // goto header of next package\r
+    //\r
+    PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHeader + PackageHeader->Length);\r
+  }\r
+\r
+\r
+  //\r
+  // We will always be notified for the removal of String Pack from a package list.\r
+  // So StringPackageCount must be one at this point.\r
+  //\r
+  ASSERT (StringPackageCount == 1);\r
+  \r
+  FreePool (HiiPackageList);\r
+  return TRUE;\r
+}\r
+\r
+\r
+\r
+// Framework HII module may cache a GUID as the name of the package list.\r
+// Then search for the Framework HII handle database for the handle matching\r
+// this GUID\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RemovePackNotify (\r
+  IN UINT8                              PackageType,\r
+  IN CONST EFI_GUID                     *PackageGuid,\r
+  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
+  )\r
+{\r
+  EFI_STATUS   Status;\r
+  HII_THUNK_PRIVATE_DATA *Private;\r
+  HII_THUNK_CONTEXT * ThunkContext;\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
+  ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK);\r
+\r
+  if (mInFrameworkHiiRemovePack || mInFrameworkUpdatePakcage) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  Private = mHiiThunkPrivateData;\r
+\r
+  ThunkContext = UefiHiiHandleToThunkContext (Private, Handle);\r
+\r
+  if (ThunkContext->FwHiiHandle > Private->StaticHiiHandle) {\r
+    if (IsRemovingLastStringPack (Handle)) {\r
+      //\r
+      // If the string package will be removed is the last string package\r
+      // in the package list, we will remove the HII Thunk entry from the\r
+      // database.\r
+      //\r
+      Status = DestroyThunkContextForUefiHiiHandle (Private, Handle);\r
+    }\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+\r
diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/SetupBrowser.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/SetupBrowser.c
new file mode 100644 (file)
index 0000000..750df86
--- /dev/null
@@ -0,0 +1,105 @@
+/**@file\r
+Framework to UEFI 2.1 Setup Browser Thunk. The file consume EFI_FORM_BROWSER2_PROTOCOL\r
+to produce a EFI_FORM_BROWSER_PROTOCOL.\r
+\r
+Copyright (c) 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "HiiDatabase.h"\r
+\r
+EFI_STATUS\r
+EFIAPI \r
+ThunkSendForm (\r
+  IN  EFI_FORM_BROWSER_PROTOCOL         *This,\r
+  IN  BOOLEAN                           UseDatabase,\r
+  IN  FRAMEWORK_EFI_HII_HANDLE          *Handle,\r
+  IN  UINTN                             HandleCount,\r
+  IN  FRAMEWORK_EFI_IFR_PACKET          *Packet, OPTIONAL\r
+  IN  EFI_HANDLE                        CallbackHandle, OPTIONAL\r
+  IN  UINT8                             *NvMapOverride, OPTIONAL\r
+  IN  FRAMEWORK_EFI_SCREEN_DESCRIPTOR   *ScreenDimensions, OPTIONAL\r
+  OUT BOOLEAN                           *ResetRequired OPTIONAL\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  EFI_BROWSER_ACTION_REQUEST        ActionRequest;\r
+  HII_THUNK_CONTEXT                 *ThunkContext;\r
+  HII_THUNK_PRIVATE_DATA            *Private;\r
+  EFI_FORMBROWSER_THUNK_PRIVATE_DATA *BrowserPrivate;\r
+\r
+  if (!UseDatabase) {\r
+    //\r
+    // Packet, CallbackHandle.\r
+    //\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  if (HandleCount != 1 ) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  BrowserPrivate = EFI_FORMBROWSER_THUNK_PRIVATE_DATA_FROM_THIS (This);\r
+  Private = BrowserPrivate->ThunkPrivate;\r
+\r
+  ThunkContext = FwHiiHandleToThunkContext (Private, *Handle);\r
+  if (ThunkContext == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (NvMapOverride != NULL) {\r
+    ThunkContext->NvMapOverride = NvMapOverride;\r
+  }\r
+\r
+  Status = mFormBrowser2Protocol->SendForm (\r
+                                    mFormBrowser2Protocol,\r
+                                    &ThunkContext->UefiHiiHandle,\r
+                                    1,\r
+                                    NULL,\r
+                                    0,\r
+                                    (EFI_SCREEN_DESCRIPTOR *) ScreenDimensions,\r
+                                    &ActionRequest\r
+                                    );\r
+\r
+  if (ActionRequest == EFI_BROWSER_ACTION_REQUEST_RESET) {\r
+    *ResetRequired = TRUE;\r
+  }\r
+  \r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI \r
+ThunkCreatePopUp (\r
+  IN  UINTN                           NumberOfLines,\r
+  IN  BOOLEAN                         HotKey,\r
+  IN  UINTN                           MaximumStringSize,\r
+  OUT CHAR16                          *StringBuffer,\r
+  OUT EFI_INPUT_KEY                   *KeyValue,\r
+  IN  CHAR16                          *String,\r
+  ...\r
+  )\r
+{\r
+  EFI_STATUS                        Status;\r
+  VA_LIST                           Marker;\r
+\r
+  if (HotKey != TRUE) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  VA_START (Marker, KeyValue);\r
+  \r
+  Status = IfrLibCreatePopUp2 (NumberOfLines, KeyValue, Marker);\r
+\r
+  VA_END (Marker);\r
+  \r
+  return Status;\r
+}\r
+\r
index 90661d6136c70a0141318ec32901e41169d372ce..318f9ee1be4a006636b83a35b46fdfc76a216c1b 100644 (file)
@@ -1,7 +1,6 @@
 /**@file\r
-\r
-  This file contains the keyboard processing code to the HII database.\r
-\r
+  This file implements the protocol functions related to string package.\r
+  \r
 Copyright (c) 2006 - 2008, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
@@ -40,80 +39,111 @@ Returns:
 }\r
 \r
 EFI_STATUS\r
-GetTagGuidByFrameworkHiiHandle (\r
-  IN  CONST EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
-  IN        FRAMEWORK_EFI_HII_HANDLE    FrameworkHiiHandle,\r
+GetTagGuidByFwHiiHandle (\r
+  IN  CONST HII_THUNK_PRIVATE_DATA      *Private,\r
+  IN        FRAMEWORK_EFI_HII_HANDLE    FwHiiHandle,\r
   OUT       EFI_GUID                    *TagGuid\r
   )\r
 {\r
-  LIST_ENTRY                                *ListEntry;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
+  LIST_ENTRY                                *Link;\r
+  HII_THUNK_CONTEXT                          *ThunkContext;\r
 \r
   ASSERT (TagGuid != NULL);\r
 \r
-  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
-       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
-       ListEntry = ListEntry->ForwardLink\r
-       ) {\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
 \r
-    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+    ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
 \r
-    if (FrameworkHiiHandle == HandleMapEntry->FrameworkHiiHandle) {\r
-      CopyGuid (TagGuid, &HandleMapEntry->TagGuid);\r
+    if (FwHiiHandle == ThunkContext->FwHiiHandle) {\r
+      CopyGuid (TagGuid, &ThunkContext->TagGuid);\r
       return EFI_SUCCESS;\r
     }\r
+\r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
   }\r
-  \r
+\r
   return EFI_NOT_FOUND;\r
 }\r
 \r
+\r
+\r
 EFI_STATUS\r
-HiiThunkNewStringForAllStringPackages (\r
-  IN  CONST EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
-  OUT CONST EFI_GUID                    *TagGuid,\r
-  IN        CHAR16                     *Language,\r
-  IN OUT    STRING_REF                 *Reference,\r
-  IN        CHAR16                     *NewString\r
+EFIAPI\r
+HiiNewString (\r
+  IN     EFI_HII_PROTOCOL           *This,\r
+  IN     CHAR16                     *Language,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE   Handle,\r
+  IN OUT STRING_REF                 *Reference,\r
+  IN     CHAR16                     *NewString\r
   )\r
+/*++\r
+\r
+Routine Description:\r
+  This function allows a new String to be added to an already existing String Package.\r
+  We will make a buffer the size of the package + StrSize of the new string.  We will\r
+  copy the string package that first gets changed and the following language packages until\r
+  we encounter the NULL string package.  All this time we will ensure that the offsets have\r
+  been adjusted.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
 {\r
   EFI_STATUS                                Status;\r
-  LIST_ENTRY                                *ListEntry;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
-  EFI_STRING_ID                             StringId1;\r
-  EFI_STRING_ID                             StringId2;\r
+  HII_THUNK_PRIVATE_DATA                    *Private;\r
+  EFI_GUID                                  TagGuid;\r
+  LIST_ENTRY                                *Link;\r
+  HII_THUNK_CONTEXT                          *ThunkContext;\r
+  EFI_STRING_ID                             StringId;\r
+  EFI_STRING_ID                             LastStringId;\r
   CHAR8                                     *AsciiLanguage;\r
   BOOLEAN                                   Found;\r
 \r
-  ASSERT (TagGuid != NULL);\r
+  //\r
+  // BugBug: Conver the language to 3066.\r
+  //\r
 \r
-  StringId1 = (EFI_STRING_ID) 0;\r
-  StringId2 = (EFI_STRING_ID) 0;\r
-  Found = FALSE;\r
+  LastStringId      = (EFI_STRING_ID) 0;\r
+  StringId          = (EFI_STRING_ID) 0;\r
+  Found             = FALSE;\r
+  AsciiLanguage     = NULL;\r
 \r
-  if (Language == NULL) {\r
-    AsciiLanguage = NULL;\r
-  } else {\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+\r
+  Status = GetTagGuidByFwHiiHandle (Private, Handle, &TagGuid);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  if (Language != NULL) {\r
     AsciiLanguage = AllocateZeroPool (StrLen (Language) + 1);\r
     UnicodeStrToAsciiStr (Language, AsciiLanguage);\r
   }\r
 \r
-  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
-       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
-       ListEntry = ListEntry->ForwardLink\r
-       ) {\r
-\r
-    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+    ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
 \r
-    if (CompareGuid (TagGuid, &HandleMapEntry->TagGuid)) {\r
+    if (CompareGuid (&TagGuid, &ThunkContext->TagGuid)) {\r
       Found = TRUE;\r
       if (*Reference == 0) {\r
+        //\r
+        // Create a new string token.\r
+        //\r
         if (AsciiLanguage == NULL) {\r
-          Status = HiiLibNewString (HandleMapEntry->UefiHiiHandle, &StringId2, NewString);\r
+          //\r
+          // For all languages in the package list.\r
+          //\r
+          Status = HiiLibNewString (ThunkContext->UefiHiiHandle, &StringId, NewString);\r
         } else {\r
+          //\r
+          // For specified language.\r
+          //\r
           Status = mHiiStringProtocol->NewString (\r
                                          mHiiStringProtocol,\r
-                                         HandleMapEntry->UefiHiiHandle,\r
-                                         &StringId2,\r
+                                         ThunkContext->UefiHiiHandle,\r
+                                         &StringId,\r
                                          AsciiLanguage,\r
                                          NULL,\r
                                          NewString,\r
@@ -121,12 +151,21 @@ HiiThunkNewStringForAllStringPackages (
                                          );\r
         }\r
       } else {\r
+        //\r
+        // Update the existing string token.\r
+        //\r
         if (AsciiLanguage == NULL) {\r
-          Status = HiiLibSetString (HandleMapEntry->UefiHiiHandle, *Reference, NewString);\r
+          //\r
+          // For all languages in the package list.\r
+          //\r
+          Status = HiiLibSetString (ThunkContext->UefiHiiHandle, *Reference, NewString);\r
         } else {\r
+          //\r
+          // For specified language.\r
+          //\r
           Status = mHiiStringProtocol->SetString (\r
                                        mHiiStringProtocol,\r
-                                       HandleMapEntry->UefiHiiHandle,\r
+                                       ThunkContext->UefiHiiHandle,\r
                                        *Reference,\r
                                        AsciiLanguage,\r
                                        NewString,\r
@@ -135,66 +174,45 @@ HiiThunkNewStringForAllStringPackages (
         }\r
       }\r
       if (EFI_ERROR (Status)) {\r
-        return Status;\r
+        //\r
+        // Only EFI_INVALID_PARAMETER is defined in HII 0.92 specification.\r
+        //\r
+        return EFI_INVALID_PARAMETER;\r
       }\r
+\r
       if (*Reference == 0) {\r
-        if (StringId1 == (EFI_STRING_ID) 0) {\r
-          StringId1 = StringId2;\r
+        //\r
+        // When creating new string token, make sure all created token is the same\r
+        // for all string packages registered using FW HII interface.\r
+        //\r
+        if (LastStringId == (EFI_STRING_ID) 0) {\r
+          LastStringId = StringId;\r
         } else {\r
-          if (StringId1 != StringId2) {\r
+          if (LastStringId != StringId) {\r
             ASSERT(FALSE);\r
             return EFI_INVALID_PARAMETER;\r
           }\r
         }\r
       }\r
     }\r
+\r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
   }\r
 \r
   if (Found) {\r
-    *Reference = StringId1;\r
+    if (*Reference == 0) {\r
+      *Reference = StringId;\r
+    }\r
     Status = EFI_SUCCESS;\r
   } else {\r
+    DEBUG((EFI_D_ERROR, "Thunk HiiNewString fails to find the String Packages to update\n"));\r
+    //\r
+    // BUGBUG: Remove ths ASSERT when development is done.\r
+    //\r
     ASSERT (FALSE);\r
     Status = EFI_NOT_FOUND;\r
   }\r
   \r
-  return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-HiiNewString (\r
-  IN     EFI_HII_PROTOCOL           *This,\r
-  IN     CHAR16                     *Language,\r
-  IN     FRAMEWORK_EFI_HII_HANDLE   Handle,\r
-  IN OUT STRING_REF                 *Reference,\r
-  IN     CHAR16                     *NewString\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-  This function allows a new String to be added to an already existing String Package.\r
-  We will make a buffer the size of the package + StrSize of the new string.  We will\r
-  copy the string package that first gets changed and the following language packages until\r
-  we encounter the NULL string package.  All this time we will ensure that the offsets have\r
-  been adjusted.\r
-\r
-Arguments:\r
-\r
-Returns:\r
-\r
---*/\r
-{\r
-  EFI_STATUS                 Status;\r
-  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
-  EFI_GUID                   TagGuid;\r
-\r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
-\r
-  Status = GetTagGuidByFrameworkHiiHandle (Private, Handle, &TagGuid);\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  Status = HiiThunkNewStringForAllStringPackages (Private, &TagGuid, Language, Reference, NewString);\r
   //\r
   // For UNI file, some String may not be defined for a language. This has been true for a lot of platform code.\r
   // For this case, EFI_NOT_FOUND will be returned. To allow the old code to be run without porting, we don't assert \r
@@ -224,8 +242,7 @@ Returns:
 \r
 --*/\r
 {\r
-  ASSERT (FALSE);\r
-  return EFI_UNSUPPORTED;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 typedef struct {\r
@@ -293,13 +310,13 @@ Returns:
 \r
 --*/\r
 {\r
-  LIST_ENTRY                                *ListEntry;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
+  LIST_ENTRY                                *Link;\r
+  HII_THUNK_CONTEXT  *ThunkContext;\r
   CHAR8                                     *AsciiLanguage;\r
-  EFI_HII_THUNK_PRIVATE_DATA                *Private;\r
+  HII_THUNK_PRIVATE_DATA                *Private;\r
   CHAR8                                     *Rfc3066AsciiLanguage;\r
 \r
-  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+  Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
   if (LanguageString == NULL) {\r
     AsciiLanguage = NULL;\r
@@ -328,21 +345,20 @@ Returns:
     \r
   }\r
 \r
-  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
-       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
-       ListEntry = ListEntry->ForwardLink\r
-       ) {\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
+\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
 \r
-    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+    ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
 \r
-    if (Handle == HandleMapEntry->FrameworkHiiHandle) {\r
+    if (Handle == ThunkContext->FwHiiHandle) {\r
       if (AsciiLanguage == NULL) {\r
-        return HiiLibGetString (HandleMapEntry->UefiHiiHandle, Token, StringBuffer, BufferLengthTemp);\r
+        return HiiLibGetString (ThunkContext->UefiHiiHandle, Token, StringBuffer, BufferLengthTemp);\r
       } else {\r
         return mHiiStringProtocol->GetString (\r
                                      mHiiStringProtocol,\r
                                      AsciiLanguage,\r
-                                     HandleMapEntry->UefiHiiHandle,\r
+                                     ThunkContext->UefiHiiHandle,\r
                                      Token,\r
                                      StringBuffer,\r
                                      BufferLengthTemp,\r
@@ -350,6 +366,9 @@ Returns:
                                      );\r
       }\r
     }\r
+    \r
+    \r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
   }\r
 \r
   return EFI_NOT_FOUND;\r
index ca012fb998a704af1b9bb7f40cd13a8cb4bcb3eb..12dd3be0b1c2bd91a187c9dad889a6f7034d9131 100644 (file)
@@ -31,7 +31,6 @@
 // Extern Variables\r
 //\r
 extern CONST EFI_HII_DATABASE_PROTOCOL            *mHiiDatabase;\r
-extern CONST EFI_HII_FONT_PROTOCOL                *mHiiFontProtocol;\r
 extern CONST EFI_HII_IMAGE_PROTOCOL               *mHiiImageProtocol;\r
 extern CONST EFI_HII_STRING_PROTOCOL              *mHiiStringProtocol;\r
 extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mHiiConfigRoutingProtocol;\r
@@ -432,8 +431,6 @@ ExtractFormDefault (
   Link = GetFirstNode (&Form->StatementListHead);\r
   while (!IsNull (&Form->StatementListHead, Link)) {\r
     Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
-    Link = GetNextNode (&Form->StatementListHead, Link);\r
-\r
     //\r
     // Reset Question to its default value\r
     //\r
@@ -442,6 +439,7 @@ ExtractFormDefault (
       continue;\r
     }\r
 \r
+    Link = GetNextNode (&Form->StatementListHead, Link);\r
   }\r
   return EFI_SUCCESS;\r
 }\r
@@ -546,20 +544,20 @@ GetBufferTypeDefaultId (
   OUT       LIST_ENTRY      *UefiDefaultsListHead\r
   )\r
 {\r
-  LIST_ENTRY                  *StorageListEntry;\r
+  LIST_ENTRY                  *StorageLink;\r
   FORMSET_STORAGE             *Storage;\r
   EFI_STATUS                  Status;\r
 \r
-  StorageListEntry = GetFirstNode (&FormSet->StorageListHead);\r
+  StorageLink = GetFirstNode (&FormSet->StorageListHead);\r
 \r
-  while (!IsNull (&FormSet->StorageListHead, StorageListEntry)) {\r
-    Storage = FORMSET_STORAGE_FROM_LINK(StorageListEntry);\r
+  while (!IsNull (&FormSet->StorageListHead, StorageLink)) {\r
+    Storage = FORMSET_STORAGE_FROM_LINK(StorageLink);\r
 \r
     if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
       Status = GetBufferTypeDefaultIdAndStorageId (DefaultStore, Storage, FormSet, UefiDefaultsListHead);\r
     }\r
 \r
-    StorageListEntry = GetNextNode (&FormSet->StorageListHead, StorageListEntry);\r
+    StorageLink = GetNextNode (&FormSet->StorageListHead, StorageLink);\r
   }\r
   \r
   return EFI_SUCCESS;\r
@@ -587,7 +585,7 @@ UefiIfrGetBufferTypeDefaults (
 {\r
   FORM_BROWSER_FORMSET *FormSet;\r
   EFI_GUID              FormSetGuid;\r
-  LIST_ENTRY            *DefaultListEntry;\r
+  LIST_ENTRY            *DefaultLink;\r
   FORMSET_DEFAULTSTORE  *DefaultStore;\r
   EFI_STATUS            Status;\r
 \r
@@ -604,14 +602,14 @@ UefiIfrGetBufferTypeDefaults (
   ASSERT (UefiDefaults != NULL);\r
   InitializeListHead (*UefiDefaults);\r
 \r
-  DefaultListEntry = GetFirstNode (&FormSet->DefaultStoreListHead);\r
-  while (!IsNull (&FormSet->DefaultStoreListHead, DefaultListEntry)) {\r
-    DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultListEntry);\r
+  DefaultLink = GetFirstNode (&FormSet->DefaultStoreListHead);\r
+  while (!IsNull (&FormSet->DefaultStoreListHead, DefaultLink)) {\r
+    DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK(DefaultLink);\r
 \r
     Status = GetBufferTypeDefaultId (DefaultStore, FormSet, *UefiDefaults);\r
     ASSERT_EFI_ERROR (Status);\r
 \r
-    DefaultListEntry = GetNextNode (&FormSet->DefaultStoreListHead, DefaultListEntry);    \r
+    DefaultLink = GetNextNode (&FormSet->DefaultStoreListHead, DefaultLink);    \r
   }\r
 \r
   DestroyFormSet (FormSet);\r
@@ -640,7 +638,7 @@ UefiIfrGetBufferTypeDefaults (
                                                            FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING.\r
 **/\r
 EFI_STATUS\r
-UefiDefaultsToFrameworkDefaults (\r
+UefiDefaultsToFwDefaults (\r
   IN     LIST_ENTRY                  *ListHead,\r
   IN     UINTN                       DefaultMask,\r
   OUT    EFI_HII_VARIABLE_PACK_LIST  **VariablePackList\r
@@ -758,19 +756,19 @@ FreeDefaultList (
   IN     LIST_ENTRY                  *ListHead\r
   )\r
 {\r
-  LIST_ENTRY *Node;\r
+  LIST_ENTRY *Link;\r
   UEFI_IFR_BUFFER_STORAGE_NODE *Default;\r
 \r
-  Node = GetFirstNode (ListHead);\r
+  Link = GetFirstNode (ListHead);\r
   \r
-  while (!IsNull (ListHead, Node)) {\r
-    Default = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(Node);\r
+  while (!IsNull (ListHead, Link)) {\r
+    Default = UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(Link);\r
 \r
-    RemoveEntryList (Node);\r
+    RemoveEntryList (Link);\r
    \r
     DestroyDefaultNode (Default);\r
     \r
-    Node = GetFirstNode (ListHead);\r
+    Link = GetNextNode (ListHead, Link);\r
   }\r
 \r
   FreePool (ListHead);\r
index efdbf333a253f85fdb7bc177304e8c7b1817b80f..ec061730e8d0c165c0719109065a7f447213a5a6 100644 (file)
 //\r
 // VARSTORE ID of 0 for Buffer Storage Type Storage is reserved in UEFI IFR form. But VARSTORE ID\r
 // 0 in Framework IFR is the default VarStore ID for storage without explicit declaration. So we have\r
-// to reseved 0xFFEE in UEFI VARSTORE ID to represetn default storage id in Framework IFR.\r
+// to reseved 0x0001 in UEFI VARSTORE ID to represetn default storage id in Framework IFR.\r
 // Framework VFR has to be ported or pre-processed to change the default VARSTORE to a VARSTORE\r
-// with ID equal to 0xFFEE.\r
+// with ID equal to 0x0001.\r
 //\r
-#define RESERVED_VARSTORE_ID 0xFFEE\r
+#define RESERVED_VARSTORE_ID 0x0001\r
+#define RESERVED_QUESTION_ID 0xf000\r
 \r
 #define UEFI_IFR_BUFFER_STORAGE_NODE_FROM_LIST(a) CR(a, UEFI_IFR_BUFFER_STORAGE_NODE, List, UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE)\r
 #define UEFI_IFR_BUFFER_STORAGE_NODE_SIGNATURE  EFI_SIGNATURE_32 ('I', 'b', 'S', 'n')\r
@@ -79,7 +80,7 @@ UefiIfrGetBufferTypeDefaults (
 **/\r
 \r
 EFI_STATUS\r
-UefiDefaultsToFrameworkDefaults (\r
+UefiDefaultsToFwDefaults (\r
   IN     LIST_ENTRY                  *UefiIfrDefaults,\r
   IN     UINTN                       DefaultMask,\r
   OUT    EFI_HII_VARIABLE_PACK_LIST  **VariablePackList\r
index 5074e961c0ae8861229d76cde9621e805d789811..c22c0b6da8825e3eab87cc6434d3755ac793fa16 100644 (file)
@@ -28,7 +28,6 @@ FORM_EXPRESSION  *mSuppressExpression;
 FORM_EXPRESSION  *mGrayOutExpression;\r
 \r
 EFI_GUID  gZeroGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
-EFI_GUID  gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
 \r
 /**\r
   Initialize Statement header members.\r
index 7a811b15c82426ff4c539fedc16481083601be7a..840c72428987010f3f8c5203f9cba5a221d83403 100644 (file)
 #include <PiDxe.h>\r
 \r
 #include <Protocol/Print.h>\r
-//#include <Protocol/SimpleTextOut.h>\r
-//#include <Protocol/SimpleTextIn.h>\r
-//#include <Protocol/FormBrowser2.h>\r
-//#include <Protocol/DevicePath.h>\r
 #include <Protocol/HiiConfigAccess.h>\r
 #include <Protocol/HiiConfigRouting.h>\r
 #include <Protocol/HiiDatabase.h>\r
@@ -46,6 +42,8 @@
 #define FORM_INCONSISTENT_VALIDATION         0\r
 #define FORM_NO_SUBMIT_VALIDATION            1\r
 \r
+extern EFI_GUID  gTianoHiiIfrGuid;\r
+\r
 \r
 typedef struct {\r
   UINT8               Type;\r
index 3e153e8d90b3e7cebb1ad2645eb3bc063ab5f1c2..f26461c426bc56ffca16f1356fecd76f9b2d5e1f 100644 (file)
@@ -33,7 +33,6 @@
 // Extern Variables\r
 //\r
 extern CONST EFI_HII_DATABASE_PROTOCOL            *mHiiDatabase;\r
-extern CONST EFI_HII_FONT_PROTOCOL                *mHiiFontProtocol;\r
 extern CONST EFI_HII_IMAGE_PROTOCOL               *mHiiImageProtocol;\r
 extern CONST EFI_HII_STRING_PROTOCOL              *mHiiStringProtocol;\r
 extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mHiiConfigRoutingProtocol;\r
index 03da20eb0dbf8d8301472f18270dcf919a84492f..58019d5b9516b9bb4d58404248e7a53f9ca5188b 100644 (file)
@@ -16,13 +16,17 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "HiiDatabase.h"\r
 \r
+EFI_GUID  gFrameworkHiiCompatbilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
+EFI_GUID  gTianoHiiIfrGuid              = EFI_IFR_TIANO_GUID;\r
+\r
+\r
 EFI_GUID *\r
 GetGuidOfFirstFormset (\r
   CONST EFI_HII_FORM_PACKAGE * FormPackage\r
 ) \r
 {\r
-  UINT8             *StartOfNextPackage;\r
-  EFI_IFR_OP_HEADER *OpCodeData;\r
+  UINT8                   *StartOfNextPackage;\r
+  EFI_IFR_OP_HEADER       *OpCodeData;\r
 \r
   StartOfNextPackage = (UINT8 *) FormPackage + FormPackage->Header.Length;\r
   OpCodeData = (EFI_IFR_OP_HEADER *) (FormPackage + 1);\r
@@ -40,138 +44,430 @@ GetGuidOfFirstFormset (
 }\r
 \r
 EFI_HII_HANDLE\r
-FrameworkHiiHandleToUefiHiiHandle (\r
-  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
-  IN FRAMEWORK_EFI_HII_HANDLE          FrameworkHiiHandle\r
+FwHiiHandleToUefiHiiHandle (\r
+  IN CONST HII_THUNK_PRIVATE_DATA      *Private,\r
+  IN FRAMEWORK_EFI_HII_HANDLE          FwHiiHandle\r
   )\r
 {\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
+  HII_THUNK_CONTEXT            *ThunkContext;\r
 \r
-  ASSERT (FrameworkHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0);\r
+  ASSERT (FwHiiHandle != (FRAMEWORK_EFI_HII_HANDLE) 0);\r
   ASSERT (Private != NULL);\r
 \r
-  HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, FrameworkHiiHandle);\r
+  ThunkContext = FwHiiHandleToThunkContext (Private, FwHiiHandle);\r
 \r
-  if (HandleMapEntry != NULL) {\r
-    return HandleMapEntry->UefiHiiHandle;\r
+  if (ThunkContext != NULL) {\r
+    return ThunkContext->UefiHiiHandle;\r
   }\r
   \r
   return (EFI_HII_HANDLE) NULL;\r
 }\r
 \r
 \r
-HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
-FrameworkHiiHandleToMapDatabaseEntry (\r
-  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
-  IN FRAMEWORK_EFI_HII_HANDLE          FrameworkHiiHandle\r
+HII_THUNK_CONTEXT *\r
+FwHiiHandleToThunkContext (\r
+  IN CONST HII_THUNK_PRIVATE_DATA      *Private,\r
+  IN FRAMEWORK_EFI_HII_HANDLE          FwHiiHandle\r
   )\r
 {\r
-  LIST_ENTRY                 *ListEntry;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+  LIST_ENTRY                 *Link;\r
+  HII_THUNK_CONTEXT           *ThunkContext;\r
+\r
 \r
-  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
-       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
-       ListEntry = ListEntry->ForwardLink\r
-       ) {\r
-    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
 \r
-    if (FrameworkHiiHandle == HandleMapEntry->FrameworkHiiHandle) {\r
-      return HandleMapEntry;\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+    ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+\r
+    if (FwHiiHandle == ThunkContext->FwHiiHandle) {\r
+      return ThunkContext;\r
     }\r
+\r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
   }\r
 \r
-  return (HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *) NULL;\r
+  return NULL;\r
 }\r
 \r
-HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
-UefiHiiHandleToMapDatabaseEntry (\r
-  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+HII_THUNK_CONTEXT *\r
+UefiHiiHandleToThunkContext (\r
+  IN CONST HII_THUNK_PRIVATE_DATA     *Private,\r
   IN EFI_HII_HANDLE                   UefiHiiHandle\r
   )\r
 {\r
-  LIST_ENTRY                 *ListEntry;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+  LIST_ENTRY                 *Link;\r
+  HII_THUNK_CONTEXT           *ThunkContext;\r
 \r
-  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
-       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
-       ListEntry = ListEntry->ForwardLink\r
-       ) {\r
-    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
 \r
-    if (UefiHiiHandle == HandleMapEntry->UefiHiiHandle) {\r
-      return HandleMapEntry;\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+    ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
+\r
+    if (UefiHiiHandle == ThunkContext->UefiHiiHandle) {\r
+      return ThunkContext;\r
     }\r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
   }\r
 \r
-  return (HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *) NULL;\r
+  return NULL;\r
 }\r
 \r
 EFI_HII_HANDLE *\r
-TagGuidToUefiIfrHiiHandle (\r
-  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+TagGuidToUefiHiiHandle (\r
+  IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
   IN CONST EFI_GUID                   *Guid\r
   )\r
 {\r
-  LIST_ENTRY                 *ListEntry;\r
-  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+  LIST_ENTRY                 *Link;\r
+  HII_THUNK_CONTEXT           *ThunkContext;\r
+\r
+  Link = GetFirstNode (&Private->ThunkContextListHead);\r
 \r
-  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
-       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
-       ListEntry = ListEntry->ForwardLink\r
-       ) {\r
-    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+  while (!IsNull (&Private->ThunkContextListHead, Link)) {\r
+    ThunkContext = HII_THUNK_CONTEXT_FROM_LINK (Link);\r
 \r
-    if (CompareGuid (Guid, &HandleMapEntry->TagGuid) && HandleMapEntry->DoesPackageListImportStringPackages) {\r
-      return HandleMapEntry->UefiHiiHandle;\r
+    if (CompareGuid (Guid, &ThunkContext->TagGuid) && (ThunkContext->IfrPackageCount != 0)) {\r
+      return ThunkContext->UefiHiiHandle;\r
     }\r
+\r
+    Link = GetNextNode (&Private->ThunkContextListHead, Link);\r
   }\r
 \r
-  return (EFI_HII_HANDLE *) NULL;\r
+  return NULL;\r
   \r
 }\r
 \r
 BOOLEAN\r
 IsFrameworkHiiDatabaseHandleDepleted (\r
-  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private\r
+  IN CONST HII_THUNK_PRIVATE_DATA *Private\r
   )\r
 {\r
   return (BOOLEAN) (Private->StaticHiiHandle == (UINTN) Private->StaticPureUefiHiiHandle);\r
 }\r
 \r
 EFI_STATUS\r
-\r
-AssignHiiHandle (\r
-  IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+AssignFrameworkHiiHandle (\r
+  IN OUT HII_THUNK_PRIVATE_DATA     *Private,\r
+  IN     BOOLEAN                    FromFwHiiNewPack,\r
   OUT    FRAMEWORK_EFI_HII_HANDLE   *Handle\r
   )\r
 {\r
   ASSERT (Handle != NULL);\r
 \r
-  *Handle = Private->StaticHiiHandle;\r
-  Private->StaticHiiHandle += 1;\r
+  if (FromFwHiiNewPack) {\r
+\r
+    *Handle = Private->StaticHiiHandle;\r
+    Private->StaticHiiHandle += 1;\r
+\r
+    if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+\r
+  } else {\r
+\r
+    *Handle = Private->StaticPureUefiHiiHandle;\r
+    Private->StaticPureUefiHiiHandle -= 1;\r
+    \r
+    if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
 \r
-  if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
-    return EFI_OUT_OF_RESOURCES;\r
   }\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
 EFI_STATUS\r
-AssignPureUefiHiiHandle (\r
-  IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
-    OUT    FRAMEWORK_EFI_HII_HANDLE   *Handle\r
+DestroyThunkContextForUefiHiiHandle (\r
+  IN HII_THUNK_PRIVATE_DATA     *Private,\r
+  IN EFI_HII_HANDLE             UefiHiiHandle\r
+ )\r
+{\r
+  HII_THUNK_CONTEXT     *ThunkContext;\r
+\r
+  ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
+  ASSERT (ThunkContext != NULL);\r
+\r
+  ASSERT (IsListEmpty (&ThunkContext->OneOfOptionMapListHead));\r
+  ASSERT (IsListEmpty (&ThunkContext->QuestionIdMapListHead));\r
+  \r
+  RemoveEntryList (&ThunkContext->Link);\r
+\r
+  FreePool (ThunkContext);\r
+    \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+/**\r
+  This function create a HII_THUNK_CONTEXT for a package list registered\r
+  by a module calling EFI_HII_DATABASE_PROTOCOL.NewPackageList. It records\r
+  the PackageListGuid in EFI_HII_PACKAGE_LIST_HEADER in the TagGuid in \r
+  HII_THUNK_CONTEXT created. This TagGuid will be used as a key to s\r
+\r
+**/\r
+HII_THUNK_CONTEXT *\r
+CreateThunkContextForUefiHiiHandle (\r
+  IN  HII_THUNK_PRIVATE_DATA     *Private,\r
+  IN  EFI_HII_HANDLE             UefiHiiHandle\r
+ )\r
+{\r
+  EFI_STATUS            Status;\r
+  EFI_GUID              PackageGuid;\r
+  HII_THUNK_CONTEXT      *ThunkContext;\r
+\r
+  ThunkContext = AllocateZeroPool (sizeof (*ThunkContext));\r
+  ASSERT (ThunkContext != NULL);\r
+  \r
+  ThunkContext->Signature = HII_THUNK_CONTEXT_SIGNATURE;\r
+\r
+  Status = AssignFrameworkHiiHandle (Private, FALSE, &ThunkContext->FwHiiHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    return NULL;\r
+  }\r
+  \r
+  ThunkContext->UefiHiiHandle = UefiHiiHandle;\r
+  \r
+  Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
+  CopyGuid(&ThunkContext->TagGuid, &PackageGuid);\r
+\r
+  InitializeListHead (&ThunkContext->QuestionIdMapListHead);\r
+  InitializeListHead (&ThunkContext->OneOfOptionMapListHead);\r
+  \r
+  InsertTailList (&Private->ThunkContextListHead, &ThunkContext->Link);\r
+\r
+  return ThunkContext;\r
+}\r
+\r
+\r
+UINTN\r
+GetPackageCountByType (\r
+  IN CONST EFI_HII_PACKAGE_LIST_HEADER     *PackageListHeader,\r
+  IN       UINT8                           PackageType\r
   )\r
 {\r
-  ASSERT (Handle != NULL);\r
+  UINTN                     Count;\r
+  EFI_HII_PACKAGE_HEADER    *PackageHeader;\r
+\r
+  PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageListHeader + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
+  Count = 0;\r
+  \r
+  while (PackageHeader->Type != EFI_HII_PACKAGE_END) {\r
+    if (PackageHeader->Type == PackageType ) {\r
+      Count++;\r
+    }\r
+    PackageHeader = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHeader + PackageHeader->Length);\r
+  }\r
+  \r
+  \r
+  return Count;\r
+}\r
+\r
+LIST_ENTRY *\r
+GetOneOfOptionMapEntryListHead (\r
+  IN CONST HII_THUNK_CONTEXT  *ThunkContext,\r
+  IN       UINT16             QuestionId\r
+  )\r
+{\r
+  LIST_ENTRY            *Link;\r
+  ONE_OF_OPTION_MAP     *Map;\r
+\r
+  Link = GetFirstNode (&ThunkContext->OneOfOptionMapListHead);\r
+\r
+  while (!IsNull (&ThunkContext->OneOfOptionMapListHead, Link)) {\r
+    Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
+    if (QuestionId == Map->QuestionId) {\r
+      return &Map->OneOfOptionMapEntryListHead;\r
+    }\r
+    Link = GetNextNode (&ThunkContext->OneOfOptionMapListHead, Link);\r
+  }\r
+  \r
+  return NULL;\r
+}\r
 \r
-  *Handle = Private->StaticPureUefiHiiHandle;\r
-  Private->StaticPureUefiHiiHandle -= 1;\r
 \r
-  if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
-    return EFI_OUT_OF_RESOURCES;\r
+EFI_STATUS\r
+CreateQuestionIdMap (\r
+  IN    OUT HII_THUNK_CONTEXT  *ThunkContext\r
+  )\r
+{\r
+  EFI_STATUS                    Status;\r
+  EFI_HII_PACKAGE_LIST_HEADER   *List;\r
+  EFI_HII_PACKAGE_HEADER        *Package;\r
+  UINTN                         Size;\r
+  EFI_IFR_OP_HEADER             *OpCode;\r
+  UINTN                         Offset;\r
+  QUESTION_ID_MAP               *IdMap;\r
+  EFI_IFR_VARSTORE              *VarStore;\r
+  EFI_IFR_FORM_SET              *FormSet;\r
+  EFI_IFR_QUESTION_HEADER       *Question;\r
+  LIST_ENTRY                    *QuestionIdMapEntryListHead;\r
+  LIST_ENTRY                    *OneOfOptinMapEntryListHead;\r
+  QUESTION_ID_MAP_ENTRY         *IdMapEntry;\r
+  EFI_IFR_GUID_OPTIONKEY        *OptionMap;\r
+  ONE_OF_OPTION_MAP             *OneOfOptionMap;\r
+  ONE_OF_OPTION_MAP_ENTRY       *OneOfOptionMapEntry;\r
+  EFI_IFR_GUID_CLASS            *Class;\r
+  \r
+\r
+  Status = HiiLibExportPackageLists (ThunkContext->UefiHiiHandle, &List, &Size);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
   }\r
 \r
+  //\r
+  // Get all VarStoreId and build the the QuestionId map.\r
+  // EFI_IFR_QUESTION_HEADER.VarStoreInfo.VarOffset -> Framework Question ID\r
+  // EFI_IFR_QUESTION_HEADER.QuestionId             -> UEFI Question ID\r
+  //\r
+\r
+  //\r
+  // Skip the package list header.\r
+  //\r
+  Package = (EFI_HII_PACKAGE_HEADER *) (List + 1);\r
+\r
+  while (Package->Type != EFI_HII_PACKAGE_END) {\r
+\r
+    if (Package->Type == EFI_HII_PACKAGE_FORM) {\r
+\r
+      //\r
+      // Skip the package header\r
+      //\r
+      Offset = sizeof (EFI_HII_PACKAGE_HEADER);\r
+      while (Offset < Package->Length) {\r
+        OpCode = (EFI_IFR_OP_HEADER *)((UINT8 *) Package + Offset);\r
+\r
+        switch (OpCode->OpCode) {\r
+        case EFI_IFR_FORM_SET_OP:\r
+          FormSet = (EFI_IFR_FORM_SET *) OpCode;\r
+          ThunkContext->FormSetTitle = FormSet->FormSetTitle;\r
+          ThunkContext->FormSetHelp  = FormSet->Help;\r
+          break;\r
+          \r
+        case EFI_IFR_VARSTORE_OP:\r
+          //\r
+          // IFR built from Framework VFR only has UEFI Buffer Type Storage\r
+          //\r
+          VarStore = (EFI_IFR_VARSTORE *) OpCode;\r
+          IdMap = AllocateZeroPool (sizeof (QUESTION_ID_MAP));\r
+          ASSERT (IdMap != NULL);\r
+          \r
+          IdMap->Signature  = QUESTION_ID_MAP_SIGNATURE;\r
+          IdMap->VarStoreId = VarStore->VarStoreId;\r
+          IdMap->VarSize    = VarStore->Size;\r
+          InitializeListHead (&IdMap->MapEntryListHead);\r
+          InsertTailList (&ThunkContext->QuestionIdMapListHead, &IdMap->Link);\r
+          break;\r
+\r
+        case EFI_IFR_NUMERIC_OP:\r
+        case EFI_IFR_CHECKBOX_OP:\r
+        case EFI_IFR_ONE_OF_OP:\r
+        case EFI_IFR_ORDERED_LIST_OP:\r
+        case EFI_IFR_STRING_OP:\r
+        //case EFI_IFR_PASSWORD_OP:\r
+          Question = (EFI_IFR_QUESTION_HEADER *)(OpCode + 1);\r
+          QuestionIdMapEntryListHead = GetMapEntryListHead (ThunkContext, Question->VarStoreId);\r
+\r
+          if (QuestionIdMapEntryListHead != NULL) {\r
+            //\r
+            // If the Question is using Buffer (EFI_IFR_VARSTORE_OP) type VarStore.\r
+            //\r
+            IdMapEntry = AllocateZeroPool (sizeof (QUESTION_ID_MAP_ENTRY));\r
+            ASSERT (IdMapEntry != NULL);\r
+\r
+            IdMapEntry->FwQId = Question->VarStoreInfo.VarOffset;\r
+            IdMapEntry->UefiQid = Question->QuestionId;\r
+            IdMapEntry->Signature = QUESTION_ID_MAP_ENTRY_SIGNATURE;\r
+\r
+            InsertTailList (QuestionIdMapEntryListHead, &IdMapEntry->Link);\r
+          }\r
+\r
+          break;\r
+       \r
+        case EFI_IFR_GUID_OP:\r
+          OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCode;\r
+          if (CompareGuid (&OptionMap->Guid, &gFrameworkHiiCompatbilityGuid)) {\r
+            if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
+              OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (ThunkContext, OptionMap->QuestionId);\r
+              if (OneOfOptinMapEntryListHead == NULL) {\r
+                OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
+                ASSERT (OneOfOptionMap != NULL);\r
+\r
+                OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
+                OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
+                OneOfOptionMap->ValueType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+                InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
+                OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
+                InsertTailList (&ThunkContext->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
+              }\r
+              OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
+              ASSERT (OneOfOptionMapEntry != NULL);\r
+\r
+              OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
+              OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
+              CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
+              \r
+              InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
+            }\r
+          }else if (CompareGuid (&OptionMap->Guid, &gTianoHiiIfrGuid)) {\r
+            Class = (EFI_IFR_GUID_CLASS *) OpCode;\r
+\r
+            switch (Class->ExtendOpCode) {\r
+              case EFI_IFR_EXTEND_OP_CLASS:\r
+                ThunkContext->FormSetClass = Class->Class;\r
+                break;\r
+              case EFI_IFR_EXTEND_OP_SUBCLASS:\r
+                ThunkContext->FormSetSubClass = ((EFI_IFR_GUID_SUBCLASS *) Class)->SubClass;\r
+                break;\r
+\r
+              default:\r
+                break;\r
+            }\r
+          }\r
+          break;\r
+          \r
+        default:\r
+          break;\r
+        \r
+        }\r
+\r
+        Offset += OpCode->Length;\r
+      }\r
+      //\r
+      // Only Form Package is in a Package List.\r
+      //\r
+      break;\r
+    }\r
+\r
+    Package = (EFI_HII_PACKAGE_HEADER *) (UINT8 *) Package + Package->Length;\r
+  }\r
+\r
+  FreePool (List);\r
   return EFI_SUCCESS;\r
 }\r
 \r
+\r
+LIST_ENTRY *\r
+GetMapEntryListHead (\r
+  IN CONST HII_THUNK_CONTEXT  *ThunkContext,\r
+  IN       UINT16             VarStoreId\r
+  )\r
+{\r
+  LIST_ENTRY            *Link;\r
+  QUESTION_ID_MAP       *Map;\r
+\r
+  Link = GetFirstNode (&ThunkContext->QuestionIdMapListHead);\r
+\r
+  while (!IsNull (&ThunkContext->QuestionIdMapListHead, Link)) {\r
+    Map = QUESTION_ID_MAP_FROM_LINK (Link);\r
+    if (VarStoreId == Map->VarStoreId) {\r
+      return &Map->MapEntryListHead;\r
+    }\r
+    Link = GetNextNode (&ThunkContext->QuestionIdMapListHead, Link);\r
+  }\r
+  return NULL;\r
+}\r
+\r
+\r
index 5504cc526710afeb4580d3f598996b17affe7f50..e8867ed29a36ff8dc2e27dfe80521cc83413b081 100644 (file)
@@ -26,51 +26,80 @@ GetGuidOfFirstFormset (
   the HII Thunk to Framework HII code.\r
 \r
   @param Private                        The pointer to the private data of Hii Thunk.\r
-  @param FrameworkHiiHandle     Framework HII Handle returned by  the HII Thunk to Framework HII code.\r
+  @param FwHiiHandle     Framework HII Handle returned by  the HII Thunk to Framework HII code.\r
 \r
   @retval  NULL                           If Framework HII Handle passed in does not have matching UEFI HII handle.\r
   @retval  !NULL                         If the match is found.\r
   \r
 **/\r
 EFI_HII_HANDLE\r
-FrameworkHiiHandleToUefiHiiHandle (\r
-  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
-  IN FRAMEWORK_EFI_HII_HANDLE          FrameworkHiiHandle\r
+FwHiiHandleToUefiHiiHandle (\r
+  IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
+  IN FRAMEWORK_EFI_HII_HANDLE          FwHiiHandle\r
   )\r
 ;\r
 \r
-HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
-FrameworkHiiHandleToMapDatabaseEntry (\r
-  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
-  IN FRAMEWORK_EFI_HII_HANDLE          FrameworkHiiHandle\r
+HII_THUNK_CONTEXT *\r
+FwHiiHandleToThunkContext (\r
+  IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
+  IN FRAMEWORK_EFI_HII_HANDLE          FwHiiHandle\r
   )\r
 ;\r
 \r
-HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
-UefiHiiHandleToMapDatabaseEntry (\r
-  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+HII_THUNK_CONTEXT *\r
+UefiHiiHandleToThunkContext (\r
+  IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
   IN EFI_HII_HANDLE                   UefiHiiHandle\r
   )\r
 ;\r
 \r
 EFI_HII_HANDLE *\r
-TagGuidToUefiIfrHiiHandle (\r
-  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+TagGuidToUefiHiiHandle (\r
+  IN CONST HII_THUNK_PRIVATE_DATA *Private,\r
   IN CONST EFI_GUID                   *Guid\r
   )\r
 ;\r
 \r
 EFI_STATUS\r
-AssignHiiHandle (\r
-  IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+AssignFrameworkHiiHandle (\r
+  IN OUT HII_THUNK_PRIVATE_DATA *Private,\r
+  IN     BOOLEAN                    FromFwHiiNewPack,\r
   OUT    FRAMEWORK_EFI_HII_HANDLE   *Handle\r
   )\r
 ;\r
 \r
+HII_THUNK_CONTEXT *\r
+CreateThunkContextForUefiHiiHandle (\r
+  IN  HII_THUNK_PRIVATE_DATA     *Private,\r
+  IN  EFI_HII_HANDLE             UefiHiiHandle\r
+ )\r
+;\r
+\r
 EFI_STATUS\r
-AssignPureUefiHiiHandle (\r
-  IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
-  OUT    FRAMEWORK_EFI_HII_HANDLE   *Handle\r
+DestroyThunkContextForUefiHiiHandle (\r
+  IN HII_THUNK_PRIVATE_DATA     *Private,\r
+  IN EFI_HII_HANDLE             UefiHiiHandle\r
+ )\r
+;\r
+\r
+UINTN\r
+GetPackageCountByType (\r
+  IN CONST EFI_HII_PACKAGE_LIST_HEADER     *PackageListHeader,\r
+  IN       UINT8                           PackageType\r
   )\r
 ;\r
+\r
+EFI_STATUS\r
+CreateQuestionIdMap (\r
+  IN    OUT HII_THUNK_CONTEXT  *ThunkContext\r
+  )\r
+;\r
+\r
+LIST_ENTRY *\r
+GetMapEntryListHead (\r
+  IN CONST HII_THUNK_CONTEXT  *ThunkContext,\r
+  IN       UINT16             VarStoreId\r
+  )\r
+;\r
+\r
 #endif\r