]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Update FrameworkHiiOnUefiHiiThunk to use new HII library.
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 20 Apr 2009 08:14:08 +0000 (08:14 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 20 Apr 2009 08:14:08 +0000 (08:14 +0000)
And add the internal CreateRawOpCode API for the unsupported OpCode: String and Ref.

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

EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/ConfigAccess.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/Forms.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/FrameworkHiiOnUefiHiiThunk.inf
EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/HiiDatabase.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/OpcodeCreation.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/SetupBrowser.c

index b8d0021303658506df21de91c307a69f4d3f7b9e..ef75fc3d8285859a1843d759a66a2689db352309 100644 (file)
@@ -189,7 +189,7 @@ GetStorageFromConfigString (
       Name = Storage->Name;\r
     }\r
     \r
-    if (IsConfigHdrMatch (ConfigString, &Storage->Guid, Name)) {\r
+    if (HiiIsConfigHdrMatch (ConfigString, &Storage->Guid, Name)) {\r
       return Storage;\r
     }\r
 \r
@@ -671,10 +671,10 @@ CreateIfrDataArray (
   FRAMEWORK_EFI_IFR_DATA_ARRAY      *IfrDataArray;\r
   FRAMEWORK_EFI_IFR_DATA_ENTRY      *IfrDataEntry;\r
   UINTN                             BrowserDataSize;\r
-  FORMSET_STORAGE                  *BufferStorage;\r
-  EFI_STATUS                        Status;\r
+  FORMSET_STORAGE                   *BufferStorage;\r
   UINTN                             Size;\r
   EFI_STRING                        String;\r
+  UINT8                             *TempBuffer;\r
 \r
   *NvMapAllocated = FALSE;\r
 \r
@@ -730,8 +730,10 @@ CreateIfrDataArray (
       IfrDataArray->NvRamMap = ConfigAccess->ThunkContext->NvMapOverride;\r
     }\r
     \r
-    Status = GetBrowserData (&BufferStorage->Guid, BufferStorage->Name, &BrowserDataSize, IfrDataArray->NvRamMap);\r
-    ASSERT_EFI_ERROR (Status);\r
+    TempBuffer = (UINT8 *) HiiGetBrowserData (&BufferStorage->Guid, BufferStorage->Name, BrowserDataSize);\r
+    ASSERT (TempBuffer == NULL);\r
+    CopyMem (IfrDataArray->NvRamMap, TempBuffer, BrowserDataSize);\r
+    FreePool (TempBuffer);\r
 \r
     IfrDataEntry = (FRAMEWORK_EFI_IFR_DATA_ENTRY *) (IfrDataArray + 1);\r
 \r
@@ -789,9 +791,9 @@ SyncBrowserDataForNvMapOverride (
   IN          EFI_QUESTION_ID               QuestionId\r
   )\r
 {\r
-  FORMSET_STORAGE                  *BufferStorage;\r
-  EFI_STATUS                        Status;\r
-  UINTN                             BrowserDataSize;\r
+  FORMSET_STORAGE   *BufferStorage;\r
+  BOOLEAN           CheckFlag;\r
+  UINTN             BrowserDataSize;\r
 \r
   if (ConfigAccess->ThunkContext->NvMapOverride != NULL) {\r
 \r
@@ -813,8 +815,8 @@ SyncBrowserDataForNvMapOverride (
     \r
     BrowserDataSize = BufferStorage->Size;\r
 \r
-    Status = SetBrowserData (&BufferStorage->Guid, BufferStorage->Name, BrowserDataSize, ConfigAccess->ThunkContext->NvMapOverride, NULL);\r
-    ASSERT_EFI_ERROR (Status);\r
+    CheckFlag = HiiSetBrowserData (&BufferStorage->Guid, BufferStorage->Name, BrowserDataSize, ConfigAccess->ThunkContext->NvMapOverride, NULL);\r
+    ASSERT (CheckFlag);\r
   }\r
 \r
 }\r
@@ -1061,7 +1063,7 @@ ThunkCallback (
   if (EFI_ERROR (Status)) {\r
     if (Packet != NULL) {\r
       do {\r
-        IfrLibCreatePopUp (1, &Key, Packet->String);\r
+        CreatePopUp (EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, &Key, Packet->String, NULL);\r
       } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
     }\r
     //\r
index 623e832826f25a35eed04312ba6af21f8f9ac4e2..484e306be2b4a05a6c6cc181595afb8a57c60cda 100644 (file)
@@ -488,24 +488,25 @@ HiiThunkUpdateForm (
   IN FRAMEWORK_EFI_HII_HANDLE          Handle,\r
   IN EFI_FORM_LABEL                    Label,\r
   IN BOOLEAN                           AddData,\r
-  IN FRAMEWORK_EFI_HII_UPDATE_DATA    *Data\r
+  IN FRAMEWORK_EFI_HII_UPDATE_DATA     *Data\r
   )\r
 {\r
   EFI_STATUS                                Status;\r
   HII_THUNK_PRIVATE_DATA                    *Private;\r
-  HII_THUNK_CONTEXT                          *ThunkContext;\r
-  EFI_HII_UPDATE_DATA                       *UefiHiiUpdateData;\r
+  HII_THUNK_CONTEXT                         *ThunkContext;\r
   EFI_HII_HANDLE                            UefiHiiHandle;\r
   EFI_GUID                                  FormsetGuid;\r
   EFI_FORM_ID                               FormId;\r
   EFI_TPL                                   OldTpl;\r
+  VOID                                      *StartOpCodeHandle;\r
+  VOID                                      *EndOpCodeHandle;\r
+  EFI_IFR_GUID_LABEL                        *StartLabel;\r
+  EFI_IFR_GUID_LABEL                        *EndLabel;\r
 \r
   OldTpl = gBS->RaiseTPL (TPL_NOTIFY);\r
   \r
   mInFrameworkUpdatePakcage = TRUE;\r
   Status = EFI_SUCCESS;\r
-  UefiHiiUpdateData = NULL;\r
-\r
 \r
   Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
@@ -539,34 +540,51 @@ HiiThunkUpdateForm (
     goto Done;\r
   }\r
 \r
+  //\r
+  // Init OpCode Handle\r
+  //\r
+  StartOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (StartOpCodeHandle != NULL);\r
+\r
+  EndOpCodeHandle = HiiAllocateOpCodeHandle ();\r
+  ASSERT (EndOpCodeHandle != NULL);\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the start opcode\r
+  //\r
+  StartLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  StartLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  StartLabel->Number       = Label;\r
+\r
+  //\r
+  // Create Hii Extend Label OpCode as the end opcode\r
+  //\r
+  EndLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));\r
+  EndLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;\r
+  EndLabel->Number       = 0xffff;\r
+\r
   if (AddData) {\r
     if (Data->DataCount != 0) {\r
 \r
       ThunkContext = UefiHiiHandleToThunkContext (Private, UefiHiiHandle);\r
-      Status = FwUpdateDataToUefiUpdateData (ThunkContext, Data, &UefiHiiUpdateData);\r
+      Status = FwUpdateDataToUefiUpdateData (ThunkContext, Data, StartOpCodeHandle);\r
       ASSERT_EFI_ERROR (Status);\r
 \r
-      Status = IfrLibUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, Label, TRUE, UefiHiiUpdateData);\r
+      Status = HiiUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, StartOpCodeHandle, NULL);\r
       ASSERT_EFI_ERROR (Status);\r
-      \r
-    } \r
+    }\r
   } else {\r
     //\r
     // Delete Opcode starting from Labe in FormId found\r
     //\r
-    UefiHiiUpdateData = AllocateZeroPool (sizeof (*UefiHiiUpdateData));\r
-       \r
-    Status = IfrLibUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, Label, FALSE, UefiHiiUpdateData);\r
+    Status = HiiUpdateForm (UefiHiiHandle, &FormsetGuid, FormId, StartOpCodeHandle, EndOpCodeHandle);\r
     ASSERT_EFI_ERROR (Status);\r
   }\r
 \r
+  HiiFreeOpCodeHandle (StartOpCodeHandle);\r
+  HiiFreeOpCodeHandle (EndOpCodeHandle);\r
+\r
 Done:\r
-  if (UefiHiiUpdateData != NULL) {\r
-    if (UefiHiiUpdateData->Data != NULL) {\r
-      FreePool (UefiHiiUpdateData->Data);\r
-    }\r
-    FreePool (UefiHiiUpdateData);\r
-  }\r
 \r
   mInFrameworkUpdatePakcage = FALSE; \r
 \r
index 9b09c0b52d52abb1a8e07615da9a19ef5eeede10..2b037182eba9f28122fb9f29289ff85db577eac4 100644 (file)
   DebugLib\r
   BaseLib\r
   HiiLib\r
-  IfrSupportLib\r
-  ExtendedIfrSupportLib\r
   PrintLib\r
   UefiLib\r
   PcdLib\r
 \r
+[Guids]\r
+  gEfiIfrTianoGuid\r
+  gEfiIfrFrameworkGuid\r
+\r
 [Protocols]\r
   gEfiHiiImageProtocolGuid\r
   gEfiHiiDatabaseProtocolGuid\r
index 8a999b315ce1af1643b098c8db7651437961ad38..2c8b7adabad67a055baf9420f7f925d1c8c09e9e 100644 (file)
@@ -46,9 +46,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include <Library/UefiRuntimeServicesTableLib.h>\r
 #include <Library/HiiLib.h>\r
 #include <Library/UefiLib.h>\r
-\r
-#include <Library/IfrSupportLib.h>\r
-#include <Library/ExtendedIfrSupportLib.h>\r
 #include <Library/PcdLib.h>\r
 \r
 #include <Guid/MdeModuleHii.h>\r
@@ -73,8 +70,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 ///\r
 #define ISO_639_2_ENTRY_SIZE            3\r
 \r
-\r
-\r
 #pragma pack (1)\r
 typedef struct {\r
   EFI_HII_PACK_HEADER     FrameworkPackageHeader;\r
@@ -421,12 +416,12 @@ ThunkSendForm (
 EFI_STATUS\r
 EFIAPI \r
 ThunkCreatePopUp (\r
-  IN  UINTN                           NumberOfLines,\r
+  IN  UINTN                           LinesNumber,\r
   IN  BOOLEAN                         HotKey,\r
   IN  UINTN                           MaximumStringSize,\r
   OUT CHAR16                          *StringBuffer,\r
-  OUT EFI_INPUT_KEY                   *KeyValue,\r
-  IN  CHAR16                          *String,\r
+  OUT EFI_INPUT_KEY                   *Key,\r
+  IN  CHAR16                          *FirstString,\r
   ...\r
   );\r
 \r
@@ -451,11 +446,11 @@ NewOrAddPackNotify (
   );\r
 \r
 /**\r
-  Create a EFI_HII_UPDATE_DATA structure used to call IfrLibUpdateForm.\r
+  Create a Hii Update data Handle used to call IfrLibUpdateForm.\r
 \r
-  @param ThunkContext   The HII Thunk Context.\r
-  @param FwUpdateData   The Framework Update Data.\r
-  @param UefiUpdateData The UEFI Update Data.\r
+  @param ThunkContext         The HII Thunk Context.\r
+  @param FwUpdateData         The Framework Update Data.\r
+  @param UefiOpCodeHandle     The UEFI Update Data.\r
 \r
   @retval EFI_SUCCESS       The UEFI Update Data is created successfully.\r
   @retval EFI_UNSUPPORTED   There is unsupported opcode in FwUpdateData.\r
@@ -465,7 +460,7 @@ EFI_STATUS
 FwUpdateDataToUefiUpdateData (\r
   IN       HII_THUNK_CONTEXT                *ThunkContext,\r
   IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA    *FwUpdateData,\r
-  OUT      EFI_HII_UPDATE_DATA              **UefiUpdateData\r
+  IN       VOID                             *UefiOpCodeHandle\r
   )\r
 ;\r
 \r
index 5b6fb7655aab6f35ba98619b66318e1395c97f50..067bb2ef95c1e4bc19c628f2e40b067388fc8156 100644 (file)
@@ -16,17 +16,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "HiiDatabase.h"\r
 #include "UefiIfrDefault.h"\r
 \r
-EFI_GUID  mTianoExtendedOpcodeGuid = EFI_IFR_TIANO_GUID;\r
-\r
-\r
-EFI_IFR_GUID_OPTIONKEY mOptionKeyTemplate = {\r
-   {EFI_IFR_GUID_OP, sizeof (EFI_IFR_GUID_OPTIONKEY), 0},\r
-   EFI_IFR_FRAMEWORK_GUID,\r
-   EFI_IFR_EXTEND_OP_OPTIONKEY,\r
-   0,\r
-   {0},\r
-   0\r
-};\r
+typedef struct {\r
+  UINT8  *Buffer;\r
+  UINTN  BufferSize;\r
+  UINTN  Position;\r
+} HII_LIB_OPCODE_BUFFER;\r
 \r
 /**\r
   The dynamic creation of these opcodes is supported in Framework HII modules.\r
@@ -155,44 +149,53 @@ FwQIdToUefiQId (
 \r
 \r
 \r
-#define LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL   0x1000\r
+#define HII_LIB_OPCODE_ALLOCATION_SIZE   0x200\r
+\r
 /**\r
-  Append the newly created OpCode buffer to EFI_HII_UPDATE_DATA buffer.\r
-  Increase the Data buffer in EFI_HII_UPDATE_DATA if the EFI_HII_UPDATE_DATA \r
-  buffer's Data Buffer does not have space left for the newly created\r
-  OpCode.\r
-\r
-  @param OpCodeBuf      The newly created OpCode Buffer to be appended to \r
-                        EFI_HII_UPDATE_DATA buffer.\r
-  @param OpCodeBufSize  The size of OpCodeBuf.\r
-  @param UefiUpdateData The EFI_HII_UPDATE_DATA to be appended.\r
-\r
-  @retval EFI_SUCCESS   The OpCode buffer is appended to EFI_HII_UPDATE_DATA successfull.\r
-  @retval EFI_OUT_OF_RESOURCES There is not enough memory.\r
+  Append raw opcodes to an OpCodeHandle.\r
+\r
+  If OpCodeHandle is NULL, then ASSERT().\r
+  If RawBuffer is NULL, then ASSERT();\r
+\r
+  @param[in]  OpCodeHandle   Handle to the buffer of opcodes.\r
+  @param[in]  RawBuffer      Buffer of opcodes to append.\r
+  @param[in]  RawBufferSize  The size, in bytes, of Buffer.\r
+\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the appended opcodes.\r
+\r
 **/\r
-EFI_STATUS\r
-AppendToUpdateBuffer (\r
-  IN CONST  UINT8                *OpCodeBuf,\r
-  IN        UINTN                OpCodeBufSize,\r
-  IN OUT    EFI_HII_UPDATE_DATA  *UefiUpdateData\r
+UINT8 *\r
+EFIAPI\r
+HiiThunkCreateRawOpCodes (\r
+  IN VOID   *OpCodeHandle,\r
+  IN UINT8  *RawBuffer,\r
+  IN UINTN  RawBufferSize\r
   )\r
 {\r
-  UINT8 * NewBuff;\r
-  \r
-  if (UefiUpdateData->Offset + OpCodeBufSize > UefiUpdateData->BufferSize) {\r
-    NewBuff = AllocateCopyPool (UefiUpdateData->BufferSize + LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL, UefiUpdateData->Data);\r
-    if (NewBuff == NULL) {\r
-      return EFI_OUT_OF_RESOURCES;\r
+  UINT8                  *Buffer;\r
+  HII_LIB_OPCODE_BUFFER  *OpCodeBuffer;\r
+\r
+  ASSERT (RawBuffer != NULL);\r
+  ASSERT (OpCodeHandle != NULL);\r
+\r
+  OpCodeBuffer = (HII_LIB_OPCODE_BUFFER *)OpCodeHandle;\r
+  if (OpCodeBuffer->Position + RawBufferSize > OpCodeBuffer->BufferSize) {\r
+    Buffer = ReallocatePool (\r
+              OpCodeBuffer->BufferSize, \r
+              OpCodeBuffer->BufferSize + (RawBufferSize + HII_LIB_OPCODE_ALLOCATION_SIZE),\r
+              OpCodeBuffer->Buffer\r
+              );\r
+    if (Buffer == NULL) {\r
+      return NULL;\r
     }\r
-    UefiUpdateData->BufferSize += LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
-    FreePool (UefiUpdateData->Data);\r
-    UefiUpdateData->Data = NewBuff;\r
+    OpCodeBuffer->Buffer = Buffer;\r
+    OpCodeBuffer->BufferSize += (RawBufferSize + HII_LIB_OPCODE_ALLOCATION_SIZE);\r
   }\r
+  Buffer = OpCodeBuffer->Buffer + OpCodeBuffer->Position;\r
+  OpCodeBuffer->Position += RawBufferSize;\r
   \r
-  CopyMem (UefiUpdateData->Data + UefiUpdateData->Offset, OpCodeBuf, OpCodeBufSize);\r
-  UefiUpdateData->Offset += (UINT32) OpCodeBufSize;\r
-\r
-  return EFI_SUCCESS;\r
+  return (UINT8 *)CopyMem (Buffer, RawBuffer, RawBufferSize);\r
 }\r
 \r
 /**\r
@@ -220,76 +223,23 @@ AssignQuestionId (
   }\r
 }\r
 \r
-/**\r
-  Create UEFI HII "End Of" Opcode and append it to UefiUpdateData buffer.\r
-\r
-  @param UefiUpdateData     The newly created UEFI HII opcode is appended to UefiUpdateData.\r
-\r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
-  \r
-**/\r
-EFI_STATUS\r
-UCreateEndOfOpcode (\r
-  IN OUT      EFI_HII_UPDATE_DATA         *UefiUpdateData\r
-  )\r
-{\r
-  EFI_IFR_END UOpcode;\r
-\r
-  ZeroMem (&UOpcode, sizeof (UOpcode));\r
-\r
-  UOpcode.Header.OpCode = EFI_IFR_END_OP;\r
-  UOpcode.Header.Length = sizeof (UOpcode);\r
-\r
-  return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiUpdateData);\r
-}\r
-\r
-/**\r
-  Create UEFI HII Subtitle Opcode from a Framework HII Subtitle Opcode.\r
-\r
-  @param FwOpcode         The input Framework Opcode.\r
-  @param UefiUpdateData   The newly created UEFI HII opcode is appended to UefiUpdateData.\r
-\r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
-  \r
-**/\r
-EFI_STATUS\r
-F2UCreateSubtitleOpCode (\r
-  IN CONST FRAMEWORK_EFI_IFR_SUBTITLE  *FwOpcode,\r
-  IN OUT   EFI_HII_UPDATE_DATA         *UefiUpdateData\r
-  )\r
-{\r
-  EFI_IFR_SUBTITLE UOpcode;\r
-\r
-  ZeroMem (&UOpcode, sizeof(UOpcode));\r
-\r
-  UOpcode.Header.OpCode = EFI_IFR_SUBTITLE_OP;\r
-  UOpcode.Header.Length = sizeof (EFI_IFR_SUBTITLE);\r
-\r
-  UOpcode.Statement.Prompt = FwOpcode->SubTitle;\r
-\r
-  return AppendToUpdateBuffer ((UINT8 *)&UOpcode, sizeof(UOpcode), UefiUpdateData);\r
-}\r
-\r
 /**\r
   Create UEFI HII Text Opcode from a Framework HII Text Opcode.\r
 \r
-  @param FwOpcode        The input Framework Opcode.\r
-  @param UefiUpdateData  The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+  @param FwOpcode              The input Framework Opcode.\r
+  @param UefiUpdateDataHandle  The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the created opcode.\r
   \r
 **/\r
-EFI_STATUS\r
+UINT8 *\r
 F2UCreateTextOpCode (\r
-  IN CONST FRAMEWORK_EFI_IFR_TEXT      *FwOpcode,\r
-  IN OUT   EFI_HII_UPDATE_DATA         *UefiUpdateData\r
+  IN OUT   VOID                        *UefiUpdateDataHandle,\r
+  IN CONST FRAMEWORK_EFI_IFR_TEXT      *FwOpcode\r
   )\r
 {\r
   EFI_IFR_TEXT      UTextOpCode;\r
-  EFI_IFR_ACTION    UActionOpCode;\r
 \r
   if ((FwOpcode->Flags & FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE) == 0) {\r
     ZeroMem (&UTextOpCode, sizeof(UTextOpCode));\r
@@ -302,41 +252,29 @@ F2UCreateTextOpCode (
     UTextOpCode.Statement.Prompt = FwOpcode->Text;\r
     UTextOpCode.TextTwo          = FwOpcode->TextTwo;\r
     \r
-    return AppendToUpdateBuffer ((UINT8 *) &UTextOpCode, sizeof(UTextOpCode), UefiUpdateData);\r
+    return HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UTextOpCode, sizeof(UTextOpCode));\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 = FwOpcode->Text;\r
-    UActionOpCode.Question.Header.Help  = FwOpcode->Help;\r
-    UActionOpCode.Question.Flags      = EFI_IFR_FLAG_CALLBACK;\r
-    UActionOpCode.Question.QuestionId = FwOpcode->Key;\r
-\r
-    return AppendToUpdateBuffer ((UINT8 *) &UActionOpCode, sizeof(UActionOpCode), UefiUpdateData);\r
-    \r
+    return HiiCreateActionOpCode (UefiUpdateDataHandle, FwOpcode->Key, FwOpcode->Text, FwOpcode->Help, EFI_IFR_FLAG_CALLBACK, 0);\r
   }\r
 }\r
 \r
 /**\r
   Create UEFI HII Reference Opcode from a Framework HII Reference Opcode.\r
 \r
-  @param FwOpcode           The input Framework Opcode.\r
-  @param UefiUpdateData     The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+  @param FwOpcode              The input Framework Opcode.\r
+  @param UefiUpdateDataHandle  The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the created opcode.\r
   \r
 **/\r
-EFI_STATUS\r
+UINT8 *\r
 F2UCreateReferenceOpCode (\r
-  IN CONST FRAMEWORK_EFI_IFR_REF       *FwOpcode,\r
-  IN OUT    EFI_HII_UPDATE_DATA        *UefiUpdateData\r
+  IN OUT   VOID                        *UefiUpdateDataHandle,\r
+  IN CONST FRAMEWORK_EFI_IFR_REF       *FwOpcode\r
   )\r
 {\r
   EFI_IFR_REF UOpcode;\r
@@ -358,27 +296,25 @@ F2UCreateReferenceOpCode (
   //\r
   UOpcode.Question.Flags  = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
   \r
-\r
-  return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+  return HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
 }\r
 \r
-\r
 /**\r
   Create UEFI HII "One Of Option" Opcode from a Framework HII "One Of Option" Opcode.\r
 \r
-  @param FwOpcode        The input Framework Opcode.\r
-  @param Width           The size of the One Of Option. 1 bytes or 2 bytes.\r
-  @param UefiUpdateData  The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+  @param FwOpcode              The input Framework Opcode.\r
+  @param Width                 The size of the One Of Option. 1 bytes or 2 bytes.\r
+  @param UefiUpdateDataHandle  The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the created opcode.\r
   \r
 **/\r
-EFI_STATUS\r
+UINT8 *\r
 F2UCreateOneOfOptionOpCode (\r
+  IN OUT   VOID                               *UefiUpdateDataHandle,\r
   IN CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION    *FwOpcode,\r
-  IN       UINTN                              Width,\r
-  IN OUT   EFI_HII_UPDATE_DATA                *UefiUpdateData\r
+  IN       UINTN                              Width\r
   )\r
 {\r
   EFI_IFR_ONE_OF_OPTION UOpcode;\r
@@ -410,64 +346,69 @@ F2UCreateOneOfOptionOpCode (
       \r
     default:\r
       ASSERT (FALSE);\r
-      return EFI_UNSUPPORTED;\r
+      return NULL;\r
   }\r
 \r
-  return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+  return HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
 }\r
 \r
 /**\r
   Create a GUID Opcode EFI_IFR_GUID_OPTIONKEY to map the Framework One Of Option callback key\r
   to a UEFI Question ID. This information is used to invoke the Framework HII Browser Callback\r
-  function. The opcode is appened to UefiUpdateData.\r
+  function. The opcode is appened to UefiUpdateDataHandle.\r
 \r
-  @param    QuestionId      The UEFI Question ID.\r
-  @param    OptionValue     The value of the "One Of Option".\r
-  @param    KeyValue        The Framework "One Of Option" callback key.\r
-  @param    UefiDat         The UEFI Update Data buffer.\r
+  @param    QuestionId            The UEFI Question ID.\r
+  @param    OptionValue           The value of the "One Of Option".\r
+  @param    KeyValue              The Framework "One Of Option" callback key.\r
+  @param    UefiUpdateDataHandle  The UEFI Update Data buffer.\r
 \r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the created opcode.\r
 **/\r
-\r
-EFI_STATUS\r
+UINT8 *\r
 CreateGuidOptionKeyOpCode (\r
+  IN OUT   VOID                        *UefiUpdateDataHandle,\r
   IN EFI_QUESTION_ID                   QuestionId,\r
   IN UINT16                            OptionValue,\r
-  IN EFI_QUESTION_ID                   KeyValue,\r
-  IN OUT    EFI_HII_UPDATE_DATA        *UefiUpdateData\r
+  IN EFI_QUESTION_ID                   KeyValue\r
   )\r
 {\r
-  EFI_IFR_GUID_OPTIONKEY              UOpcode;\r
-\r
-  CopyMem (&UOpcode, &mOptionKeyTemplate, sizeof (EFI_IFR_GUID_OPTIONKEY));\r
-\r
-  UOpcode.QuestionId  = QuestionId;\r
-  CopyMem (&UOpcode.OptionValue, &OptionValue, sizeof (OptionValue)); \r
-  UOpcode.KeyValue = KeyValue;\r
+  EFI_IFR_GUID_OPTIONKEY              *UOpcode;\r
   \r
-  return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+  UOpcode = (EFI_IFR_GUID_OPTIONKEY *) HiiCreateGuidOpCode (\r
+                                         UefiUpdateDataHandle, \r
+                                         &gEfiIfrFrameworkGuid, \r
+                                         NULL,\r
+                                         sizeof (EFI_IFR_GUID_OPTIONKEY)\r
+                                         );\r
+\r
+  UOpcode->ExtendOpCode = EFI_IFR_EXTEND_OP_OPTIONKEY;\r
+  UOpcode->QuestionId  = QuestionId;\r
+  CopyMem (&UOpcode->OptionValue, &OptionValue, sizeof (OptionValue)); \r
+  UOpcode->KeyValue = KeyValue;\r
+\r
+  return (UINT8 *) UOpcode;\r
 }\r
 \r
 /**\r
   Create UEFI HII "One Of" Opcode from a Framework HII "One Of" Opcode.\r
 \r
-  @param ThunkContext The HII Thunk Context.\r
-  @param FwOpcode     The input Framework Opcode.\r
-  @param UefiUpdateData     The newly created UEFI HII opcode is appended to UefiUpdateData.\r
-  @param NextFwOpcode Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of\r
-                      the "One Of Option".\r
-  @param OpcodeCount  The number of Opcode for the complete Framework "One Of" Opcode.\r
+  @param ThunkContext             The HII Thunk Context.\r
+  @param FwOpcode                 The input Framework Opcode.\r
+  @param UefiUpdateDataHandle     The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
+  @param NextFwOpcode             Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of\r
+                                  the "One Of Option".\r
+  @param OpcodeCount              The number of Opcode for the complete Framework "One Of" Opcode.\r
                       \r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the created opcode.\r
   \r
 **/\r
-EFI_STATUS\r
+UINT8 *\r
 F2UCreateOneOfOpCode (\r
+  IN OUT   VOID                        *UefiUpdateDataHandle,\r
   IN       HII_THUNK_CONTEXT           *ThunkContext,\r
   IN CONST FRAMEWORK_EFI_IFR_ONE_OF    *FwOpcode,\r
-  IN OUT   EFI_HII_UPDATE_DATA         *UefiUpdateData,\r
   OUT      FRAMEWORK_EFI_IFR_OP_HEADER **NextFwOpcode,\r
   OUT      UINTN                       *OpcodeCount\r
   )\r
@@ -476,6 +417,8 @@ F2UCreateOneOfOpCode (
   EFI_IFR_ONE_OF                      UOpcode;\r
   FRAMEWORK_EFI_IFR_OP_HEADER         *FwOpHeader;\r
   FRAMEWORK_EFI_IFR_ONE_OF_OPTION     *FwOneOfOp;\r
+  UINT8                               *OpCodeBuffer;\r
+  UINT8                               *OneOfOpCodeBuffer;\r
 \r
   ASSERT (NextFwOpcode != NULL);\r
   ASSERT (OpcodeCount != NULL);\r
@@ -530,9 +473,9 @@ F2UCreateOneOfOpCode (
     }\r
   }\r
   \r
-  Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof (UOpcode), UefiUpdateData);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  OneOfOpCodeBuffer = HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof (UOpcode));\r
+  if (OneOfOpCodeBuffer == NULL) {\r
+    return NULL;\r
   }\r
   *OpcodeCount += 1;\r
 \r
@@ -544,47 +487,48 @@ F2UCreateOneOfOpCode (
 \r
     FwOneOfOp = (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader;\r
       \r
-    Status = F2UCreateOneOfOptionOpCode ((FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->Width, UefiUpdateData);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
+    OpCodeBuffer = F2UCreateOneOfOptionOpCode (UefiUpdateDataHandle, (FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, FwOpcode->Width);\r
+    if (OpCodeBuffer == NULL) {\r
+      return NULL;\r
     }\r
 \r
-    Status = CreateGuidOptionKeyOpCode (UOpcode.Question.QuestionId, FwOneOfOp->Value, FwOneOfOp->Key, UefiUpdateData);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
+    OpCodeBuffer = CreateGuidOptionKeyOpCode (UefiUpdateDataHandle, UOpcode.Question.QuestionId, FwOneOfOp->Value, FwOneOfOp->Key);\r
+    if (OpCodeBuffer == NULL) {\r
+      return NULL;\r
     }\r
+\r
     FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
     *OpcodeCount += 1;\r
   }\r
 \r
-  Status = UCreateEndOfOpcode (UefiUpdateData);\r
-  if (!EFI_ERROR (Status)) {\r
+  OpCodeBuffer = HiiCreateEndOpCode (UefiUpdateDataHandle);\r
+  if (OpCodeBuffer != NULL) {\r
     *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
     *OpcodeCount += 1;\r
   }\r
 \r
-  return Status;\r
+  return OneOfOpCodeBuffer;\r
 }\r
 \r
 /**\r
   Create UEFI HII "Ordered List" Opcode from a Framework HII "Ordered List" Opcode.\r
 \r
-  @param ThunkContext The HII Thunk Context.\r
-  @param FwOpcode     The input Framework Opcode.\r
-  @param UefiUpdateData The newly created UEFI HII opcode is appended to UefiUpdateData.\r
-  @param NextFwOpcode Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of\r
-                      the "Ordered List".\r
-  @param OpcodeCount  The number of Opcode for the complete Framework "Ordered List" Opcode.\r
+  @param ThunkContext         The HII Thunk Context.\r
+  @param FwOpcode             The input Framework Opcode.\r
+  @param UefiUpdateDataHandle The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
+  @param NextFwOpcode         Returns the position of the next Framework Opcode after FRAMEWORK_EFI_IFR_END_ONE_OF_OP of\r
+                              the "Ordered List".\r
+  @param OpcodeCount          The number of Opcode for the complete Framework "Ordered List" Opcode.\r
                       \r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the created opcode.\r
   \r
 **/\r
-EFI_STATUS\r
+UINT8 *\r
 F2UCreateOrderedListOpCode (\r
+  IN OUT    VOID                          *UefiUpdateDataHandle,\r
   IN       HII_THUNK_CONTEXT              *ThunkContext,\r
   IN CONST FRAMEWORK_EFI_IFR_ORDERED_LIST *FwOpcode,\r
-  IN OUT    EFI_HII_UPDATE_DATA           *UefiUpdateData,\r
   OUT      FRAMEWORK_EFI_IFR_OP_HEADER    **NextFwOpcode,\r
   OUT      UINTN                          *OpcodeCount\r
   )\r
@@ -592,7 +536,9 @@ 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
+  FRAMEWORK_EFI_IFR_ONE_OF_OPTION   *FwOneOfOp;\r
+  UINT8                             *OpcodeBuffer;   \r
+  UINT8                             *OrderListOpCode;\r
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
   *OpcodeCount = 0;\r
@@ -642,9 +588,9 @@ F2UCreateOrderedListOpCode (
     }\r
   }\r
  \r
-  Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  OrderListOpCode = HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
+  if (OrderListOpCode == NULL) {\r
+    return NULL;\r
   }\r
   *OpcodeCount += 1;\r
 \r
@@ -653,39 +599,39 @@ F2UCreateOrderedListOpCode (
     //\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, UefiUpdateData);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
+    OpcodeBuffer = F2UCreateOneOfOptionOpCode (UefiUpdateDataHandle, (CONST FRAMEWORK_EFI_IFR_ONE_OF_OPTION *) FwOpHeader, 1);\r
+    if (OpcodeBuffer == NULL) {\r
+      return NULL;\r
     }\r
     FwOpHeader = (FRAMEWORK_EFI_IFR_OP_HEADER *) ((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
     *OpcodeCount += 1;\r
   }\r
 \r
-  Status = UCreateEndOfOpcode (UefiUpdateData);\r
-  if (!EFI_ERROR (Status)) {\r
+  OpcodeBuffer = HiiCreateEndOpCode (UefiUpdateDataHandle);\r
+  if (OpcodeBuffer != NULL) {\r
     *NextFwOpcode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpHeader + FwOpHeader->Length);\r
     *OpcodeCount += 1;\r
   }\r
 \r
-  return Status;\r
+  return OrderListOpCode;\r
 }\r
 \r
 /**\r
   Create UEFI HII CheckBox Opcode from a Framework HII Checkbox Opcode.\r
 \r
-  @param ThunkContext    The HII Thunk Context.\r
-  @param FwOpcode        The input Framework Opcode.\r
-  @param UefiUpdateData  The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+  @param ThunkContext          The HII Thunk Context.\r
+  @param FwOpcode              The input Framework Opcode.\r
+  @param UefiUpdateDataHandle  The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the created opcode.\r
   \r
 **/\r
-EFI_STATUS\r
+UINT8 *\r
 F2UCreateCheckBoxOpCode (\r
+  IN OUT   VOID                        *UefiUpdateDataHandle,\r
   IN       HII_THUNK_CONTEXT           *ThunkContext,\r
-  IN CONST FRAMEWORK_EFI_IFR_CHECKBOX  *FwOpcode,\r
-  IN OUT   EFI_HII_UPDATE_DATA         *UefiUpdateData\r
+  IN CONST FRAMEWORK_EFI_IFR_CHECKBOX  *FwOpcode\r
   )\r
 {\r
   EFI_STATUS       Status;\r
@@ -731,31 +677,33 @@ F2UCreateCheckBoxOpCode (
   //\r
   UOpcode.Flags           = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_DEFAULT | FRAMEWORK_EFI_IFR_FLAG_MANUFACTURING));\r
 \r
-  return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+  return HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
 }\r
 \r
 \r
 /**\r
   Create UEFI HII Numeric Opcode from a Framework HII Numeric Opcode.\r
 \r
-  @param ThunkContext The HII Thunk Context.\r
-  @param FwOpcode     The input Framework Opcode.\r
-  @param UefiUpdateData     The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+  @param ThunkContext            The HII Thunk Context.\r
+  @param FwOpcode                The input Framework Opcode.\r
+  @param UefiUpdateDataHandle    The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the created opcode.\r
   \r
 **/\r
-EFI_STATUS\r
+UINT8 *\r
 F2UCreateNumericOpCode (\r
+  IN OUT   VOID                        *UefiUpdateDataHandle,\r
   IN       HII_THUNK_CONTEXT           *ThunkContext,\r
-  IN CONST FRAMEWORK_EFI_IFR_NUMERIC   *FwOpcode,\r
-  IN OUT    EFI_HII_UPDATE_DATA        *UefiUpdateData\r
+  IN CONST FRAMEWORK_EFI_IFR_NUMERIC   *FwOpcode\r
   )\r
 {\r
   EFI_STATUS      Status;\r
   EFI_IFR_NUMERIC UOpcode;\r
   EFI_IFR_DEFAULT UOpcodeDefault;\r
+  UINT8           *NumbericOpCode;\r
+  UINT8           *OpcodeBuffer;\r
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
 \r
@@ -808,13 +756,13 @@ F2UCreateNumericOpCode (
     default: \r
     {\r
       ASSERT (FALSE);\r
-      return EFI_INVALID_PARAMETER;\r
+      return NULL;\r
     }\r
   }\r
   \r
-  Status = AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  NumbericOpCode = HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
+  if (NumbericOpCode == NULL) {\r
+    return NULL;\r
   }\r
 \r
   //\r
@@ -841,40 +789,51 @@ F2UCreateNumericOpCode (
 \r
   CopyMem (&UOpcodeDefault.Value.u8, &FwOpcode->Default, FwOpcode->Width);\r
 \r
-  Status = AppendToUpdateBuffer ((UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault), UefiUpdateData);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  OpcodeBuffer = HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcodeDefault, sizeof(UOpcodeDefault));\r
+  if (OpcodeBuffer == NULL) {\r
+    return NULL;\r
+  }\r
+\r
+  OpcodeBuffer = HiiCreateEndOpCode (UefiUpdateDataHandle);\r
+  if (OpcodeBuffer == NULL) {\r
+    return NULL;\r
   }\r
-  Status = UCreateEndOfOpcode (UefiUpdateData);\r
 \r
-  return Status;\r
+  return NumbericOpCode;\r
 }\r
 \r
 \r
 /**\r
   Create UEFI HII String Opcode from a Framework HII String Opcode.\r
 \r
-  @param ThunkContext The HII Thunk Context.\r
-  @param FwOpcode     The input Framework Opcode.\r
-  @param UefiUpdateData     The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+  @param ThunkContext             The HII Thunk Context.\r
+  @param FwOpcode                 The input Framework Opcode.\r
+  @param UefiUpdateDataHandle     The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the created opcode.\r
   \r
 **/\r
-EFI_STATUS\r
+UINT8 *\r
 F2UCreateStringOpCode (\r
+  IN OUT   VOID                        *UefiUpdateDataHandle,\r
   IN       HII_THUNK_CONTEXT           *ThunkContext,\r
-  IN CONST FRAMEWORK_EFI_IFR_STRING    *FwOpcode,\r
-  IN OUT    EFI_HII_UPDATE_DATA        *UefiUpdateData\r
+  IN CONST FRAMEWORK_EFI_IFR_STRING    *FwOpcode\r
   )\r
 {\r
   EFI_IFR_STRING UOpcode;\r
+  EFI_STATUS     Status;\r
 \r
   ZeroMem (&UOpcode, sizeof(UOpcode));\r
 \r
   if (FwOpcode->Key == 0) {\r
-    FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, FwOpcode->QuestionId, &UOpcode.Question.QuestionId);\r
+    Status = FwQIdToUefiQId (ThunkContext->FormSet, FwOpcode->Header.OpCode, 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 = AssignQuestionId (FwOpcode->QuestionId, ThunkContext->FormSet);\r
+    }\r
   } else {\r
     UOpcode.Question.QuestionId    = FwOpcode->Key;\r
   }\r
@@ -885,7 +844,6 @@ F2UCreateStringOpCode (
   UOpcode.Question.Header.Prompt = FwOpcode->Prompt;\r
   UOpcode.Question.Header.Help = FwOpcode->Help;\r
 \r
-  UOpcode.Question.QuestionId    = FwOpcode->Key;\r
   UOpcode.Question.Flags  = (UINT8) (FwOpcode->Flags & (FRAMEWORK_EFI_IFR_FLAG_INTERACTIVE | FRAMEWORK_EFI_IFR_FLAG_RESET_REQUIRED));\r
 \r
   UOpcode.Question.VarStoreId    = ThunkContext->FormSet->DefaultVarStoreId;\r
@@ -895,101 +853,88 @@ F2UCreateStringOpCode (
   UOpcode.MaxSize = FwOpcode->MaxSize;\r
   UOpcode.Flags   = EFI_IFR_STRING_MULTI_LINE;\r
 \r
-  return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+  return HiiThunkCreateRawOpCodes (UefiUpdateDataHandle, (UINT8 *) &UOpcode, sizeof(UOpcode));\r
 }\r
 \r
 /**\r
   Create UEFI HII Banner Opcode from a Framework HII Banner Opcode.\r
 \r
-  @param FwOpcode     The input Framework Opcode.\r
-  @param UefiUpdateData     The newly created UEFI HII opcode is appended to UefiUpdateData.\r
+  @param FwOpcode                 The input Framework Opcode.\r
+  @param UefiUpdateDataHandle     The newly created UEFI HII opcode is appended to UefiUpdateDataHandle.\r
 \r
-  @retval EFI_SUCCESS           The UEFI HII opcode is created successfully and appended to UefiUpdateData.\r
-  @retval EFI_OUT_OF_RESOURCE   There is not enough resource.\r
+  @retval NULL   There is not enough space left in Buffer to add the opcode.\r
+  @retval Other  A pointer to the created opcode.\r
   \r
 **/\r
-EFI_STATUS\r
+UINT8 *\r
 F2UCreateBannerOpCode (\r
-  IN CONST FRAMEWORK_EFI_IFR_BANNER    *FwOpcode,\r
-  IN OUT    EFI_HII_UPDATE_DATA        *UefiUpdateData\r
+  IN OUT   VOID                        *UefiUpdateDataHandle,\r
+  IN CONST FRAMEWORK_EFI_IFR_BANNER    *FwOpcode\r
   )\r
 {\r
-  EFI_IFR_GUID_BANNER UOpcode;\r
+  EFI_IFR_GUID_BANNER *UOpcode;\r
 \r
-  ZeroMem (&UOpcode, sizeof(UOpcode));\r
+  UOpcode = (EFI_IFR_GUID_BANNER *) HiiCreateGuidOpCode (\r
+                                      UefiUpdateDataHandle, \r
+                                      &gEfiIfrTianoGuid, \r
+                                      NULL,\r
+                                      sizeof (EFI_IFR_GUID_BANNER)\r
+                                      );  \r
 \r
-  UOpcode.Header.Length = sizeof(UOpcode);\r
-  UOpcode.Header.OpCode = EFI_IFR_GUID_OP;\r
+  UOpcode->ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
+  UOpcode->Title          = FwOpcode->Title;\r
+  UOpcode->LineNumber     = FwOpcode->LineNumber;\r
+  UOpcode->Alignment      = FwOpcode->Alignment;\r
 \r
-  CopyMem (&UOpcode.Guid, &mTianoExtendedOpcodeGuid, sizeof (EFI_GUID));\r
-  UOpcode.ExtendOpCode = EFI_IFR_EXTEND_OP_BANNER;\r
-  UOpcode.Title          = FwOpcode->Title;\r
-  UOpcode.LineNumber     = FwOpcode->LineNumber;\r
-  UOpcode.Alignment      = FwOpcode->Alignment;\r
-\r
-  return AppendToUpdateBuffer ((UINT8 *) &UOpcode, sizeof(UOpcode), UefiUpdateData);\r
+  return (UINT8 *) UOpcode;\r
 }\r
 \r
 /**\r
-  Create a EFI_HII_UPDATE_DATA structure used to call IfrLibUpdateForm.\r
+  Create a Hii Update data Handle used to call IfrLibUpdateForm.\r
 \r
-  @param ThunkContext   The HII Thunk Context.\r
-  @param FwUpdateData   The Framework Update Data.\r
-  @param UefiUpdateData The UEFI Update Data.\r
+  @param ThunkContext         The HII Thunk Context.\r
+  @param FwUpdateData         The Framework Update Data.\r
+  @param UefiUpdateData       The UEFI Update Data.\r
 \r
   @retval EFI_SUCCESS       The UEFI Update Data is created successfully.\r
   @retval EFI_UNSUPPORTED   There is unsupported opcode in FwUpdateData.\r
   @retval EFI_OUT_OF_RESOURCES There is not enough resource.\r
 **/\r
-EFI_STATUS\r
+EFI_STATUS \r
 FwUpdateDataToUefiUpdateData (\r
   IN       HII_THUNK_CONTEXT                *ThunkContext,\r
   IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA    *FwUpdateData,\r
-  OUT      EFI_HII_UPDATE_DATA              **UefiUpdateData\r
+  IN       VOID                             *UefiOpCodeHandle\r
   )\r
 {\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
-\r
-  UefiOpCode = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
-  if (UefiOpCode == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-  \r
-  UefiOpCode->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
-  if (UefiOpCode->Data == NULL) {\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  UefiOpCode->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
-  UefiOpCode->Offset = 0;\r
+  UINT8                                *OpCodeBuffer;\r
 \r
   FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *) &FwUpdateData->Data;\r
 \r
   for (Index = 0; Index < FwUpdateData->DataCount; Index += DataCount) {\r
     switch (FwOpCode->OpCode) {\r
       case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
-        Status = F2UCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE  *) FwOpCode, UefiOpCode);\r
+        OpCodeBuffer = HiiCreateSubTitleOpCode (UefiOpCodeHandle, ((FRAMEWORK_EFI_IFR_SUBTITLE  *) FwOpCode)->SubTitle, 0, 0, 0);\r
         DataCount = 1;\r
         break;\r
         \r
       case FRAMEWORK_EFI_IFR_TEXT_OP:\r
-        Status = F2UCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT  *) FwOpCode, UefiOpCode);  \r
+        OpCodeBuffer = F2UCreateTextOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_TEXT  *) FwOpCode);  \r
         DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_REF_OP:\r
-        Status = F2UCreateReferenceOpCode ((FRAMEWORK_EFI_IFR_REF *) FwOpCode, UefiOpCode);  \r
+        OpCodeBuffer = F2UCreateReferenceOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_REF *) FwOpCode);  \r
         DataCount = 1;\r
         break;\r
         \r
       case FRAMEWORK_EFI_IFR_ONE_OF_OP:\r
-        Status = F2UCreateOneOfOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
-        if (!EFI_ERROR (Status)) {\r
+        OpCodeBuffer = F2UCreateOneOfOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ONE_OF *) FwOpCode, &NextFwOpCode, &DataCount);\r
+        if (OpCodeBuffer != NULL) {\r
           FwOpCode = NextFwOpCode;\r
           //\r
           // FwOpCode is already updated to point to the next opcode.\r
@@ -999,8 +944,8 @@ FwUpdateDataToUefiUpdateData (
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_ORDERED_LIST_OP:\r
-        Status = F2UCreateOrderedListOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, UefiOpCode, &NextFwOpCode, &DataCount);\r
-        if (!EFI_ERROR (Status)) {\r
+        OpCodeBuffer = F2UCreateOrderedListOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_ORDERED_LIST *) FwOpCode, &NextFwOpCode, &DataCount);\r
+        if (OpCodeBuffer != NULL) {\r
           FwOpCode = NextFwOpCode;\r
           //\r
           // FwOpCode is already updated to point to the next opcode.\r
@@ -1010,27 +955,27 @@ FwUpdateDataToUefiUpdateData (
         break;\r
         \r
       case FRAMEWORK_EFI_IFR_CHECKBOX_OP:\r
-        Status = F2UCreateCheckBoxOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode, UefiOpCode);  \r
+        OpCodeBuffer = F2UCreateCheckBoxOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_CHECKBOX *) FwOpCode);  \r
         DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_STRING_OP:\r
-        Status = F2UCreateStringOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode, UefiOpCode);  \r
+        OpCodeBuffer = F2UCreateStringOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_STRING *) FwOpCode);  \r
         DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_BANNER_OP:\r
-        Status = F2UCreateBannerOpCode ((FRAMEWORK_EFI_IFR_BANNER *) FwOpCode, UefiOpCode);  \r
+        OpCodeBuffer = F2UCreateBannerOpCode (UefiOpCodeHandle, (FRAMEWORK_EFI_IFR_BANNER *) FwOpCode);  \r
         DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_END_ONE_OF_OP:\r
-        Status = UCreateEndOfOpcode (UefiOpCode);\r
+        OpCodeBuffer = HiiCreateEndOpCode (UefiOpCodeHandle);\r
         DataCount = 1;\r
         break;\r
 \r
       case FRAMEWORK_EFI_IFR_NUMERIC_OP:\r
-        Status = F2UCreateNumericOpCode (ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode, UefiOpCode);\r
+        OpCodeBuffer = F2UCreateNumericOpCode (UefiOpCodeHandle, ThunkContext, (FRAMEWORK_EFI_IFR_NUMERIC *) FwOpCode);\r
         DataCount = 1;\r
         break;\r
 \r
@@ -1039,17 +984,13 @@ FwUpdateDataToUefiUpdateData (
         return EFI_UNSUPPORTED;\r
     }\r
 \r
-    if (EFI_ERROR (Status)) {\r
-      FreePool (UefiOpCode->Data);\r
-      FreePool (UefiOpCode);\r
-      return Status;\r
+    if (OpCodeBuffer == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
     FwOpCode = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FwOpCode + FwOpCode->Length);\r
   }\r
 \r
-  *UefiUpdateData = UefiOpCode;\r
-  \r
   return EFI_SUCCESS;\r
 }\r
 \r
index 807e8396d032948453e85dfee94a6feba19f169e..43d1b9c0f40f67f3c417fe4ec7b4c469a06e18dd 100644 (file)
@@ -487,14 +487,13 @@ ThunkSendForm (
   Rountine used to display a generic dialog interface and return \r
   the Key or Input from user input.\r
 \r
-  @param NumberOfLines The number of lines for the dialog box.\r
+  @param LinesNumber   The number of lines for the dialog box.\r
   @param HotKey        Defines if a single character is parsed (TRUE) and returned in KeyValue\r
                        or if a string is returned in StringBuffer.\r
   @param MaximumStringSize The maximum size in bytes of a typed-in string.\r
-  @param StringBuffer  On return contains the typed-in string if HotKey\r
-         is FALSE.\r
-  @param KeyValue      The EFI_INPUT_KEY value returned if HotKey is TRUE.\r
-  @param String        The pointer to the first string in the list of strings\r
+  @param StringBuffer  On return contains the typed-in string if HotKey is FALSE.\r
+  @param Key           The EFI_INPUT_KEY value returned if HotKey is TRUE.\r
+  @param FirstString   The pointer to the first string in the list of strings\r
                        that comprise the dialog box.\r
   @param ...           A series of NumberOfLines text strings that will be used\r
                        to construct the dialog box.\r
@@ -505,29 +504,182 @@ ThunkSendForm (
 EFI_STATUS\r
 EFIAPI \r
 ThunkCreatePopUp (\r
-  IN  UINTN                           NumberOfLines,\r
+  IN  UINTN                           LinesNumber,\r
   IN  BOOLEAN                         HotKey,\r
   IN  UINTN                           MaximumStringSize,\r
   OUT CHAR16                          *StringBuffer,\r
-  OUT EFI_INPUT_KEY                   *KeyValue,\r
-  IN  CHAR16                          *String,\r
+  OUT EFI_INPUT_KEY                   *Key,\r
+  IN  CHAR16                          *FirstString,\r
   ...\r
   )\r
 {\r
-  EFI_STATUS                        Status;\r
-  VA_LIST                           Marker;\r
-\r
-  if (HotKey != TRUE) {\r
+  VA_LIST                          Args;\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *ConOut;\r
+  EFI_SIMPLE_TEXT_OUTPUT_MODE      SavedConsoleMode;\r
+  UINTN                            Columns;\r
+  UINTN                            Rows;\r
+  UINTN                            Column;\r
+  UINTN                            Row;\r
+  UINTN                            NumberOfLines;\r
+  UINTN                            MaxLength;\r
+  CHAR16                           *String;\r
+  UINTN                            Length;\r
+  CHAR16                           *Line;\r
+  UINTN                            EventIndex;\r
+\r
+  if (!HotKey) {\r
     return EFI_UNSUPPORTED;\r
   }\r
+  \r
+  if (MaximumStringSize == 0) {\r
+    //\r
+    // Blank strint to output\r
+    //\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // Determine the length of the longest line in the popup and the the total \r
+  // number of lines in the popup\r
+  //\r
+  MaxLength = StrLen (FirstString);\r
+  NumberOfLines = 1;\r
+  VA_START (Args, FirstString);\r
+  while ((String = VA_ARG (Args, CHAR16 *)) != NULL) {\r
+    MaxLength = MAX (MaxLength, StrLen (String));\r
+    NumberOfLines++;\r
+  }\r
+  VA_END (Args);\r
+\r
+  //\r
+  // If the total number of lines in the popup is not same to the input NumberOfLines\r
+  // the parameter is not valid. Not check.\r
+  //\r
+  //  if (NumberOfLines != LinesNumber) {\r
+  //    return EFI_INVALID_PARAMETER;\r
+  //  }\r
+\r
+  //\r
+  // If the maximum length of all the strings is not same to the input MaximumStringSize\r
+  // the parameter is not valid. Not check.\r
+  //\r
+  // if (MaxLength != MaximumStringSize) {\r
+  //   return EFI_INVALID_PARAMETER;\r
+  // }\r
 \r
-  VA_START (Marker, String);\r
+  //\r
+  // Cache a pointer to the Simple Text Output Protocol in the EFI System Table\r
+  //\r
+  ConOut = gST->ConOut;\r
   \r
-  Status = IfrLibCreatePopUp2 (NumberOfLines, KeyValue, String, Marker);\r
+  //\r
+  // Save the current console cursor position and attributes\r
+  //\r
+  CopyMem (&SavedConsoleMode, ConOut->Mode, sizeof (SavedConsoleMode));\r
+\r
+  //\r
+  // Retrieve the number of columns and rows in the current console mode\r
+  //\r
+  ConOut->QueryMode (ConOut, SavedConsoleMode.Mode, &Columns, &Rows);\r
+\r
+  //\r
+  // Disable cursor and set the foreground and background colors specified by Attribute\r
+  //\r
+  ConOut->EnableCursor (ConOut, FALSE);\r
+  ConOut->SetAttribute (ConOut, EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE);\r
+\r
+  //\r
+  // Limit NumberOfLines to height of the screen minus 3 rows for the box itself\r
+  //\r
+  NumberOfLines = MIN (NumberOfLines, Rows - 3);\r
+\r
+  //\r
+  // Limit MaxLength to width of the screen minus 2 columns for the box itself\r
+  //\r
+  MaxLength = MIN (MaxLength, Columns - 2);\r
 \r
-  VA_END (Marker);\r
+  //\r
+  // Compute the starting row and starting column for the popup\r
+  //\r
+  Row    = (Rows - (NumberOfLines + 3)) / 2;\r
+  Column = (Columns - (MaxLength + 2)) / 2;\r
+\r
+  //\r
+  // Allocate a buffer for a single line of the popup with borders and a Null-terminator\r
+  //\r
+  Line = AllocateZeroPool ((MaxLength + 3) * sizeof (CHAR16));\r
+  ASSERT (Line != NULL);\r
+\r
+  //\r
+  // Draw top of popup box   \r
+  //\r
+  SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);\r
+  Line[0]             = BOXDRAW_DOWN_RIGHT;\r
+  Line[MaxLength + 1] = BOXDRAW_DOWN_LEFT;\r
+  Line[MaxLength + 2] = L'\0';\r
+  ConOut->SetCursorPosition (ConOut, Column, Row++);\r
+  ConOut->OutputString (ConOut, Line);\r
+\r
+  //\r
+  // Draw middle of the popup with strings\r
+  //\r
+  VA_START (Args, FirstString);\r
+  String = FirstString;\r
+  while ((String != NULL) && (NumberOfLines > 0)) {\r
+    Length = StrLen (String);\r
+    SetMem16 (Line, (MaxLength + 2) * 2, L' ');\r
+    if (Length <= MaxLength) {\r
+      //\r
+      // Length <= MaxLength\r
+      //\r
+      CopyMem (Line + 1 + (MaxLength - Length) / 2, String , Length * sizeof (CHAR16));\r
+    } else {\r
+      //\r
+      // Length > MaxLength\r
+      //\r
+      CopyMem (Line + 1, String + (Length - MaxLength) / 2 , MaxLength * sizeof (CHAR16));\r
+    }\r
+    Line[0]             = BOXDRAW_VERTICAL;\r
+    Line[MaxLength + 1] = BOXDRAW_VERTICAL;\r
+    Line[MaxLength + 2] = L'\0';\r
+    ConOut->SetCursorPosition (ConOut, Column, Row++);\r
+    ConOut->OutputString (ConOut, Line);\r
+    String = VA_ARG (Args, CHAR16 *);\r
+    NumberOfLines--;\r
+  }\r
+  VA_END (Args);\r
+\r
+  //\r
+  // Draw bottom of popup box\r
+  //\r
+  SetMem16 (Line, (MaxLength + 2) * 2, BOXDRAW_HORIZONTAL);\r
+  Line[0]             = BOXDRAW_UP_RIGHT;\r
+  Line[MaxLength + 1] = BOXDRAW_UP_LEFT;\r
+  Line[MaxLength + 2] = L'\0';\r
+  ConOut->SetCursorPosition (ConOut, Column, Row++);\r
+  ConOut->OutputString (ConOut, Line);\r
+\r
+  //\r
+  // Free the allocated line buffer\r
+  //\r
+  FreePool (Line);\r
+\r
+  //\r
+  // Restore the cursor visibility, position, and attributes\r
+  //\r
+  ConOut->EnableCursor      (ConOut, SavedConsoleMode.CursorVisible);\r
+  ConOut->SetCursorPosition (ConOut, SavedConsoleMode.CursorColumn, SavedConsoleMode.CursorRow);\r
+  ConOut->SetAttribute      (ConOut, SavedConsoleMode.Attribute);\r
+\r
+  //\r
+  // Wait for a keystroke\r
+  //\r
+  if (Key != NULL) {\r
+    gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);\r
+    gST->ConIn->ReadKeyStroke (gST->ConIn, Key);\r
+  }\r
   \r
-  return Status;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 /** \r