]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Refine the code logic for browser and display engine.
authorEric Dong <eric.dong@intel.com>
Mon, 12 Aug 2013 04:49:48 +0000 (04:49 +0000)
committerydong10 <ydong10@6f19259b-4bc3-4df7-8a09-765794883524>
Mon, 12 Aug 2013 04:49:48 +0000 (04:49 +0000)
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14543 6f19259b-4bc3-4df7-8a09-765794883524

20 files changed:
MdeModulePkg/Include/Library/CustomizedDisplayLib.h
MdeModulePkg/Include/Protocol/FormBrowserEx2.h
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLib.c
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.c
MdeModulePkg/Library/CustomizedDisplayLib/CustomizedDisplayLibInternal.h
MdeModulePkg/Universal/DisplayEngineDxe/DisplayEngineDxe.inf
MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.c
MdeModulePkg/Universal/DisplayEngineDxe/FormDisplay.h
MdeModulePkg/Universal/DisplayEngineDxe/InputHandler.c
MdeModulePkg/Universal/DisplayEngineDxe/Print.c [deleted file]
MdeModulePkg/Universal/SetupBrowserDxe/Colors.h [deleted file]
MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c [deleted file]
MdeModulePkg/Universal/SetupBrowserDxe/Print.c [deleted file]
MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c [deleted file]
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserDxe.inf
MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.uni [deleted file]
MdeModulePkg/Universal/SetupBrowserDxe/Ui.c [deleted file]
MdeModulePkg/Universal/SetupBrowserDxe/Ui.h [deleted file]

index 9644d9331c93582dcb88c56ceb16d0cb2dc00e55..31e1091e8889e9c31fd89be54352f280aa2e69c2 100644 (file)
@@ -19,7 +19,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 /**\r
 +------------------------------------------------------------------------------+\r
-?                                 Setup Page                                  ?\r
+|                                 Setup Page                                   |\r
 +------------------------------------------------------------------------------+\r
 \r
 Statement\r
@@ -31,8 +31,8 @@ Statement
 \r
 \r
 +------------------------------------------------------------------------------+\r
-?F1=Scroll Help                 F9=Reset to Defaults        F10=Save and Exit ?\r
-| ^"=Move Highlight          <Spacebar> Toggles Checkbox   Esc=Discard Changes |\r
+|                                F9=Reset to Defaults        F10=Save          |\r
+| ^"=Move Highlight          <Spacebar> Toggles Checkbox     Esc=Exit          |\r
 +------------------------------------------------------------------------------+\r
   StatusBar\r
 **/\r
index 817f80d4c4fa7094c58e8f5ac5329f7ea1b3118c..105ac0308fa3fff6d3514ac348a2fa04393bc1a4 100644 (file)
@@ -2,7 +2,7 @@
   Extension Form Browser Protocol provides the services that can be used to \r
   register the different hot keys for the standard Browser actions described in UEFI specification.\r
 \r
-Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2013, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials are licensed and made available under \r
 the terms and conditions of the BSD License that accompanies this distribution.  \r
 The full text of the license may be found at\r
@@ -62,8 +62,8 @@ typedef struct {
 \r
   EFI_HII_HANDLE  HiiHandle;\r
   EFI_GUID        FormSetGuid;\r
-  UINT16          FormId;\r
-  UINT16          QuestionId;\r
+  EFI_FORM_ID     FormId;\r
+  EFI_QUESTION_ID QuestionId;\r
 } FORM_ENTRY_INFO;\r
 \r
 #define FORM_ENTRY_INFO_FROM_LINK(a)  CR (a, FORM_ENTRY_INFO, Link, FORM_ENTRY_INFO_SIGNATURE)\r
index 84df7cc2499762d7de944a4767c214a46ed4f0c1..aa28146b0255405b8c846870e7d0fd53c4e824d2 100644 (file)
@@ -18,7 +18,7 @@ EFI_GUID          gCustomizedDisplayLibGuid = { 0x99fdc8fd, 0x849b, 0x4eba, { 0x
 \r
 EFI_HII_HANDLE    mCDLStringPackHandle;\r
 UINT16            gClassOfVfr;                 // Formset class information\r
-UINT16            gLastClassOfVfr = 0;\r
+BOOLEAN           gLibIsFirstForm = TRUE;\r
 BANNER_DATA       *gBannerData;\r
 \r
 UINTN             gFooterHeight;\r
@@ -37,8 +37,8 @@ Statement
 \r
 \r
 +------------------------------------------------------------------------------+\r
-| F1=Scroll Help                 F9=Reset to Defaults        F10=Save and Exit |\r
-| ^"=Move Highlight          <Spacebar> Toggles Checkbox   Esc=Discard Changes |\r
+|                                F9=Reset to Defaults        F10=Save          |\r
+| ^"=Move Highlight          <Spacebar> Toggles Checkbox     Esc=Exit          |\r
 +------------------------------------------------------------------------------+\r
   StatusBar\r
 **/\r
@@ -74,9 +74,6 @@ DisplayPageFrame (
   }\r
 \r
   gClassOfVfr = FORMSET_CLASS_PLATFORM_SETUP;\r
-  if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
-    gClassOfVfr = FORMSET_CLASS_MODEL_PAGE;\r
-  }\r
 \r
   ProcessExternedOpcode(FormData);\r
 \r
@@ -84,7 +81,7 @@ DisplayPageFrame (
   // Calculate the ScreenForStatement.\r
   //\r
   ScreenForStatement->BottomRow   = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight;\r
-  if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE) {\r
+  if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
     ScreenForStatement->TopRow    = gScreenDimensions.TopRow + FRONT_PAGE_HEADER_HEIGHT;\r
   } else {\r
     ScreenForStatement->TopRow    = gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT;\r
@@ -92,42 +89,30 @@ DisplayPageFrame (
   ScreenForStatement->LeftColumn  = gScreenDimensions.LeftColumn;\r
   ScreenForStatement->RightColumn = gScreenDimensions.RightColumn;\r
 \r
-  //\r
-  // If Last Vfr Class is same to current Vfr Class, \r
-  // they will have the same page frame. So, Page Frame is not required to be repainted.\r
-  //\r
-  if (gLastClassOfVfr == gClassOfVfr) {\r
-    UpdateStatusBar(NV_UPDATE_REQUIRED, FormData->SettingChangedFlag);\r
-    PrintFormTitle(FormData);\r
-    return EFI_SUCCESS;\r
+  if ((gLibIsFirstForm) || ((FormData->Attribute & HII_DISPLAY_MODAL) != 0)) {\r
+    //\r
+    // Ensure we are in Text mode\r
+    //\r
+    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
+    ClearLines (0, gScreenDimensions.RightColumn, 0, gScreenDimensions.BottomRow, KEYHELP_BACKGROUND);\r
+    gLibIsFirstForm = FALSE;\r
   }\r
 \r
   //\r
-  // Record last ClassOfVfr and Streen Information.\r
+  // Don't print frame for modal form.\r
   //\r
-  gLastClassOfVfr = gClassOfVfr;\r
-\r
-  //\r
-  // Ensure we are in Text mode\r
-  //\r
-  gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-\r
-  ClearLines (0, gScreenDimensions.RightColumn, 0, gScreenDimensions.BottomRow, KEYHELP_BACKGROUND);\r
-\r
   if ((FormData->Attribute & HII_DISPLAY_MODAL) != 0) {\r
     return EFI_SUCCESS;\r
   }\r
 \r
-  if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE) {\r
+  if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
     PrintBannerInfo (FormData);\r
   }\r
 \r
-  PrintFramework ();\r
+  PrintFramework (FormData);\r
 \r
   UpdateStatusBar(NV_UPDATE_REQUIRED, FormData->SettingChangedFlag);\r
 \r
-  PrintFormTitle(FormData);\r
-\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -213,7 +198,7 @@ RefreshKeyHelp (
     if (!Selected) {\r
         PrintHotKeyHelpString (FormData);\r
 \r
-      if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
+      if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
         PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
       }\r
 \r
@@ -269,7 +254,7 @@ RefreshKeyHelp (
   case EFI_IFR_CHECKBOX_OP:\r
     PrintHotKeyHelpString (FormData);\r
 \r
-    if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
+    if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
       PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
     }\r
 \r
@@ -287,7 +272,7 @@ RefreshKeyHelp (
      if (!Selected) {\r
       PrintHotKeyHelpString (FormData);\r
 \r
-      if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
+      if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
         PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
       }\r
 \r
@@ -584,7 +569,7 @@ FormExitPolicy (
   VOID\r
   )\r
 {\r
-  return (gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE ? FALSE : TRUE;\r
+  return gClassOfVfr == FORMSET_CLASS_FRONT_PAGE ? FALSE : TRUE;\r
 }\r
 \r
 /**\r
@@ -883,7 +868,7 @@ ClearDisplayPage (
 {\r
   gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
   gST->ConOut->ClearScreen (gST->ConOut);\r
-  gLastClassOfVfr = 0;\r
+  gLibIsFirstForm = TRUE;\r
 }\r
 \r
 /**\r
index 9b6ddb517fbfe8171d056abd5142083ba4caf687..b6b4055b6d260ca2e584cf81454e4f10a627c890 100644 (file)
@@ -130,20 +130,35 @@ PrintBannerInfo (
 }\r
 \r
 /**\r
+  Print framework and form title for a page.\r
 \r
-  Print framework for a page.\r
-  \r
+  @param[in]  FormData             Form Data to be shown in Page\r
 **/\r
 VOID\r
 PrintFramework (\r
-  VOID\r
+  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
   )\r
 {\r
   UINTN                  Index;\r
   CHAR16                 Character;\r
   CHAR16                 *Buffer;\r
   UINTN                  Row;\r
+  CHAR16                 *TitleStr;\r
 \r
+  if (gClassOfVfr != FORMSET_CLASS_PLATFORM_SETUP) {\r
+    //\r
+    // Only Setup page needs Framework\r
+    //\r
+    ClearLines (\r
+      gScreenDimensions.LeftColumn,\r
+      gScreenDimensions.RightColumn,\r
+      gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight,\r
+      gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1,\r
+      KEYHELP_TEXT | KEYHELP_BACKGROUND\r
+      );\r
+    return;\r
+  }\r
+    \r
   Buffer = AllocateZeroPool (0x10000);\r
   ASSERT (Buffer != NULL);\r
   Character = BOXDRAW_HORIZONTAL;\r
@@ -151,108 +166,30 @@ PrintFramework (
     Buffer[Index] = Character;\r
   }\r
 \r
-  ClearLines (\r
-    gScreenDimensions.LeftColumn,\r
-    gScreenDimensions.RightColumn,\r
-    gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight,\r
-    gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1,\r
-    KEYHELP_TEXT | KEYHELP_BACKGROUND\r
-    );\r
-\r
-  if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) == FORMSET_CLASS_PLATFORM_SETUP) {\r
-    ClearLines (\r
-      gScreenDimensions.LeftColumn,\r
-      gScreenDimensions.RightColumn,\r
-      gScreenDimensions.TopRow,\r
-      gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 1,\r
-      TITLE_TEXT | TITLE_BACKGROUND\r
-      );\r
-    //\r
-    // Print Top border line\r
-    // +------------------------------------------------------------------------------+\r
-    // ?                                                                             ?\r
-    // +------------------------------------------------------------------------------+\r
-    //\r
-    Character = BOXDRAW_DOWN_RIGHT;\r
-\r
-    PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-    PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
-    Character = BOXDRAW_DOWN_LEFT;\r
-    PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-\r
-    Character = BOXDRAW_VERTICAL;\r
-    for (Row = gScreenDimensions.TopRow + 1; Row <= gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 2; Row++) {\r
-      PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
-      PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
-    }\r
-\r
-    Character = BOXDRAW_UP_RIGHT;\r
-    PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 1, Character);\r
-    PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
-    Character = BOXDRAW_UP_LEFT;\r
-    PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-\r
-    //\r
-    // Print Bottom border line\r
-    // +------------------------------------------------------------------------------+\r
-    // ?                                                                             ?\r
-    // +------------------------------------------------------------------------------+\r
-    //\r
-    Character = BOXDRAW_DOWN_RIGHT;\r
-    PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight, Character);\r
-\r
-    PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
-    Character = BOXDRAW_DOWN_LEFT;\r
-    PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-    Character = BOXDRAW_VERTICAL;\r
-    for (Row = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
-         Row <= gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
-         Row++\r
-        ) {\r
-      PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
-      PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
-    }\r
-\r
-    Character = BOXDRAW_UP_RIGHT;\r
-    PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1, Character);\r
-\r
-    PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
-\r
-    Character = BOXDRAW_UP_LEFT;\r
-    PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
-  }\r
-  \r
-  FreePool (Buffer);\r
-}\r
-\r
-/**\r
-  Print the form title.\r
+  //\r
+  // Print Top border line\r
+  // +------------------------------------------------------------------------------+\r
+  // ?                                                                             ?\r
+  // +------------------------------------------------------------------------------+\r
+  //\r
+  gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
+  Character = BOXDRAW_DOWN_RIGHT;\r
 \r
-  @param[in]  FormData             Form Data to be shown in Page\r
+  PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow, Character);\r
+  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
 \r
-**/\r
-VOID\r
-PrintFormTitle (\r
-  IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
-  )\r
-{\r
-  CHAR16                 *TitleStr;\r
+  Character = BOXDRAW_DOWN_LEFT;\r
+  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
 \r
-  if ((gClassOfVfr & FORMSET_CLASS_PLATFORM_SETUP) != FORMSET_CLASS_PLATFORM_SETUP) {  \r
-    //\r
-    // Only Setup Page need Title.\r
-    //\r
-    return;\r
+  Character = BOXDRAW_VERTICAL;\r
+  for (Row = gScreenDimensions.TopRow + 1; Row <= gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 2; Row++) {\r
+    PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
+    PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
   }\r
   \r
-  TitleStr = LibGetToken (FormData->FormTitle, FormData->HiiHandle);\r
-  ASSERT (TitleStr != NULL);\r
-  \r
-  gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
-\r
+  //\r
+  // Print Form Title\r
+  //\r
   ClearLines (\r
     gScreenDimensions.LeftColumn + 1,\r
     gScreenDimensions.RightColumn - 1,\r
@@ -261,13 +198,53 @@ PrintFormTitle (
     TITLE_TEXT | TITLE_BACKGROUND\r
     );\r
 \r
+  TitleStr = LibGetToken (FormData->FormTitle, FormData->HiiHandle);\r
+  ASSERT (TitleStr != NULL);\r
   PrintStringAt (\r
     (gScreenDimensions.RightColumn + gScreenDimensions.LeftColumn - LibGetStringWidth (TitleStr) / 2) / 2,\r
     gScreenDimensions.TopRow + 1,\r
     TitleStr\r
     );\r
-\r
   FreePool (TitleStr);\r
+\r
+  Character = BOXDRAW_UP_RIGHT;\r
+  PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 1, Character);\r
+  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
+\r
+  Character = BOXDRAW_UP_LEFT;\r
+  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
+\r
+  //\r
+  // Print Bottom border line\r
+  // +------------------------------------------------------------------------------+\r
+  // ?                                                                             ?\r
+  // +------------------------------------------------------------------------------+\r
+  //\r
+  Character = BOXDRAW_DOWN_RIGHT;\r
+  PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight, Character);\r
+\r
+  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
+\r
+  Character = BOXDRAW_DOWN_LEFT;\r
+  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
+  Character = BOXDRAW_VERTICAL;\r
+  for (Row = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight + 1;\r
+       Row <= gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 2;\r
+       Row++\r
+      ) {\r
+    PrintCharAt (gScreenDimensions.LeftColumn, Row, Character);\r
+    PrintCharAt (gScreenDimensions.RightColumn - 1, Row, Character);\r
+  }\r
+\r
+  Character = BOXDRAW_UP_RIGHT;\r
+  PrintCharAt (gScreenDimensions.LeftColumn, gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - 1, Character);\r
+\r
+  PrintStringAt ((UINTN) -1, (UINTN) -1, Buffer);\r
+\r
+  Character = BOXDRAW_UP_LEFT;\r
+  PrintCharAt ((UINTN) -1, (UINTN) -1, Character);\r
+  \r
+  FreePool (Buffer);\r
 }\r
 \r
 /**\r
@@ -300,7 +277,7 @@ ProcessUserOpcode(
           //\r
           // Only in front page form set, we care about the banner data.\r
           //\r
-          if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE) {\r
+          if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
             //\r
             // Initialize Driver private data\r
             //\r
index ab197cfe722ba232fc7a0065fe800bdb44aa9c04..ccbd45f4259440b9f58612425bf99fb78bcefc04 100644 (file)
@@ -57,7 +57,6 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #define FORMSET_CLASS_PLATFORM_SETUP         0x0001\r
 #define FORMSET_CLASS_FRONT_PAGE             0x0002\r
-#define FORMSET_CLASS_MODEL_PAGE             0x0004\r
 \r
 \r
 #define FRONT_PAGE_HEADER_HEIGHT      6\r
@@ -130,23 +129,12 @@ PrintBannerInfo (
   );\r
 \r
 /**\r
-\r
-  Print framework for a page.\r
-  \r
-**/\r
-VOID\r
-PrintFramework (\r
-  VOID\r
-  );\r
-  \r
-/**\r
-  Print the form title.\r
+  Print framework and form title for a page.\r
 \r
   @param[in]  FormData             Form Data to be shown in Page\r
-\r
 **/\r
 VOID\r
-PrintFormTitle (\r
+PrintFramework (\r
   IN FORM_DISPLAY_ENGINE_FORM       *FormData\r
   );\r
 \r
index 2170369d9e8cac26d441a21c24d0f9ed44fd2a9a..323fcadb85513a3dd7f2c78abcedfe6f1ceba375 100644 (file)
@@ -32,7 +32,6 @@
   FormDisplayStr.uni\r
   FormDisplay.c\r
   FormDisplay.h\r
-  Print.c\r
   ProcessOptions.c\r
   InputHandler.c\r
   \r
@@ -65,6 +64,3 @@
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowserGrayOutTextStatement            ## CONSUMES\r
   gEfiMdeModulePkgTokenSpaceGuid.PcdBrowerGrayOutReadOnlyMenu              ## CONSUMES\r
 \r
-[BuildOptions] \r
-  MSFT:*_*_*_CC_FLAGS     = /Od \r
-\r
index f6322293fc032c1774870adb99699abcf29c8d48..a07cc75a47c2c44755a268bf5119d0f1cf9695c4 100644 (file)
@@ -97,9 +97,9 @@ EFI_GUID  gDisplayEngineGuid = {
   0xE38C1029, 0xE38F, 0x45b9, {0x8F, 0x0D, 0xE2, 0xE6, 0x0B, 0xC9, 0xB2, 0x62}\r
 };\r
 \r
+FORM_ENTRY_INFO               gFormEntryInfo;\r
 UINTN                         gSequence;\r
 EFI_SCREEN_DESCRIPTOR         gStatementDimensions;\r
-EFI_SCREEN_DESCRIPTOR         gOldStatementDimensions = {0};\r
 BOOLEAN                       mStatementLayoutIsChanged = TRUE;\r
 USER_INPUT                    *gUserInput;\r
 FORM_DISPLAY_ENGINE_FORM      *gFormData;\r
@@ -107,6 +107,8 @@ EFI_HII_HANDLE                gHiiHandle;
 UINT16                        gDirection;\r
 LIST_ENTRY                    gMenuOption;\r
 DISPLAY_HIGHLIGHT_MENU_INFO   gHighligthMenuInfo = {0};\r
+BOOLEAN                       mIsFirstForm = TRUE;\r
+FORM_ENTRY_INFO               gOldFormEntry = {0};\r
 \r
 //\r
 // Browser Global Strings\r
@@ -138,7 +140,7 @@ FORM_DISPLAY_DRIVER_PRIVATE_DATA  mPrivateData = {
   NULL,\r
   {\r
     FormDisplay,\r
-    ClearDisplayPage,\r
+    DriverClearDisplayPage,\r
     ConfirmDataChange\r
   }\r
 };\r
@@ -2978,6 +2980,7 @@ UiDisplayMenu (
       break;\r
 \r
     case CfExit:\r
+      gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
       if (HelpString != NULL) {\r
         FreePool (HelpString);\r
       }\r
@@ -3096,18 +3099,67 @@ FormDisplay (
     return Status;\r
   }\r
 \r
-  if (CompareMem (&gOldStatementDimensions, &gStatementDimensions, sizeof (gStatementDimensions)) == 0) {\r
-    mStatementLayoutIsChanged = FALSE;\r
-  } else {\r
+  //\r
+  // Check whether layout is changed.\r
+  //\r
+  if (mIsFirstForm \r
+      || (gOldFormEntry.HiiHandle != FormData->HiiHandle)\r
+      || (!CompareGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid))\r
+      || (gOldFormEntry.FormId != FormData->FormId)) {\r
     mStatementLayoutIsChanged = TRUE;\r
-    CopyMem (&gOldStatementDimensions, &gStatementDimensions, sizeof (gStatementDimensions));\r
+  } else {\r
+    mStatementLayoutIsChanged = FALSE;\r
   }\r
 \r
   Status = UiDisplayMenu(FormData);\r
+  \r
+  //\r
+  // Backup last form info.\r
+  //\r
+  mIsFirstForm            = FALSE;\r
+  gOldFormEntry.HiiHandle = FormData->HiiHandle;\r
+  CopyGuid (&gOldFormEntry.FormSetGuid, &FormData->FormSetGuid);\r
+  gOldFormEntry.FormId    = FormData->FormId;\r
 \r
   return Status;\r
 }\r
 \r
+/**\r
+  Clear Screen to the initial state.\r
+**/\r
+VOID\r
+EFIAPI \r
+DriverClearDisplayPage (\r
+  VOID\r
+  )\r
+{\r
+  ClearDisplayPage ();\r
+  mIsFirstForm = TRUE;\r
+}\r
+\r
+/**\r
+  Set Buffer to Value for Size bytes.\r
+\r
+  @param  Buffer                 Memory to set.\r
+  @param  Size                   Number of bytes to set\r
+  @param  Value                  Value of the set operation.\r
+\r
+**/\r
+VOID\r
+SetUnicodeMem (\r
+  IN VOID   *Buffer,\r
+  IN UINTN  Size,\r
+  IN CHAR16 Value\r
+  )\r
+{\r
+  CHAR16  *Ptr;\r
+\r
+  Ptr = Buffer;\r
+  while ((Size--)  != 0) {\r
+    *(Ptr++) = Value;\r
+  }\r
+}\r
+\r
 /**\r
   Initialize Setup Browser driver.\r
 \r
@@ -3153,6 +3205,9 @@ InitializeDisplayEngine (
   ASSERT_EFI_ERROR (Status);\r
 \r
   InitializeDisplayStrings();\r
+  \r
+  ZeroMem (&gHighligthMenuInfo, sizeof (gHighligthMenuInfo));\r
+  ZeroMem (&gOldFormEntry, sizeof (gOldFormEntry));\r
 \r
   //\r
   // Use BrowserEx2 protocol to register HotKey.\r
index ad4684efc393c188568b36c73359b69bb93d9e5d..45bcadc7e654dc6f268c7bce86e0d50db0180456 100644 (file)
@@ -553,6 +553,15 @@ FormDisplay (
   OUT USER_INPUT                *UserInputData\r
   );\r
 \r
+/**\r
+  Clear Screen to the initial state.\r
+**/\r
+VOID\r
+EFIAPI \r
+DriverClearDisplayPage (\r
+  VOID\r
+  );\r
+\r
 /**\r
   Exit Display and Clear Screen to the original state.\r
 \r
index 607f0df83c290a9cc0dd291edb5c3ba74d4d2268..a58e12f12c29ed903e43c92bf91f84d992fcf903 100644 (file)
@@ -1045,16 +1045,16 @@ IsValuesEqual (
   switch (Type) {\r
   case EFI_IFR_TYPE_BOOLEAN:\r
   case EFI_IFR_TYPE_NUM_SIZE_8:\r
-    return Value1->u8 == Value2->u8;\r
+    return (BOOLEAN) (Value1->u8 == Value2->u8);\r
   \r
   case EFI_IFR_TYPE_NUM_SIZE_16:\r
-    return Value1->u16 == Value2->u16;\r
-\r
+    return (BOOLEAN) (Value1->u16 == Value2->u16);\r
+  \r
   case EFI_IFR_TYPE_NUM_SIZE_32:\r
-    return Value1->u32 == Value2->u32;\r
-\r
+    return (BOOLEAN) (Value1->u32 == Value2->u32);\r
+  \r
   case EFI_IFR_TYPE_NUM_SIZE_64:\r
-    return Value1->u64 == Value2->u64;\r
+    return (BOOLEAN) (Value1->u64 == Value2->u64);\r
 \r
   default:\r
     ASSERT (FALSE);\r
diff --git a/MdeModulePkg/Universal/DisplayEngineDxe/Print.c b/MdeModulePkg/Universal/DisplayEngineDxe/Print.c
deleted file mode 100644 (file)
index f5a95c4..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/** @file\r
-Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very\r
-simple implemenation of SPrint() and Print() to support debug.\r
-\r
-You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a\r
-time. This makes the implementation very simple.\r
-\r
-VSPrint, Print, SPrint format specification has the follwoing form\r
-\r
-%type\r
-\r
-type:\r
-  'S','s' - argument is an Unicode string\r
-  'c' - argument is an ascii character\r
-  '%' - Print a %\r
-\r
-\r
-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\r
-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 "FormDisplay.h"\r
-\r
-\r
-/**\r
-  Set Buffer to Value for Size bytes.\r
-\r
-  @param  Buffer                 Memory to set.\r
-  @param  Size                   Number of bytes to set\r
-  @param  Value                  Value of the set operation.\r
-\r
-**/\r
-VOID\r
-SetUnicodeMem (\r
-  IN VOID   *Buffer,\r
-  IN UINTN  Size,\r
-  IN CHAR16 Value\r
-  )\r
-{\r
-  CHAR16  *Ptr;\r
-\r
-  Ptr = Buffer;\r
-  while ((Size--)  != 0) {\r
-    *(Ptr++) = Value;\r
-  }\r
-}\r
-\r
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Colors.h b/MdeModulePkg/Universal/SetupBrowserDxe/Colors.h
deleted file mode 100644 (file)
index 2db8b99..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/** @file\r
-MACRO definitions for color used in Setup Browser.\r
-\r
-Copyright (c) 2004 - 2011, Intel Corporation. All rights reserved.<BR>\r
-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
-// Unicode collation protocol in\r
-\r
-#ifndef _COLORS_H_\r
-#define _COLORS_H_\r
-\r
-//\r
-// Screen Color Settings\r
-//\r
-#define PICKLIST_HIGHLIGHT_TEXT       EFI_WHITE\r
-#define PICKLIST_HIGHLIGHT_BACKGROUND EFI_BACKGROUND_CYAN\r
-#define TITLE_TEXT                    EFI_WHITE\r
-#define TITLE_BACKGROUND              EFI_BACKGROUND_BLUE\r
-#define KEYHELP_TEXT                  EFI_LIGHTGRAY\r
-#define KEYHELP_BACKGROUND            EFI_BACKGROUND_BLACK\r
-#define SUBTITLE_BACKGROUND           EFI_BACKGROUND_LIGHTGRAY\r
-#define BANNER_TEXT                   EFI_BLUE\r
-#define BANNER_BACKGROUND             EFI_BACKGROUND_LIGHTGRAY\r
-#define FIELD_TEXT_GRAYED             EFI_DARKGRAY\r
-#define FIELD_BACKGROUND              EFI_BACKGROUND_LIGHTGRAY\r
-#define POPUP_TEXT                    EFI_LIGHTGRAY\r
-#define POPUP_BACKGROUND              EFI_BACKGROUND_BLUE\r
-#define POPUP_INVERSE_TEXT            EFI_LIGHTGRAY\r
-#define POPUP_INVERSE_BACKGROUND      EFI_BACKGROUND_BLACK\r
-#define HELP_TEXT                     EFI_BLUE\r
-#define ERROR_TEXT                    EFI_RED | EFI_BRIGHT\r
-#define INFO_TEXT                     EFI_YELLOW | EFI_BRIGHT\r
-#define ARROW_TEXT                    EFI_RED | EFI_BRIGHT\r
-#define ARROW_BACKGROUND              EFI_BACKGROUND_LIGHTGRAY\r
-\r
-#endif\r
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c b/MdeModulePkg/Universal/SetupBrowserDxe/InputHandler.c
deleted file mode 100644 (file)
index 8445907..0000000
+++ /dev/null
@@ -1,1418 +0,0 @@
-/** @file\r
-Implementation for handling user input from the User Interfaces.\r
-\r
-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\r
-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 "Setup.h"\r
-\r
-\r
-/**\r
-  Get string or password input from user.\r
-\r
-  @param  MenuOption        Pointer to the current input menu.\r
-  @param  Prompt            The prompt string shown on popup window.\r
-  @param  StringPtr         Old user input and destination for use input string.\r
-\r
-  @retval EFI_SUCCESS       If string input is read successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-ReadString (\r
-  IN     UI_MENU_OPTION              *MenuOption,\r
-  IN     CHAR16                      *Prompt,\r
-  IN OUT CHAR16                      *StringPtr\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-  EFI_INPUT_KEY           Key;\r
-  CHAR16                  NullCharacter;\r
-  UINTN                   ScreenSize;\r
-  CHAR16                  Space[2];\r
-  CHAR16                  KeyPad[2];\r
-  CHAR16                  *TempString;\r
-  CHAR16                  *BufferedString;\r
-  UINTN                   Index;\r
-  UINTN                   Index2;\r
-  UINTN                   Count;\r
-  UINTN                   Start;\r
-  UINTN                   Top;\r
-  UINTN                   DimensionsWidth;\r
-  UINTN                   DimensionsHeight;\r
-  UINTN                   CurrentCursor;\r
-  BOOLEAN                 CursorVisible;\r
-  UINTN                   Minimum;\r
-  UINTN                   Maximum;\r
-  FORM_BROWSER_STATEMENT  *Question;\r
-  BOOLEAN                 IsPassword;\r
-\r
-  DimensionsWidth  = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;\r
-  DimensionsHeight = gScreenDimensions.BottomRow - gScreenDimensions.TopRow;\r
-\r
-  NullCharacter    = CHAR_NULL;\r
-  ScreenSize       = GetStringWidth (Prompt) / sizeof (CHAR16);\r
-  Space[0]         = L' ';\r
-  Space[1]         = CHAR_NULL;\r
-\r
-  Question         = MenuOption->ThisTag;\r
-  Minimum          = (UINTN) Question->Minimum;\r
-  Maximum          = (UINTN) Question->Maximum;\r
-\r
-  if (Question->Operand == EFI_IFR_PASSWORD_OP) {\r
-    IsPassword = TRUE;\r
-  } else {\r
-    IsPassword = FALSE;\r
-  }\r
-\r
-  TempString = AllocateZeroPool ((Maximum + 1)* sizeof (CHAR16));\r
-  ASSERT (TempString);\r
-\r
-  if (ScreenSize < (Maximum + 1)) {\r
-    ScreenSize = Maximum + 1;\r
-  }\r
-\r
-  if ((ScreenSize + 2) > DimensionsWidth) {\r
-    ScreenSize = DimensionsWidth - 2;\r
-  }\r
-\r
-  BufferedString = AllocateZeroPool (ScreenSize * 2);\r
-  ASSERT (BufferedString);\r
-\r
-  Start = (DimensionsWidth - ScreenSize - 2) / 2 + gScreenDimensions.LeftColumn + 1;\r
-  Top   = ((DimensionsHeight - 6) / 2) + gScreenDimensions.TopRow - 1;\r
-\r
-  //\r
-  // Display prompt for string\r
-  //\r
-  CreateMultiStringPopUp (ScreenSize, 4, &NullCharacter, Prompt, Space, &NullCharacter);\r
-\r
-  gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));\r
-\r
-  CursorVisible = gST->ConOut->Mode->CursorVisible;\r
-  gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
-\r
-  CurrentCursor = GetStringWidth (StringPtr) / 2 - 1;\r
-  if (CurrentCursor != 0) {\r
-    //\r
-    // Show the string which has beed saved before.\r
-    //\r
-    SetUnicodeMem (BufferedString, ScreenSize - 1, L' ');\r
-    PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-\r
-    if ((GetStringWidth (StringPtr) / 2) > (DimensionsWidth - 2)) {\r
-      Index = (GetStringWidth (StringPtr) / 2) - DimensionsWidth + 2;\r
-    } else {\r
-      Index = 0;\r
-    }\r
-\r
-    if (IsPassword) {\r
-      gST->ConOut->SetCursorPosition (gST->ConOut, Start + 1, Top + 3);\r
-    }\r
-\r
-    for (Count = 0; Index + 1 < GetStringWidth (StringPtr) / 2; Index++, Count++) {\r
-      BufferedString[Count] = StringPtr[Index];\r
-\r
-      if (IsPassword) {\r
-        PrintChar (L'*');\r
-      }\r
-    }\r
-\r
-    if (!IsPassword) {\r
-      PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-    }\r
-    \r
-    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-    gST->ConOut->SetCursorPosition (gST->ConOut, Start + GetStringWidth (StringPtr) / 2, Top + 3);\r
-  }\r
-  \r
-  do {\r
-    Status = WaitForKeyStroke (&Key);\r
-    ASSERT_EFI_ERROR (Status);\r
-\r
-    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_BLACK, EFI_LIGHTGRAY));\r
-    switch (Key.UnicodeChar) {\r
-    case CHAR_NULL:\r
-      switch (Key.ScanCode) {\r
-      case SCAN_LEFT:\r
-        if (CurrentCursor > 0) {\r
-          CurrentCursor--;\r
-        }\r
-        break;\r
-\r
-      case SCAN_RIGHT:\r
-        if (CurrentCursor < (GetStringWidth (StringPtr) / 2 - 1)) {\r
-          CurrentCursor++;\r
-        }\r
-        break;\r
-\r
-      case SCAN_ESC:\r
-        FreePool (TempString);\r
-        FreePool (BufferedString);\r
-        gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-        gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
-        return EFI_DEVICE_ERROR;\r
-\r
-      default:\r
-        break;\r
-      }\r
-\r
-      break;\r
-\r
-    case CHAR_CARRIAGE_RETURN:\r
-      if (GetStringWidth (StringPtr) >= ((Minimum + 1) * sizeof (CHAR16))) {\r
-\r
-        FreePool (TempString);\r
-        FreePool (BufferedString);\r
-        gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-        gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
-        return EFI_SUCCESS;\r
-      } else {\r
-        //\r
-        // Simply create a popup to tell the user that they had typed in too few characters.\r
-        // To save code space, we can then treat this as an error and return back to the menu.\r
-        //\r
-        do {\r
-          CreateDialog (4, TRUE, 0, NULL, &Key, &NullCharacter, gMiniString, gPressEnter, &NullCharacter);\r
-        } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-\r
-        FreePool (TempString);\r
-        FreePool (BufferedString);\r
-        gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-        gST->ConOut->EnableCursor (gST->ConOut, CursorVisible);\r
-        return EFI_DEVICE_ERROR;\r
-      }\r
-\r
-      break;\r
-\r
-    case CHAR_BACKSPACE:\r
-      if (StringPtr[0] != CHAR_NULL && CurrentCursor != 0) {\r
-        for (Index = 0; Index < CurrentCursor - 1; Index++) {\r
-          TempString[Index] = StringPtr[Index];\r
-        }\r
-        Count = GetStringWidth (StringPtr) / 2 - 1;\r
-        if (Count >= CurrentCursor) {\r
-          for (Index = CurrentCursor - 1, Index2 = CurrentCursor; Index2 < Count; Index++, Index2++) {\r
-            TempString[Index] = StringPtr[Index2];\r
-          }\r
-          TempString[Index] = CHAR_NULL;\r
-        }\r
-        //\r
-        // Effectively truncate string by 1 character\r
-        //\r
-        StrCpy (StringPtr, TempString);\r
-        CurrentCursor --;\r
-      }\r
-\r
-    default:\r
-      //\r
-      // If it is the beginning of the string, don't worry about checking maximum limits\r
-      //\r
-      if ((StringPtr[0] == CHAR_NULL) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
-        StrnCpy (StringPtr, &Key.UnicodeChar, 1);\r
-        CurrentCursor++;\r
-      } else if ((GetStringWidth (StringPtr) < ((Maximum + 1) * sizeof (CHAR16))) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
-        KeyPad[0] = Key.UnicodeChar;\r
-        KeyPad[1] = CHAR_NULL;\r
-        Count = GetStringWidth (StringPtr) / 2 - 1;\r
-        if (CurrentCursor < Count) {\r
-          for (Index = 0; Index < CurrentCursor; Index++) {\r
-            TempString[Index] = StringPtr[Index];\r
-          }\r
-                 TempString[Index] = CHAR_NULL;\r
-          StrCat (TempString, KeyPad);\r
-          StrCat (TempString, StringPtr + CurrentCursor);\r
-          StrCpy (StringPtr, TempString);\r
-        } else {\r
-          StrCat (StringPtr, KeyPad);\r
-        }\r
-        CurrentCursor++;\r
-      }\r
-\r
-      //\r
-      // If the width of the input string is now larger than the screen, we nee to\r
-      // adjust the index to start printing portions of the string\r
-      //\r
-      SetUnicodeMem (BufferedString, ScreenSize - 1, L' ');\r
-      PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-\r
-      if ((GetStringWidth (StringPtr) / 2) > (DimensionsWidth - 2)) {\r
-        Index = (GetStringWidth (StringPtr) / 2) - DimensionsWidth + 2;\r
-      } else {\r
-        Index = 0;\r
-      }\r
-\r
-      if (IsPassword) {\r
-        gST->ConOut->SetCursorPosition (gST->ConOut, Start + 1, Top + 3);\r
-      }\r
-\r
-      for (Count = 0; Index + 1 < GetStringWidth (StringPtr) / 2; Index++, Count++) {\r
-        BufferedString[Count] = StringPtr[Index];\r
-\r
-        if (IsPassword) {\r
-          PrintChar (L'*');\r
-        }\r
-      }\r
-\r
-      if (!IsPassword) {\r
-        PrintStringAt (Start + 1, Top + 3, BufferedString);\r
-      }\r
-      break;\r
-    }\r
-\r
-    gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-    gST->ConOut->SetCursorPosition (gST->ConOut, Start + CurrentCursor + 1, Top + 3);\r
-  } while (TRUE);\r
-\r
-}\r
-\r
-/**\r
-  Adjust the value to the correct one. Rules follow the sample:\r
-  like:  Year change:  2012.02.29 -> 2013.02.29 -> 2013.02.01\r
-         Month change: 2013.03.29 -> 2013.02.29 -> 2013.02.28\r
-\r
-  @param  Question          Pointer to current question.\r
-  @param  Sequence          The sequence of the field in the question.\r
-**/\r
-VOID\r
-AdjustQuestionValue (\r
-  IN  FORM_BROWSER_STATEMENT  *Question,\r
-  IN  UINT8                   Sequence\r
-  )\r
-{\r
-  UINT8     Month;\r
-  UINT16    Year;\r
-  UINT8     Maximum;\r
-  UINT8     Minimum;\r
-\r
-  if (Question->Operand != EFI_IFR_DATE_OP) {\r
-    return;\r
-  }\r
-\r
-  Month   = Question->HiiValue.Value.date.Month;\r
-  Year    = Question->HiiValue.Value.date.Year;\r
-  Minimum = 1;\r
-\r
-  switch (Month) {\r
-  case 2:\r
-    if ((Year % 4) == 0 && ((Year % 100) != 0 || (Year % 400) == 0)) {\r
-      Maximum = 29;\r
-    } else {\r
-      Maximum = 28;\r
-    }\r
-    break;\r
-  case 4:\r
-  case 6:\r
-  case 9:\r
-  case 11:\r
-    Maximum = 30;\r
-    break;\r
-  default:\r
-    Maximum = 31;\r
-    break;\r
-  }\r
-\r
-  //\r
-  // Change the month area.\r
-  //\r
-  if (Sequence == 0) {\r
-    if (Question->HiiValue.Value.date.Day > Maximum) {\r
-      Question->HiiValue.Value.date.Day = Maximum;\r
-    }\r
-  }\r
-  \r
-  //\r
-  // Change the Year area.\r
-  //\r
-  if (Sequence == 2) {\r
-    if (Question->HiiValue.Value.date.Day > Maximum) {\r
-      Question->HiiValue.Value.date.Day = Minimum;\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  This routine reads a numeric value from the user input.\r
-\r
-  @param  Selection         Pointer to current selection.\r
-  @param  MenuOption        Pointer to the current input menu.\r
-\r
-  @retval EFI_SUCCESS       If numerical input is read successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-GetNumericInput (\r
-  IN  UI_MENU_SELECTION           *Selection,\r
-  IN  UI_MENU_OPTION              *MenuOption\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-  UINTN                   Column;\r
-  UINTN                   Row;\r
-  CHAR16                  InputText[MAX_NUMERIC_INPUT_WIDTH];\r
-  CHAR16                  FormattedNumber[MAX_NUMERIC_INPUT_WIDTH - 1];\r
-  UINT64                  PreviousNumber[MAX_NUMERIC_INPUT_WIDTH - 3];\r
-  UINTN                   Count;\r
-  UINTN                   Loop;\r
-  BOOLEAN                 ManualInput;\r
-  BOOLEAN                 HexInput;\r
-  BOOLEAN                 DateOrTime;\r
-  UINTN                   InputWidth;\r
-  UINT64                  EditValue;\r
-  UINT64                  Step;\r
-  UINT64                  Minimum;\r
-  UINT64                  Maximum;\r
-  UINTN                   EraseLen;\r
-  UINT8                   Digital;\r
-  EFI_INPUT_KEY           Key;\r
-  EFI_HII_VALUE           *QuestionValue;\r
-  FORM_BROWSER_FORM       *Form;\r
-  FORM_BROWSER_FORMSET    *FormSet;\r
-  FORM_BROWSER_STATEMENT  *Question;\r
-\r
-  Column            = MenuOption->OptCol;\r
-  Row               = MenuOption->Row;\r
-  PreviousNumber[0] = 0;\r
-  Count             = 0;\r
-  InputWidth        = 0;\r
-  Digital           = 0;\r
-\r
-  FormSet       = Selection->FormSet;\r
-  Form          = Selection->Form;\r
-  Question      = MenuOption->ThisTag;\r
-  QuestionValue = &Question->HiiValue;\r
-  Step          = Question->Step;\r
-  Minimum       = Question->Minimum;\r
-  Maximum       = Question->Maximum;\r
-\r
-  //\r
-  // Only two case, user can enter to this function: Enter and +/- case.\r
-  // In Enter case, gDirection = 0; in +/- case, gDirection = SCAN_LEFT/SCAN_WRIGHT\r
-  //\r
-  ManualInput        = (BOOLEAN)(gDirection == 0 ? TRUE : FALSE);\r
-\r
-  if ((Question->Operand == EFI_IFR_DATE_OP) || (Question->Operand == EFI_IFR_TIME_OP)) {\r
-    DateOrTime = TRUE;\r
-  } else {\r
-    DateOrTime = FALSE;\r
-  }\r
-\r
-  //\r
-  // Prepare Value to be edit\r
-  //\r
-  EraseLen = 0;\r
-  EditValue = 0;\r
-  if (Question->Operand == EFI_IFR_DATE_OP) {\r
-    Step = 1;\r
-    Minimum = 1;\r
-\r
-    switch (MenuOption->Sequence) {\r
-    case 0:\r
-      Maximum = 12;\r
-      EraseLen = 4;\r
-      EditValue = QuestionValue->Value.date.Month;\r
-      break;\r
-\r
-    case 1:\r
-      switch (QuestionValue->Value.date.Month) {\r
-      case 2:\r
-        if ((QuestionValue->Value.date.Year % 4) == 0  && \r
-            ((QuestionValue->Value.date.Year % 100) != 0 || \r
-            (QuestionValue->Value.date.Year % 400) == 0)) {\r
-          Maximum = 29;\r
-        } else {\r
-          Maximum = 28;\r
-        }\r
-        break;\r
-      case 4:\r
-      case 6:\r
-      case 9:\r
-      case 11:\r
-        Maximum = 30;\r
-        break;\r
-      default:\r
-        Maximum = 31;\r
-        break;\r
-      } \r
-\r
-      EraseLen = 3;\r
-      EditValue = QuestionValue->Value.date.Day;\r
-      break;\r
-\r
-    case 2:\r
-      Maximum = 0xffff;\r
-      EraseLen = 5;\r
-      EditValue = QuestionValue->Value.date.Year;\r
-      break;\r
-\r
-    default:\r
-      break;\r
-    }\r
-  } else if (Question->Operand == EFI_IFR_TIME_OP) {\r
-    Step = 1;\r
-    Minimum = 0;\r
-\r
-    switch (MenuOption->Sequence) {\r
-    case 0:\r
-      Maximum = 23;\r
-      EraseLen = 4;\r
-      EditValue = QuestionValue->Value.time.Hour;\r
-      break;\r
-\r
-    case 1:\r
-      Maximum = 59;\r
-      EraseLen = 3;\r
-      EditValue = QuestionValue->Value.time.Minute;\r
-      break;\r
-\r
-    case 2:\r
-      Maximum = 59;\r
-      EraseLen = 3;\r
-      EditValue = QuestionValue->Value.time.Second;\r
-      break;\r
-\r
-    default:\r
-      break;\r
-    }\r
-  } else {\r
-    //\r
-    // Numeric\r
-    //\r
-    EraseLen = gOptionBlockWidth;\r
-    EditValue = QuestionValue->Value.u64;\r
-    if (Maximum == 0) {\r
-      Maximum = (UINT64) -1;\r
-    }\r
-  }\r
-\r
-  if ((Question->Operand == EFI_IFR_NUMERIC_OP) &&\r
-      ((Question->Flags & EFI_IFR_DISPLAY) == EFI_IFR_DISPLAY_UINT_HEX)) {\r
-    HexInput = TRUE;\r
-  } else {\r
-    HexInput = FALSE;\r
-  }\r
-\r
-  //\r
-  // Enter from "Enter" input, clear the old word showing.\r
-  //\r
-  if (ManualInput) {\r
-    if (Question->Operand == EFI_IFR_NUMERIC_OP) {\r
-      if (HexInput) {\r
-        InputWidth = Question->StorageWidth * 2;\r
-      } else {\r
-        switch (Question->StorageWidth) {\r
-        case 1:\r
-          InputWidth = 3;\r
-          break;\r
-\r
-        case 2:\r
-          InputWidth = 5;\r
-          break;\r
-\r
-        case 4:\r
-          InputWidth = 10;\r
-          break;\r
-\r
-        case 8:\r
-          InputWidth = 20;\r
-          break;\r
-\r
-        default:\r
-          InputWidth = 0;\r
-          break;\r
-        }\r
-      }\r
-\r
-      InputText[0] = LEFT_NUMERIC_DELIMITER;\r
-      SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
-      ASSERT (InputWidth + 2 < MAX_NUMERIC_INPUT_WIDTH);\r
-      InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
-      InputText[InputWidth + 2] = L'\0';\r
-\r
-      PrintAt (Column, Row, InputText);\r
-      Column++;\r
-    }\r
-\r
-    if (Question->Operand == EFI_IFR_DATE_OP) {\r
-      if (MenuOption->Sequence == 2) {\r
-        InputWidth = 4;\r
-      } else {\r
-        InputWidth = 2;\r
-      }\r
-\r
-      if (MenuOption->Sequence == 0) {\r
-        InputText[0] = LEFT_NUMERIC_DELIMITER;\r
-        SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
-      } else {\r
-        SetUnicodeMem (InputText, InputWidth, L' ');\r
-      }\r
-\r
-      if (MenuOption->Sequence == 2) {\r
-        InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
-      } else {\r
-        InputText[InputWidth + 1] = DATE_SEPARATOR;\r
-      }\r
-      InputText[InputWidth + 2] = L'\0';\r
-\r
-      PrintAt (Column, Row, InputText);\r
-      if (MenuOption->Sequence == 0) {\r
-        Column++;\r
-      }\r
-    }\r
-\r
-    if (Question->Operand == EFI_IFR_TIME_OP) {\r
-      InputWidth = 2;\r
-\r
-      if (MenuOption->Sequence == 0) {\r
-        InputText[0] = LEFT_NUMERIC_DELIMITER;\r
-        SetUnicodeMem (InputText + 1, InputWidth, L' ');\r
-      } else {\r
-        SetUnicodeMem (InputText, InputWidth, L' ');\r
-      }\r
-\r
-      if (MenuOption->Sequence == 2) {\r
-        InputText[InputWidth + 1] = RIGHT_NUMERIC_DELIMITER;\r
-      } else {\r
-        InputText[InputWidth + 1] = TIME_SEPARATOR;\r
-      }\r
-      InputText[InputWidth + 2] = L'\0';\r
-\r
-      PrintAt (Column, Row, InputText);\r
-      if (MenuOption->Sequence == 0) {\r
-        Column++;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // First time we enter this handler, we need to check to see if\r
-  // we were passed an increment or decrement directive\r
-  //\r
-  do {\r
-    Key.UnicodeChar = CHAR_NULL;\r
-    if (gDirection != 0) {\r
-      Key.ScanCode  = gDirection;\r
-      gDirection    = 0;\r
-      goto TheKey2;\r
-    }\r
-\r
-    Status = WaitForKeyStroke (&Key);\r
-\r
-TheKey2:\r
-    switch (Key.UnicodeChar) {\r
-\r
-    case '+':\r
-    case '-':\r
-      if (Key.UnicodeChar == '+') {\r
-        Key.ScanCode = SCAN_RIGHT;\r
-      } else {\r
-        Key.ScanCode = SCAN_LEFT;\r
-      }\r
-      Key.UnicodeChar = CHAR_NULL;\r
-      goto TheKey2;\r
-\r
-    case CHAR_NULL:\r
-      switch (Key.ScanCode) {\r
-      case SCAN_LEFT:\r
-      case SCAN_RIGHT:\r
-        if (DateOrTime && !ManualInput) {\r
-          //\r
-          // By setting this value, we will return back to the caller.\r
-          // We need to do this since an auto-refresh will destroy the adjustment\r
-          // based on what the real-time-clock is showing.  So we always commit\r
-          // upon changing the value.\r
-          //\r
-          gDirection = SCAN_DOWN;\r
-        }\r
-\r
-        if ((Step != 0) && !ManualInput) {\r
-          if (Key.ScanCode == SCAN_LEFT) {\r
-            if (EditValue >= Minimum + Step) {\r
-              EditValue = EditValue - Step;\r
-            } else if (EditValue > Minimum){\r
-              EditValue = Minimum;\r
-            } else {\r
-              EditValue = Maximum;\r
-            }\r
-          } else if (Key.ScanCode == SCAN_RIGHT) {\r
-            if (EditValue + Step <= Maximum) {\r
-              EditValue = EditValue + Step;\r
-            } else if (EditValue < Maximum) {\r
-              EditValue = Maximum;\r
-            } else {\r
-              EditValue = Minimum;\r
-            }\r
-          }\r
-\r
-          ZeroMem (FormattedNumber, 21 * sizeof (CHAR16));\r
-          if (Question->Operand == EFI_IFR_DATE_OP) {\r
-            if (MenuOption->Sequence == 2) {\r
-              //\r
-              // Year\r
-              //\r
-              UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%04d", (UINT16) EditValue);\r
-            } else {\r
-              //\r
-              // Month/Day\r
-              //\r
-              UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);\r
-            }\r
-\r
-            if (MenuOption->Sequence == 0) {\r
-              ASSERT (EraseLen >= 2);\r
-              FormattedNumber[EraseLen - 2] = DATE_SEPARATOR;\r
-            } else if (MenuOption->Sequence == 1) {\r
-              ASSERT (EraseLen >= 1);\r
-              FormattedNumber[EraseLen - 1] = DATE_SEPARATOR;\r
-            }\r
-          } else if (Question->Operand == EFI_IFR_TIME_OP) {\r
-            UnicodeSPrint (FormattedNumber, 21 * sizeof (CHAR16), L"%02d", (UINT8) EditValue);\r
-\r
-            if (MenuOption->Sequence == 0) {\r
-              ASSERT (EraseLen >= 2);\r
-              FormattedNumber[EraseLen - 2] = TIME_SEPARATOR;\r
-            } else if (MenuOption->Sequence == 1) {\r
-              ASSERT (EraseLen >= 1);\r
-              FormattedNumber[EraseLen - 1] = TIME_SEPARATOR;\r
-            }\r
-          } else {\r
-            QuestionValue->Value.u64 = EditValue;\r
-            PrintFormattedNumber (Question, FormattedNumber, 21 * sizeof (CHAR16));\r
-          }\r
-\r
-          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
-          for (Loop = 0; Loop < EraseLen; Loop++) {\r
-            PrintAt (MenuOption->OptCol + Loop, MenuOption->Row, L" ");\r
-          }\r
-          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor));\r
-\r
-          if (MenuOption->Sequence == 0) {\r
-            PrintCharAt (MenuOption->OptCol, Row, LEFT_NUMERIC_DELIMITER);\r
-            Column = MenuOption->OptCol + 1;\r
-          }\r
-\r
-          PrintStringAt (Column, Row, FormattedNumber);\r
-\r
-          if (!DateOrTime || MenuOption->Sequence == 2) {\r
-            PrintChar (RIGHT_NUMERIC_DELIMITER);\r
-          }\r
-        }\r
-\r
-        goto EnterCarriageReturn;\r
-        break;\r
-\r
-      case SCAN_UP:\r
-      case SCAN_DOWN:\r
-        goto EnterCarriageReturn;\r
-\r
-      case SCAN_ESC:\r
-        return EFI_DEVICE_ERROR;\r
-\r
-      default:\r
-        break;\r
-      }\r
-\r
-      break;\r
-\r
-EnterCarriageReturn:\r
-\r
-    case CHAR_CARRIAGE_RETURN:\r
-      //\r
-      // Validate input value with Minimum value.\r
-      //\r
-      if (EditValue < Minimum) {\r
-        UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, TRUE);\r
-        break;\r
-      } else {\r
-        UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, FALSE);\r
-      }\r
-\r
-      //\r
-      // Store Edit value back to Question\r
-      //\r
-      if (Question->Operand == EFI_IFR_DATE_OP) {\r
-        switch (MenuOption->Sequence) {\r
-        case 0:\r
-          QuestionValue->Value.date.Month = (UINT8) EditValue;\r
-          break;\r
-\r
-        case 1:\r
-          QuestionValue->Value.date.Day = (UINT8) EditValue;\r
-          break;\r
-\r
-        case 2:\r
-          QuestionValue->Value.date.Year = (UINT16) EditValue;\r
-          break;\r
-\r
-        default:\r
-          break;\r
-        }\r
-      } else if (Question->Operand == EFI_IFR_TIME_OP) {\r
-        switch (MenuOption->Sequence) {\r
-        case 0:\r
-          QuestionValue->Value.time.Hour = (UINT8) EditValue;\r
-          break;\r
-\r
-        case 1:\r
-          QuestionValue->Value.time.Minute = (UINT8) EditValue;\r
-          break;\r
-\r
-        case 2:\r
-          QuestionValue->Value.time.Second = (UINT8) EditValue;\r
-          break;\r
-\r
-        default:\r
-          break;\r
-        }\r
-      } else {\r
-        //\r
-        // Numeric\r
-        //\r
-        QuestionValue->Value.u64 = EditValue;\r
-      }\r
-\r
-      //\r
-      // Adjust the value to the correct one.\r
-      // Sample like: 2012.02.29 -> 2013.02.29 -> 2013.02.01\r
-      //              2013.03.29 -> 2013.02.29 -> 2013.02.28\r
-      //\r
-      if (Question->Operand == EFI_IFR_DATE_OP && \r
-        (MenuOption->Sequence == 0 || MenuOption->Sequence == 2)) {\r
-        AdjustQuestionValue (Question, (UINT8)MenuOption->Sequence);\r
-      }\r
-\r
-      //\r
-      // Check to see if the Value is something reasonable against consistency limitations.\r
-      // If not, let's kick the error specified.\r
-      //\r
-      Status = ValidateQuestion (FormSet, Form, Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);\r
-      if (EFI_ERROR (Status)) {\r
-        //\r
-        // Input value is not valid, restore Question Value\r
-        //\r
-        GetQuestionValue (FormSet, Form, Question, GetSetValueWithEditBuffer);\r
-      } else {\r
-        SetQuestionValue (FormSet, Form, Question, GetSetValueWithEditBuffer);\r
-        if (!DateOrTime || (Question->Storage != NULL)) {\r
-          //\r
-          // NV flag is unnecessary for RTC type of Date/Time\r
-          //\r
-          UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);\r
-        }\r
-      }\r
-\r
-      return Status;\r
-      break;\r
-\r
-    case CHAR_BACKSPACE:\r
-      if (ManualInput) {\r
-        if (Count == 0) {\r
-          break;\r
-        }\r
-        //\r
-        // Remove a character\r
-        //\r
-        EditValue = PreviousNumber[Count - 1];\r
-        UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, FALSE);\r
-        Count--;\r
-        Column--;\r
-        PrintAt (Column, Row, L" ");\r
-      }\r
-      break;\r
-\r
-    default:\r
-      if (ManualInput) {\r
-        if (HexInput) {\r
-          if ((Key.UnicodeChar >= L'0') && (Key.UnicodeChar <= L'9')) {\r
-            Digital = (UINT8) (Key.UnicodeChar - L'0');\r
-          } else if ((Key.UnicodeChar >= L'A') && (Key.UnicodeChar <= L'F')) {\r
-            Digital = (UINT8) (Key.UnicodeChar - L'A' + 0x0A);\r
-          } else if ((Key.UnicodeChar >= L'a') && (Key.UnicodeChar <= L'f')) {\r
-            Digital = (UINT8) (Key.UnicodeChar - L'a' + 0x0A);\r
-          } else {\r
-            UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, TRUE);\r
-            break;\r
-          }\r
-        } else {\r
-          if (Key.UnicodeChar > L'9' || Key.UnicodeChar < L'0') {\r
-            UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, TRUE);\r
-            break;\r
-          }\r
-        }\r
-\r
-        //\r
-        // If Count exceed input width, there is no way more is valid\r
-        //\r
-        if (Count >= InputWidth) {\r
-          break;\r
-        }\r
-        //\r
-        // Someone typed something valid!\r
-        //\r
-        if (Count != 0) {\r
-          if (HexInput) {\r
-            EditValue = LShiftU64 (EditValue, 4) + Digital;\r
-          } else {\r
-            EditValue = MultU64x32 (EditValue, 10) + (Key.UnicodeChar - L'0');\r
-          }\r
-        } else {\r
-          if (HexInput) {\r
-            EditValue = Digital;\r
-          } else {\r
-            EditValue = Key.UnicodeChar - L'0';\r
-          }\r
-        }\r
-\r
-        if (EditValue > Maximum) {\r
-          UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, TRUE);\r
-          ASSERT (Count < sizeof (PreviousNumber) / sizeof (PreviousNumber[0]));\r
-          EditValue = PreviousNumber[Count];\r
-          break;\r
-        } else {\r
-          UpdateStatusBar (Selection, INPUT_ERROR, Question->QuestionFlags, FALSE);\r
-        }\r
-\r
-        Count++;\r
-        ASSERT (Count < (sizeof (PreviousNumber) / sizeof (PreviousNumber[0])));\r
-        PreviousNumber[Count] = EditValue;\r
-\r
-        PrintCharAt (Column, Row, Key.UnicodeChar);\r
-        Column++;\r
-      }\r
-      break;\r
-    }\r
-  } while (TRUE);\r
-\r
-}\r
-\r
-\r
-/**\r
-  Get selection for OneOf and OrderedList (Left/Right will be ignored).\r
-\r
-  @param  Selection         Pointer to current selection.\r
-  @param  MenuOption        Pointer to the current input menu.\r
-\r
-  @retval EFI_SUCCESS       If Option input is processed successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-GetSelectionInputPopUp (\r
-  IN  UI_MENU_SELECTION           *Selection,\r
-  IN  UI_MENU_OPTION              *MenuOption\r
-  )\r
-{\r
-  EFI_STATUS              Status;\r
-  EFI_INPUT_KEY           Key;\r
-  UINTN                   Index;\r
-  CHAR16                  *StringPtr;\r
-  CHAR16                  *TempStringPtr;\r
-  UINTN                   Index2;\r
-  UINTN                   TopOptionIndex;\r
-  UINTN                   HighlightOptionIndex;\r
-  UINTN                   Start;\r
-  UINTN                   End;\r
-  UINTN                   Top;\r
-  UINTN                   Bottom;\r
-  UINTN                   PopUpMenuLines;\r
-  UINTN                   MenuLinesInView;\r
-  UINTN                   PopUpWidth;\r
-  CHAR16                  Character;\r
-  INT32                   SavedAttribute;\r
-  BOOLEAN                 ShowDownArrow;\r
-  BOOLEAN                 ShowUpArrow;\r
-  UINTN                   DimensionsWidth;\r
-  LIST_ENTRY              *Link;\r
-  BOOLEAN                 OrderedList;\r
-  UINT8                   *ValueArray;\r
-  UINT8                   ValueType;\r
-  EFI_HII_VALUE           HiiValue;\r
-  EFI_HII_VALUE           *HiiValueArray;\r
-  UINTN                   OptionCount;\r
-  QUESTION_OPTION         *OneOfOption;\r
-  QUESTION_OPTION         *CurrentOption;\r
-  FORM_BROWSER_STATEMENT  *Question;\r
-  INTN                    Result;\r
-\r
-  DimensionsWidth   = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;\r
-\r
-  ValueArray        = NULL;\r
-  ValueType         = 0;\r
-  CurrentOption     = NULL;\r
-  ShowDownArrow     = FALSE;\r
-  ShowUpArrow       = FALSE;\r
-\r
-  StringPtr = AllocateZeroPool ((gOptionBlockWidth + 1) * 2);\r
-  ASSERT (StringPtr);\r
-\r
-  Question = MenuOption->ThisTag;\r
-  if (Question->Operand == EFI_IFR_ORDERED_LIST_OP) {\r
-    ValueArray = Question->BufferValue;\r
-    ValueType = Question->ValueType;\r
-    OrderedList = TRUE;\r
-  } else {\r
-    OrderedList = FALSE;\r
-  }\r
-\r
-  //\r
-  // Calculate Option count\r
-  //\r
-  if (OrderedList) {\r
-    for (Index = 0; Index < Question->MaxContainers; Index++) {\r
-      if (GetArrayData (ValueArray, ValueType, Index) == 0) {\r
-        break;\r
-      }\r
-    }\r
-\r
-    OptionCount = Index;\r
-  } else {\r
-    OptionCount = 0;\r
-    Link = GetFirstNode (&Question->OptionListHead);\r
-    while (!IsNull (&Question->OptionListHead, Link)) {\r
-      OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
-\r
-      OptionCount++;\r
-\r
-      Link = GetNextNode (&Question->OptionListHead, Link);\r
-    }\r
-  }\r
-\r
-  //\r
-  // Move valid Option to list head.\r
-  //\r
-  PopUpMenuLines = 0;\r
-  if (OrderedList) {\r
-    //\r
-    // Prepare HiiValue array\r
-    //  \r
-    HiiValueArray = AllocateZeroPool (OptionCount * sizeof (EFI_HII_VALUE));\r
-    ASSERT (HiiValueArray != NULL);\r
-    for (Index = 0; Index < OptionCount; Index++) {\r
-      HiiValueArray[Index].Type = ValueType;\r
-      HiiValueArray[Index].Value.u64 = GetArrayData (ValueArray, ValueType, Index);\r
-    }\r
-\r
-    for (Index = 0; Index < OptionCount; Index++) {\r
-      OneOfOption = ValueToOption (Question, &HiiValueArray[OptionCount - Index - 1]);\r
-      if (OneOfOption == NULL) {\r
-        return EFI_NOT_FOUND;\r
-      }\r
-\r
-      RemoveEntryList (&OneOfOption->Link);\r
-\r
-      //\r
-      // Insert to head.\r
-      //\r
-      InsertHeadList (&Question->OptionListHead, &OneOfOption->Link);\r
-\r
-      PopUpMenuLines++;\r
-    }\r
-\r
-    FreePool (HiiValueArray);\r
-  } else {\r
-    Link = GetFirstNode (&Question->OptionListHead);\r
-    for (Index = 0; Index < OptionCount; Index++) {\r
-      OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
-      Link = GetNextNode (&Question->OptionListHead, Link);\r
-      if ((OneOfOption->SuppressExpression != NULL) &&\r
-          EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
-        continue;\r
-      } else {\r
-        PopUpMenuLines++;\r
-      }\r
-    }\r
-  }\r
-\r
-  //\r
-  // Get the number of one of options present and its size\r
-  //\r
-  PopUpWidth = 0;\r
-  HighlightOptionIndex = 0;\r
-  Link = GetFirstNode (&Question->OptionListHead);\r
-  for (Index = 0; Index < PopUpMenuLines; Index++) {\r
-    OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
-    Link = GetNextNode (&Question->OptionListHead, Link);\r
-\r
-    if (!OrderedList && (OneOfOption->SuppressExpression != NULL) &&\r
-        EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
-      Index--;\r
-      continue;\r
-    }\r
-\r
-    StringPtr = GetToken (OneOfOption->Text, MenuOption->Handle);\r
-    if (StrLen (StringPtr) > PopUpWidth) {\r
-      PopUpWidth = StrLen (StringPtr);\r
-    }\r
-    FreePool (StringPtr);\r
-\r
-    if (!OrderedList && (CompareHiiValue (&Question->HiiValue, &OneOfOption->Value, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) {\r
-      //\r
-      // Find current selected Option for OneOf\r
-      //\r
-      HighlightOptionIndex = Index;\r
-    }\r
-  }\r
-\r
-  //\r
-  // Perform popup menu initialization.\r
-  //\r
-  PopUpWidth = PopUpWidth + POPUP_PAD_SPACE_COUNT;\r
-\r
-  SavedAttribute = gST->ConOut->Mode->Attribute;\r
-  gST->ConOut->SetAttribute (gST->ConOut, POPUP_TEXT | POPUP_BACKGROUND);\r
-\r
-  if ((PopUpWidth + POPUP_FRAME_WIDTH) > DimensionsWidth) {\r
-    PopUpWidth = DimensionsWidth - POPUP_FRAME_WIDTH;\r
-  }\r
-\r
-  Start  = (DimensionsWidth - PopUpWidth - POPUP_FRAME_WIDTH) / 2 + gScreenDimensions.LeftColumn;\r
-  End    = Start + PopUpWidth + POPUP_FRAME_WIDTH;\r
-  Top    = gScreenDimensions.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT;\r
-  Bottom = gScreenDimensions.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight - 1;\r
-\r
-  MenuLinesInView = Bottom - Top - 1;\r
-  if (MenuLinesInView >= PopUpMenuLines) {\r
-    Top     = Top + (MenuLinesInView - PopUpMenuLines) / 2;\r
-    Bottom  = Top + PopUpMenuLines + 1;\r
-  } else {\r
-    ShowDownArrow = TRUE;\r
-  }\r
-\r
-  if (HighlightOptionIndex > (MenuLinesInView - 1)) {\r
-    TopOptionIndex = HighlightOptionIndex - MenuLinesInView + 1;\r
-  } else {\r
-    TopOptionIndex = 0;\r
-  }\r
-\r
-  do {\r
-    //\r
-    // Clear that portion of the screen\r
-    //\r
-    ClearLines (Start, End, Top, Bottom, POPUP_TEXT | POPUP_BACKGROUND);\r
-\r
-    //\r
-    // Draw "One of" pop-up menu\r
-    //\r
-    Character = BOXDRAW_DOWN_RIGHT;\r
-    PrintCharAt (Start, Top, Character);\r
-    for (Index = Start; Index + 2 < End; Index++) {\r
-      if ((ShowUpArrow) && ((Index + 1) == (Start + End) / 2)) {\r
-        Character = GEOMETRICSHAPE_UP_TRIANGLE;\r
-      } else {\r
-        Character = BOXDRAW_HORIZONTAL;\r
-      }\r
-\r
-      PrintChar (Character);\r
-    }\r
-\r
-    Character = BOXDRAW_DOWN_LEFT;\r
-    PrintChar (Character);\r
-    Character = BOXDRAW_VERTICAL;\r
-    for (Index = Top + 1; Index < Bottom; Index++) {\r
-      PrintCharAt (Start, Index, Character);\r
-      PrintCharAt (End - 1, Index, Character);\r
-    }\r
-\r
-    //\r
-    // Move to top Option\r
-    //\r
-    Link = GetFirstNode (&Question->OptionListHead);\r
-    for (Index = 0; Index < TopOptionIndex; Index++) {\r
-      Link = GetNextNode (&Question->OptionListHead, Link);\r
-\r
-      OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
-      if (!OrderedList && (OneOfOption->SuppressExpression != NULL) &&\r
-          EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
-        Index--;\r
-        continue;\r
-      }\r
-    }\r
-\r
-    //\r
-    // Display the One of options\r
-    //\r
-    Index2 = Top + 1;\r
-    for (Index = TopOptionIndex; (Index < PopUpMenuLines) && (Index2 < Bottom); Index++) {\r
-      OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
-      Link = GetNextNode (&Question->OptionListHead, Link);\r
-\r
-      if (!OrderedList && (OneOfOption->SuppressExpression != NULL) &&\r
-          EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) > ExpressFalse) {\r
-        Index--;\r
-        continue;\r
-      }\r
-\r
-      StringPtr = GetToken (OneOfOption->Text, MenuOption->Handle);\r
-      ASSERT (StringPtr != NULL);\r
-      //\r
-      // If the string occupies multiple lines, truncate it to fit in one line,\r
-      // and append a "..." for indication.\r
-      //\r
-      if (StrLen (StringPtr) > (PopUpWidth - 1)) {\r
-        TempStringPtr = AllocateZeroPool (sizeof (CHAR16) * (PopUpWidth - 1));\r
-        ASSERT ( TempStringPtr != NULL );\r
-        CopyMem (TempStringPtr, StringPtr, (sizeof (CHAR16) * (PopUpWidth - 5)));\r
-        FreePool (StringPtr);\r
-        StringPtr = TempStringPtr;\r
-        StrCat (StringPtr, L"...");\r
-      }\r
-\r
-      if (Index == HighlightOptionIndex) {\r
-          //\r
-          // Highlight the selected one\r
-          //\r
-          CurrentOption = OneOfOption;\r
-\r
-          gST->ConOut->SetAttribute (gST->ConOut, PICKLIST_HIGHLIGHT_TEXT | PICKLIST_HIGHLIGHT_BACKGROUND);\r
-          PrintStringAt (Start + 2, Index2, StringPtr);\r
-          gST->ConOut->SetAttribute (gST->ConOut, POPUP_TEXT | POPUP_BACKGROUND);\r
-        } else {\r
-          gST->ConOut->SetAttribute (gST->ConOut, POPUP_TEXT | POPUP_BACKGROUND);\r
-          PrintStringAt (Start + 2, Index2, StringPtr);\r
-        }\r
-\r
-      Index2++;\r
-      FreePool (StringPtr);\r
-    }\r
-\r
-    Character = BOXDRAW_UP_RIGHT;\r
-    PrintCharAt (Start, Bottom, Character);\r
-    for (Index = Start; Index + 2 < End; Index++) {\r
-      if ((ShowDownArrow) && ((Index + 1) == (Start + End) / 2)) {\r
-        Character = GEOMETRICSHAPE_DOWN_TRIANGLE;\r
-      } else {\r
-        Character = BOXDRAW_HORIZONTAL;\r
-      }\r
-\r
-      PrintChar (Character);\r
-    }\r
-\r
-    Character = BOXDRAW_UP_LEFT;\r
-    PrintChar (Character);\r
-\r
-    //\r
-    // Get User selection\r
-    //\r
-    Key.UnicodeChar = CHAR_NULL;\r
-    if ((gDirection == SCAN_UP) || (gDirection == SCAN_DOWN)) {\r
-      Key.ScanCode  = gDirection;\r
-      gDirection    = 0;\r
-      goto TheKey;\r
-    }\r
-\r
-    Status = WaitForKeyStroke (&Key);\r
-\r
-TheKey:\r
-    switch (Key.UnicodeChar) {\r
-    case '+':\r
-      if (OrderedList) {\r
-        if ((TopOptionIndex > 0) && (TopOptionIndex == HighlightOptionIndex)) {\r
-          //\r
-          // Highlight reaches the top of the popup window, scroll one menu item.\r
-          //\r
-          TopOptionIndex--;\r
-          ShowDownArrow = TRUE;\r
-        }\r
-\r
-        if (TopOptionIndex == 0) {\r
-          ShowUpArrow = FALSE;\r
-        }\r
-\r
-        if (HighlightOptionIndex > 0) {\r
-          HighlightOptionIndex--;\r
-\r
-          ASSERT (CurrentOption != NULL);\r
-          SwapListEntries (CurrentOption->Link.BackLink, &CurrentOption->Link);\r
-        }\r
-      }\r
-      break;\r
-\r
-    case '-':\r
-      //\r
-      // If an ordered list op-code, we will allow for a popup of +/- keys\r
-      // to create an ordered list of items\r
-      //\r
-      if (OrderedList) {\r
-        if (((TopOptionIndex + MenuLinesInView) < PopUpMenuLines) &&\r
-            (HighlightOptionIndex == (TopOptionIndex + MenuLinesInView - 1))) {\r
-          //\r
-          // Highlight reaches the bottom of the popup window, scroll one menu item.\r
-          //\r
-          TopOptionIndex++;\r
-          ShowUpArrow = TRUE;\r
-        }\r
-\r
-        if ((TopOptionIndex + MenuLinesInView) == PopUpMenuLines) {\r
-          ShowDownArrow = FALSE;\r
-        }\r
-\r
-        if (HighlightOptionIndex < (PopUpMenuLines - 1)) {\r
-          HighlightOptionIndex++;\r
-\r
-          ASSERT (CurrentOption != NULL);\r
-          SwapListEntries (&CurrentOption->Link, CurrentOption->Link.ForwardLink);\r
-        }\r
-      }\r
-      break;\r
-\r
-    case CHAR_NULL:\r
-      switch (Key.ScanCode) {\r
-      case SCAN_UP:\r
-      case SCAN_DOWN:\r
-        if (Key.ScanCode == SCAN_UP) {\r
-          if ((TopOptionIndex > 0) && (TopOptionIndex == HighlightOptionIndex)) {\r
-            //\r
-            // Highlight reaches the top of the popup window, scroll one menu item.\r
-            //\r
-            TopOptionIndex--;\r
-            ShowDownArrow = TRUE;\r
-          }\r
-\r
-          if (TopOptionIndex == 0) {\r
-            ShowUpArrow = FALSE;\r
-          }\r
-\r
-          if (HighlightOptionIndex > 0) {\r
-            HighlightOptionIndex--;\r
-          }\r
-        } else {\r
-          if (((TopOptionIndex + MenuLinesInView) < PopUpMenuLines) &&\r
-              (HighlightOptionIndex == (TopOptionIndex + MenuLinesInView - 1))) {\r
-            //\r
-            // Highlight reaches the bottom of the popup window, scroll one menu item.\r
-            //\r
-            TopOptionIndex++;\r
-            ShowUpArrow = TRUE;\r
-          }\r
-\r
-          if ((TopOptionIndex + MenuLinesInView) == PopUpMenuLines) {\r
-            ShowDownArrow = FALSE;\r
-          }\r
-\r
-          if (HighlightOptionIndex < (PopUpMenuLines - 1)) {\r
-            HighlightOptionIndex++;\r
-          }\r
-        }\r
-        break;\r
-\r
-      case SCAN_ESC:\r
-        gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);\r
-\r
-        //\r
-        // Restore link list order for orderedlist\r
-        //\r
-        if (OrderedList) {\r
-          HiiValue.Type = ValueType;\r
-          HiiValue.Value.u64 = 0;\r
-          for (Index = 0; Index < Question->MaxContainers; Index++) {\r
-            HiiValue.Value.u64 = GetArrayData (ValueArray, ValueType, Index);\r
-            if (HiiValue.Value.u64 == 0) {\r
-              break;\r
-            }\r
-\r
-            OneOfOption = ValueToOption (Question, &HiiValue);\r
-            if (OneOfOption == NULL) {\r
-              return EFI_NOT_FOUND;\r
-            }\r
-\r
-            RemoveEntryList (&OneOfOption->Link);\r
-            InsertTailList (&Question->OptionListHead, &OneOfOption->Link);\r
-          }\r
-        }\r
-\r
-        return EFI_DEVICE_ERROR;\r
-\r
-      default:\r
-        break;\r
-      }\r
-\r
-      break;\r
-\r
-    case CHAR_CARRIAGE_RETURN:\r
-      //\r
-      // return the current selection\r
-      //\r
-      if (OrderedList) {\r
-        Index = 0;\r
-        Link = GetFirstNode (&Question->OptionListHead);\r
-        while (!IsNull (&Question->OptionListHead, Link)) {\r
-          OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
-          Link = GetNextNode (&Question->OptionListHead, Link);\r
-\r
-          if ((OneOfOption->SuppressExpression != NULL) &&\r
-              EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) != ExpressFalse) {\r
-            continue;\r
-          }\r
-\r
-          SetArrayData (ValueArray, ValueType, Index, OneOfOption->Value.Value.u64);\r
-\r
-          Index++;\r
-          if (Index > Question->MaxContainers) {\r
-            break;\r
-          }\r
-        }\r
-      } else {\r
-        ASSERT (CurrentOption != NULL);\r
-        CopyMem (&Question->HiiValue, &CurrentOption->Value, sizeof (EFI_HII_VALUE));\r
-      }\r
-\r
-      gST->ConOut->SetAttribute (gST->ConOut, SavedAttribute);\r
-\r
-      Status = ValidateQuestion (Selection->FormSet, Selection->Form, Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);\r
-      if (EFI_ERROR (Status)) {\r
-        //\r
-        // Input value is not valid, restore Question Value\r
-        //\r
-        GetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
-      } else {\r
-        SetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
-        UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);\r
-      }\r
-\r
-      return Status;\r
-\r
-    default:\r
-      break;\r
-    }\r
-  } while (TRUE);\r
-\r
-}\r
-\r
-/**\r
-  Wait for a key to be pressed by user.\r
-\r
-  @param Key         The key which is pressed by user.\r
-\r
-  @retval EFI_SUCCESS The function always completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-WaitForKeyStroke (\r
-  OUT  EFI_INPUT_KEY           *Key\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-\r
-  while (TRUE) {\r
-    Status = gST->ConIn->ReadKeyStroke (gST->ConIn, Key);\r
-    if (!EFI_ERROR (Status)) {\r
-      break;\r
-    }\r
-\r
-    if (Status != EFI_NOT_READY) {\r
-      continue;\r
-    }\r
-\r
-    UiWaitForSingleEvent (gST->ConIn->WaitForKey, 0, 0);\r
-  }\r
-  return Status;\r
-}\r
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Print.c b/MdeModulePkg/Universal/SetupBrowserDxe/Print.c
deleted file mode 100644 (file)
index eeadf24..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-/** @file\r
-Basic Ascii AvSPrintf() function named VSPrint(). VSPrint() enables very\r
-simple implemenation of SPrint() and Print() to support debug.\r
-\r
-You can not Print more than EFI_DRIVER_LIB_MAX_PRINT_BUFFER characters at a\r
-time. This makes the implementation very simple.\r
-\r
-VSPrint, Print, SPrint format specification has the follwoing form\r
-\r
-%type\r
-\r
-type:\r
-  'S','s' - argument is an Unicode string\r
-  'c' - argument is an ascii character\r
-  '%' - Print a %\r
-\r
-\r
-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\r
-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 "Setup.h"\r
-\r
-/**\r
-  The internal function prints to the EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL\r
-  protocol instance.\r
-\r
-  @param Column          The position of the output string.\r
-  @param Row             The position of the output string.\r
-  @param Out             The EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL instance.\r
-  @param Fmt             The format string.\r
-  @param Args            The additional argument for the variables in the format string.\r
-\r
-  @return Number of Unicode character printed.\r
-\r
-**/\r
-UINTN\r
-PrintInternal (\r
-  IN UINTN                            Column,\r
-  IN UINTN                            Row,\r
-  IN EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *Out,\r
-  IN CHAR16                           *Fmt,\r
-  IN VA_LIST                          Args\r
-  )\r
-{\r
-  CHAR16  *Buffer;\r
-  CHAR16  *BackupBuffer;\r
-  UINTN   Index;\r
-  UINTN   PreviousIndex;\r
-  UINTN   Count;\r
-\r
-  //\r
-  // For now, allocate an arbitrarily long buffer\r
-  //\r
-  Buffer        = AllocateZeroPool (0x10000);\r
-  BackupBuffer  = AllocateZeroPool (0x10000);\r
-  ASSERT (Buffer);\r
-  ASSERT (BackupBuffer);\r
-\r
-  if (Column != (UINTN) -1) {\r
-    Out->SetCursorPosition (Out, Column, Row);\r
-  }\r
-\r
-  UnicodeVSPrint (Buffer, 0x10000, Fmt, Args);\r
-\r
-  Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
-\r
-  Out->SetAttribute (Out, Out->Mode->Attribute);\r
-\r
-  Index         = 0;\r
-  PreviousIndex = 0;\r
-  Count         = 0;\r
-\r
-  do {\r
-    for (; (Buffer[Index] != NARROW_CHAR) && (Buffer[Index] != WIDE_CHAR) && (Buffer[Index] != 0); Index++) {\r
-      BackupBuffer[Index] = Buffer[Index];\r
-    }\r
-\r
-    if (Buffer[Index] == 0) {\r
-      break;\r
-    }\r
-    //\r
-    // Null-terminate the temporary string\r
-    //\r
-    BackupBuffer[Index] = 0;\r
-\r
-    //\r
-    // Print this out, we are about to switch widths\r
-    //\r
-    Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
-    Count += StrLen (&BackupBuffer[PreviousIndex]);\r
-\r
-    //\r
-    // Preserve the current index + 1, since this is where we will start printing from next\r
-    //\r
-    PreviousIndex = Index + 1;\r
-\r
-    //\r
-    // We are at a narrow or wide character directive.  Set attributes and strip it and print it\r
-    //\r
-    if (Buffer[Index] == NARROW_CHAR) {\r
-      //\r
-      // Preserve bits 0 - 6 and zero out the rest\r
-      //\r
-      Out->Mode->Attribute = Out->Mode->Attribute & 0x7f;\r
-      Out->SetAttribute (Out, Out->Mode->Attribute);\r
-    } else {\r
-      //\r
-      // Must be wide, set bit 7 ON\r
-      //\r
-      Out->Mode->Attribute = Out->Mode->Attribute | EFI_WIDE_ATTRIBUTE;\r
-      Out->SetAttribute (Out, Out->Mode->Attribute);\r
-    }\r
-\r
-    Index++;\r
-\r
-  } while (Buffer[Index] != 0);\r
-\r
-  //\r
-  // We hit the end of the string - print it\r
-  //\r
-  Out->OutputString (Out, &BackupBuffer[PreviousIndex]);\r
-  Count += StrLen (&BackupBuffer[PreviousIndex]);\r
-\r
-  FreePool (Buffer);\r
-  FreePool (BackupBuffer);\r
-  return Count;\r
-}\r
-\r
-\r
-/**\r
-  Prints a formatted unicode string to the default console.\r
-\r
-  @param  Fmt        Format string\r
-  @param  ...        Variable argument list for format string.\r
-\r
-  @return Length of string printed to the console.\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-ConsolePrint (\r
-  IN CHAR16   *Fmt,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST Args;\r
-  UINTN   LengthOfPrinted;\r
-\r
-  VA_START (Args, Fmt);\r
-  LengthOfPrinted = PrintInternal ((UINTN) -1, (UINTN) -1, gST->ConOut, Fmt, Args);\r
-  VA_END (Args);\r
-  return LengthOfPrinted;\r
-}\r
-\r
-\r
-/**\r
-  Prints a unicode string to the default console,\r
-  using L"%s" format.\r
-\r
-  @param  String     String pointer.\r
-\r
-  @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-PrintString (\r
-  IN CHAR16       *String\r
-  )\r
-{\r
-  return ConsolePrint (L"%s", String);\r
-}\r
-\r
-\r
-/**\r
-  Prints a chracter to the default console,\r
-  using L"%c" format.\r
-\r
-  @param  Character  Character to print.\r
-\r
-  @return Length of string printed to the console.\r
-\r
-**/\r
-UINTN\r
-PrintChar (\r
-  CHAR16       Character\r
-  )\r
-{\r
-  return ConsolePrint (L"%c", Character);\r
-}\r
-\r
-\r
-/**\r
-  Prints a formatted unicode string to the default console, at\r
-  the supplied cursor position.\r
-\r
-  @param  Column     The cursor position to print the string at.\r
-  @param  Row        The cursor position to print the string at.\r
-  @param  Fmt        Format string.\r
-  @param  ...        Variable argument list for format string.\r
-\r
-  @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-EFIAPI\r
-PrintAt (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *Fmt,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST Args;\r
-  UINTN   LengthOfPrinted;\r
-\r
-  VA_START (Args, Fmt);\r
-  LengthOfPrinted = PrintInternal (Column, Row, gST->ConOut, Fmt, Args);\r
-  VA_END (Args);\r
-  return LengthOfPrinted;\r
-}\r
-\r
-\r
-/**\r
-  Prints a unicode string to the default console, at\r
-  the supplied cursor position, using L"%s" format.\r
-\r
-  @param  Column     The cursor position to print the string at.\r
-  @param  Row        The cursor position to print the string at\r
-  @param  String     String pointer.\r
-\r
-  @return Length of string printed to the console\r
-\r
-**/\r
-UINTN\r
-PrintStringAt (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  IN CHAR16    *String\r
-  )\r
-{\r
-  return PrintAt (Column, Row, L"%s", String);\r
-}\r
-\r
-\r
-/**\r
-  Prints a chracter to the default console, at\r
-  the supplied cursor position, using L"%c" format.\r
-\r
-  @param  Column     The cursor position to print the string at.\r
-  @param  Row        The cursor position to print the string at.\r
-  @param  Character  Character to print.\r
-\r
-  @return Length of string printed to the console.\r
-\r
-**/\r
-UINTN\r
-PrintCharAt (\r
-  IN UINTN     Column,\r
-  IN UINTN     Row,\r
-  CHAR16       Character\r
-  )\r
-{\r
-  return PrintAt (Column, Row, L"%c", Character);\r
-}\r
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c b/MdeModulePkg/Universal/SetupBrowserDxe/ProcessOptions.c
deleted file mode 100644 (file)
index fecb98e..0000000
+++ /dev/null
@@ -1,1075 +0,0 @@
-/** @file\r
-Implementation for handling the User Interface option processing.\r
-\r
-\r
-Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>\r
-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 "Setup.h"\r
-\r
-\r
-/**\r
-  Process Question Config.\r
-\r
-  @param  Selection              The UI menu selection.\r
-  @param  Question               The Question to be peocessed.\r
-\r
-  @retval EFI_SUCCESS            Question Config process success.\r
-  @retval Other                  Question Config process fail.\r
-\r
-**/\r
-EFI_STATUS\r
-ProcessQuestionConfig (\r
-  IN  UI_MENU_SELECTION       *Selection,\r
-  IN  FORM_BROWSER_STATEMENT  *Question\r
-  )\r
-{\r
-  EFI_STATUS                      Status;\r
-  CHAR16                          *ConfigResp;\r
-  CHAR16                          *Progress;\r
-  EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
-\r
-  if (Question->QuestionConfig == 0) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  //\r
-  // Get <ConfigResp>\r
-  //\r
-  ConfigResp = GetToken (Question->QuestionConfig, Selection->FormSet->HiiHandle);\r
-  if (ConfigResp == NULL) {\r
-    return EFI_NOT_FOUND;\r
-  }\r
-\r
-  //\r
-  // Send config to Configuration Driver\r
-  //\r
-  ConfigAccess = Selection->FormSet->ConfigAccess;\r
-  if (ConfigAccess == NULL) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-  Status = ConfigAccess->RouteConfig (\r
-                           ConfigAccess,\r
-                           ConfigResp,\r
-                           &Progress\r
-                           );\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Search an Option of a Question by its value.\r
-\r
-  @param  Question               The Question\r
-  @param  OptionValue            Value for Option to be searched.\r
-\r
-  @retval Pointer                Pointer to the found Option.\r
-  @retval NULL                   Option not found.\r
-\r
-**/\r
-QUESTION_OPTION *\r
-ValueToOption (\r
-  IN FORM_BROWSER_STATEMENT   *Question,\r
-  IN EFI_HII_VALUE            *OptionValue\r
-  )\r
-{\r
-  LIST_ENTRY       *Link;\r
-  QUESTION_OPTION  *Option;\r
-  INTN             Result;\r
-\r
-  Link = GetFirstNode (&Question->OptionListHead);\r
-  while (!IsNull (&Question->OptionListHead, Link)) {\r
-    Option = QUESTION_OPTION_FROM_LINK (Link);\r
-\r
-    if ((CompareHiiValue (&Option->Value, OptionValue, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) {\r
-      //\r
-      // Check the suppressif condition, only a valid option can be return.\r
-      //\r
-      if ((Option->SuppressExpression == NULL) ||\r
-          ((EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) == ExpressFalse))) {\r
-        return Option;\r
-      }\r
-    }\r
-\r
-    Link = GetNextNode (&Question->OptionListHead, Link);\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-\r
-/**\r
-  Return data element in an Array by its Index.\r
-\r
-  @param  Array                  The data array.\r
-  @param  Type                   Type of the data in this array.\r
-  @param  Index                  Zero based index for data in this array.\r
-\r
-  @retval Value                  The data to be returned\r
-\r
-**/\r
-UINT64\r
-GetArrayData (\r
-  IN VOID                     *Array,\r
-  IN UINT8                    Type,\r
-  IN UINTN                    Index\r
-  )\r
-{\r
-  UINT64 Data;\r
-\r
-  ASSERT (Array != NULL);\r
-\r
-  Data = 0;\r
-  switch (Type) {\r
-  case EFI_IFR_TYPE_NUM_SIZE_8:\r
-    Data = (UINT64) *(((UINT8 *) Array) + Index);\r
-    break;\r
-\r
-  case EFI_IFR_TYPE_NUM_SIZE_16:\r
-    Data = (UINT64) *(((UINT16 *) Array) + Index);\r
-    break;\r
-\r
-  case EFI_IFR_TYPE_NUM_SIZE_32:\r
-    Data = (UINT64) *(((UINT32 *) Array) + Index);\r
-    break;\r
-\r
-  case EFI_IFR_TYPE_NUM_SIZE_64:\r
-    Data = (UINT64) *(((UINT64 *) Array) + Index);\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  }\r
-\r
-  return Data;\r
-}\r
-\r
-\r
-/**\r
-  Set value of a data element in an Array by its Index.\r
-\r
-  @param  Array                  The data array.\r
-  @param  Type                   Type of the data in this array.\r
-  @param  Index                  Zero based index for data in this array.\r
-  @param  Value                  The value to be set.\r
-\r
-**/\r
-VOID\r
-SetArrayData (\r
-  IN VOID                     *Array,\r
-  IN UINT8                    Type,\r
-  IN UINTN                    Index,\r
-  IN UINT64                   Value\r
-  )\r
-{\r
-\r
-  ASSERT (Array != NULL);\r
-\r
-  switch (Type) {\r
-  case EFI_IFR_TYPE_NUM_SIZE_8:\r
-    *(((UINT8 *) Array) + Index) = (UINT8) Value;\r
-    break;\r
-\r
-  case EFI_IFR_TYPE_NUM_SIZE_16:\r
-    *(((UINT16 *) Array) + Index) = (UINT16) Value;\r
-    break;\r
-\r
-  case EFI_IFR_TYPE_NUM_SIZE_32:\r
-    *(((UINT32 *) Array) + Index) = (UINT32) Value;\r
-    break;\r
-\r
-  case EFI_IFR_TYPE_NUM_SIZE_64:\r
-    *(((UINT64 *) Array) + Index) = (UINT64) Value;\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  }\r
-}\r
-\r
-/**\r
-  Check whether this value already in the array, if yes, return the index.\r
-\r
-  @param  Array                  The data array.\r
-  @param  Type                   Type of the data in this array.\r
-  @param  Value                  The value to be find.\r
-  @param  Index                  The index in the array which has same value with Value.\r
-  \r
-  @retval   TRUE Found the value in the array.\r
-  @retval   FALSE Not found the value.\r
-\r
-**/\r
-BOOLEAN \r
-FindArrayData (\r
-  IN VOID                     *Array,\r
-  IN UINT8                    Type,\r
-  IN UINT64                   Value,\r
-  OUT UINTN                   *Index OPTIONAL\r
-  )\r
-{\r
-  UINTN  Count;\r
-  UINT64 TmpValue;\r
-  \r
-  ASSERT (Array != NULL);\r
-\r
-  Count    = 0;\r
-  TmpValue = 0;\r
-\r
-  while ((TmpValue = GetArrayData (Array, Type, Count)) != 0) {\r
-    if (Value == TmpValue) {\r
-      if (Index != NULL) {\r
-        *Index = Count;\r
-      }\r
-      return TRUE;\r
-    }\r
-\r
-    Count ++;\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-/**\r
-  Print Question Value according to it's storage width and display attributes.\r
-\r
-  @param  Question               The Question to be printed.\r
-  @param  FormattedNumber        Buffer for output string.\r
-  @param  BufferSize             The FormattedNumber buffer size in bytes.\r
-\r
-  @retval EFI_SUCCESS            Print success.\r
-  @retval EFI_BUFFER_TOO_SMALL   Buffer size is not enough for formatted number.\r
-\r
-**/\r
-EFI_STATUS\r
-PrintFormattedNumber (\r
-  IN FORM_BROWSER_STATEMENT   *Question,\r
-  IN OUT CHAR16               *FormattedNumber,\r
-  IN UINTN                    BufferSize\r
-  )\r
-{\r
-  INT64          Value;\r
-  CHAR16         *Format;\r
-  EFI_HII_VALUE  *QuestionValue;\r
-\r
-  if (BufferSize < (21 * sizeof (CHAR16))) {\r
-    return EFI_BUFFER_TOO_SMALL;\r
-  }\r
-\r
-  QuestionValue = &Question->HiiValue;\r
-\r
-  Value = (INT64) QuestionValue->Value.u64;\r
-  switch (Question->Flags & EFI_IFR_DISPLAY) {\r
-  case EFI_IFR_DISPLAY_INT_DEC:\r
-    switch (QuestionValue->Type) {\r
-    case EFI_IFR_NUMERIC_SIZE_1:\r
-      Value = (INT64) ((INT8) QuestionValue->Value.u8);\r
-      break;\r
-\r
-    case EFI_IFR_NUMERIC_SIZE_2:\r
-      Value = (INT64) ((INT16) QuestionValue->Value.u16);\r
-      break;\r
-\r
-    case EFI_IFR_NUMERIC_SIZE_4:\r
-      Value = (INT64) ((INT32) QuestionValue->Value.u32);\r
-      break;\r
-\r
-    case EFI_IFR_NUMERIC_SIZE_8:\r
-    default:\r
-      break;\r
-    }\r
-\r
-    if (Value < 0) {\r
-      Value = -Value;\r
-      Format = L"-%ld";\r
-    } else {\r
-      Format = L"%ld";\r
-    }\r
-    break;\r
-\r
-  case EFI_IFR_DISPLAY_UINT_DEC:\r
-    Format = L"%ld";\r
-    break;\r
-\r
-  case EFI_IFR_DISPLAY_UINT_HEX:\r
-    Format = L"%lx";\r
-    break;\r
-\r
-  default:\r
-    return EFI_UNSUPPORTED;\r
-    break;\r
-  }\r
-\r
-  UnicodeSPrint (FormattedNumber, BufferSize, Format, Value);\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Password may be stored as encrypted by Configuration Driver. When change a\r
-  password, user will be challenged with old password. To validate user input old\r
-  password, we will send the clear text to Configuration Driver via Callback().\r
-  Configuration driver is responsible to check the passed in password and return\r
-  the validation result. If validation pass, state machine in password Callback()\r
-  will transit from BROWSER_STATE_VALIDATE_PASSWORD to BROWSER_STATE_SET_PASSWORD.\r
-  After user type in new password twice, Callback() will be invoked to send the\r
-  new password to Configuration Driver.\r
-\r
-  @param  Selection              Pointer to UI_MENU_SELECTION.\r
-  @param  MenuOption             The MenuOption for this password Question.\r
-  @param  String                 The clear text of password.\r
-\r
-  @retval EFI_NOT_AVAILABLE_YET  Callback() request to terminate password input.\r
-  @return In state of BROWSER_STATE_VALIDATE_PASSWORD:\r
-  @retval EFI_SUCCESS            Password correct, Browser will prompt for new\r
-                                 password.\r
-  @retval EFI_NOT_READY          Password incorrect, Browser will show error\r
-                                 message.\r
-  @retval Other                  Browser will do nothing.\r
-  @return In state of BROWSER_STATE_SET_PASSWORD:\r
-  @retval EFI_SUCCESS            Set password success.\r
-  @retval Other                  Set password failed.\r
-\r
-**/\r
-EFI_STATUS\r
-PasswordCallback (\r
-  IN  UI_MENU_SELECTION           *Selection,\r
-  IN  UI_MENU_OPTION              *MenuOption,\r
-  IN  CHAR16                      *String\r
-  )\r
-{\r
-  EFI_STATUS                      Status;\r
-  EFI_HII_CONFIG_ACCESS_PROTOCOL  *ConfigAccess;\r
-  EFI_BROWSER_ACTION_REQUEST      ActionRequest;\r
-  EFI_IFR_TYPE_VALUE              IfrTypeValue;\r
-\r
-  ConfigAccess = Selection->FormSet->ConfigAccess;\r
-  if (ConfigAccess == NULL) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  //\r
-  // Prepare password string in HII database\r
-  //\r
-  if (String != NULL) {\r
-    IfrTypeValue.string = NewString (String, Selection->FormSet->HiiHandle);\r
-  } else {\r
-    IfrTypeValue.string = 0;\r
-  }\r
-\r
-  //\r
-  // Send password to Configuration Driver for validation\r
-  //\r
-  Status = ConfigAccess->Callback (\r
-                           ConfigAccess,\r
-                           EFI_BROWSER_ACTION_CHANGING,\r
-                           MenuOption->ThisTag->QuestionId,\r
-                           MenuOption->ThisTag->HiiValue.Type,\r
-                           &IfrTypeValue,\r
-                           &ActionRequest\r
-                           );\r
-\r
-  //\r
-  // Remove password string from HII database\r
-  //\r
-  if (String != NULL) {\r
-    DeleteString (IfrTypeValue.string, Selection->FormSet->HiiHandle);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Display error message for invalid password.\r
-\r
-**/\r
-VOID\r
-PasswordInvalid (\r
-  VOID\r
-  )\r
-{\r
-  EFI_INPUT_KEY  Key;\r
-\r
-  //\r
-  // Invalid password, prompt error message\r
-  //\r
-  do {\r
-    CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gPassowordInvalid, gPressEnter, gEmptyString);\r
-  } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-}\r
-\r
-\r
-/**\r
-  Process a Question's Option (whether selected or un-selected).\r
-\r
-  @param  Selection              Pointer to UI_MENU_SELECTION.\r
-  @param  MenuOption             The MenuOption for this Question.\r
-  @param  Selected               TRUE: if Question is selected.\r
-  @param  OptionString           Pointer of the Option String to be displayed.\r
-\r
-  @retval EFI_SUCCESS            Question Option process success.\r
-  @retval Other                  Question Option process fail.\r
-\r
-**/\r
-EFI_STATUS\r
-ProcessOptions (\r
-  IN  UI_MENU_SELECTION           *Selection,\r
-  IN  UI_MENU_OPTION              *MenuOption,\r
-  IN  BOOLEAN                     Selected,\r
-  OUT CHAR16                      **OptionString\r
-  )\r
-{\r
-  EFI_STATUS                      Status;\r
-  CHAR16                          *StringPtr;\r
-  CHAR16                          *TempString;\r
-  UINTN                           Index;\r
-  FORM_BROWSER_STATEMENT          *Question;\r
-  CHAR16                          FormattedNumber[21];\r
-  UINT16                          Number;\r
-  CHAR16                          Character[2];\r
-  EFI_INPUT_KEY                   Key;\r
-  UINTN                           BufferSize;\r
-  QUESTION_OPTION                 *OneOfOption;\r
-  LIST_ENTRY                      *Link;\r
-  EFI_HII_VALUE                   HiiValue;\r
-  EFI_HII_VALUE                   *QuestionValue;\r
-  UINT16                          Maximum;\r
-  QUESTION_OPTION                 *Option;\r
-  UINTN                           Index2;\r
-  UINT8                           *ValueArray;\r
-  UINT8                           ValueType;\r
-  EFI_STRING_ID                   StringId;\r
-\r
-  Status        = EFI_SUCCESS;\r
-\r
-  StringPtr     = NULL;\r
-  Character[1]  = L'\0';\r
-  *OptionString = NULL;\r
-  StringId      = 0;\r
-\r
-  ZeroMem (FormattedNumber, 21 * sizeof (CHAR16));\r
-  BufferSize = (gOptionBlockWidth + 1) * 2 * gScreenDimensions.BottomRow;\r
-\r
-  Question = MenuOption->ThisTag;\r
-  QuestionValue = &Question->HiiValue;\r
-  Maximum = (UINT16) Question->Maximum;\r
-\r
-  ValueArray = Question->BufferValue;\r
-  ValueType = Question->ValueType;\r
-\r
-  switch (Question->Operand) {\r
-  case EFI_IFR_ORDERED_LIST_OP:\r
-    //\r
-    // Check whether there are Options of this OrderedList\r
-    //\r
-    if (IsListEmpty (&Question->OptionListHead)) {\r
-      break;\r
-    }\r
-    //\r
-    // Initialize Option value array\r
-    //\r
-    if (GetArrayData (ValueArray, ValueType, 0) == 0) {\r
-      GetQuestionDefault (Selection->FormSet, Selection->Form, Question, 0);\r
-    }\r
-\r
-    if (Selected) {\r
-      //\r
-      // Go ask for input\r
-      //\r
-      Status = GetSelectionInputPopUp (Selection, MenuOption);\r
-    } else {\r
-      //\r
-      // We now know how many strings we will have, so we can allocate the\r
-      // space required for the array or strings.\r
-      //\r
-      *OptionString = AllocateZeroPool (Question->MaxContainers * BufferSize);\r
-      ASSERT (*OptionString);\r
-\r
-      HiiValue.Type = ValueType;\r
-      HiiValue.Value.u64 = 0;\r
-      for (Index = 0; Index < Question->MaxContainers; Index++) {\r
-        HiiValue.Value.u64 = GetArrayData (ValueArray, ValueType, Index);\r
-        if (HiiValue.Value.u64 == 0) {\r
-          //\r
-          // Values for the options in ordered lists should never be a 0\r
-          //\r
-          break;\r
-        }\r
-\r
-        OneOfOption = ValueToOption (Question, &HiiValue);\r
-        if (OneOfOption == NULL) {\r
-          //\r
-          // Show error message\r
-          //\r
-          do {\r
-            CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gOptionMismatch, gPressEnter, gEmptyString);\r
-          } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-\r
-          //\r
-          // The initial value of the orderedlist is invalid, force to be valid value\r
-          //\r
-          Link = GetFirstNode (&Question->OptionListHead);\r
-          Index2 = 0;\r
-          while (!IsNull (&Question->OptionListHead, Link) && Index2 < Question->MaxContainers) {\r
-            Option = QUESTION_OPTION_FROM_LINK (Link);\r
-            Link = GetNextNode (&Question->OptionListHead, Link);\r
-            if ((Option->SuppressExpression != NULL) &&\r
-                ((EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress))) {\r
-              continue;\r
-            }\r
-            SetArrayData (ValueArray, ValueType, Index2, Option->Value.Value.u64);\r
-            Index2++;\r
-          }\r
-          SetArrayData (ValueArray, ValueType, Index2, 0);\r
-\r
-          Status = SetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
-          UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);\r
-\r
-          FreePool (*OptionString);\r
-          *OptionString = NULL;\r
-          return EFI_NOT_FOUND;\r
-        }\r
-\r
-        Character[0] = LEFT_ONEOF_DELIMITER;\r
-        NewStrCat (OptionString[0], Character);\r
-        StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
-        ASSERT (StringPtr != NULL);\r
-        NewStrCat (OptionString[0], StringPtr);\r
-        Character[0] = RIGHT_ONEOF_DELIMITER;\r
-        NewStrCat (OptionString[0], Character);\r
-        Character[0] = CHAR_CARRIAGE_RETURN;\r
-        NewStrCat (OptionString[0], Character);\r
-        FreePool (StringPtr);\r
-      }\r
-\r
-      //\r
-      // Search the other options, try to find the one not in the container.\r
-      //\r
-      Link = GetFirstNode (&Question->OptionListHead);\r
-      while (!IsNull (&Question->OptionListHead, Link)) {\r
-        OneOfOption = QUESTION_OPTION_FROM_LINK (Link);\r
-        Link = GetNextNode (&Question->OptionListHead, Link);\r
-        if ((OneOfOption->SuppressExpression != NULL) &&\r
-            ((EvaluateExpressionList(OneOfOption->SuppressExpression, FALSE, NULL, NULL) == ExpressSuppress))) {\r
-          continue;\r
-        }\r
-\r
-        if (FindArrayData (ValueArray, ValueType, OneOfOption->Value.Value.u64, NULL)) {\r
-          continue;\r
-        }\r
-\r
-        SetArrayData (ValueArray, ValueType, Index++, OneOfOption->Value.Value.u64);\r
-\r
-        Character[0] = LEFT_ONEOF_DELIMITER;\r
-        NewStrCat (OptionString[0], Character);\r
-        StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
-        ASSERT (StringPtr != NULL);\r
-        NewStrCat (OptionString[0], StringPtr);\r
-        Character[0] = RIGHT_ONEOF_DELIMITER;\r
-        NewStrCat (OptionString[0], Character);\r
-        Character[0] = CHAR_CARRIAGE_RETURN;\r
-        NewStrCat (OptionString[0], Character);\r
-        FreePool (StringPtr);\r
-      }\r
-    }\r
-    break;\r
-\r
-  case EFI_IFR_ONE_OF_OP:\r
-    //\r
-    // Check whether there are Options of this OneOf\r
-    //\r
-    if (IsListEmpty (&Question->OptionListHead)) {\r
-      break;\r
-    }\r
-    if (Selected) {\r
-      //\r
-      // Go ask for input\r
-      //\r
-      Status = GetSelectionInputPopUp (Selection, MenuOption);\r
-    } else {\r
-      *OptionString = AllocateZeroPool (BufferSize);\r
-      ASSERT (*OptionString);\r
-\r
-      OneOfOption = ValueToOption (Question, QuestionValue);\r
-      if (OneOfOption == NULL) {\r
-        //\r
-        // Show error message\r
-        //\r
-        do {\r
-          CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gOptionMismatch, gPressEnter, gEmptyString);\r
-        } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-\r
-        //\r
-        // Force the Question value to be valid\r
-        //\r
-        Link = GetFirstNode (&Question->OptionListHead);\r
-        while (!IsNull (&Question->OptionListHead, Link)) {\r
-          Option = QUESTION_OPTION_FROM_LINK (Link);\r
-\r
-          if ((Option->SuppressExpression == NULL) ||\r
-              (EvaluateExpressionList(Option->SuppressExpression, FALSE, NULL, NULL) == ExpressFalse)) {\r
-            CopyMem (QuestionValue, &Option->Value, sizeof (EFI_HII_VALUE));\r
-            SetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
-            UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);\r
-            break;\r
-          }\r
-\r
-          Link = GetNextNode (&Question->OptionListHead, Link);\r
-        }\r
-\r
-        FreePool (*OptionString);\r
-        *OptionString = NULL;\r
-        return EFI_NOT_FOUND;\r
-      }\r
-\r
-      Character[0] = LEFT_ONEOF_DELIMITER;\r
-      NewStrCat (OptionString[0], Character);\r
-      StringPtr = GetToken (OneOfOption->Text, Selection->Handle);\r
-      ASSERT (StringPtr != NULL);\r
-      NewStrCat (OptionString[0], StringPtr);\r
-      Character[0] = RIGHT_ONEOF_DELIMITER;\r
-      NewStrCat (OptionString[0], Character);\r
-\r
-      FreePool (StringPtr);\r
-    }\r
-    break;\r
-\r
-  case EFI_IFR_CHECKBOX_OP:\r
-    *OptionString = AllocateZeroPool (BufferSize);\r
-    ASSERT (*OptionString);\r
-\r
-    *OptionString[0] = LEFT_CHECKBOX_DELIMITER;\r
-\r
-    if (Selected) {\r
-      //\r
-      // Since this is a BOOLEAN operation, flip it upon selection\r
-      //\r
-      QuestionValue->Value.b = (BOOLEAN) (QuestionValue->Value.b ? FALSE : TRUE);\r
-\r
-      //\r
-      // Perform inconsistent check\r
-      //\r
-      Status = ValidateQuestion (Selection->FormSet, Selection->Form, Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);\r
-      if (EFI_ERROR (Status)) {\r
-        //\r
-        // Inconsistent check fail, restore Question Value\r
-        //\r
-        QuestionValue->Value.b = (BOOLEAN) (QuestionValue->Value.b ? FALSE : TRUE);\r
-        FreePool (*OptionString);\r
-        *OptionString = NULL;\r
-        return Status;\r
-      }\r
-\r
-      //\r
-      // Save Question value\r
-      //\r
-      Status = SetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
-      UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);\r
-    }\r
-\r
-    if (QuestionValue->Value.b) {\r
-      *(OptionString[0] + 1) = CHECK_ON;\r
-    } else {\r
-      *(OptionString[0] + 1) = CHECK_OFF;\r
-    }\r
-    *(OptionString[0] + 2) = RIGHT_CHECKBOX_DELIMITER;\r
-    break;\r
-\r
-  case EFI_IFR_NUMERIC_OP:\r
-    if (Selected) {\r
-      //\r
-      // Go ask for input\r
-      //\r
-      Status = GetNumericInput (Selection, MenuOption);\r
-    } else {\r
-      *OptionString = AllocateZeroPool (BufferSize);\r
-      ASSERT (*OptionString);\r
-\r
-      *OptionString[0] = LEFT_NUMERIC_DELIMITER;\r
-\r
-      //\r
-      // Formatted print\r
-      //\r
-      PrintFormattedNumber (Question, FormattedNumber, 21 * sizeof (CHAR16));\r
-      Number = (UINT16) GetStringWidth (FormattedNumber);\r
-      CopyMem (OptionString[0] + 1, FormattedNumber, Number);\r
-\r
-      *(OptionString[0] + Number / 2) = RIGHT_NUMERIC_DELIMITER;\r
-    }\r
-    break;\r
-\r
-  case EFI_IFR_DATE_OP:\r
-    if (Selected) {\r
-      //\r
-      // This is similar to numerics\r
-      //\r
-      Status = GetNumericInput (Selection, MenuOption);\r
-    } else {\r
-      *OptionString = AllocateZeroPool (BufferSize);\r
-      ASSERT (*OptionString);\r
-\r
-      switch (MenuOption->Sequence) {\r
-      case 0:\r
-        *OptionString[0] = LEFT_NUMERIC_DELIMITER;\r
-        UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Month);\r
-        *(OptionString[0] + 3) = DATE_SEPARATOR;\r
-        break;\r
-\r
-      case 1:\r
-        SetUnicodeMem (OptionString[0], 4, L' ');\r
-        UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Day);\r
-        *(OptionString[0] + 6) = DATE_SEPARATOR;\r
-        break;\r
-\r
-      case 2:\r
-        SetUnicodeMem (OptionString[0], 7, L' ');\r
-        UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%04d", QuestionValue->Value.date.Year);\r
-        *(OptionString[0] + 11) = RIGHT_NUMERIC_DELIMITER;\r
-        break;\r
-      }\r
-    }\r
-    break;\r
-\r
-  case EFI_IFR_TIME_OP:\r
-    if (Selected) {\r
-      //\r
-      // This is similar to numerics\r
-      //\r
-      Status = GetNumericInput (Selection, MenuOption);\r
-    } else {\r
-      *OptionString = AllocateZeroPool (BufferSize);\r
-      ASSERT (*OptionString);\r
-\r
-      switch (MenuOption->Sequence) {\r
-      case 0:\r
-        *OptionString[0] = LEFT_NUMERIC_DELIMITER;\r
-        UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Hour);\r
-        *(OptionString[0] + 3) = TIME_SEPARATOR;\r
-        break;\r
-\r
-      case 1:\r
-        SetUnicodeMem (OptionString[0], 4, L' ');\r
-        UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Minute);\r
-        *(OptionString[0] + 6) = TIME_SEPARATOR;\r
-        break;\r
-\r
-      case 2:\r
-        SetUnicodeMem (OptionString[0], 7, L' ');\r
-        UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Second);\r
-        *(OptionString[0] + 9) = RIGHT_NUMERIC_DELIMITER;\r
-        break;\r
-      }\r
-    }\r
-    break;\r
-\r
-  case EFI_IFR_STRING_OP:\r
-    if (Selected) {\r
-      StringPtr = AllocateZeroPool ((Maximum + 1) * sizeof (CHAR16));\r
-      ASSERT (StringPtr);\r
-      CopyMem(StringPtr, Question->BufferValue, Maximum * sizeof (CHAR16));\r
-\r
-      Status = ReadString (MenuOption, gPromptForData, StringPtr);\r
-      if (!EFI_ERROR (Status)) {\r
-        HiiSetString(Selection->FormSet->HiiHandle, Question->HiiValue.Value.string, StringPtr, NULL);\r
-        Status = ValidateQuestion(Selection->FormSet, Selection->Form, Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);\r
-        if (EFI_ERROR (Status)) {\r
-          HiiSetString(Selection->FormSet->HiiHandle, Question->HiiValue.Value.string, (CHAR16*)Question->BufferValue, NULL);\r
-        } else {\r
-          CopyMem (Question->BufferValue, StringPtr, Maximum * sizeof (CHAR16));\r
-          SetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithEditBuffer);\r
-\r
-          UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Question->QuestionFlags, TRUE);\r
-        }\r
-      }\r
-\r
-      FreePool (StringPtr);\r
-    } else {\r
-      *OptionString = AllocateZeroPool (BufferSize);\r
-      ASSERT (*OptionString);\r
-\r
-      if (((CHAR16 *) Question->BufferValue)[0] == 0x0000) {\r
-        *(OptionString[0]) = '_';\r
-      } else {\r
-        if ((Maximum * sizeof (CHAR16)) < BufferSize) {\r
-          BufferSize = Maximum * sizeof (CHAR16);\r
-        }\r
-        CopyMem (OptionString[0], (CHAR16 *) Question->BufferValue, BufferSize);\r
-      }\r
-    }\r
-    break;\r
-\r
-  case EFI_IFR_PASSWORD_OP:\r
-    if (Selected) {\r
-      StringPtr = AllocateZeroPool ((Maximum + 1) * sizeof (CHAR16));\r
-      ASSERT (StringPtr);\r
-\r
-      //\r
-      // For interactive passwords, old password is validated by callback\r
-      //\r
-      if ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK)  != 0) {\r
-        //\r
-        // Use a NULL password to test whether old password is required\r
-        //\r
-        *StringPtr = 0;\r
-        Status = PasswordCallback (Selection, MenuOption, StringPtr);\r
-        if (Status == EFI_NOT_AVAILABLE_YET || Status == EFI_UNSUPPORTED) {\r
-          //\r
-          // Callback is not supported, or\r
-          // Callback request to terminate password input\r
-          //\r
-          FreePool (StringPtr);\r
-          return EFI_SUCCESS;\r
-        }\r
-\r
-        if (EFI_ERROR (Status)) {\r
-          //\r
-          // Old password exist, ask user for the old password\r
-          //\r
-          Status = ReadString (MenuOption, gPromptForPassword, StringPtr);\r
-          if (EFI_ERROR (Status)) {\r
-            FreePool (StringPtr);\r
-            return Status;\r
-          }\r
-\r
-          //\r
-          // Check user input old password\r
-          //\r
-          Status = PasswordCallback (Selection, MenuOption, StringPtr);\r
-          if (EFI_ERROR (Status)) {\r
-            if (Status == EFI_NOT_READY) {\r
-              //\r
-              // Typed in old password incorrect\r
-              //\r
-              PasswordInvalid ();\r
-            } else {\r
-              Status = EFI_SUCCESS;\r
-            }\r
-\r
-            FreePool (StringPtr);\r
-            return Status;\r
-          }\r
-        }\r
-      } else {\r
-        //\r
-        // For non-interactive password, validate old password in local\r
-        //\r
-        if (*((CHAR16 *) Question->BufferValue) != 0) {\r
-          //\r
-          // There is something there!  Prompt for password\r
-          //\r
-          Status = ReadString (MenuOption, gPromptForPassword, StringPtr);\r
-          if (EFI_ERROR (Status)) {\r
-            FreePool (StringPtr);\r
-            return Status;\r
-          }\r
-\r
-          TempString = AllocateCopyPool ((Maximum + 1) * sizeof (CHAR16), Question->BufferValue);\r
-          ASSERT (TempString != NULL);\r
-\r
-          TempString[Maximum] = L'\0';\r
-\r
-          if (StrCmp (StringPtr, TempString) != 0) {\r
-            //\r
-            // Typed in old password incorrect\r
-            //\r
-            PasswordInvalid ();\r
-\r
-            FreePool (StringPtr);\r
-            FreePool (TempString);\r
-            return Status;\r
-          }\r
-\r
-          FreePool (TempString);\r
-        }\r
-      }\r
-\r
-      //\r
-      // Ask for new password\r
-      //\r
-      ZeroMem (StringPtr, (Maximum + 1) * sizeof (CHAR16));\r
-      Status = ReadString (MenuOption, gPromptForNewPassword, StringPtr);\r
-      if (EFI_ERROR (Status)) {\r
-        //\r
-        // Reset state machine for interactive password\r
-        //\r
-        if ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-          PasswordCallback (Selection, MenuOption, NULL);\r
-        }\r
-\r
-        FreePool (StringPtr);\r
-        return Status;\r
-      }\r
-\r
-      //\r
-      // Confirm new password\r
-      //\r
-      TempString = AllocateZeroPool ((Maximum + 1) * sizeof (CHAR16));\r
-      ASSERT (TempString);\r
-      Status = ReadString (MenuOption, gConfirmPassword, TempString);\r
-      if (EFI_ERROR (Status)) {\r
-        //\r
-        // Reset state machine for interactive password\r
-        //\r
-        if ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-          PasswordCallback (Selection, MenuOption, NULL);\r
-        }\r
-\r
-        FreePool (StringPtr);\r
-        FreePool (TempString);\r
-        return Status;\r
-      }\r
-\r
-      //\r
-      // Compare two typed-in new passwords\r
-      //\r
-      if (StrCmp (StringPtr, TempString) == 0) {\r
-        //\r
-        // Prepare the  Question->HiiValue.Value.string for ValidateQuestion use.\r
-        //\r
-        if((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-          StringId = Question->HiiValue.Value.string;\r
-          Question->HiiValue.Value.string = NewString (StringPtr, Selection->FormSet->HiiHandle);\r
-        } else {\r
-          HiiSetString(Selection->FormSet->HiiHandle, Question->HiiValue.Value.string, StringPtr, NULL);\r
-        }\r
-        \r
-        Status = ValidateQuestion(Selection->FormSet, Selection->Form, Question, EFI_HII_EXPRESSION_INCONSISTENT_IF);\r
-\r
-        //\r
-        //  Researve the Question->HiiValue.Value.string.\r
-        //\r
-        if((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-          DeleteString(Question->HiiValue.Value.string, Selection->FormSet->HiiHandle);\r
-          Question->HiiValue.Value.string = StringId;\r
-        }   \r
-        \r
-        if (EFI_ERROR (Status)) {\r
-          //\r
-          // Reset state machine for interactive password\r
-          //\r
-          if ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-            PasswordCallback (Selection, MenuOption, NULL);\r
-          } else {\r
-            //\r
-            // Researve the Question->HiiValue.Value.string.\r
-            //\r
-            HiiSetString(Selection->FormSet->HiiHandle, Question->HiiValue.Value.string, (CHAR16*)Question->BufferValue, NULL);            \r
-          }\r
-        } else {\r
-          //\r
-          // Two password match, send it to Configuration Driver\r
-          //\r
-          if ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-            PasswordCallback (Selection, MenuOption, StringPtr);\r
-          } else {\r
-            CopyMem (Question->BufferValue, StringPtr, Maximum * sizeof (CHAR16));\r
-            SetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithHiiDriver);\r
-          }\r
-        }\r
-      } else {\r
-        //\r
-        // Reset state machine for interactive password\r
-        //\r
-        if ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-          PasswordCallback (Selection, MenuOption, NULL);\r
-        }\r
-\r
-        //\r
-        // Two password mismatch, prompt error message\r
-        //\r
-        do {\r
-          CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gConfirmError, gPressEnter, gEmptyString);\r
-        } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-      }\r
-\r
-      FreePool (TempString);\r
-      FreePool (StringPtr);\r
-    }\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Process the help string: Split StringPtr to several lines of strings stored in\r
-  FormattedString and the glyph width of each line cannot exceed gHelpBlockWidth.\r
-\r
-  @param  StringPtr              The entire help string.\r
-  @param  FormattedString        The oupput formatted string.\r
-  @param  EachLineWidth          The max string length of each line in the formatted string.\r
-  @param  RowCount               TRUE: if Question is selected.\r
-\r
-**/\r
-UINTN\r
-ProcessHelpString (\r
-  IN  CHAR16  *StringPtr,\r
-  OUT CHAR16  **FormattedString,\r
-  OUT UINT16  *EachLineWidth,\r
-  IN  UINTN   RowCount\r
-  )\r
-{\r
-  UINTN   Index;\r
-  CHAR16  *OutputString;\r
-  UINTN   TotalRowNum;\r
-  UINTN   CheckedNum;\r
-  UINT16  GlyphWidth;\r
-  UINT16  LineWidth;\r
-  UINT16  MaxStringLen;\r
-  UINT16  StringLen;\r
-\r
-  TotalRowNum    = 0;\r
-  CheckedNum     = 0;\r
-  GlyphWidth     = 1;\r
-  Index          = 0;\r
-  MaxStringLen   = 0;\r
-  StringLen      = 0;\r
-\r
-  //\r
-  // Set default help string width.\r
-  //\r
-  LineWidth      = (UINT16) (gHelpBlockWidth - 1);\r
-\r
-  //\r
-  // Get row number of the String.\r
-  //\r
-  while ((StringLen = GetLineByWidth (StringPtr, LineWidth, &GlyphWidth, &Index, &OutputString)) != 0) {\r
-    if (StringLen > MaxStringLen) {\r
-      MaxStringLen = StringLen;\r
-    }\r
-\r
-    TotalRowNum ++;\r
-    FreePool (OutputString);\r
-  }\r
-  *EachLineWidth = MaxStringLen;\r
-\r
-  *FormattedString = AllocateZeroPool (TotalRowNum * MaxStringLen * sizeof (CHAR16));\r
-  ASSERT (*FormattedString != NULL);\r
-\r
-  //\r
-  // Generate formatted help string array.\r
-  //\r
-  GlyphWidth  = 1;\r
-  Index       = 0;\r
-  while((StringLen = GetLineByWidth (StringPtr, LineWidth, &GlyphWidth, &Index, &OutputString)) != 0) {\r
-    CopyMem (*FormattedString + CheckedNum * MaxStringLen, OutputString, StringLen * sizeof (CHAR16));\r
-    CheckedNum ++;\r
-    FreePool (OutputString);\r
-  }\r
-\r
-  return TotalRowNum; \r
-}\r
index c4dd18a04fd664e4320d71ffabad670625763088..ba72d1220b594cb1857ed9bba97eee0ee1079a52 100644 (file)
@@ -46,7 +46,7 @@ UINTN           gBrowserContextCount = 0;
 LIST_ENTRY      gBrowserContextList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserContextList);\r
 LIST_ENTRY      gBrowserFormSetList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserFormSetList);\r
 LIST_ENTRY      gBrowserHotKeyList  = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserHotKeyList);\r
-LIST_ENTRY      gBrowserStorageList  = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserStorageList);\r
+LIST_ENTRY      gBrowserStorageList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserStorageList);\r
 \r
 BOOLEAN               gResetRequired;\r
 BOOLEAN               gExitRequired;\r
@@ -58,17 +58,15 @@ EXIT_HANDLER          ExitHandlerFunction = NULL;
 // Browser Global Strings\r
 //\r
 CHAR16            *gEmptyString;\r
-\r
 CHAR16            *mUnknownString = L"!";\r
 \r
 EFI_GUID  gZeroGuid = {0, 0, 0, {0, 0, 0, 0, 0, 0, 0, 0}};\r
-EFI_GUID  gSetupBrowserGuid = {\r
-  0xab368524, 0xb60c, 0x495b, {0xa0, 0x9, 0x12, 0xe8, 0x5b, 0x1a, 0xea, 0x32}\r
-};\r
 \r
-FORM_BROWSER_FORMSET  *gOldFormSet = NULL;\r
-extern UINT32   gBrowserStatus;\r
-extern CHAR16   *gErrorInfo;\r
+extern UINT32          gBrowserStatus;\r
+extern CHAR16          *gErrorInfo;\r
+extern EFI_GUID        mCurrentFormSetGuid;\r
+extern EFI_HII_HANDLE  mCurrentHiiHandle;\r
+extern UINT16          mCurrentFormId;\r
 extern FORM_DISPLAY_ENGINE_FORM gDisplayFormData;\r
 \r
 /**\r
@@ -4612,11 +4610,6 @@ SaveBrowserContext (
     return;\r
   }\r
 \r
-  //\r
-  // Not support SendForm nest in another SendForm, assert here.\r
-  //\r
-  ASSERT (FALSE);\r
-\r
   Context = AllocatePool (sizeof (BROWSER_CONTEXT));\r
   ASSERT (Context != NULL);\r
 \r
@@ -4625,9 +4618,12 @@ SaveBrowserContext (
   //\r
   // Save FormBrowser context\r
   //\r
+  Context->Selection            = gCurrentSelection;\r
   Context->ResetRequired        = gResetRequired;\r
   Context->ExitRequired         = gExitRequired;\r
   Context->HiiHandle            = mCurrentHiiHandle;\r
+  Context->FormId               = mCurrentFormId;\r
+  CopyGuid (&Context->FormSetGuid, &mCurrentFormSetGuid);\r
 \r
   //\r
   // Save the menu history data.\r
@@ -4677,9 +4673,12 @@ RestoreBrowserContext (
   //\r
   // Restore FormBrowser context\r
   //\r
+  gCurrentSelection     = Context->Selection;\r
   gResetRequired        = Context->ResetRequired;\r
   gExitRequired         = Context->ExitRequired;\r
   mCurrentHiiHandle     = Context->HiiHandle;\r
+  mCurrentFormId        = Context->FormId;\r
+  CopyGuid (&mCurrentFormSetGuid, &Context->FormSetGuid);\r
 \r
   //\r
   // Restore the menu history data.\r
index 1be2c0d5a03a020889475d98fffb64bb4c9a9609..030cf32eac72ba0e63d509394c66b2327b18d1c6 100644 (file)
@@ -449,23 +449,6 @@ typedef struct {
 \r
 #define FORM_BROWSER_REFRESH_EVENT_FROM_LINK(a) BASE_CR (a, FORM_BROWSER_REFRESH_EVENT_NODE, Link)\r
 \r
-#define BROWSER_CONTEXT_SIGNATURE  SIGNATURE_32 ('B', 'C', 'T', 'X')\r
-\r
-typedef struct {\r
-  UINTN                 Signature;\r
-  LIST_ENTRY            Link;\r
-\r
-  //\r
-  // Globals defined in Setup.c\r
-  //\r
-  BOOLEAN                  ResetRequired;\r
-  BOOLEAN                  ExitRequired;\r
-  EFI_HII_HANDLE           HiiHandle;\r
-\r
-  LIST_ENTRY           FormHistoryList;\r
-} BROWSER_CONTEXT;\r
-\r
-#define BROWSER_CONTEXT_FROM_LINK(a)  CR (a, BROWSER_CONTEXT, Link, BROWSER_CONTEXT_SIGNATURE)\r
 \r
 typedef struct {\r
   EFI_HII_HANDLE  Handle;\r
@@ -507,6 +490,27 @@ typedef struct {
   FORM_ENTRY_INFO            *CurrentMenu;\r
 } UI_MENU_SELECTION;\r
 \r
+#define BROWSER_CONTEXT_SIGNATURE  SIGNATURE_32 ('B', 'C', 'T', 'X')\r
+\r
+typedef struct {\r
+  UINTN                 Signature;\r
+  LIST_ENTRY            Link;\r
+\r
+  //\r
+  // Globals defined in Setup.c\r
+  //\r
+  BOOLEAN                  ResetRequired;\r
+  BOOLEAN                  ExitRequired;\r
+  EFI_HII_HANDLE           HiiHandle;\r
+  EFI_GUID                 FormSetGuid;\r
+  EFI_FORM_ID              FormId;\r
+  UI_MENU_SELECTION        *Selection;\r
+\r
+  LIST_ENTRY           FormHistoryList;\r
+} BROWSER_CONTEXT;\r
+\r
+#define BROWSER_CONTEXT_FROM_LINK(a)  CR (a, BROWSER_CONTEXT, Link, BROWSER_CONTEXT_SIGNATURE)\r
+\r
 //\r
 // Scope for get defaut value. It may be GetDefaultForNoStorage, GetDefaultForStorage or GetDefaultForAll.\r
 //\r
@@ -535,7 +539,6 @@ extern EDKII_FORM_DISPLAY_ENGINE_PROTOCOL *mFormDisplay;
 extern BOOLEAN               gResetRequired;\r
 extern BOOLEAN               gExitRequired;\r
 \r
-extern FORM_BROWSER_FORMSET  *gOldFormSet;\r
 extern LIST_ENTRY            gBrowserFormSetList;\r
 extern LIST_ENTRY            gBrowserHotKeyList;\r
 extern BROWSER_SETTING_SCOPE gBrowserSettingScope;\r
index 395c9383d546e60ba967e621f19778b12e046bcb..a3f3a6fc2c8e078930528e842aee8434f540ec06 100644 (file)
@@ -77,6 +77,4 @@
 [Depex]\r
   gEfiHiiDatabaseProtocolGuid AND gEfiHiiConfigRoutingProtocolGuid\r
 \r
-[BuildOptions] \r
-  MSFT:*_*_*_CC_FLAGS     = /Od \r
 \r
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.uni b/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.uni
deleted file mode 100644 (file)
index bb6414d..0000000
Binary files a/MdeModulePkg/Universal/SetupBrowserDxe/SetupBrowserStr.uni and /dev/null differ
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c b/MdeModulePkg/Universal/SetupBrowserDxe/Ui.c
deleted file mode 100644 (file)
index 7c246b6..0000000
+++ /dev/null
@@ -1,4027 +0,0 @@
-/** @file\r
-Utility functions for User Interface functions.\r
-\r
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
-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 "Setup.h"\r
-\r
-LIST_ENTRY          gMenuOption;\r
-LIST_ENTRY          gMenuList;\r
-MENU_REFRESH_ENTRY  *gMenuRefreshHead;                // Menu list used for refresh timer opcode.\r
-MENU_REFRESH_ENTRY  *gMenuEventGuidRefreshHead;       // Menu list used for refresh event guid opcode.\r
-\r
-//\r
-// Search table for UiDisplayMenu()\r
-//\r
-SCAN_CODE_TO_SCREEN_OPERATION     gScanCodeToOperation[] = {\r
-  {\r
-    SCAN_UP,\r
-    UiUp,\r
-  },\r
-  {\r
-    SCAN_DOWN,\r
-    UiDown,\r
-  },\r
-  {\r
-    SCAN_PAGE_UP,\r
-    UiPageUp,\r
-  },\r
-  {\r
-    SCAN_PAGE_DOWN,\r
-    UiPageDown,\r
-  },\r
-  {\r
-    SCAN_ESC,\r
-    UiReset,\r
-  },\r
-  {\r
-    SCAN_LEFT,\r
-    UiLeft,\r
-  },\r
-  {\r
-    SCAN_RIGHT,\r
-    UiRight,\r
-  }\r
-};\r
-\r
-UINTN mScanCodeNumber = sizeof (gScanCodeToOperation) / sizeof (gScanCodeToOperation[0]);\r
-\r
-SCREEN_OPERATION_T0_CONTROL_FLAG  gScreenOperationToControlFlag[] = {\r
-  {\r
-    UiNoOperation,\r
-    CfUiNoOperation,\r
-  },\r
-  {\r
-    UiSelect,\r
-    CfUiSelect,\r
-  },\r
-  {\r
-    UiUp,\r
-    CfUiUp,\r
-  },\r
-  {\r
-    UiDown,\r
-    CfUiDown,\r
-  },\r
-  {\r
-    UiLeft,\r
-    CfUiLeft,\r
-  },\r
-  {\r
-    UiRight,\r
-    CfUiRight,\r
-  },\r
-  {\r
-    UiReset,\r
-    CfUiReset,\r
-  },\r
-  {\r
-    UiPageUp,\r
-    CfUiPageUp,\r
-  },\r
-  {\r
-    UiPageDown,\r
-    CfUiPageDown\r
-  }, \r
-  {\r
-    UiHotKey,\r
-    CfUiHotKey\r
-  }\r
-};\r
-\r
-BOOLEAN  mInputError;\r
-BOOLEAN GetLineByWidthFinished = FALSE;\r
-\r
-\r
-/**\r
-  Set Buffer to Value for Size bytes.\r
-\r
-  @param  Buffer                 Memory to set.\r
-  @param  Size                   Number of bytes to set\r
-  @param  Value                  Value of the set operation.\r
-\r
-**/\r
-VOID\r
-SetUnicodeMem (\r
-  IN VOID   *Buffer,\r
-  IN UINTN  Size,\r
-  IN CHAR16 Value\r
-  )\r
-{\r
-  CHAR16  *Ptr;\r
-\r
-  Ptr = Buffer;\r
-  while ((Size--)  != 0) {\r
-    *(Ptr++) = Value;\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Initialize Menu option list.\r
-\r
-**/\r
-VOID\r
-UiInitMenu (\r
-  VOID\r
-  )\r
-{\r
-  InitializeListHead (&gMenuOption);\r
-}\r
-\r
-\r
-/**\r
-  Free Menu option linked list.\r
-\r
-**/\r
-VOID\r
-UiFreeMenu (\r
-  VOID\r
-  )\r
-{\r
-  UI_MENU_OPTION  *MenuOption;\r
-\r
-  while (!IsListEmpty (&gMenuOption)) {\r
-    MenuOption = MENU_OPTION_FROM_LINK (gMenuOption.ForwardLink);\r
-    RemoveEntryList (&MenuOption->Link);\r
-\r
-    //\r
-    // We allocated space for this description when we did a GetToken, free it here\r
-    //\r
-    if (MenuOption->Skip != 0) {\r
-      //\r
-      // For date/time, MenuOption->Description is shared by three Menu Options\r
-      // Data format :      [01/02/2004]      [11:22:33]\r
-      // Line number :        0  0    1         0  0  1\r
-      //\r
-      FreePool (MenuOption->Description);\r
-    }\r
-    FreePool (MenuOption);\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Create a menu with specified formset GUID and form ID, and add it as a child\r
-  of the given parent menu.\r
-\r
-  @param  Parent                 The parent of menu to be added.\r
-  @param  HiiHandle              Hii handle related to this formset.\r
-  @param  FormSetGuid            The Formset Guid of menu to be added.\r
-  @param  FormId                 The Form ID of menu to be added.\r
-\r
-  @return A pointer to the newly added menu or NULL if memory is insufficient.\r
-\r
-**/\r
-UI_MENU_LIST *\r
-UiAddMenuList (\r
-  IN OUT UI_MENU_LIST     *Parent,\r
-  IN EFI_HII_HANDLE       HiiHandle,\r
-  IN EFI_GUID             *FormSetGuid,\r
-  IN UINT16               FormId\r
-  )\r
-{\r
-  UI_MENU_LIST  *MenuList;\r
-\r
-  MenuList = AllocateZeroPool (sizeof (UI_MENU_LIST));\r
-  if (MenuList == NULL) {\r
-    return NULL;\r
-  }\r
-\r
-  MenuList->Signature = UI_MENU_LIST_SIGNATURE;\r
-  InitializeListHead (&MenuList->ChildListHead);\r
-\r
-  MenuList->HiiHandle = HiiHandle;\r
-  CopyMem (&MenuList->FormSetGuid, FormSetGuid, sizeof (EFI_GUID));\r
-  MenuList->FormId = FormId;\r
-  MenuList->Parent = Parent;\r
-\r
-  if (Parent == NULL) {\r
-    //\r
-    // If parent is not specified, it is the root Form of a Formset\r
-    //\r
-    InsertTailList (&gMenuList, &MenuList->Link);\r
-  } else {\r
-    InsertTailList (&Parent->ChildListHead, &MenuList->Link);\r
-  }\r
-\r
-  return MenuList;\r
-}\r
-\r
-\r
-/**\r
-  Search Menu with given FormId, FormSetGuid and Handle in all cached menu list.\r
-\r
-  @param  Parent                 The parent of menu to search.\r
-  @param  Handle                 Hii handle related to this formset.\r
-  @param  FormSetGuid            The Formset GUID of the menu to search.  \r
-  @param  FormId                 The Form ID of menu to search.\r
-\r
-  @return A pointer to menu found or NULL if not found.\r
-\r
-**/\r
-UI_MENU_LIST *\r
-UiFindChildMenuList (\r
-  IN UI_MENU_LIST         *Parent,\r
-  IN EFI_HII_HANDLE       Handle,\r
-  IN EFI_GUID             *FormSetGuid, \r
-  IN UINT16               FormId\r
-  )\r
-{\r
-  LIST_ENTRY      *Link;\r
-  UI_MENU_LIST    *Child;\r
-  UI_MENU_LIST    *MenuList;\r
-\r
-  ASSERT (Parent != NULL);\r
-\r
-  if (Parent->FormId == FormId && CompareGuid (FormSetGuid, &Parent->FormSetGuid) && Parent->HiiHandle == Handle) {\r
-    return Parent;\r
-  }\r
-\r
-  Link = GetFirstNode (&Parent->ChildListHead);\r
-  while (!IsNull (&Parent->ChildListHead, Link)) {\r
-    Child = UI_MENU_LIST_FROM_LINK (Link);\r
-\r
-    MenuList = UiFindChildMenuList (Child, Handle, FormSetGuid, FormId);\r
-    if (MenuList != NULL) {\r
-      return MenuList;\r
-    }\r
-\r
-    Link = GetNextNode (&Parent->ChildListHead, Link);\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-\r
-/**\r
-  Search Menu with given Handle, FormSetGuid and FormId in all cached menu list.\r
-\r
-  @param  Handle                 Hii handle related to this formset.\r
-  @param  FormSetGuid            The Formset GUID of the menu to search.\r
-  @param  FormId                 The Form ID of menu to search.\r
-\r
-  @return A pointer to menu found or NULL if not found.\r
-\r
-**/\r
-UI_MENU_LIST *\r
-UiFindMenuList (\r
-  IN EFI_HII_HANDLE       Handle,\r
-  IN EFI_GUID             *FormSetGuid,\r
-  IN UINT16               FormId\r
-  )\r
-{\r
-  LIST_ENTRY      *Link;\r
-  UI_MENU_LIST    *MenuList;\r
-  UI_MENU_LIST    *Child;\r
-\r
-  Link = GetFirstNode (&gMenuList);\r
-  while (!IsNull (&gMenuList, Link)) {\r
-    MenuList = UI_MENU_LIST_FROM_LINK (Link);\r
-\r
-    Child = UiFindChildMenuList(MenuList, Handle, FormSetGuid, FormId);\r
-    if (Child != NULL) {\r
-\r
-      //\r
-      // If this form already in the menu history list,\r
-      // just free the list between old this form.\r
-      //\r
-      UiFreeMenuList(&Child->ChildListHead);\r
-      return Child;\r
-    }\r
-\r
-    Link = GetNextNode (&gMenuList, Link);\r
-  }\r
-\r
-  return NULL;\r
-}\r
-\r
-/**\r
-  Free Menu list linked list.\r
-\r
-  @param  MenuListHead    One Menu list point in the menu list.\r
-\r
-**/\r
-VOID\r
-UiFreeMenuList (\r
-  LIST_ENTRY   *MenuListHead\r
-  )\r
-{\r
-  UI_MENU_LIST    *MenuList;\r
-\r
-  while (!IsListEmpty (MenuListHead)) {\r
-    MenuList = UI_MENU_LIST_FROM_LINK (MenuListHead->ForwardLink);\r
-    RemoveEntryList (&MenuList->Link);\r
-    \r
-    UiFreeMenuList(&MenuList->ChildListHead);\r
-    FreePool (MenuList);\r
-  }\r
-\r
-}\r
-\r
-/**\r
-  Free Menu option linked list.\r
-\r
-**/\r
-VOID\r
-UiFreeRefreshList (\r
-  VOID\r
-  )\r
-{\r
-  MENU_REFRESH_ENTRY  *OldMenuRefreshEntry;\r
-\r
-  while (gMenuRefreshHead != NULL) {\r
-    OldMenuRefreshEntry = gMenuRefreshHead->Next;\r
-    FreePool (gMenuRefreshHead);\r
-    gMenuRefreshHead = OldMenuRefreshEntry;\r
-  }\r
-\r
-  while (gMenuEventGuidRefreshHead != NULL) {\r
-    OldMenuRefreshEntry = gMenuEventGuidRefreshHead->Next;\r
-    if (gMenuEventGuidRefreshHead != NULL) {\r
-      gBS->CloseEvent(gMenuEventGuidRefreshHead->Event);\r
-    }\r
-    FreePool (gMenuEventGuidRefreshHead);\r
-    gMenuEventGuidRefreshHead = OldMenuRefreshEntry;\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Process option string for date/time opcode.\r
-\r
-  @param  MenuOption              Menu option point to date/time.\r
-  @param  OptionString            Option string input for process.\r
-  @param  AddOptCol               Whether need to update MenuOption->OptCol. \r
-\r
-**/\r
-VOID \r
-ProcessStringForDateTime (\r
-  UI_MENU_OPTION                  *MenuOption,\r
-  CHAR16                          *OptionString,\r
-  BOOLEAN                         AddOptCol\r
-  )\r
-{\r
-  UINTN Index;\r
-  UINTN Count;\r
-  FORM_BROWSER_STATEMENT          *Statement;\r
-\r
-  ASSERT (MenuOption != NULL && OptionString != NULL);\r
-  \r
-  Statement = MenuOption->ThisTag;\r
-  \r
-  //\r
-  // If leading spaces on OptionString - remove the spaces\r
-  //\r
-  for (Index = 0; OptionString[Index] == L' '; Index++) {\r
-    //\r
-    // Base on the blockspace to get the option column info.\r
-    //\r
-    if (AddOptCol) {\r
-      MenuOption->OptCol++;\r
-    }\r
-  }\r
-  \r
-  for (Count = 0; OptionString[Index] != CHAR_NULL; Index++) {\r
-    OptionString[Count] = OptionString[Index];\r
-    Count++;\r
-  }\r
-  OptionString[Count] = CHAR_NULL;\r
-  \r
-  //\r
-  // Enable to suppress field in the opcode base on the flag.\r
-  //\r
-  if (Statement->Operand == EFI_IFR_DATE_OP) {\r
-    //\r
-    // OptionString format is: <**:  **: ****>\r
-    //                        |month|day|year|\r
-    //                          4     3    5\r
-    //\r
-    if ((Statement->Flags & EFI_QF_DATE_MONTH_SUPPRESS) && (MenuOption->Sequence == 0)) {\r
-      //\r
-      // At this point, only "<**:" in the optionstring. \r
-      // Clean the day's ** field, after clean, the format is "<  :"\r
-      //\r
-      SetUnicodeMem (&OptionString[1], 2, L' ');\r
-    } else if ((Statement->Flags & EFI_QF_DATE_DAY_SUPPRESS) && (MenuOption->Sequence == 1)) {\r
-      //\r
-      // At this point, only "**:" in the optionstring. \r
-      // Clean the month's "**" field, after clean, the format is "  :"\r
-      //                \r
-      SetUnicodeMem (&OptionString[0], 2, L' ');\r
-    } else if ((Statement->Flags & EFI_QF_DATE_YEAR_SUPPRESS) && (MenuOption->Sequence == 2)) {\r
-      //\r
-      // At this point, only "****>" in the optionstring. \r
-      // Clean the year's "****" field, after clean, the format is "  >"\r
-      //                \r
-      SetUnicodeMem (&OptionString[0], 4, L' ');\r
-    }\r
-  } else if (Statement->Operand == EFI_IFR_TIME_OP) {\r
-    //\r
-    // OptionString format is: <**:  **:    **>\r
-    //                        |hour|minute|second|\r
-    //                          4     3      3\r
-    //\r
-    if ((Statement->Flags & QF_TIME_HOUR_SUPPRESS) && (MenuOption->Sequence == 0)) {\r
-      //\r
-      // At this point, only "<**:" in the optionstring. \r
-      // Clean the hour's ** field, after clean, the format is "<  :"\r
-      //\r
-      SetUnicodeMem (&OptionString[1], 2, L' ');\r
-    } else if ((Statement->Flags & QF_TIME_MINUTE_SUPPRESS) && (MenuOption->Sequence == 1)) {\r
-      //\r
-      // At this point, only "**:" in the optionstring. \r
-      // Clean the minute's "**" field, after clean, the format is "  :"\r
-      //                \r
-      SetUnicodeMem (&OptionString[0], 2, L' ');\r
-    } else if ((Statement->Flags & QF_TIME_SECOND_SUPPRESS) && (MenuOption->Sequence == 2)) {\r
-      //\r
-      // At this point, only "**>" in the optionstring. \r
-      // Clean the second's "**" field, after clean, the format is "  >"\r
-      //                \r
-      SetUnicodeMem (&OptionString[0], 2, L' ');\r
-    }\r
-  }\r
-}\r
-\r
-/**\r
-  Refresh question.\r
-\r
-  @param     MenuRefreshEntry    Menu refresh structure which has info about the refresh question.\r
-**/\r
-EFI_STATUS \r
-RefreshQuestion (\r
-  IN   MENU_REFRESH_ENTRY    *MenuRefreshEntry\r
-  )\r
-{\r
-  CHAR16                          *OptionString;\r
-  EFI_STATUS                      Status;\r
-  UI_MENU_SELECTION               *Selection;\r
-  FORM_BROWSER_STATEMENT          *Question;\r
-\r
-  Selection = MenuRefreshEntry->Selection;\r
-  Question = MenuRefreshEntry->MenuOption->ThisTag;\r
-\r
-  Status = GetQuestionValue (Selection->FormSet, Selection->Form, Question, GetSetValueWithHiiDriver);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  OptionString = NULL;\r
-  ProcessOptions (Selection, MenuRefreshEntry->MenuOption, FALSE, &OptionString);\r
-\r
-  if (OptionString != NULL) {\r
-    //\r
-    // If old Text is longer than new string, need to clean the old string before paint the newer.\r
-    // This option is no need for time/date opcode, because time/data opcode has fixed string length.\r
-    //\r
-    if ((MenuRefreshEntry->MenuOption->ThisTag->Operand != EFI_IFR_DATE_OP) &&\r
-      (MenuRefreshEntry->MenuOption->ThisTag->Operand != EFI_IFR_TIME_OP)) {\r
-      ClearLines (\r
-        MenuRefreshEntry->CurrentColumn, \r
-        MenuRefreshEntry->CurrentColumn + gOptionBlockWidth - 1,\r
-        MenuRefreshEntry->CurrentRow,\r
-        MenuRefreshEntry->CurrentRow,\r
-        PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND\r
-        );\r
-    }\r
-\r
-    gST->ConOut->SetAttribute (gST->ConOut, MenuRefreshEntry->CurrentAttribute);\r
-    ProcessStringForDateTime(MenuRefreshEntry->MenuOption, OptionString, FALSE);\r
-    PrintStringAt (MenuRefreshEntry->CurrentColumn, MenuRefreshEntry->CurrentRow, OptionString);\r
-    FreePool (OptionString);\r
-  }\r
-\r
-  //\r
-  // Question value may be changed, need invoke its Callback()\r
-  //\r
-  Status = ProcessCallBackFunction (Selection, Question, EFI_BROWSER_ACTION_CHANGING, FALSE);\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Refresh the question which has refresh guid event attribute.\r
-  \r
-  @param Event    The event which has this function related.     \r
-  @param Context  The input context info related to this event or the status code return to the caller.\r
-**/\r
-VOID\r
-EFIAPI\r
-RefreshQuestionNotify(\r
-  IN      EFI_EVENT Event,\r
-  IN      VOID      *Context\r
-  )\r
-{\r
-  MENU_REFRESH_ENTRY              *MenuRefreshEntry;\r
-  UI_MENU_SELECTION               *Selection;\r
-\r
-  //\r
-  // Reset FormPackage update flag\r
-  //\r
-  mHiiPackageListUpdated = FALSE;\r
-\r
-  MenuRefreshEntry = (MENU_REFRESH_ENTRY *)Context;\r
-  ASSERT (MenuRefreshEntry != NULL);\r
-  Selection = MenuRefreshEntry->Selection;\r
-\r
-  RefreshQuestion (MenuRefreshEntry);\r
-  \r
-  if (mHiiPackageListUpdated) {\r
-    //\r
-    // Package list is updated, force to reparse IFR binary of target Formset\r
-    //\r
-    mHiiPackageListUpdated = FALSE;\r
-    Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-  } \r
-}\r
-\r
-\r
-/**\r
-  Refresh screen.\r
-\r
-**/\r
-EFI_STATUS\r
-RefreshForm (\r
-  VOID\r
-  )\r
-{\r
-  MENU_REFRESH_ENTRY              *MenuRefreshEntry;\r
-  EFI_STATUS                      Status;\r
-  UI_MENU_SELECTION               *Selection;\r
-\r
-  if (gMenuRefreshHead != NULL) {\r
-    //\r
-    // call from refresh interval process.\r
-    //\r
-    MenuRefreshEntry = gMenuRefreshHead;\r
-    Selection = MenuRefreshEntry->Selection;\r
-    //\r
-    // Reset FormPackage update flag\r
-    //\r
-    mHiiPackageListUpdated = FALSE;\r
-\r
-    do {\r
-      Status = RefreshQuestion (MenuRefreshEntry);\r
-      if (EFI_ERROR (Status)) {\r
-        return Status;\r
-      }\r
-\r
-      MenuRefreshEntry = MenuRefreshEntry->Next;\r
-\r
-    } while (MenuRefreshEntry != NULL);\r
-\r
-    if (mHiiPackageListUpdated) {\r
-      //\r
-      // Package list is updated, force to reparse IFR binary of target Formset\r
-      //\r
-      mHiiPackageListUpdated = FALSE;\r
-      Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-      return EFI_SUCCESS;\r
-    }\r
-  }\r
-\r
-  return EFI_TIMEOUT;\r
-}\r
-\r
-\r
-/**\r
-  Wait for a given event to fire, or for an optional timeout to expire.\r
-\r
-  @param  Event                  The event to wait for\r
-  @param  Timeout                An optional timeout value in 100 ns units.\r
-  @param  RefreshInterval        Menu refresh interval (in seconds).\r
-\r
-  @retval EFI_SUCCESS            Event fired before Timeout expired.\r
-  @retval EFI_TIME_OUT           Timout expired before Event fired.\r
-\r
-**/\r
-EFI_STATUS\r
-UiWaitForSingleEvent (\r
-  IN EFI_EVENT                Event,\r
-  IN UINT64                   Timeout, OPTIONAL\r
-  IN UINT8                    RefreshInterval OPTIONAL\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINTN       Index;\r
-  EFI_EVENT   TimerEvent;\r
-  EFI_EVENT   WaitList[2];\r
-\r
-  if (Timeout != 0) {\r
-    //\r
-    // Create a timer event\r
-    //\r
-    Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);\r
-    if (!EFI_ERROR (Status)) {\r
-      //\r
-      // Set the timer event\r
-      //\r
-      gBS->SetTimer (\r
-            TimerEvent,\r
-            TimerRelative,\r
-            Timeout\r
-            );\r
-\r
-      //\r
-      // Wait for the original event or the timer\r
-      //\r
-      WaitList[0] = Event;\r
-      WaitList[1] = TimerEvent;\r
-      Status      = gBS->WaitForEvent (2, WaitList, &Index);\r
-      gBS->CloseEvent (TimerEvent);\r
-\r
-      //\r
-      // If the timer expired, change the return to timed out\r
-      //\r
-      if (!EFI_ERROR (Status) && Index == 1) {\r
-        Status = EFI_TIMEOUT;\r
-      }\r
-    }\r
-  } else {\r
-    //\r
-    // Update screen every second\r
-    //\r
-    if (RefreshInterval == 0) {\r
-      Timeout = ONE_SECOND;\r
-    } else {\r
-      Timeout = RefreshInterval * ONE_SECOND;\r
-    }\r
-\r
-    do {\r
-      Status = gBS->CreateEvent (EVT_TIMER, 0, NULL, NULL, &TimerEvent);\r
-\r
-      //\r
-      // Set the timer event\r
-      //\r
-      gBS->SetTimer (\r
-            TimerEvent,\r
-            TimerRelative,\r
-            Timeout\r
-            );\r
-\r
-      //\r
-      // Wait for the original event or the timer\r
-      //\r
-      WaitList[0] = Event;\r
-      WaitList[1] = TimerEvent;\r
-      Status      = gBS->WaitForEvent (2, WaitList, &Index);\r
-\r
-      //\r
-      // If the timer expired, update anything that needs a refresh and keep waiting\r
-      //\r
-      if (!EFI_ERROR (Status) && Index == 1) {\r
-        Status = EFI_TIMEOUT;\r
-        if (RefreshInterval != 0) {\r
-          Status = RefreshForm ();\r
-        }\r
-      }\r
-\r
-      gBS->CloseEvent (TimerEvent);\r
-    } while (Status == EFI_TIMEOUT);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Add one menu option by specified description and context.\r
-\r
-  @param  String                 String description for this option.\r
-  @param  Handle                 Hii handle for the package list.\r
-  @param  Form                   The form this statement belong to.\r
-  @param  Statement              Statement of this Menu Option.\r
-  @param  NumberOfLines          Display lines for this Menu Option.\r
-  @param  MenuItemCount          The index for this Option in the Menu.\r
-\r
-  @retval Pointer                Pointer to the added Menu Option.\r
-\r
-**/\r
-UI_MENU_OPTION *\r
-UiAddMenuOption (\r
-  IN CHAR16                  *String,\r
-  IN EFI_HII_HANDLE          Handle,\r
-  IN FORM_BROWSER_FORM       *Form,\r
-  IN FORM_BROWSER_STATEMENT  *Statement,\r
-  IN UINT16                  NumberOfLines,\r
-  IN UINT16                  MenuItemCount\r
-  )\r
-{\r
-  UI_MENU_OPTION  *MenuOption;\r
-  UINTN           Index;\r
-  UINTN           Count;\r
-\r
-  Count = 1;\r
-  MenuOption = NULL;\r
-\r
-  if (Statement->Operand == EFI_IFR_DATE_OP || Statement->Operand == EFI_IFR_TIME_OP) {\r
-    //\r
-    // Add three MenuOptions for Date/Time\r
-    // Data format :      [01/02/2004]      [11:22:33]\r
-    // Line number :        0  0    1         0  0  1\r
-    //\r
-    NumberOfLines = 0;\r
-    Count = 3;\r
-\r
-    if (Statement->Storage == NULL) {\r
-      //\r
-      // For RTC type of date/time, set default refresh interval to be 1 second\r
-      //\r
-      if (Statement->RefreshInterval == 0) {\r
-        Statement->RefreshInterval = 1;\r
-      }\r
-    }\r
-  }\r
-\r
-  for (Index = 0; Index < Count; Index++) {\r
-    MenuOption = AllocateZeroPool (sizeof (UI_MENU_OPTION));\r
-    ASSERT (MenuOption);\r
-\r
-    MenuOption->Signature   = UI_MENU_OPTION_SIGNATURE;\r
-    MenuOption->Description = String;\r
-    MenuOption->Handle      = Handle;\r
-    MenuOption->ThisTag     = Statement;\r
-    MenuOption->EntryNumber = MenuItemCount;\r
-\r
-    if (Index == 2) {\r
-      //\r
-      // Override LineNumber for the MenuOption in Date/Time sequence\r
-      //\r
-      MenuOption->Skip = 1;\r
-    } else {\r
-      MenuOption->Skip = NumberOfLines;\r
-    }\r
-    MenuOption->Sequence = Index;\r
-\r
-    if (EvaluateExpressionList(Statement->Expression, FALSE, NULL, NULL) == ExpressGrayOut ) {\r
-      MenuOption->GrayOut = TRUE;\r
-    } else {\r
-      MenuOption->GrayOut = FALSE;\r
-    }\r
-\r
-    //\r
-    // If the form or the question has the lock attribute, deal same as grayout.\r
-    //\r
-    if (Form->Locked || Statement->Locked) {\r
-      MenuOption->GrayOut = TRUE;\r
-    }\r
-    \r
-    switch (Statement->Operand) {\r
-    case EFI_IFR_ORDERED_LIST_OP:\r
-    case EFI_IFR_ONE_OF_OP:\r
-    case EFI_IFR_NUMERIC_OP:\r
-    case EFI_IFR_TIME_OP:\r
-    case EFI_IFR_DATE_OP:\r
-    case EFI_IFR_CHECKBOX_OP:\r
-    case EFI_IFR_PASSWORD_OP:\r
-    case EFI_IFR_STRING_OP:\r
-      //\r
-      // User could change the value of these items\r
-      //\r
-      MenuOption->IsQuestion = TRUE;\r
-      break;\r
-\r
-    case EFI_IFR_TEXT_OP:\r
-      if (FeaturePcdGet (PcdBrowserGrayOutTextStatement)) {\r
-        //\r
-        // Initializing GrayOut option as TRUE for Text setup options \r
-        // so that those options will be Gray in colour and un selectable.\r
-        //\r
-        MenuOption->GrayOut = TRUE;\r
-      }\r
-      //\r
-      // break skipped on purpose\r
-      //\r
-    default:\r
-      MenuOption->IsQuestion = FALSE;\r
-      break;\r
-    }\r
-\r
-    if ((Statement->ValueExpression != NULL) ||\r
-        ((Statement->QuestionFlags & EFI_IFR_FLAG_READ_ONLY) != 0)) {\r
-      MenuOption->ReadOnly = TRUE;\r
-      if (FeaturePcdGet (PcdBrowerGrayOutReadOnlyMenu)) {\r
-        MenuOption->GrayOut = TRUE;\r
-      }\r
-    }\r
-\r
-    InsertTailList (&gMenuOption, &MenuOption->Link);\r
-  }\r
-\r
-  return MenuOption;\r
-}\r
-\r
-\r
-/**\r
-  Routine used to abstract a generic dialog interface and return the selected key or string\r
-\r
-  @param  NumberOfLines          The number of lines for the dialog box\r
-  @param  HotKey                 Defines whether a single character is parsed\r
-                                 (TRUE) and returned in KeyValue or a string is\r
-                                 returned in StringBuffer.  Two special characters\r
-                                 are considered when entering a string, a SCAN_ESC\r
-                                 and an CHAR_CARRIAGE_RETURN.  SCAN_ESC terminates\r
-                                 string input and returns\r
-  @param  MaximumStringSize      The maximum size in bytes of a typed in string\r
-                                 (each character is a CHAR16) and the minimum\r
-                                 string returned is two bytes\r
-  @param  StringBuffer           The passed in pointer to the buffer which will\r
-                                 hold the typed in string if HotKey is FALSE\r
-  @param  KeyValue               The EFI_KEY value returned if HotKey is TRUE..\r
-  @param  ...                    A series of (quantity == NumberOfLines) text\r
-                                 strings which will be used to construct the dialog\r
-                                 box\r
-\r
-  @retval EFI_SUCCESS            Displayed dialog and received user interaction\r
-  @retval EFI_INVALID_PARAMETER  One of the parameters was invalid (e.g.\r
-                                 (StringBuffer == NULL) && (HotKey == FALSE))\r
-  @retval EFI_DEVICE_ERROR       User typed in an ESC character to exit the routine\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-CreateDialog (\r
-  IN  UINTN                       NumberOfLines,\r
-  IN  BOOLEAN                     HotKey,\r
-  IN  UINTN                       MaximumStringSize,\r
-  OUT CHAR16                      *StringBuffer,\r
-  OUT EFI_INPUT_KEY               *KeyValue,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST       Marker;\r
-  UINTN         Count;\r
-  EFI_INPUT_KEY Key;\r
-  UINTN         LargestString;\r
-  CHAR16        *TempString;\r
-  CHAR16        *BufferedString;\r
-  CHAR16        *StackString;\r
-  CHAR16        KeyPad[2];\r
-  UINTN         Start;\r
-  UINTN         Top;\r
-  UINTN         Index;\r
-  EFI_STATUS    Status;\r
-  BOOLEAN       SelectionComplete;\r
-  UINTN         InputOffset;\r
-  UINTN         CurrentAttribute;\r
-  UINTN         DimensionsWidth;\r
-  UINTN         DimensionsHeight;\r
-\r
-  DimensionsWidth   = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;\r
-  DimensionsHeight  = gScreenDimensions.BottomRow - gScreenDimensions.TopRow;\r
-\r
-  SelectionComplete = FALSE;\r
-  InputOffset       = 0;\r
-  TempString        = AllocateZeroPool (MaximumStringSize * 2);\r
-  BufferedString    = AllocateZeroPool (MaximumStringSize * 2);\r
-  CurrentAttribute  = gST->ConOut->Mode->Attribute;\r
-\r
-  ASSERT (TempString);\r
-  ASSERT (BufferedString);\r
-\r
-  //\r
-  // Zero the outgoing buffer\r
-  //\r
-  ZeroMem (StringBuffer, MaximumStringSize);\r
-\r
-  if (HotKey) {\r
-    if (KeyValue == NULL) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-  } else {\r
-    if (StringBuffer == NULL) {\r
-      return EFI_INVALID_PARAMETER;\r
-    }\r
-  }\r
-  //\r
-  // Disable cursor\r
-  //\r
-  gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
-\r
-  LargestString = 0;\r
-\r
-  VA_START (Marker, KeyValue);\r
-\r
-  //\r
-  // Determine the largest string in the dialog box\r
-  // Notice we are starting with 1 since String is the first string\r
-  //\r
-  for (Count = 0; Count < NumberOfLines; Count++) {\r
-    StackString = VA_ARG (Marker, CHAR16 *);\r
-\r
-    if (StackString[0] == L' ') {\r
-      InputOffset = Count + 1;\r
-    }\r
-\r
-    if ((GetStringWidth (StackString) / 2) > LargestString) {\r
-      //\r
-      // Size of the string visually and subtract the width by one for the null-terminator\r
-      //\r
-      LargestString = (GetStringWidth (StackString) / 2);\r
-    }\r
-  }\r
-  VA_END (Marker);\r
-\r
-  Start = (DimensionsWidth - LargestString - 2) / 2 + gScreenDimensions.LeftColumn + 1;\r
-  Top   = ((DimensionsHeight - NumberOfLines - 2) / 2) + gScreenDimensions.TopRow - 1;\r
-\r
-  Count = 0;\r
-\r
-  //\r
-  // Display the Popup\r
-  //\r
-  VA_START (Marker, KeyValue);\r
-  CreateSharedPopUp (LargestString, NumberOfLines, Marker);\r
-  VA_END (Marker);\r
-\r
-  //\r
-  // Take the first key typed and report it back?\r
-  //\r
-  if (HotKey) {\r
-    Status = WaitForKeyStroke (&Key);\r
-    ASSERT_EFI_ERROR (Status);\r
-    CopyMem (KeyValue, &Key, sizeof (EFI_INPUT_KEY));\r
-\r
-  } else {\r
-    do {\r
-      Status = WaitForKeyStroke (&Key);\r
-\r
-      switch (Key.UnicodeChar) {\r
-      case CHAR_NULL:\r
-        switch (Key.ScanCode) {\r
-        case SCAN_ESC:\r
-          FreePool (TempString);\r
-          FreePool (BufferedString);\r
-          gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);\r
-          gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
-          return EFI_DEVICE_ERROR;\r
-\r
-        default:\r
-          break;\r
-        }\r
-\r
-        break;\r
-\r
-      case CHAR_CARRIAGE_RETURN:\r
-        SelectionComplete = TRUE;\r
-        FreePool (TempString);\r
-        FreePool (BufferedString);\r
-        gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);\r
-        gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
-        return EFI_SUCCESS;\r
-        break;\r
-\r
-      case CHAR_BACKSPACE:\r
-        if (StringBuffer[0] != CHAR_NULL) {\r
-          for (Index = 0; StringBuffer[Index] != CHAR_NULL; Index++) {\r
-            TempString[Index] = StringBuffer[Index];\r
-          }\r
-          //\r
-          // Effectively truncate string by 1 character\r
-          //\r
-          TempString[Index - 1] = CHAR_NULL;\r
-          StrCpy (StringBuffer, TempString);\r
-        }\r
-        //\r
-        // break skipped on purpose\r
-        //\r
-\r
-      default:\r
-        //\r
-        // If it is the beginning of the string, don't worry about checking maximum limits\r
-        //\r
-        if ((StringBuffer[0] == CHAR_NULL) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
-          StrnCpy (StringBuffer, &Key.UnicodeChar, 1);\r
-          StrnCpy (TempString, &Key.UnicodeChar, 1);\r
-        } else if ((GetStringWidth (StringBuffer) < MaximumStringSize) && (Key.UnicodeChar != CHAR_BACKSPACE)) {\r
-          KeyPad[0] = Key.UnicodeChar;\r
-          KeyPad[1] = CHAR_NULL;\r
-          StrCat (StringBuffer, KeyPad);\r
-          StrCat (TempString, KeyPad);\r
-        }\r
-        //\r
-        // If the width of the input string is now larger than the screen, we nee to\r
-        // adjust the index to start printing portions of the string\r
-        //\r
-        SetUnicodeMem (BufferedString, LargestString, L' ');\r
-\r
-        PrintStringAt (Start + 1, Top + InputOffset, BufferedString);\r
-\r
-        if ((GetStringWidth (StringBuffer) / 2) > (DimensionsWidth - 2)) {\r
-          Index = (GetStringWidth (StringBuffer) / 2) - DimensionsWidth + 2;\r
-        } else {\r
-          Index = 0;\r
-        }\r
-\r
-        for (Count = 0; Index + 1 < GetStringWidth (StringBuffer) / 2; Index++, Count++) {\r
-          BufferedString[Count] = StringBuffer[Index];\r
-        }\r
-\r
-        PrintStringAt (Start + 1, Top + InputOffset, BufferedString);\r
-        break;\r
-      }\r
-    } while (!SelectionComplete);\r
-  }\r
-\r
-  gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);\r
-  gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
-  Draw a pop up windows based on the dimension, number of lines and\r
-  strings specified.\r
-\r
-  @param RequestedWidth  The width of the pop-up.\r
-  @param NumberOfLines   The number of lines.\r
-  @param Marker          The variable argument list for the list of string to be printed.\r
-\r
-**/\r
-VOID\r
-CreateSharedPopUp (\r
-  IN  UINTN                       RequestedWidth,\r
-  IN  UINTN                       NumberOfLines,\r
-  IN  VA_LIST                     Marker\r
-  )\r
-{\r
-  UINTN   Index;\r
-  UINTN   Count;\r
-  CHAR16  Character;\r
-  UINTN   Start;\r
-  UINTN   End;\r
-  UINTN   Top;\r
-  UINTN   Bottom;\r
-  CHAR16  *String;\r
-  UINTN   DimensionsWidth;\r
-  UINTN   DimensionsHeight;\r
-\r
-  DimensionsWidth   = gScreenDimensions.RightColumn - gScreenDimensions.LeftColumn;\r
-  DimensionsHeight  = gScreenDimensions.BottomRow - gScreenDimensions.TopRow;\r
-\r
-  gST->ConOut->SetAttribute (gST->ConOut, POPUP_TEXT | POPUP_BACKGROUND);\r
-\r
-  if ((RequestedWidth + 2) > DimensionsWidth) {\r
-    RequestedWidth = DimensionsWidth - 2;\r
-  }\r
-\r
-  //\r
-  // Subtract the PopUp width from total Columns, allow for one space extra on\r
-  // each end plus a border.\r
-  //\r
-  Start     = (DimensionsWidth - RequestedWidth - 2) / 2 + gScreenDimensions.LeftColumn + 1;\r
-  End       = Start + RequestedWidth + 1;\r
-\r
-  Top       = ((DimensionsHeight - NumberOfLines - 2) / 2) + gScreenDimensions.TopRow - 1;\r
-  Bottom    = Top + NumberOfLines + 2;\r
-\r
-  Character = BOXDRAW_DOWN_RIGHT;\r
-  PrintCharAt (Start, Top, Character);\r
-  Character = BOXDRAW_HORIZONTAL;\r
-  for (Index = Start; Index + 2 < End; Index++) {\r
-    PrintChar (Character);\r
-  }\r
-\r
-  Character = BOXDRAW_DOWN_LEFT;\r
-  PrintChar (Character);\r
-  Character = BOXDRAW_VERTICAL;\r
-\r
-  Count = 0;\r
-  for (Index = Top; Index + 2 < Bottom; Index++, Count++) {\r
-    String = VA_ARG (Marker, CHAR16*);\r
-\r
-    //\r
-    // This will clear the background of the line - we never know who might have been\r
-    // here before us.  This differs from the next clear in that it used the non-reverse\r
-    // video for normal printing.\r
-    //\r
-    if (GetStringWidth (String) / 2 > 1) {\r
-      ClearLines (Start, End, Index + 1, Index + 1, POPUP_TEXT | POPUP_BACKGROUND);\r
-    }\r
-\r
-    //\r
-    // Passing in a space results in the assumption that this is where typing will occur\r
-    //\r
-    if (String[0] == L' ') {\r
-      ClearLines (Start + 1, End - 1, Index + 1, Index + 1, POPUP_INVERSE_TEXT | POPUP_INVERSE_BACKGROUND);\r
-    }\r
-\r
-    //\r
-    // Passing in a NULL results in a blank space\r
-    //\r
-    if (String[0] == CHAR_NULL) {\r
-      ClearLines (Start, End, Index + 1, Index + 1, POPUP_TEXT | POPUP_BACKGROUND);\r
-    }\r
-\r
-    PrintStringAt (\r
-      ((DimensionsWidth - GetStringWidth (String) / 2) / 2) + gScreenDimensions.LeftColumn + 1,\r
-      Index + 1,\r
-      String\r
-      );\r
-    gST->ConOut->SetAttribute (gST->ConOut, POPUP_TEXT | POPUP_BACKGROUND);\r
-    PrintCharAt (Start, Index + 1, Character);\r
-    PrintCharAt (End - 1, Index + 1, Character);\r
-  }\r
-\r
-  Character = BOXDRAW_UP_RIGHT;\r
-  PrintCharAt (Start, Bottom - 1, Character);\r
-  Character = BOXDRAW_HORIZONTAL;\r
-  for (Index = Start; Index + 2 < End; Index++) {\r
-    PrintChar (Character);\r
-  }\r
-\r
-  Character = BOXDRAW_UP_LEFT;\r
-  PrintChar (Character);\r
-}\r
-\r
-/**\r
-  Draw a pop up windows based on the dimension, number of lines and\r
-  strings specified.\r
-\r
-  @param RequestedWidth  The width of the pop-up.\r
-  @param NumberOfLines   The number of lines.\r
-  @param ...             A series of text strings that displayed in the pop-up.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CreateMultiStringPopUp (\r
-  IN  UINTN                       RequestedWidth,\r
-  IN  UINTN                       NumberOfLines,\r
-  ...\r
-  )\r
-{\r
-  VA_LIST Marker;\r
-\r
-  VA_START (Marker, NumberOfLines);\r
-\r
-  CreateSharedPopUp (RequestedWidth, NumberOfLines, Marker);\r
-\r
-  VA_END (Marker);\r
-}\r
-\r
-\r
-/**\r
-  Update status bar on the bottom of menu.\r
-\r
-  @param  Selection              Current Selction info.\r
-  @param  MessageType            The type of message to be shown.\r
-  @param  Flags                  The flags in Question header.\r
-  @param  State                  Set or clear.\r
-\r
-**/\r
-VOID\r
-UpdateStatusBar (\r
-  IN  UI_MENU_SELECTION           *Selection,\r
-  IN  UINTN                       MessageType,\r
-  IN  UINT8                       Flags,\r
-  IN  BOOLEAN                     State\r
-  )\r
-{\r
-  UINTN           Index;\r
-  CHAR16          *NvUpdateMessage;\r
-  CHAR16          *InputErrorMessage;\r
-  LIST_ENTRY              *Link;\r
-  FORM_BROWSER_FORMSET    *LocalFormSet;\r
-  FORM_BROWSER_STATEMENT  *Question;\r
-  \r
-  NvUpdateMessage   = GetToken (STRING_TOKEN (NV_UPDATE_MESSAGE), gHiiHandle);\r
-  InputErrorMessage = GetToken (STRING_TOKEN (INPUT_ERROR_MESSAGE), gHiiHandle);\r
-\r
-  switch (MessageType) {\r
-  case INPUT_ERROR:\r
-    if (State) {\r
-      gST->ConOut->SetAttribute (gST->ConOut, ERROR_TEXT);\r
-      PrintStringAt (\r
-        gScreenDimensions.LeftColumn + gPromptBlockWidth,\r
-        gScreenDimensions.BottomRow - 1,\r
-        InputErrorMessage\r
-        );\r
-      mInputError = TRUE;\r
-    } else {\r
-      gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor));\r
-      for (Index = 0; Index < (GetStringWidth (InputErrorMessage) - 2) / 2; Index++) {\r
-        PrintAt (gScreenDimensions.LeftColumn + gPromptBlockWidth + Index, gScreenDimensions.BottomRow - 1, L"  ");\r
-      }\r
-\r
-      mInputError = FALSE;\r
-    }\r
-    break;\r
-\r
-  case NV_UPDATE_REQUIRED:\r
-    //\r
-    // Global setting support. Show configuration change on every form.\r
-    //\r
-    if (State) {\r
-      gResetRequired    = (BOOLEAN) (gResetRequired | ((Flags & EFI_IFR_FLAG_RESET_REQUIRED) == EFI_IFR_FLAG_RESET_REQUIRED));\r
-\r
-      if (Selection != NULL && Selection->Statement != NULL) {\r
-        Question = Selection->Statement;\r
-        if (Question->Storage != NULL || Question->Operand == EFI_IFR_DATE_OP || Question->Operand == EFI_IFR_TIME_OP) {\r
-          //\r
-          // Update only for Question value that need to be saved into Storage.\r
-          //\r
-          Selection->Form->NvUpdateRequired = TRUE;\r
-        }\r
-      }\r
-      \r
-      if (Selection == NULL || IsNvUpdateRequired (Selection->FormSet)) {\r
-        gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT);\r
-        PrintStringAt (\r
-          gScreenDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth,\r
-          gScreenDimensions.BottomRow - 1,\r
-          NvUpdateMessage\r
-          );\r
-      }\r
-    } else {\r
-      gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor));\r
-      for (Index = 0; Index < (GetStringWidth (NvUpdateMessage) - 2) / 2; Index++) {\r
-        PrintAt (\r
-          (gScreenDimensions.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + Index),\r
-          gScreenDimensions.BottomRow - 1,\r
-          L"  "\r
-          );\r
-      }\r
-    }\r
-    break;\r
-\r
-  case REFRESH_STATUS_BAR:\r
-    if (mInputError) {\r
-      UpdateStatusBar (Selection, INPUT_ERROR, Flags, TRUE);\r
-    }\r
-\r
-    switch (gBrowserSettingScope) {\r
-    case SystemLevel:\r
-      //\r
-      // Check the maintain list to see whether there is any change.\r
-      //\r
-      Link = GetFirstNode (&gBrowserFormSetList);\r
-      while (!IsNull (&gBrowserFormSetList, Link)) {\r
-        LocalFormSet = FORM_BROWSER_FORMSET_FROM_LINK (Link);\r
-        if (IsNvUpdateRequired(LocalFormSet)) {\r
-          UpdateStatusBar (NULL, NV_UPDATE_REQUIRED, Flags, TRUE);\r
-          break;\r
-        }\r
-        Link = GetNextNode (&gBrowserFormSetList, Link);\r
-      }\r
-      break;\r
-    case FormSetLevel:\r
-    case FormLevel:\r
-      UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, Flags, TRUE);\r
-    default:\r
-      break;\r
-    }\r
-\r
-    break;\r
-\r
-  default:\r
-    break;\r
-  }\r
-\r
-  FreePool (InputErrorMessage);\r
-  FreePool (NvUpdateMessage);\r
-  return ;\r
-}\r
-\r
-\r
-/**\r
-  Get the supported width for a particular op-code\r
-\r
-  @param  Statement              The FORM_BROWSER_STATEMENT structure passed in.\r
-  @param  Handle                 The handle in the HII database being used\r
-\r
-  @return Returns the number of CHAR16 characters that is support.\r
-\r
-**/\r
-UINT16\r
-GetWidth (\r
-  IN FORM_BROWSER_STATEMENT        *Statement,\r
-  IN EFI_HII_HANDLE                 Handle\r
-  )\r
-{\r
-  CHAR16  *String;\r
-  UINTN   Size;\r
-  UINT16  Width;\r
-\r
-  Size = 0;\r
-\r
-  //\r
-  // See if the second text parameter is really NULL\r
-  //\r
-  if ((Statement->Operand == EFI_IFR_TEXT_OP) && (Statement->TextTwo != 0)) {\r
-    String = GetToken (Statement->TextTwo, Handle);\r
-    Size   = StrLen (String);\r
-    FreePool (String);\r
-  }\r
-\r
-  if ((Statement->Operand == EFI_IFR_SUBTITLE_OP) ||\r
-      (Statement->Operand == EFI_IFR_REF_OP) ||\r
-      (Statement->Operand == EFI_IFR_PASSWORD_OP) ||\r
-      (Statement->Operand == EFI_IFR_ACTION_OP) ||\r
-      (Statement->Operand == EFI_IFR_RESET_BUTTON_OP) ||\r
-      //\r
-      // Allow a wide display if text op-code and no secondary text op-code\r
-      //\r
-      ((Statement->Operand == EFI_IFR_TEXT_OP) && (Size == 0))\r
-      ) {\r
-    Width = (UINT16) (gPromptBlockWidth + gOptionBlockWidth);\r
-  } else {\r
-    Width = (UINT16) gPromptBlockWidth;\r
-  }\r
-\r
-  if (Statement->InSubtitle) {\r
-    Width -= SUBTITLE_INDENT;\r
-  }\r
-\r
-  return (UINT16) (Width - LEFT_SKIPPED_COLUMNS);\r
-}\r
-\r
-/**\r
-  Will copy LineWidth amount of a string in the OutputString buffer and return the\r
-  number of CHAR16 characters that were copied into the OutputString buffer.\r
-  The output string format is:\r
-    Glyph Info + String info + '\0'.\r
-\r
-  In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.\r
-\r
-  @param  InputString            String description for this option.\r
-  @param  LineWidth              Width of the desired string to extract in CHAR16\r
-                                 characters\r
-  @param  GlyphWidth             The glyph width of the begin of the char in the string.\r
-  @param  Index                  Where in InputString to start the copy process\r
-  @param  OutputString           Buffer to copy the string into\r
-\r
-  @return Returns the number of CHAR16 characters that were copied into the OutputString \r
-  buffer, include extra glyph info and '\0' info.\r
-\r
-**/\r
-UINT16\r
-GetLineByWidth (\r
-  IN      CHAR16                      *InputString,\r
-  IN      UINT16                      LineWidth,\r
-  IN OUT  UINT16                      *GlyphWidth,\r
-  IN OUT  UINTN                       *Index,\r
-  OUT     CHAR16                      **OutputString\r
-  )\r
-{\r
-  UINT16          StrOffset;\r
-  UINT16          GlyphOffset;\r
-  UINT16          OriginalGlyphWidth;\r
-  BOOLEAN         ReturnFlag;\r
-  UINT16          LastSpaceOffset;\r
-  UINT16          LastGlyphWidth;\r
-\r
-  if (InputString == NULL || Index == NULL || OutputString == NULL) {\r
-    return 0;\r
-  }\r
-\r
-  if (LineWidth == 0 || *GlyphWidth == 0) {\r
-    return 0;\r
-  }\r
-\r
-  //\r
-  // Save original glyph width.\r
-  //\r
-  OriginalGlyphWidth = *GlyphWidth;\r
-  LastGlyphWidth     = OriginalGlyphWidth;\r
-  ReturnFlag         = FALSE;\r
-  LastSpaceOffset    = 0;\r
-\r
-  //\r
-  // NARROW_CHAR can not be printed in screen, so if a line only contain  the two CHARs: 'NARROW_CHAR + CHAR_CARRIAGE_RETURN' , it is a empty line  in Screen.\r
-  // To avoid displaying this  empty line in screen,  just skip  the two CHARs here.\r
-  //\r
-  if ((InputString[*Index] == NARROW_CHAR) && (InputString[*Index + 1] == CHAR_CARRIAGE_RETURN)) {\r
-    *Index = *Index + 2;\r
-  }\r
-\r
-  //\r
-  // Fast-forward the string and see if there is a carriage-return in the string\r
-  //\r
-  for (StrOffset = 0, GlyphOffset = 0; GlyphOffset <= LineWidth; StrOffset++) {\r
-    switch (InputString[*Index + StrOffset]) {\r
-      case NARROW_CHAR:\r
-        *GlyphWidth = 1;\r
-        break;\r
-\r
-      case WIDE_CHAR:\r
-        *GlyphWidth = 2;\r
-        break;\r
-\r
-      case CHAR_CARRIAGE_RETURN:\r
-      case CHAR_LINEFEED:\r
-      case CHAR_NULL:\r
-        ReturnFlag = TRUE;\r
-        break;\r
-\r
-      default:\r
-        GlyphOffset = GlyphOffset + *GlyphWidth;\r
-\r
-        //\r
-        // Record the last space info in this line. Will be used in rewind.\r
-        //\r
-        if ((InputString[*Index + StrOffset] == CHAR_SPACE) && (GlyphOffset <= LineWidth)) {\r
-          LastSpaceOffset = StrOffset;\r
-          LastGlyphWidth  = *GlyphWidth;\r
-        }\r
-        break;\r
-    }\r
-\r
-    if (ReturnFlag) {\r
-      break;\r
-    }\r
-  } \r
-\r
-  //\r
-  // Rewind the string from the maximum size until we see a space to break the line\r
-  //\r
-  if (GlyphOffset > LineWidth) {\r
-    //\r
-    // Rewind the string to last space char in this line.\r
-    //\r
-    if (LastSpaceOffset != 0) {\r
-      StrOffset   = LastSpaceOffset;\r
-      *GlyphWidth = LastGlyphWidth;\r
-    } else {\r
-      //\r
-      // Roll back to last char in the line width.\r
-      //\r
-      StrOffset--;\r
-    }\r
-  }\r
-\r
-  //\r
-  // The CHAR_NULL has process last time, this time just return 0 to stand for the end.\r
-  //\r
-  if (StrOffset == 0 && (InputString[*Index + StrOffset] == CHAR_NULL)) {\r
-    return 0;\r
-  }\r
-\r
-  //\r
-  // Need extra glyph info and '\0' info, so +2.\r
-  //\r
-  *OutputString = AllocateZeroPool (((UINTN) (StrOffset + 2) * sizeof(CHAR16)));\r
-  if (*OutputString == NULL) {\r
-    return 0;\r
-  }\r
-\r
-  //\r
-  // Save the glyph info at the begin of the string, will used by Print function.\r
-  //\r
-  if (OriginalGlyphWidth == 1) {\r
-    *(*OutputString) = NARROW_CHAR;\r
-  } else  {\r
-    *(*OutputString) = WIDE_CHAR;\r
-  }\r
-\r
-  CopyMem ((*OutputString) + 1, &InputString[*Index], StrOffset * sizeof(CHAR16));\r
-\r
-  if (InputString[*Index + StrOffset] == CHAR_SPACE) {\r
-    //\r
-    // Skip the space info at the begin of next line.\r
-    //  \r
-    *Index = (UINT16) (*Index + StrOffset + 1);\r
-  } else if (InputString[*Index + StrOffset] == CHAR_LINEFEED) {\r
-    //\r
-    // Skip the /n or /n/r info.\r
-    //\r
-    if (InputString[*Index + StrOffset + 1] == CHAR_CARRIAGE_RETURN) {\r
-      *Index = (UINT16) (*Index + StrOffset + 2);\r
-    } else {\r
-      *Index = (UINT16) (*Index + StrOffset + 1);\r
-    }\r
-  } else if (InputString[*Index + StrOffset] == CHAR_CARRIAGE_RETURN) {\r
-    //\r
-    // Skip the /r or /r/n info.\r
-    //  \r
-    if (InputString[*Index + StrOffset + 1] == CHAR_LINEFEED) {\r
-      *Index = (UINT16) (*Index + StrOffset + 2);\r
-    } else {\r
-      *Index = (UINT16) (*Index + StrOffset + 1);\r
-    }\r
-  } else {\r
-    *Index = (UINT16) (*Index + StrOffset);\r
-  }\r
-\r
-  //\r
-  // Include extra glyph info and '\0' info, so +2.\r
-  //\r
-  return StrOffset + 2;\r
-}\r
-\r
-\r
-/**\r
-  Update display lines for a Menu Option.\r
-\r
-  @param  Selection              The user's selection.\r
-  @param  MenuOption             The MenuOption to be checked.\r
-\r
-**/\r
-VOID\r
-UpdateOptionSkipLines (\r
-  IN UI_MENU_SELECTION            *Selection,\r
-  IN UI_MENU_OPTION               *MenuOption\r
-  )\r
-{\r
-  UINTN   Index;\r
-  UINT16  Width;\r
-  UINTN   Row;\r
-  UINTN   OriginalRow;\r
-  CHAR16  *OutputString;\r
-  CHAR16  *OptionString;\r
-  UINT16  GlyphWidth;\r
-\r
-  Row           = 0;\r
-  OptionString  = NULL;\r
-  Width         = (UINT16) gOptionBlockWidth;\r
-  OriginalRow   = 0;\r
-  GlyphWidth    = 1;\r
-  \r
-  ProcessOptions (Selection, MenuOption, FALSE, &OptionString);\r
-  if (OptionString == NULL) {\r
-    return;\r
-  }\r
-\r
-  for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-    //\r
-    // If there is more string to process print on the next row and increment the Skip value\r
-    //\r
-    if (StrLen (&OptionString[Index]) != 0) {\r
-      Row++;\r
-      //\r
-      // Since the Number of lines for this menu entry may or may not be reflected accurately\r
-      // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
-      // some testing to ensure we are keeping this in-sync.\r
-      //\r
-      // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
-      //\r
-      if ((Row - OriginalRow) >= MenuOption->Skip) {\r
-        MenuOption->Skip++;\r
-      }\r
-    }\r
-\r
-    FreePool (OutputString);\r
-  }\r
-\r
-  if (OptionString != NULL) {\r
-    FreePool (OptionString);\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Check whether this Menu Option could be highlighted.\r
-\r
-  This is an internal function.\r
-\r
-  @param  MenuOption             The MenuOption to be checked.\r
-\r
-  @retval TRUE                   This Menu Option is selectable.\r
-  @retval FALSE                  This Menu Option could not be selected.\r
-\r
-**/\r
-BOOLEAN\r
-IsSelectable (\r
-  UI_MENU_OPTION   *MenuOption\r
-  )\r
-{\r
-  if ((MenuOption->ThisTag->Operand == EFI_IFR_SUBTITLE_OP) ||\r
-      MenuOption->GrayOut || MenuOption->ReadOnly) {\r
-    return FALSE;\r
-  } else {\r
-    return TRUE;\r
-  }\r
-}\r
-\r
-\r
-/**\r
-  Determine if the menu is the last menu that can be selected.\r
-\r
-  This is an internal function.\r
-\r
-  @param  Direction              The scroll direction. False is down. True is up.\r
-  @param  CurrentPos             The current focus.\r
-\r
-  @return FALSE -- the menu isn't the last menu that can be selected.\r
-  @return TRUE  -- the menu is the last menu that can be selected.\r
-\r
-**/\r
-BOOLEAN\r
-ValueIsScroll (\r
-  IN  BOOLEAN                     Direction,\r
-  IN  LIST_ENTRY                  *CurrentPos\r
-  )\r
-{\r
-  LIST_ENTRY      *Temp;\r
-\r
-  Temp = Direction ? CurrentPos->BackLink : CurrentPos->ForwardLink;\r
-\r
-  if (Temp == &gMenuOption) {\r
-    return TRUE;\r
-  }\r
-\r
-  return FALSE;\r
-}\r
-\r
-\r
-/**\r
-  Move to next selectable statement.\r
-\r
-  This is an internal function.\r
-\r
-  @param  Selection              Menu selection.\r
-  @param  GoUp                   The navigation direction. TRUE: up, FALSE: down.\r
-  @param  CurrentPosition        Current position.\r
-  @param  GapToTop               Gap position to top or bottom.\r
-\r
-  @return The row distance from current MenuOption to next selectable MenuOption.\r
-\r
-  @retval -1       Reach the begin of the menu, still can't find the selectable menu.\r
-  @retval Value    Find the selectable menu, maybe the truly selectable, maybe the l\r
-                   last menu showing at current form.\r
-\r
-**/\r
-INTN\r
-MoveToNextStatement (\r
-  IN     UI_MENU_SELECTION         *Selection,\r
-  IN     BOOLEAN                   GoUp,\r
-  IN OUT LIST_ENTRY                **CurrentPosition,\r
-  IN     UINTN                     GapToTop\r
-  )\r
-{\r
-  INTN             Distance;\r
-  LIST_ENTRY       *Pos;\r
-  UI_MENU_OPTION   *NextMenuOption;\r
-  UI_MENU_OPTION   *PreMenuOption;\r
-\r
-  Distance      = 0;\r
-  Pos           = *CurrentPosition;\r
-  PreMenuOption = MENU_OPTION_FROM_LINK (Pos);\r
-\r
-  while (TRUE) {\r
-    NextMenuOption = MENU_OPTION_FROM_LINK (Pos);\r
-    //\r
-    // NextMenuOption->Row == 0 means this menu has not calculate\r
-    // the NextMenuOption->Skip value yet, just calculate here.\r
-    //\r
-    if (NextMenuOption->Row == 0) {\r
-      UpdateOptionSkipLines (Selection, NextMenuOption);\r
-    }\r
-    \r
-    if (GoUp && (PreMenuOption != NextMenuOption)) {\r
-      //\r
-      // In this case, still can't find the selectable menu,\r
-      // return the last one in the showing form.\r
-      //\r
-      if ((UINTN) Distance + NextMenuOption->Skip > GapToTop) {\r
-        NextMenuOption = PreMenuOption;\r
-        break;\r
-      }\r
-\r
-      //\r
-      // Current Position doesn't need to be caculated when go up.\r
-      // Caculate distanct at first when go up\r
-      //      \r
-      Distance += NextMenuOption->Skip;\r
-    }\r
-\r
-    if (IsSelectable (NextMenuOption)) {\r
-      break;\r
-    }\r
-\r
-    //\r
-    // Arrive at begin of the menu list.\r
-    //\r
-    if ((GoUp ? Pos->BackLink : Pos->ForwardLink) == &gMenuOption) {\r
-      Distance = -1;\r
-      break;\r
-    }\r
-\r
-    if (!GoUp) {\r
-      //\r
-      // In this case, still can't find the selectable menu,\r
-      // return the last one in the showing form.\r
-      //\r
-      if ((UINTN) Distance + NextMenuOption->Skip > GapToTop) {\r
-        NextMenuOption = PreMenuOption;\r
-        break;\r
-      }\r
-\r
-      Distance += NextMenuOption->Skip;\r
-    }\r
-\r
-    PreMenuOption = NextMenuOption;\r
-    Pos = (GoUp ? Pos->BackLink : Pos->ForwardLink);\r
-  }\r
-\r
-  *CurrentPosition = &NextMenuOption->Link;\r
-  return Distance;\r
-}\r
-\r
-\r
-/**\r
-  Adjust Data and Time position accordingly.\r
-  Data format :      [01/02/2004]      [11:22:33]\r
-  Line number :        0  0    1         0  0  1\r
-\r
-  This is an internal function.\r
-\r
-  @param  DirectionUp            the up or down direction. False is down. True is\r
-                                 up.\r
-  @param  CurrentPosition        Current position. On return: Point to the last\r
-                                 Option (Year or Second) if up; Point to the first\r
-                                 Option (Month or Hour) if down.\r
-\r
-  @return Return line number to pad. It is possible that we stand on a zero-advance\r
-  @return data or time opcode, so pad one line when we judge if we are going to scroll outside.\r
-\r
-**/\r
-UINTN\r
-AdjustDateAndTimePosition (\r
-  IN     BOOLEAN                     DirectionUp,\r
-  IN OUT LIST_ENTRY                  **CurrentPosition\r
-  )\r
-{\r
-  UINTN           Count;\r
-  LIST_ENTRY      *NewPosition;\r
-  UI_MENU_OPTION  *MenuOption;\r
-  UINTN           PadLineNumber;\r
-\r
-  PadLineNumber = 0;\r
-  NewPosition   = *CurrentPosition;\r
-  MenuOption    = MENU_OPTION_FROM_LINK (NewPosition);\r
-\r
-  if ((MenuOption->ThisTag->Operand == EFI_IFR_DATE_OP) ||\r
-      (MenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)) {\r
-    //\r
-    // Calculate the distance from current position to the last Date/Time MenuOption\r
-    //\r
-    Count = 0;\r
-    while (MenuOption->Skip == 0) {\r
-      Count++;\r
-      NewPosition   = NewPosition->ForwardLink;\r
-      MenuOption    = MENU_OPTION_FROM_LINK (NewPosition);\r
-      PadLineNumber = 1;\r
-    }\r
-\r
-    NewPosition = *CurrentPosition;\r
-    if (DirectionUp) {\r
-      //\r
-      // Since the behavior of hitting the up arrow on a Date/Time MenuOption is intended\r
-      // to be one that back to the previous set of MenuOptions, we need to advance to the first\r
-      // Date/Time MenuOption and leave the remaining logic in CfUiUp intact so the appropriate\r
-      // checking can be done.\r
-      //\r
-      while (Count++ < 2) {\r
-        NewPosition = NewPosition->BackLink;\r
-      }\r
-    } else {\r
-      //\r
-      // Since the behavior of hitting the down arrow on a Date/Time MenuOption is intended\r
-      // to be one that progresses to the next set of MenuOptions, we need to advance to the last\r
-      // Date/Time MenuOption and leave the remaining logic in CfUiDown intact so the appropriate\r
-      // checking can be done.\r
-      //\r
-      while (Count-- > 0) {\r
-        NewPosition = NewPosition->ForwardLink;\r
-      }\r
-    }\r
-\r
-    *CurrentPosition = NewPosition;\r
-  }\r
-\r
-  return PadLineNumber;\r
-}\r
-\r
-/**\r
-  Find HII Handle in the HII database associated with given Device Path.\r
-\r
-  If DevicePath is NULL, then ASSERT.\r
-\r
-  @param  DevicePath             Device Path associated with the HII package list\r
-                                 handle.\r
-\r
-  @retval Handle                 HII package list Handle associated with the Device\r
-                                        Path.\r
-  @retval NULL                   Hii Package list handle is not found.\r
-\r
-**/\r
-EFI_HII_HANDLE\r
-EFIAPI\r
-DevicePathToHiiHandle (\r
-  IN EFI_DEVICE_PATH_PROTOCOL   *DevicePath\r
-  )\r
-{\r
-  EFI_STATUS                  Status;\r
-  EFI_DEVICE_PATH_PROTOCOL    *TmpDevicePath;\r
-  UINTN                       BufferSize;\r
-  UINTN                       HandleCount;\r
-  UINTN                       Index;\r
-  EFI_HANDLE                  Handle;\r
-  EFI_HANDLE                  DriverHandle;\r
-  EFI_HII_HANDLE              *HiiHandles;\r
-  EFI_HII_HANDLE              HiiHandle;\r
-\r
-  ASSERT (DevicePath != NULL);\r
-\r
-  TmpDevicePath = DevicePath;\r
-  //\r
-  // Locate Device Path Protocol handle buffer\r
-  //\r
-  Status = gBS->LocateDevicePath (\r
-                  &gEfiDevicePathProtocolGuid,\r
-                  &TmpDevicePath,\r
-                  &DriverHandle\r
-                  );\r
-  if (EFI_ERROR (Status) || !IsDevicePathEnd (TmpDevicePath)) {\r
-    return NULL;\r
-  }\r
-\r
-  //\r
-  // Retrieve all HII Handles from HII database\r
-  //\r
-  BufferSize = 0x1000;\r
-  HiiHandles = AllocatePool (BufferSize);\r
-  ASSERT (HiiHandles != NULL);\r
-  Status = mHiiDatabase->ListPackageLists (\r
-                           mHiiDatabase,\r
-                           EFI_HII_PACKAGE_TYPE_ALL,\r
-                           NULL,\r
-                           &BufferSize,\r
-                           HiiHandles\r
-                           );\r
-  if (Status == EFI_BUFFER_TOO_SMALL) {\r
-    FreePool (HiiHandles);\r
-    HiiHandles = AllocatePool (BufferSize);\r
-    ASSERT (HiiHandles != NULL);\r
-\r
-    Status = mHiiDatabase->ListPackageLists (\r
-                             mHiiDatabase,\r
-                             EFI_HII_PACKAGE_TYPE_ALL,\r
-                             NULL,\r
-                             &BufferSize,\r
-                             HiiHandles\r
-                             );\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    FreePool (HiiHandles);\r
-    return NULL;\r
-  }\r
-\r
-  //\r
-  // Search Hii Handle by Driver Handle\r
-  //\r
-  HiiHandle = NULL;\r
-  HandleCount = BufferSize / sizeof (EFI_HII_HANDLE);\r
-  for (Index = 0; Index < HandleCount; Index++) {\r
-    Status = mHiiDatabase->GetPackageListHandle (\r
-                             mHiiDatabase,\r
-                             HiiHandles[Index],\r
-                             &Handle\r
-                             );\r
-    if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {\r
-      HiiHandle = HiiHandles[Index];\r
-      break;\r
-    }\r
-  }\r
-\r
-  FreePool (HiiHandles);\r
-  return HiiHandle;\r
-}\r
-\r
-/**\r
-  Find HII Handle in the HII database associated with given form set guid.\r
-\r
-  If FormSetGuid is NULL, then ASSERT.\r
-\r
-  @param  ComparingGuid          FormSet Guid associated with the HII package list\r
-                                 handle.\r
-\r
-  @retval Handle                 HII package list Handle associated with the Device\r
-                                        Path.\r
-  @retval NULL                   Hii Package list handle is not found.\r
-\r
-**/\r
-EFI_HII_HANDLE\r
-FormSetGuidToHiiHandle (\r
-  EFI_GUID     *ComparingGuid\r
-  )\r
-{\r
-  EFI_HII_HANDLE               *HiiHandles;\r
-  UINTN                        Index;\r
-  EFI_HII_PACKAGE_LIST_HEADER  *HiiPackageList;\r
-  UINTN                        BufferSize;\r
-  UINT32                       Offset;\r
-  UINT32                       Offset2;\r
-  UINT32                       PackageListLength;\r
-  EFI_HII_PACKAGE_HEADER       PackageHeader;\r
-  UINT8                        *Package;\r
-  UINT8                        *OpCodeData;\r
-  EFI_STATUS                   Status;\r
-  EFI_HII_HANDLE               HiiHandle;\r
-\r
-  ASSERT (ComparingGuid != NULL);\r
-\r
-  HiiHandle  = NULL;\r
-  //\r
-  // Get all the Hii handles\r
-  //\r
-  HiiHandles = HiiGetHiiHandles (NULL);\r
-  ASSERT (HiiHandles != NULL);\r
-\r
-  //\r
-  // Search for formset of each class type\r
-  //\r
-  for (Index = 0; HiiHandles[Index] != NULL; Index++) {\r
-    BufferSize = 0;\r
-    HiiPackageList = NULL;\r
-    Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandles[Index], &BufferSize, HiiPackageList);\r
-    if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      HiiPackageList = AllocatePool (BufferSize);\r
-      ASSERT (HiiPackageList != NULL);\r
-\r
-      Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, HiiHandles[Index], &BufferSize, HiiPackageList);\r
-    }\r
-    if (EFI_ERROR (Status) || HiiPackageList == NULL) {\r
-      return NULL;\r
-    }\r
-\r
-    //\r
-    // Get Form package from this HII package List\r
-    //\r
-    Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
-    Offset2 = 0;\r
-    CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32)); \r
-\r
-    while (Offset < PackageListLength) {\r
-      Package = ((UINT8 *) HiiPackageList) + Offset;\r
-      CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
-\r
-      if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
-        //\r
-        // Search FormSet in this Form Package\r
-        //\r
-        Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
-        while (Offset2 < PackageHeader.Length) {\r
-          OpCodeData = Package + Offset2;\r
-\r
-          if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
-            //\r
-            // Try to compare against formset GUID\r
-            //\r
-            if (CompareGuid (ComparingGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
-              HiiHandle = HiiHandles[Index];\r
-              break;\r
-            }\r
-          }\r
-\r
-          Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
-        }\r
-      }\r
-      if (HiiHandle != NULL) {\r
-        break;\r
-      }\r
-      Offset += PackageHeader.Length;\r
-    }\r
-    \r
-    FreePool (HiiPackageList);\r
-       if (HiiHandle != NULL) {\r
-               break;\r
-       }\r
-  }\r
-\r
-  FreePool (HiiHandles);\r
-\r
-  return HiiHandle;\r
-}\r
-\r
-/**\r
-  Process the goto op code, update the info in the selection structure.\r
-\r
-  @param Statement    The statement belong to goto op code.\r
-  @param Selection    The selection info.\r
-  @param Repaint      Whether need to repaint the menu.\r
-  @param NewLine      Whether need to create new line.\r
-\r
-  @retval EFI_SUCCESS    The menu process successfully.\r
-  @return Other value if the process failed.\r
-**/\r
-EFI_STATUS\r
-ProcessGotoOpCode (\r
-  IN OUT   FORM_BROWSER_STATEMENT      *Statement,\r
-  IN OUT   UI_MENU_SELECTION           *Selection,\r
-  OUT      BOOLEAN                     *Repaint,\r
-  OUT      BOOLEAN                     *NewLine\r
-  )\r
-{\r
-  CHAR16                          *StringPtr;\r
-  EFI_DEVICE_PATH_PROTOCOL        *DevicePath;\r
-  FORM_BROWSER_FORM               *RefForm;\r
-  EFI_INPUT_KEY                   Key;\r
-  EFI_STATUS                      Status;\r
-\r
-  Status    = EFI_SUCCESS;\r
-  StringPtr = NULL;\r
-\r
-  //\r
-  // Prepare the device path check, get the device path info first.\r
-  //\r
-  if (Statement->HiiValue.Value.ref.DevicePath != 0) {\r
-    StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);\r
-  }\r
-\r
-  //\r
-  // Check whether the device path string is a valid string.\r
-  //\r
-  if (Statement->HiiValue.Value.ref.DevicePath != 0 && StringPtr != NULL) {\r
-    if (Selection->Form->ModalForm) {\r
-      return Status;\r
-    }\r
-\r
-    //\r
-    // Goto another Hii Package list\r
-    //\r
-    if (mPathFromText != NULL) {\r
-      DevicePath = mPathFromText->ConvertTextToDevicePath(StringPtr);\r
-      if (DevicePath != NULL) {\r
-        Selection->Handle = DevicePathToHiiHandle (DevicePath);\r
-        FreePool (DevicePath);\r
-      }\r
-      FreePool (StringPtr);\r
-    } else {\r
-      //\r
-      // Not found the EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL protocol.\r
-      //\r
-      do {\r
-        CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gProtocolNotFound, gPressEnter, gEmptyString);\r
-      } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-      if (Repaint != NULL) {\r
-        *Repaint = TRUE;\r
-      }\r
-      FreePool (StringPtr);\r
-      return Status;\r
-    }\r
-\r
-    Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-    if (Selection->Handle == NULL) {\r
-      //\r
-      // If target Hii Handle not found, exit\r
-      //\r
-      Selection->Action = UI_ACTION_EXIT;\r
-      Selection->Statement = NULL;\r
-      return Status;\r
-    }\r
-\r
-    CopyMem (&Selection->FormSetGuid,&Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
-    Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
-    Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
-  } else if (!CompareGuid (&Statement->HiiValue.Value.ref.FormSetGuid, &gZeroGuid)) {\r
-    if (Selection->Form->ModalForm) {\r
-      return Status;\r
-    }  \r
-    //\r
-    // Goto another Formset, check for uncommitted data\r
-    //\r
-    Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-    \r
-    Selection->Handle = FormSetGuidToHiiHandle(&Statement->HiiValue.Value.ref.FormSetGuid);\r
-    if (Selection->Handle == NULL) {\r
-      //\r
-      // If target Hii Handle not found, exit\r
-      //\r
-      Selection->Action = UI_ACTION_EXIT;\r
-      Selection->Statement = NULL;\r
-      return Status;\r
-    } \r
-\r
-    CopyMem (&Selection->FormSetGuid, &Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
-    Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
-    Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
-  } else if (Statement->HiiValue.Value.ref.FormId != 0) {\r
-    //\r
-    // Check whether target From is suppressed.\r
-    //\r
-    RefForm = IdToForm (Selection->FormSet, Statement->HiiValue.Value.ref.FormId);\r
-\r
-    if ((RefForm != NULL) && (RefForm->SuppressExpression != NULL)) {\r
-      if (EvaluateExpressionList(RefForm->SuppressExpression, TRUE, Selection->FormSet, RefForm) != ExpressFalse) {\r
-        //\r
-        // Form is suppressed. \r
-        //\r
-        do {\r
-          CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);\r
-        } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-        if (Repaint != NULL) {\r
-          *Repaint = TRUE;\r
-        }\r
-        return Status;\r
-      }\r
-    }\r
-\r
-    //\r
-    // Goto another form inside this formset,\r
-    //\r
-    Selection->Action = UI_ACTION_REFRESH_FORM;\r
-\r
-    Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
-    Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
-  } else if (Statement->HiiValue.Value.ref.QuestionId != 0) {\r
-    //\r
-    // Goto another Question\r
-    //\r
-    Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
-\r
-    if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-      Selection->Action = UI_ACTION_REFRESH_FORM;\r
-    } else {\r
-      if (Repaint != NULL) {\r
-        *Repaint = TRUE;\r
-      }\r
-      if (NewLine != NULL) {\r
-        *NewLine = TRUE;\r
-      }\r
-    }\r
-  } else {\r
-    if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
-      Selection->Action = UI_ACTION_REFRESH_FORM;\r
-    }\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Display menu and wait for user to select one menu option, then return it.\r
-  If AutoBoot is enabled, then if user doesn't select any option,\r
-  after period of time, it will automatically return the first menu option.\r
-\r
-  @param  Selection              Menu selection.\r
-\r
-  @retval EFI_SUCESSS            This function always return successfully for now.\r
-\r
-**/\r
-EFI_STATUS\r
-UiDisplayMenu (\r
-  IN OUT UI_MENU_SELECTION           *Selection\r
-  )\r
-{\r
-  INTN                            SkipValue;\r
-  INTN                            Difference;\r
-  UINTN                           DistanceValue;\r
-  UINTN                           Row;\r
-  UINTN                           Col;\r
-  UINTN                           Temp;\r
-  UINTN                           Temp2;\r
-  UINTN                           TopRow;\r
-  UINTN                           BottomRow;\r
-  UINTN                           OriginalRow;\r
-  UINTN                           Index;\r
-  UINT16                          Width;\r
-  CHAR16                          *StringPtr;\r
-  CHAR16                          *OptionString;\r
-  CHAR16                          *OutputString;\r
-  CHAR16                          *HelpString;\r
-  CHAR16                          *HelpHeaderString;\r
-  CHAR16                          *HelpBottomString;\r
-  BOOLEAN                         NewLine;\r
-  BOOLEAN                         Repaint;\r
-  BOOLEAN                         SavedValue;\r
-  BOOLEAN                         UpArrow;\r
-  BOOLEAN                         DownArrow;\r
-  BOOLEAN                         InitializedFlag;\r
-  EFI_STATUS                      Status;\r
-  EFI_INPUT_KEY                   Key;\r
-  LIST_ENTRY                      *Link;\r
-  LIST_ENTRY                      *NewPos;\r
-  LIST_ENTRY                      *TopOfScreen;\r
-  LIST_ENTRY                      *SavedListEntry;\r
-  UI_MENU_OPTION                  *MenuOption;\r
-  UI_MENU_OPTION                  *NextMenuOption;\r
-  UI_MENU_OPTION                  *SavedMenuOption;\r
-  UI_MENU_OPTION                  *PreviousMenuOption;\r
-  UI_CONTROL_FLAG                 ControlFlag;\r
-  EFI_SCREEN_DESCRIPTOR           LocalScreen;\r
-  MENU_REFRESH_ENTRY              *MenuRefreshEntry;\r
-  MENU_REFRESH_ENTRY              *MenuUpdateEntry;  \r
-  UI_SCREEN_OPERATION             ScreenOperation;\r
-  UINT8                           MinRefreshInterval;\r
-  UINT16                          DefaultId;\r
-  FORM_BROWSER_STATEMENT          *Statement;\r
-  UI_MENU_LIST                    *CurrentMenu;\r
-  UINTN                           ModalSkipColumn;\r
-  BROWSER_HOT_KEY                 *HotKey;\r
-  UINTN                           HelpPageIndex;\r
-  UINTN                           HelpPageCount;\r
-  UINTN                           RowCount;\r
-  UINTN                           HelpLine;\r
-  UINTN                           HelpHeaderLine;\r
-  UINTN                           HelpBottomLine;\r
-  BOOLEAN                         MultiHelpPage;\r
-  UINT16                          GlyphWidth;\r
-  UINT16                          EachLineWidth;\r
-  UINT16                          HeaderLineWidth;\r
-  UINT16                          BottomLineWidth;\r
-\r
-  CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
-\r
-  Status              = EFI_SUCCESS;\r
-  HelpString          = NULL;\r
-  HelpHeaderString    = NULL;\r
-  HelpBottomString    = NULL;\r
-  OptionString        = NULL;\r
-  ScreenOperation     = UiNoOperation;\r
-  NewLine             = TRUE;\r
-  MinRefreshInterval  = 0;\r
-  DefaultId           = 0;\r
-  HelpPageCount       = 0;\r
-  HelpLine            = 0;\r
-  RowCount            = 0;\r
-  HelpBottomLine      = 0;\r
-  HelpHeaderLine      = 0;\r
-  HelpPageIndex       = 0;\r
-  MultiHelpPage       = FALSE;\r
-  EachLineWidth       = 0;\r
-  HeaderLineWidth     = 0;\r
-  BottomLineWidth     = 0;\r
-  OutputString        = NULL;\r
-  UpArrow             = FALSE;\r
-  DownArrow           = FALSE;\r
-  SkipValue           = 0;\r
-  MenuRefreshEntry    = gMenuRefreshHead;\r
-\r
-  NextMenuOption      = NULL;\r
-  PreviousMenuOption  = NULL;\r
-  SavedMenuOption     = NULL;\r
-  HotKey              = NULL;\r
-  ModalSkipColumn     = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 6;\r
-\r
-  ZeroMem (&Key, sizeof (EFI_INPUT_KEY));\r
-\r
-  if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE){\r
-    TopRow  = LocalScreen.TopRow + FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;\r
-    Row     = LocalScreen.TopRow + FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;\r
-  } else {\r
-    TopRow  = LocalScreen.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;\r
-    Row     = LocalScreen.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;\r
-  }\r
-\r
-  if (Selection->Form->ModalForm) {\r
-    Col = LocalScreen.LeftColumn + LEFT_SKIPPED_COLUMNS + ModalSkipColumn;\r
-  } else {\r
-    Col = LocalScreen.LeftColumn + LEFT_SKIPPED_COLUMNS;\r
-  }\r
-\r
-  BottomRow = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - gFooterHeight - SCROLL_ARROW_HEIGHT - 1;\r
-\r
-  Selection->TopRow = TopRow;\r
-  Selection->BottomRow = BottomRow;\r
-  Selection->PromptCol = Col;\r
-  Selection->OptionCol = gPromptBlockWidth + 1 + LocalScreen.LeftColumn;\r
-  Selection->Statement = NULL;\r
-\r
-  TopOfScreen = gMenuOption.ForwardLink;\r
-  Repaint     = TRUE;\r
-  MenuOption  = NULL;\r
-\r
-  //\r
-  // Find current Menu\r
-  //\r
-  CurrentMenu = UiFindMenuList (Selection->Handle, &Selection->FormSetGuid, Selection->FormId);\r
-  if (CurrentMenu == NULL) {\r
-    //\r
-    // Current menu not found, add it to the menu tree\r
-    //\r
-    CurrentMenu = UiAddMenuList (Selection->CurrentMenu, Selection->Handle, &Selection->FormSetGuid, Selection->FormId);\r
-  }\r
-  ASSERT (CurrentMenu != NULL);\r
-  Selection->CurrentMenu = CurrentMenu;\r
-\r
-  if (Selection->QuestionId == 0) {\r
-    //\r
-    // Highlight not specified, fetch it from cached menu\r
-    //\r
-    Selection->QuestionId = CurrentMenu->QuestionId;\r
-    Selection->Sequence   = CurrentMenu->Sequence;\r
-  }\r
-\r
-  //\r
-  // Init option as the current user's selection\r
-  //\r
-  InitializedFlag = TRUE;\r
-  NewPos = gMenuOption.ForwardLink;\r
-\r
-  gST->ConOut->EnableCursor (gST->ConOut, FALSE);\r
-  UpdateStatusBar (Selection, REFRESH_STATUS_BAR, (UINT8) 0, TRUE);\r
-\r
-  ControlFlag = CfInitialization;\r
-  Selection->Action = UI_ACTION_NONE;\r
-  while (TRUE) {\r
-    switch (ControlFlag) {\r
-    case CfInitialization:\r
-      if (IsListEmpty (&gMenuOption)) {\r
-        ControlFlag = CfReadKey;\r
-      } else {\r
-        ControlFlag = CfCheckSelection;\r
-      }\r
-      break;\r
-\r
-    case CfCheckSelection:\r
-      if (Selection->Action != UI_ACTION_NONE) {\r
-        ControlFlag = CfExit;\r
-      } else {\r
-        ControlFlag = CfRepaint;\r
-      }\r
-      break;\r
-\r
-    case CfRepaint:\r
-      ControlFlag = CfRefreshHighLight;\r
-\r
-      if (Repaint) {\r
-        //\r
-        // Display menu\r
-        //\r
-        DownArrow       = FALSE;\r
-        UpArrow         = FALSE;\r
-        Row             = TopRow;\r
-\r
-        Temp            = (UINTN) SkipValue;\r
-        Temp2           = (UINTN) SkipValue;\r
-\r
-        //\r
-        // 1. Clear the screen.\r
-        //\r
-        if (Selection->Form->ModalForm) {\r
-          ClearLines (\r
-            LocalScreen.LeftColumn + ModalSkipColumn,\r
-            LocalScreen.LeftColumn + ModalSkipColumn + gPromptBlockWidth + gOptionBlockWidth,\r
-            TopRow - SCROLL_ARROW_HEIGHT,\r
-            BottomRow + SCROLL_ARROW_HEIGHT,\r
-            PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND\r
-            );   \r
-        } else {\r
-          ClearLines (\r
-            LocalScreen.LeftColumn,\r
-            LocalScreen.RightColumn,\r
-            TopRow - SCROLL_ARROW_HEIGHT,\r
-            BottomRow + SCROLL_ARROW_HEIGHT,\r
-            PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND\r
-            );\r
-        }\r
-        UiFreeRefreshList ();\r
-        MinRefreshInterval = 0;\r
-\r
-        //\r
-        // 2.Paint the menu.\r
-        //\r
-        for (Link = TopOfScreen; Link != &gMenuOption; Link = Link->ForwardLink) {\r
-          MenuOption          = MENU_OPTION_FROM_LINK (Link);\r
-          MenuOption->Row     = Row;\r
-          MenuOption->Col     = Col;\r
-          if (Selection->Form->ModalForm) {\r
-            MenuOption->OptCol  = gPromptBlockWidth + 1 + LocalScreen.LeftColumn + ModalSkipColumn;\r
-          } else {\r
-            MenuOption->OptCol  = gPromptBlockWidth + 1 + LocalScreen.LeftColumn;\r
-          }\r
-\r
-          Statement = MenuOption->ThisTag;\r
-          if (Statement->InSubtitle) {\r
-            MenuOption->Col += SUBTITLE_INDENT;\r
-          }\r
-\r
-          if (MenuOption->GrayOut) {\r
-            gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT_GRAYED | FIELD_BACKGROUND);\r
-          } else {\r
-            if (Statement->Operand == EFI_IFR_SUBTITLE_OP) {\r
-              gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserSubtitleTextColor) | FIELD_BACKGROUND);\r
-            }\r
-          }\r
-\r
-          Width       = GetWidth (Statement, MenuOption->Handle);\r
-          OriginalRow = Row;\r
-          GlyphWidth  = 1;\r
-\r
-          if (Statement->Operand == EFI_IFR_REF_OP && MenuOption->Col >= 2) {\r
-            //\r
-            // Print Arrow for Goto button.\r
-            //\r
-            PrintAt (\r
-              MenuOption->Col - 2,\r
-              Row,\r
-              L"%c",\r
-              GEOMETRICSHAPE_RIGHT_TRIANGLE\r
-              );\r
-          }\r
-\r
-          //\r
-          // 2.1. Paint the description.\r
-          //\r
-          for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-            //\r
-            // Temp means need to skip how many lines from the start.\r
-            //\r
-            if ((Temp == 0) && (Row <= BottomRow)) {\r
-              PrintStringAt (MenuOption->Col, Row, OutputString);\r
-            }\r
-            //\r
-            // If there is more string to process print on the next row and increment the Skip value\r
-            //\r
-            if (StrLen (&MenuOption->Description[Index]) != 0) {\r
-              if (Temp == 0) {\r
-                Row++;\r
-              }\r
-            }\r
-\r
-            FreePool (OutputString);\r
-            if (Temp != 0) {\r
-              Temp--;\r
-            }\r
-          }\r
-\r
-          Temp  = 0;\r
-          Row   = OriginalRow;\r
-\r
-          //\r
-          // 2.2. Paint the option string.\r
-          //\r
-          Status = ProcessOptions (Selection, MenuOption, FALSE, &OptionString);\r
-          if (EFI_ERROR (Status)) {\r
-            //\r
-            // Repaint to clear possible error prompt pop-up\r
-            //\r
-            Repaint = TRUE;\r
-            NewLine = TRUE;\r
-            ControlFlag = CfRepaint;\r
-            break;\r
-          }\r
-\r
-          if (OptionString != NULL) {\r
-            if (Statement->Operand == EFI_IFR_DATE_OP || Statement->Operand == EFI_IFR_TIME_OP) {\r
-              ProcessStringForDateTime(MenuOption, OptionString, TRUE);\r
-            }\r
-\r
-            Width       = (UINT16) gOptionBlockWidth;\r
-            OriginalRow = Row;\r
-            GlyphWidth  = 1;\r
-\r
-            for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-              if ((Temp2 == 0) && (Row <= BottomRow)) {\r
-                PrintStringAt (MenuOption->OptCol, Row, OutputString);\r
-              }\r
-              //\r
-              // If there is more string to process print on the next row and increment the Skip value\r
-              //\r
-              if (StrLen (&OptionString[Index]) != 0) {\r
-                if (Temp2 == 0) {\r
-                  Row++;\r
-                  //\r
-                  // Since the Number of lines for this menu entry may or may not be reflected accurately\r
-                  // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
-                  // some testing to ensure we are keeping this in-sync.\r
-                  //\r
-                  // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
-                  //\r
-                  if ((Row - OriginalRow) >= MenuOption->Skip) {\r
-                    MenuOption->Skip++;\r
-                  }\r
-                }\r
-              }\r
-\r
-              FreePool (OutputString);\r
-              if (Temp2 != 0) {\r
-                Temp2--;\r
-              }\r
-            }\r
-\r
-            Temp2 = 0;\r
-            Row   = OriginalRow;\r
-\r
-            FreePool (OptionString);\r
-          }\r
-\r
-          //\r
-          // 2.4 Special process for Test opcode with test two.\r
-          //\r
-          if (!CompareGuid (&Statement->RefreshGuid, &gZeroGuid)) {\r
-            if (gMenuEventGuidRefreshHead == NULL) {\r
-              MenuUpdateEntry = AllocateZeroPool (sizeof (MENU_REFRESH_ENTRY));\r
-              gMenuEventGuidRefreshHead = MenuUpdateEntry;\r
-            } else {\r
-              MenuUpdateEntry = gMenuEventGuidRefreshHead;\r
-              while (MenuUpdateEntry->Next != NULL) {\r
-                MenuUpdateEntry = MenuUpdateEntry->Next; \r
-              }\r
-              MenuUpdateEntry->Next = AllocateZeroPool (sizeof (MENU_REFRESH_ENTRY));\r
-              MenuUpdateEntry = MenuUpdateEntry->Next; \r
-            }\r
-            ASSERT (MenuUpdateEntry != NULL);\r
-            Status = gBS->CreateEventEx (EVT_NOTIFY_SIGNAL, TPL_NOTIFY, RefreshQuestionNotify, MenuUpdateEntry, &Statement->RefreshGuid, &MenuUpdateEntry->Event);\r
-            ASSERT (!EFI_ERROR (Status));\r
-            MenuUpdateEntry->MenuOption        = MenuOption;\r
-            MenuUpdateEntry->Selection         = Selection;\r
-            MenuUpdateEntry->CurrentColumn     = MenuOption->OptCol;\r
-            MenuUpdateEntry->CurrentRow        = MenuOption->Row;\r
-            if (MenuOption->GrayOut) {\r
-              MenuUpdateEntry->CurrentAttribute = FIELD_TEXT_GRAYED | FIELD_BACKGROUND;\r
-            } else {\r
-              MenuUpdateEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;\r
-            }\r
-          }\r
-          \r
-          //\r
-          // If Question request refresh, register the op-code\r
-          //\r
-          if (Statement->RefreshInterval != 0) {\r
-            //\r
-            // Menu will be refreshed at minimal interval of all Questions\r
-            // which have refresh request\r
-            //\r
-            if (MinRefreshInterval == 0 || Statement->RefreshInterval < MinRefreshInterval) {\r
-              MinRefreshInterval = Statement->RefreshInterval;\r
-            }\r
-            \r
-            if (gMenuRefreshHead == NULL) {\r
-              MenuRefreshEntry = AllocateZeroPool (sizeof (MENU_REFRESH_ENTRY));\r
-              gMenuRefreshHead = MenuRefreshEntry;\r
-            } else {\r
-              MenuRefreshEntry = gMenuRefreshHead;\r
-              while (MenuRefreshEntry->Next != NULL) {\r
-                MenuRefreshEntry = MenuRefreshEntry->Next; \r
-              }\r
-              MenuRefreshEntry->Next = AllocateZeroPool (sizeof (MENU_REFRESH_ENTRY));\r
-              MenuRefreshEntry = MenuRefreshEntry->Next;\r
-            }\r
-            ASSERT (MenuRefreshEntry != NULL);            \r
-            MenuRefreshEntry->MenuOption        = MenuOption;\r
-            MenuRefreshEntry->Selection         = Selection;\r
-            MenuRefreshEntry->CurrentColumn     = MenuOption->OptCol;\r
-            MenuRefreshEntry->CurrentRow        = MenuOption->Row;\r
-            if (MenuOption->GrayOut) {\r
-              MenuRefreshEntry->CurrentAttribute = FIELD_TEXT_GRAYED | FIELD_BACKGROUND;\r
-            } else {               \r
-              MenuRefreshEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;\r
-            }\r
-          }\r
-          \r
-          //\r
-          // If this is a text op with secondary text information\r
-          //\r
-          if ((Statement->Operand == EFI_IFR_TEXT_OP) && (Statement->TextTwo != 0)) {\r
-            StringPtr   = GetToken (Statement->TextTwo, MenuOption->Handle);\r
-\r
-            Width       = (UINT16) gOptionBlockWidth;\r
-            OriginalRow = Row;\r
-            GlyphWidth = 1;\r
-\r
-            for (Index = 0; GetLineByWidth (StringPtr, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-              if ((Temp == 0) && (Row <= BottomRow)) {\r
-                PrintStringAt (MenuOption->OptCol, Row, OutputString);\r
-              }\r
-              //\r
-              // If there is more string to process print on the next row and increment the Skip value\r
-              //\r
-              if (StrLen (&StringPtr[Index]) != 0) {\r
-                if (Temp2 == 0) {\r
-                  Row++;\r
-                  //\r
-                  // Since the Number of lines for this menu entry may or may not be reflected accurately\r
-                  // since the prompt might be 1 lines and option might be many, and vice versa, we need to do\r
-                  // some testing to ensure we are keeping this in-sync.\r
-                  //\r
-                  // If the difference in rows is greater than or equal to the skip value, increase the skip value\r
-                  //\r
-                  if ((Row - OriginalRow) >= MenuOption->Skip) {\r
-                    MenuOption->Skip++;\r
-                  }\r
-                }\r
-              }\r
-\r
-              FreePool (OutputString);\r
-              if (Temp2 != 0) {\r
-                Temp2--;\r
-              }\r
-            }\r
-\r
-            Row = OriginalRow;\r
-            FreePool (StringPtr);\r
-          }\r
-          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
-\r
-          //\r
-          // 3. Update the row info which will be used by next menu.\r
-          //\r
-          if (Link == TopOfScreen) {\r
-            Row += MenuOption->Skip - SkipValue;\r
-          } else {\r
-            Row += MenuOption->Skip;\r
-          }\r
-\r
-          if (Row > BottomRow) {\r
-            if (!ValueIsScroll (FALSE, Link)) {\r
-              DownArrow = TRUE;\r
-            }\r
-\r
-            Row = BottomRow + 1;\r
-            break;\r
-          }\r
-        }\r
-\r
-        if (!ValueIsScroll (TRUE, TopOfScreen)) {\r
-          UpArrow = TRUE;\r
-        }\r
-\r
-        if (UpArrow) {\r
-          gST->ConOut->SetAttribute (gST->ConOut, ARROW_TEXT | ARROW_BACKGROUND);\r
-          PrintAt (\r
-            LocalScreen.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
-            TopRow - SCROLL_ARROW_HEIGHT,\r
-            L"%c",\r
-            ARROW_UP\r
-            );\r
-          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
-        }\r
-\r
-        if (DownArrow) {\r
-          gST->ConOut->SetAttribute (gST->ConOut, ARROW_TEXT | ARROW_BACKGROUND);\r
-          PrintAt (\r
-            LocalScreen.LeftColumn + gPromptBlockWidth + gOptionBlockWidth + 1,\r
-            BottomRow + SCROLL_ARROW_HEIGHT,\r
-            L"%c",\r
-            ARROW_DOWN\r
-            );\r
-          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
-        }\r
-\r
-        MenuOption = NULL;\r
-      }\r
-      break;\r
-\r
-    case CfRefreshHighLight:\r
-      //\r
-      // MenuOption: Last menu option that need to remove hilight\r
-      //             MenuOption is set to NULL in Repaint\r
-      // NewPos:     Current menu option that need to hilight\r
-      //\r
-      ControlFlag = CfUpdateHelpString;\r
-      if (TopOfScreen == &MenuOption->Link) {\r
-        Temp = SkipValue;\r
-      } else {\r
-        Temp = 0;\r
-      }\r
-      if (NewPos == TopOfScreen) {\r
-        Temp2 = SkipValue;\r
-      } else {\r
-        Temp2 = 0;\r
-      }\r
-      if (InitializedFlag) {\r
-        InitializedFlag = FALSE;\r
-        MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);\r
-      }\r
-\r
-      //\r
-      // Repaint flag is normally reset when finish processing CfUpdateHelpString. Temporarily\r
-      // reset Repaint flag because we may break halfway and skip CfUpdateHelpString processing.\r
-      //\r
-      SavedValue  = Repaint;\r
-      Repaint     = FALSE;\r
-\r
-      if (Selection->QuestionId != 0) {\r
-        NewPos = gMenuOption.ForwardLink;\r
-        SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-\r
-        while ((SavedMenuOption->ThisTag->QuestionId != Selection->QuestionId ||\r
-                SavedMenuOption->Sequence != Selection->Sequence) &&\r
-                NewPos->ForwardLink != &gMenuOption) {\r
-          NewPos     = NewPos->ForwardLink;\r
-          SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-        }\r
-        if (SavedMenuOption->ThisTag->QuestionId == Selection->QuestionId) {\r
-          //\r
-          // Target Question found, find its MenuOption\r
-          //\r
-          Link = TopOfScreen;\r
-\r
-          for (Index = TopRow; Index <= BottomRow && Link != NewPos;) {\r
-            SavedMenuOption = MENU_OPTION_FROM_LINK (Link);\r
-            Index += SavedMenuOption->Skip;\r
-            if (Link == TopOfScreen) {\r
-              Index -= SkipValue;\r
-            }\r
-            Link = Link->ForwardLink;\r
-          }\r
-          if (NewPos == Link) {\r
-            SavedMenuOption = MENU_OPTION_FROM_LINK (Link);\r
-          }\r
-\r
-          //\r
-          // Not find the selected menu in current show page.\r
-          // Have two case to enter this if:\r
-          // 1. Not find the menu at current page.\r
-          // 2. Find the menu in current page, but the menu shows at the bottom and not all info shows.\r
-          //    For case 2, has an exception: The menu can show more than one pages and now only this menu shows.\r
-          //\r
-          // Base on the selected menu will show at the bottom of the page,\r
-          // select the menu which will show at the top of the page.\r
-          //\r
-          if (Link != NewPos || Index > BottomRow || \r
-              (Link == NewPos && (SavedMenuOption->Row + SavedMenuOption->Skip - 1 > BottomRow) && (Link != TopOfScreen))) {\r
-            //\r
-            // Find the MenuOption which has the skip value for Date/Time opcode. \r
-            //\r
-            AdjustDateAndTimePosition(FALSE, &NewPos);\r
-            //\r
-            // NewPos is not in the current page, simply scroll page so that NewPos is in the end of the page\r
-            //\r
-            SavedMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-            //\r
-            // SavedMenuOption->Row == 0 means the menu not show yet.\r
-            //\r
-            if (SavedMenuOption->Row == 0) {\r
-              UpdateOptionSkipLines (Selection, SavedMenuOption);\r
-            }\r
-\r
-            //\r
-            // Base on the selected menu will show at the bottome of next page, \r
-            // select the menu show at the top of the next page. \r
-            //\r
-            Link    = NewPos;\r
-            for (Index = TopRow + SavedMenuOption->Skip; Index <= BottomRow + 1; ) {            \r
-              Link = Link->BackLink;\r
-              SavedMenuOption = MENU_OPTION_FROM_LINK (Link);\r
-              if (SavedMenuOption->Row == 0) {\r
-                UpdateOptionSkipLines (Selection, SavedMenuOption);\r
-              }\r
-              Index += SavedMenuOption->Skip;\r
-            }\r
-\r
-            //\r
-            // Found the menu which will show at the top of the page.\r
-            //\r
-            if (Link == NewPos) {\r
-              //\r
-              // The menu can show more than one pages, just show the menu at the top of the page.\r
-              //\r
-              SkipValue    = 0;\r
-              TopOfScreen  = Link;\r
-            } else {\r
-              //\r
-              // Check whether need to skip some line for menu shows at the top of the page.\r
-              //\r
-              SkipValue = Index - BottomRow - 1;\r
-              if (SkipValue > 0 && SkipValue < (INTN) SavedMenuOption->Skip) {\r
-                TopOfScreen     = Link;\r
-              } else {\r
-                SkipValue       = 0;\r
-                TopOfScreen     = Link->ForwardLink;\r
-              }\r
-            }\r
-\r
-            Repaint = TRUE;\r
-            NewLine = TRUE;\r
-            ControlFlag = CfRepaint;\r
-            break;\r
-          }\r
-        } else {\r
-          //\r
-          // Target Question not found, highlight the default menu option\r
-          //\r
-          NewPos = TopOfScreen;\r
-        }\r
-\r
-        Selection->QuestionId = 0;\r
-      }\r
-\r
-      if (NewPos != NULL && (MenuOption == NULL || NewPos != &MenuOption->Link)) {\r
-        if (MenuOption != NULL) {\r
-          //\r
-          // Remove highlight on last Menu Option\r
-          //\r
-          gST->ConOut->SetCursorPosition (gST->ConOut, MenuOption->Col, MenuOption->Row);\r
-          ProcessOptions (Selection, MenuOption, FALSE, &OptionString);\r
-          gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
-          if (OptionString != NULL) {\r
-            if ((MenuOption->ThisTag->Operand == EFI_IFR_DATE_OP) ||\r
-                (MenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)\r
-               ) {\r
-              ProcessStringForDateTime(MenuOption, OptionString, FALSE);\r
-            }\r
-\r
-            Width               = (UINT16) gOptionBlockWidth;\r
-            OriginalRow         = MenuOption->Row;\r
-            GlyphWidth          = 1;\r
-\r
-            for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-              if ((Temp == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow)) {\r
-                PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);\r
-              }\r
-              //\r
-              // If there is more string to process print on the next row and increment the Skip value\r
-              //\r
-              if (StrLen (&OptionString[Index]) != 0) {\r
-                if (Temp == 0) {\r
-                  MenuOption->Row++;\r
-                }\r
-              }\r
-\r
-              FreePool (OutputString);\r
-              if (Temp != 0) {\r
-                Temp--;\r
-              }\r
-            }\r
-\r
-            MenuOption->Row = OriginalRow;\r
-\r
-            FreePool (OptionString);\r
-          } else {\r
-            if (NewLine) {\r
-              if (MenuOption->GrayOut) {\r
-                gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT_GRAYED | FIELD_BACKGROUND);\r
-              } else if (MenuOption->ThisTag->Operand == EFI_IFR_SUBTITLE_OP) {\r
-                gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserSubtitleTextColor) | FIELD_BACKGROUND);\r
-              }\r
-\r
-              OriginalRow = MenuOption->Row;\r
-              Width       = GetWidth (MenuOption->ThisTag, MenuOption->Handle);\r
-              GlyphWidth  = 1;\r
-\r
-              for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-                if ((Temp == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow)) {\r
-                  PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);\r
-                }\r
-                //\r
-                // If there is more string to process print on the next row and increment the Skip value\r
-                //\r
-                if (StrLen (&MenuOption->Description[Index]) != 0) {\r
-                  if (Temp == 0) {\r
-                    MenuOption->Row++;\r
-                  }\r
-                }\r
-\r
-                FreePool (OutputString);\r
-                if (Temp != 0) {\r
-                  Temp--;\r
-                }\r
-              }\r
-\r
-              MenuOption->Row = OriginalRow;\r
-              gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
-            }\r
-          }\r
-        }\r
-\r
-        //\r
-        // This is the current selected statement\r
-        //\r
-        MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-        Statement = MenuOption->ThisTag;\r
-        Selection->Statement = Statement;\r
-        if (!IsSelectable (MenuOption)) {\r
-          Repaint = SavedValue;\r
-          UpdateKeyHelp (Selection, MenuOption, FALSE);\r
-          break;\r
-        }\r
-\r
-        //\r
-        // Record highlight for current menu\r
-        //\r
-        CurrentMenu->QuestionId = Statement->QuestionId;\r
-        CurrentMenu->Sequence   = MenuOption->Sequence;\r
-\r
-        //\r
-        // Set reverse attribute\r
-        //\r
-        gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor));\r
-        gST->ConOut->SetCursorPosition (gST->ConOut, MenuOption->Col, MenuOption->Row);\r
-\r
-        //\r
-        // Assuming that we have a refresh linked-list created, lets annotate the\r
-        // appropriate entry that we are highlighting with its new attribute.  Just prior to this\r
-        // lets reset all of the entries' attribute so we do not get multiple highlights in he refresh\r
-        //\r
-        if (gMenuRefreshHead != NULL) {\r
-          for (MenuRefreshEntry = gMenuRefreshHead; MenuRefreshEntry != NULL; MenuRefreshEntry = MenuRefreshEntry->Next) {\r
-            if (MenuRefreshEntry->MenuOption->GrayOut) {\r
-              MenuRefreshEntry->CurrentAttribute = FIELD_TEXT_GRAYED | FIELD_BACKGROUND;\r
-            } else {               \r
-              MenuRefreshEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND;\r
-            }\r
-            if (MenuRefreshEntry->MenuOption == MenuOption) {\r
-              MenuRefreshEntry->CurrentAttribute = PcdGet8 (PcdBrowserFieldTextHighlightColor) | PcdGet8 (PcdBrowserFieldBackgroundHighlightColor);\r
-            }\r
-          }\r
-        }\r
-\r
-        ProcessOptions (Selection, MenuOption, FALSE, &OptionString);\r
-        if (OptionString != NULL) {\r
-          if (Statement->Operand == EFI_IFR_DATE_OP || Statement->Operand == EFI_IFR_TIME_OP) {\r
-            ProcessStringForDateTime(MenuOption, OptionString, FALSE);\r
-          }\r
-          Width               = (UINT16) gOptionBlockWidth;\r
-\r
-          OriginalRow         = MenuOption->Row;\r
-          GlyphWidth          = 1;\r
-\r
-          for (Index = 0; GetLineByWidth (OptionString, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-            if ((Temp2 == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow) ) {\r
-              PrintStringAt (MenuOption->OptCol, MenuOption->Row, OutputString);\r
-            }\r
-            //\r
-            // If there is more string to process print on the next row and increment the Skip value\r
-            //\r
-            if (StrLen (&OptionString[Index]) != 0) {\r
-              if (Temp2 == 0) {\r
-              MenuOption->Row++;\r
-              }\r
-            }\r
-\r
-            FreePool (OutputString);\r
-            if (Temp2 != 0) {\r
-              Temp2--;\r
-            }\r
-          }\r
-\r
-          MenuOption->Row = OriginalRow;\r
-\r
-          FreePool (OptionString);\r
-        } else {\r
-          if (NewLine) {\r
-            OriginalRow = MenuOption->Row;\r
-\r
-            Width       = GetWidth (Statement, MenuOption->Handle);\r
-            GlyphWidth          = 1;\r
-\r
-            for (Index = 0; GetLineByWidth (MenuOption->Description, Width, &GlyphWidth, &Index, &OutputString) != 0x0000;) {\r
-              if ((Temp2 == 0) && (MenuOption->Row >= TopRow) && (MenuOption->Row <= BottomRow) ) {\r
-                PrintStringAt (MenuOption->Col, MenuOption->Row, OutputString);\r
-              }\r
-              //\r
-              // If there is more string to process print on the next row and increment the Skip value\r
-              //\r
-              if (StrLen (&MenuOption->Description[Index]) != 0) {\r
-                if (Temp2 == 0) {\r
-                  MenuOption->Row++;\r
-                }\r
-              }\r
-\r
-              FreePool (OutputString);\r
-              if (Temp2 != 0) {\r
-                Temp2--;\r
-              }\r
-            }\r
-\r
-            MenuOption->Row = OriginalRow;\r
-\r
-          }\r
-        }\r
-\r
-        UpdateKeyHelp (Selection, MenuOption, FALSE);\r
-\r
-        //\r
-        // Clear reverse attribute\r
-        //\r
-        gST->ConOut->SetAttribute (gST->ConOut, PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND);\r
-      }\r
-      //\r
-      // Repaint flag will be used when process CfUpdateHelpString, so restore its value\r
-      // if we didn't break halfway when process CfRefreshHighLight.\r
-      //\r
-      Repaint = SavedValue;\r
-      break;\r
-\r
-    case CfUpdateHelpString:\r
-      ControlFlag = CfPrepareToReadKey;\r
-      if (Selection->Form->ModalForm) {\r
-        break;\r
-      }\r
-\r
-      if (Repaint || NewLine) {\r
-        //\r
-        // Don't print anything if it is a NULL help token\r
-        //\r
-        ASSERT(MenuOption != NULL);\r
-        if (MenuOption->ThisTag->Help == 0 || !IsSelectable (MenuOption)) {\r
-          StringPtr = L"\0";\r
-        } else {\r
-          StringPtr = GetToken (MenuOption->ThisTag->Help, MenuOption->Handle);\r
-        }\r
-\r
-        RowCount      = BottomRow - TopRow;\r
-        HelpPageIndex = 0;\r
-        //\r
-        // 1.Calculate how many line the help string need to print.\r
-        //\r
-        if (HelpString != NULL) {\r
-          FreePool (HelpString);\r
-        }\r
-        HelpLine = ProcessHelpString (StringPtr, &HelpString, &EachLineWidth, RowCount);\r
-        if (HelpLine > RowCount) {\r
-          MultiHelpPage   = TRUE;\r
-          StringPtr       = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_UP), gHiiHandle);\r
-          if (HelpHeaderString != NULL) {\r
-            FreePool (HelpHeaderString);\r
-          }\r
-          HelpHeaderLine  = ProcessHelpString (StringPtr, &HelpHeaderString, &HeaderLineWidth, RowCount);\r
-          StringPtr       = GetToken (STRING_TOKEN(ADJUST_HELP_PAGE_DOWN), gHiiHandle);\r
-          if (HelpBottomString != NULL) {\r
-            FreePool (HelpBottomString);\r
-          }\r
-          HelpBottomLine  = ProcessHelpString (StringPtr, &HelpBottomString, &BottomLineWidth, RowCount);\r
-          //\r
-          // Calculate the help page count.\r
-          //\r
-          if (HelpLine > 2 * RowCount - 2) {\r
-            HelpPageCount = (HelpLine - RowCount + 1) / (RowCount - 2) + 1;\r
-            if ((HelpLine - RowCount + 1) % (RowCount - 2) > 1) {\r
-              HelpPageCount += 1;\r
-            }\r
-          } else {\r
-            HelpPageCount = 2;\r
-          }\r
-        } else {\r
-          MultiHelpPage = FALSE;\r
-        }\r
-      }\r
-\r
-      //\r
-      // Clean the help field first.\r
-      //\r
-      ClearLines (\r
-        LocalScreen.RightColumn - gHelpBlockWidth,\r
-        LocalScreen.RightColumn,\r
-        TopRow,\r
-        BottomRow,\r
-        PcdGet8 (PcdBrowserFieldTextColor) | FIELD_BACKGROUND\r
-        );\r
-\r
-      //\r
-      // Check whether need to show the 'More(U/u)' at the begin.\r
-      // Base on current direct info, here shows aligned to the right side of the column.\r
-      // If the direction is multi line and aligned to right side may have problem, so \r
-      // add ASSERT code here.\r
-      //\r
-      if (HelpPageIndex > 0) {\r
-        gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT | FIELD_BACKGROUND);\r
-        for (Index = 0; Index < HelpHeaderLine; Index++) {\r
-          ASSERT (HelpHeaderLine == 1);\r
-          ASSERT (GetStringWidth (HelpHeaderString) / 2 < (UINTN) (gHelpBlockWidth - 1));\r
-          PrintStringAt (\r
-            LocalScreen.RightColumn - GetStringWidth (HelpHeaderString) / 2 - 1,\r
-            Index + TopRow,\r
-            &HelpHeaderString[Index * HeaderLineWidth]\r
-            );\r
-        }\r
-      }\r
-\r
-      gST->ConOut->SetAttribute (gST->ConOut, HELP_TEXT | FIELD_BACKGROUND);\r
-      //\r
-      // Print the help string info.\r
-      //\r
-      if (!MultiHelpPage) {\r
-        for (Index = 0; Index < HelpLine; Index++) {\r
-          PrintStringAt (\r
-            LocalScreen.RightColumn - gHelpBlockWidth,\r
-            Index + TopRow,\r
-            &HelpString[Index * EachLineWidth]\r
-            );\r
-        }\r
-        gST->ConOut->SetCursorPosition(gST->ConOut, LocalScreen.RightColumn-1, BottomRow);\r
-      } else  {\r
-        if (HelpPageIndex == 0) {\r
-          for (Index = 0; Index < RowCount - HelpBottomLine; Index++) {\r
-            PrintStringAt (\r
-              LocalScreen.RightColumn - gHelpBlockWidth,\r
-              Index + TopRow,\r
-              &HelpString[Index * EachLineWidth]\r
-              );\r
-          }\r
-        } else {\r
-          for (Index = 0; (Index < RowCount - HelpBottomLine - HelpHeaderLine) && \r
-              (Index + HelpPageIndex * (RowCount - 2) + 1 < HelpLine); Index++) {\r
-            PrintStringAt (\r
-              LocalScreen.RightColumn - gHelpBlockWidth,\r
-              Index + TopRow + HelpHeaderLine,\r
-              &HelpString[(Index + HelpPageIndex * (RowCount - 2) + 1)* EachLineWidth]\r
-              );\r
-          }\r
-          if (HelpPageIndex == HelpPageCount - 1) {\r
-            gST->ConOut->SetCursorPosition(gST->ConOut, LocalScreen.RightColumn-1, BottomRow);\r
-          }\r
-        } \r
-      }\r
-\r
-      //\r
-      // Check whether need to print the 'More(D/d)' at the bottom.\r
-      // Base on current direct info, here shows aligned to the right side of the column.\r
-      // If the direction is multi line and aligned to right side may have problem, so \r
-      // add ASSERT code here.\r
-      //\r
-      if (HelpPageIndex < HelpPageCount - 1 && MultiHelpPage) {\r
-        gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT | FIELD_BACKGROUND);\r
-        for (Index = 0; Index < HelpBottomLine; Index++) {\r
-          ASSERT (HelpBottomLine == 1);\r
-          ASSERT (GetStringWidth (HelpBottomString) / 2 < (UINTN) (gHelpBlockWidth - 1)); \r
-          PrintStringAt (\r
-            LocalScreen.RightColumn - GetStringWidth (HelpBottomString) / 2 - 1,\r
-            Index + BottomRow - HelpBottomLine,\r
-            &HelpBottomString[Index * BottomLineWidth]\r
-            );\r
-        }\r
-      }\r
-      //\r
-      // Reset this flag every time we finish using it.\r
-      //\r
-      Repaint = FALSE;\r
-      NewLine = FALSE;\r
-      break;\r
-\r
-    case CfPrepareToReadKey:\r
-      ControlFlag = CfReadKey;\r
-      ScreenOperation = UiNoOperation;\r
-      break;\r
-\r
-    case CfReadKey:\r
-      ControlFlag = CfScreenOperation;\r
-\r
-      //\r
-      // Wait for user's selection\r
-      //\r
-      while (TRUE) {\r
-        Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
-        if (!EFI_ERROR (Status)) {\r
-          break;\r
-        }\r
-\r
-        //\r
-        // If we encounter error, continue to read another key in.\r
-        //\r
-        if (Status != EFI_NOT_READY) {\r
-          continue;\r
-        }\r
-\r
-        Status = UiWaitForSingleEvent (gST->ConIn->WaitForKey, 0, MinRefreshInterval);\r
-        ASSERT_EFI_ERROR (Status);\r
-\r
-        if (Selection->Action == UI_ACTION_REFRESH_FORMSET) {\r
-          //\r
-          // IFR is updated in Callback of refresh opcode, re-parse it\r
-          //\r
-          ControlFlag = CfCheckSelection;\r
-          Selection->Statement = NULL;\r
-          break;\r
-        }\r
-      }\r
-\r
-      if (ControlFlag == CfCheckSelection) {\r
-        break;\r
-      }\r
-\r
-      switch (Key.UnicodeChar) {\r
-      case CHAR_CARRIAGE_RETURN:\r
-        if(MenuOption->GrayOut || MenuOption->ReadOnly) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-\r
-        ScreenOperation = UiSelect;\r
-        gDirection      = 0;\r
-        break;\r
-\r
-      //\r
-      // We will push the adjustment of these numeric values directly to the input handler\r
-      //  NOTE: we won't handle manual input numeric\r
-      //\r
-      case '+':\r
-      case '-':\r
-        //\r
-        // If the screen has no menu items, and the user didn't select UiReset\r
-        // ignore the selection and go back to reading keys.\r
-        //\r
-        if(IsListEmpty (&gMenuOption) || MenuOption->GrayOut || MenuOption->ReadOnly) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-\r
-        ASSERT(MenuOption != NULL);\r
-        Statement = MenuOption->ThisTag;\r
-        if ((Statement->Operand == EFI_IFR_DATE_OP)\r
-          || (Statement->Operand == EFI_IFR_TIME_OP)\r
-          || ((Statement->Operand == EFI_IFR_NUMERIC_OP) && (Statement->Step != 0))\r
-        ){\r
-          if (Key.UnicodeChar == '+') {\r
-            gDirection = SCAN_RIGHT;\r
-          } else {\r
-            gDirection = SCAN_LEFT;\r
-          }\r
-          Status = ProcessOptions (Selection, MenuOption, TRUE, &OptionString);\r
-          if (EFI_ERROR (Status)) {\r
-            //\r
-            // Repaint to clear possible error prompt pop-up\r
-            //\r
-            Repaint = TRUE;\r
-            NewLine = TRUE;\r
-          } else {\r
-            Selection->Action = UI_ACTION_REFRESH_FORM;\r
-          }\r
-          if (OptionString != NULL) {\r
-            FreePool (OptionString);\r
-          }\r
-        }\r
-        break;\r
-\r
-      case '^':\r
-        ScreenOperation = UiUp;\r
-        break;\r
-\r
-      case 'V':\r
-      case 'v':\r
-        ScreenOperation = UiDown;\r
-        break;\r
-\r
-      case ' ':\r
-        if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) != FORMSET_CLASS_FRONT_PAGE) {\r
-          //\r
-          // If the screen has no menu items, and the user didn't select UiReset\r
-          // ignore the selection and go back to reading keys.\r
-          //\r
-          if(IsListEmpty (&gMenuOption)) {\r
-            ControlFlag = CfReadKey;\r
-            break;\r
-          }\r
-          \r
-          ASSERT(MenuOption != NULL);\r
-          if (MenuOption->ThisTag->Operand == EFI_IFR_CHECKBOX_OP && !MenuOption->GrayOut && !MenuOption->ReadOnly) {\r
-            ScreenOperation = UiSelect;\r
-          }\r
-        }\r
-        break;\r
-\r
-      case 'D':\r
-      case 'd':\r
-        if (!MultiHelpPage) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-        ControlFlag    = CfUpdateHelpString;\r
-        HelpPageIndex  = HelpPageIndex < HelpPageCount - 1 ? HelpPageIndex + 1 : HelpPageCount - 1;\r
-        break;\r
-\r
-      case 'U':\r
-      case 'u':\r
-        if (!MultiHelpPage) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-        ControlFlag    = CfUpdateHelpString;\r
-        HelpPageIndex  = HelpPageIndex > 0 ? HelpPageIndex - 1 : 0;\r
-        break;\r
-\r
-      case CHAR_NULL:\r
-        for (Index = 0; Index < mScanCodeNumber; Index++) {\r
-          if (Key.ScanCode == gScanCodeToOperation[Index].ScanCode) {\r
-            ScreenOperation = gScanCodeToOperation[Index].ScreenOperation;\r
-            break;\r
-          }\r
-        }\r
-        \r
-        if (Selection->Form->ModalForm && (Key.ScanCode == SCAN_ESC || Index == mScanCodeNumber)) {\r
-          //\r
-          // ModalForm has no ESC key and Hot Key.\r
-          //\r
-          ControlFlag = CfReadKey;\r
-        } else if (Index == mScanCodeNumber) {\r
-          //\r
-          // Check whether Key matches the registered hot key.\r
-          //\r
-          HotKey = NULL;\r
-          if ((gBrowserSettingScope == SystemLevel) || \r
-              (Selection->FormEditable && gFunctionKeySetting != NONE_FUNCTION_KEY_SETTING)) {\r
-            HotKey = GetHotKeyFromRegisterList (&Key);\r
-          }\r
-          if (HotKey != NULL) {\r
-            ScreenOperation = UiHotKey;\r
-          }\r
-        }\r
-        break;\r
-      }\r
-      break;\r
-\r
-    case CfScreenOperation:\r
-      if (ScreenOperation != UiReset) {\r
-        //\r
-        // If the screen has no menu items, and the user didn't select UiReset\r
-        // ignore the selection and go back to reading keys.\r
-        //\r
-        if (IsListEmpty (&gMenuOption)) {\r
-          ControlFlag = CfReadKey;\r
-          break;\r
-        }\r
-      }\r
-\r
-      for (Index = 0;\r
-           Index < sizeof (gScreenOperationToControlFlag) / sizeof (gScreenOperationToControlFlag[0]);\r
-           Index++\r
-          ) {\r
-        if (ScreenOperation == gScreenOperationToControlFlag[Index].ScreenOperation) {\r
-          ControlFlag = gScreenOperationToControlFlag[Index].ControlFlag;\r
-          break;\r
-        }\r
-      }\r
-      break;\r
-\r
-    case CfUiSelect:\r
-      ControlFlag = CfCheckSelection;\r
-\r
-      ASSERT(MenuOption != NULL);\r
-      Statement = MenuOption->ThisTag;\r
-      if (Statement->Operand == EFI_IFR_TEXT_OP) {\r
-        break;\r
-      }\r
-\r
-      //\r
-      // Keep highlight on current MenuOption\r
-      //\r
-      Selection->QuestionId = Statement->QuestionId;\r
-\r
-      switch (Statement->Operand) {\r
-      case EFI_IFR_REF_OP:\r
-        ProcessGotoOpCode(Statement, Selection, &Repaint, &NewLine);\r
-        break;\r
-\r
-      case EFI_IFR_ACTION_OP:\r
-        //\r
-        // Process the Config string <ConfigResp>\r
-        //\r
-        Status = ProcessQuestionConfig (Selection, Statement);\r
-\r
-        if (EFI_ERROR (Status)) {\r
-          break;\r
-        }\r
-\r
-        //\r
-        // The action button may change some Question value, so refresh the form\r
-        //\r
-        Selection->Action = UI_ACTION_REFRESH_FORM;\r
-        break;\r
-\r
-      case EFI_IFR_RESET_BUTTON_OP:\r
-        //\r
-        // Reset Question to default value specified by DefaultId\r
-        //\r
-        ControlFlag = CfUiDefault;\r
-        DefaultId = Statement->DefaultId;\r
-        break;\r
-\r
-      default:\r
-        //\r
-        // Editable Questions: oneof, ordered list, checkbox, numeric, string, password\r
-        //\r
-        UpdateKeyHelp (Selection, MenuOption, TRUE);\r
-        Status = ProcessOptions (Selection, MenuOption, TRUE, &OptionString);\r
-\r
-        if (EFI_ERROR (Status)) {\r
-          Repaint = TRUE;\r
-          NewLine = TRUE;\r
-          UpdateKeyHelp (Selection, MenuOption, FALSE);\r
-        } else {\r
-          Selection->Action = UI_ACTION_REFRESH_FORM;\r
-        }\r
-\r
-        if (OptionString != NULL) {\r
-          FreePool (OptionString);\r
-        }\r
-        break;\r
-      }\r
-      break;\r
-\r
-    case CfUiReset:\r
-      //\r
-      // We come here when someone press ESC\r
-      //\r
-      ControlFlag = CfCheckSelection;\r
-      FindNextMenu (Selection, &Repaint, &NewLine);\r
-      break;\r
-\r
-    case CfUiLeft:\r
-      ControlFlag = CfCheckSelection;\r
-      ASSERT(MenuOption != NULL);\r
-      if ((MenuOption->ThisTag->Operand == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)) {\r
-        if (MenuOption->Sequence != 0) {\r
-          //\r
-          // In the middle or tail of the Date/Time op-code set, go left.\r
-          //\r
-          ASSERT(NewPos != NULL);\r
-          NewPos = NewPos->BackLink;\r
-        }\r
-      }\r
-      break;\r
-\r
-    case CfUiRight:\r
-      ControlFlag = CfCheckSelection;\r
-      ASSERT(MenuOption != NULL);\r
-      if ((MenuOption->ThisTag->Operand == EFI_IFR_DATE_OP) || (MenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)) {\r
-        if (MenuOption->Sequence != 2) {\r
-          //\r
-          // In the middle or tail of the Date/Time op-code set, go left.\r
-          //\r
-          ASSERT(NewPos != NULL);\r
-          NewPos = NewPos->ForwardLink;\r
-        }\r
-      }\r
-      break;\r
-\r
-    case CfUiUp:\r
-      ControlFlag = CfCheckSelection;\r
-\r
-      SavedListEntry = NewPos;\r
-\r
-      ASSERT(NewPos != NULL);\r
-      //\r
-      // Adjust Date/Time position before we advance forward.\r
-      //\r
-      AdjustDateAndTimePosition (TRUE, &NewPos);\r
-      if (NewPos->BackLink != &gMenuOption) {\r
-        MenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-        ASSERT (MenuOption != NULL);\r
-        NewLine    = TRUE;\r
-        NewPos     = NewPos->BackLink;\r
-\r
-        PreviousMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-        if (PreviousMenuOption->Row == 0) {\r
-          UpdateOptionSkipLines (Selection, PreviousMenuOption);\r
-        }\r
-        DistanceValue = PreviousMenuOption->Skip;\r
-        Difference    = 0;\r
-        if (MenuOption->Row >= DistanceValue + TopRow) {\r
-          Difference = MoveToNextStatement (Selection, TRUE, &NewPos, MenuOption->Row - TopRow - DistanceValue);\r
-        }\r
-        NextMenuOption = MENU_OPTION_FROM_LINK (NewPos);\r
-       \r
-        if (Difference < 0) {\r
-          //\r
-          // We hit the begining MenuOption that can be focused\r
-          // so we simply scroll to the top.\r
-          //\r
-          if (TopOfScreen != gMenuOption.ForwardLink) {\r
-            TopOfScreen = gMenuOption.ForwardLink;\r
-            Repaint     = TRUE;\r
-          } else {\r
-            //\r
-            // Scroll up to the last page when we have arrived at top page.\r
-            //\r
-            NewPos          = &gMenuOption;\r
-            TopOfScreen     = &gMenuOption;\r
-            MenuOption      = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-            ScreenOperation = UiPageUp;\r
-            ControlFlag     = CfScreenOperation;\r
-            break;\r
-          }\r
-        } else if (MenuOption->Row < TopRow + DistanceValue + Difference) {\r
-          //\r
-          // Previous focus MenuOption is above the TopOfScreen, so we need to scroll\r
-          //\r
-          TopOfScreen = NewPos;\r
-          Repaint     = TRUE;\r
-          SkipValue = 0;\r
-        } else if (!IsSelectable (NextMenuOption)) {\r
-          //\r
-          // Continue to go up until scroll to next page or the selectable option is found.\r
-          //\r
-          ScreenOperation = UiUp;\r
-          ControlFlag     = CfScreenOperation;\r
-        }\r
-\r
-        //\r
-        // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.\r
-        //\r
-        AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
-        AdjustDateAndTimePosition (TRUE, &NewPos);\r
-        MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-        UpdateStatusBar (Selection, INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);\r
-      } else {\r
-        //\r
-        // Scroll up to the last page.\r
-        //\r
-        NewPos          = &gMenuOption;\r
-        TopOfScreen     = &gMenuOption;\r
-        MenuOption      = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-        ScreenOperation = UiPageUp;\r
-        ControlFlag     = CfScreenOperation;\r
-      }\r
-      break;\r
-\r
-    case CfUiPageUp:\r
-      //\r
-      // SkipValue means lines is skipped when show the top menu option.\r
-      //\r
-      ControlFlag     = CfCheckSelection;\r
-\r
-      ASSERT(NewPos != NULL);\r
-      //\r
-      // Already at the first menu option, so do nothing.\r
-      //\r
-      if (NewPos->BackLink == &gMenuOption) {\r
-        NewLine = FALSE;\r
-        Repaint = FALSE;\r
-        break;\r
-      }\r
-\r
-      NewLine   = TRUE;\r
-      Repaint   = TRUE;\r
-\r
-      //\r
-      // SkipValue > (BottomRow - TopRow + 1) means current menu has more than one\r
-      // form of options to be show, so just update the SkipValue to show the next\r
-      // parts of options.\r
-      //\r
-      if (SkipValue > (INTN) (BottomRow - TopRow + 1)) {\r
-        SkipValue -= BottomRow - TopRow + 1;\r
-        break;\r
-      }\r
-\r
-      Link      = TopOfScreen;\r
-      //\r
-      // First minus the menu of the top screen, it's value is SkipValue.\r
-      //\r
-      Index     = (BottomRow + 1) - SkipValue;\r
-      while ((Index >= TopRow) && (Link->BackLink != &gMenuOption)) {\r
-        Link = Link->BackLink;\r
-        PreviousMenuOption = MENU_OPTION_FROM_LINK (Link);\r
-        if (PreviousMenuOption->Row == 0) {\r
-          UpdateOptionSkipLines (Selection, PreviousMenuOption);\r
-        }        \r
-        if (Index < PreviousMenuOption->Skip) {\r
-          break;\r
-        }\r
-        Index = Index - PreviousMenuOption->Skip;\r
-      }\r
-      \r
-      if ((Link->BackLink == &gMenuOption) && (Index >= TopRow)) {\r
-        SkipValue = 0;\r
-        if (TopOfScreen == &gMenuOption) {\r
-          TopOfScreen = gMenuOption.ForwardLink;\r
-          NewPos      = gMenuOption.BackLink;\r
-          MoveToNextStatement (Selection, TRUE, &NewPos, BottomRow - TopRow);\r
-          Repaint = FALSE;\r
-        } else if (TopOfScreen != Link) {\r
-          TopOfScreen = Link;\r
-          NewPos      = Link;\r
-          MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);\r
-        } else {\r
-          //\r
-          // Finally we know that NewPos is the last MenuOption can be focused.\r
-          //\r
-          Repaint = FALSE;\r
-          NewPos  = Link;\r
-          MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);\r
-        }\r
-      } else {\r
-        if (Index >= TopRow) {\r
-          //\r
-          // At here, only case "Index < PreviousMenuOption->Skip" can reach here.\r
-          //\r
-          SkipValue = PreviousMenuOption->Skip - (Index - TopRow);\r
-        } else {\r
-          SkipValue = PreviousMenuOption->Skip - (TopRow - Index);\r
-          Link = Link->ForwardLink;\r
-        }\r
-\r
-        //\r
-        // Move to the option in Next page.\r
-        //\r
-        if (TopOfScreen == &gMenuOption) {\r
-          NewPos = gMenuOption.BackLink;\r
-          MoveToNextStatement (Selection, TRUE, &NewPos, BottomRow - TopRow);\r
-        } else {\r
-          NewPos = Link;\r
-          MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);\r
-        }\r
-\r
-        //\r
-        // There are more MenuOption needing scrolling up.\r
-        //\r
-        TopOfScreen = Link;\r
-        MenuOption  = NULL;\r
-      }\r
-\r
-      //\r
-      // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.\r
-      // Don't do this when we are already in the first page.\r
-      //\r
-      AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
-      AdjustDateAndTimePosition (TRUE, &NewPos);\r
-      break;\r
-\r
-    case CfUiPageDown:\r
-      //\r
-      // SkipValue means lines is skipped when show the top menu option.\r
-      //\r
-      ControlFlag     = CfCheckSelection;\r
-\r
-      ASSERT (NewPos != NULL);\r
-      if (NewPos->ForwardLink == &gMenuOption) {\r
-        NewLine = FALSE;\r
-        Repaint = FALSE;\r
-        break;\r
-      }\r
-\r
-      NewLine = TRUE;\r
-      Repaint = TRUE;\r
-      Link    = TopOfScreen;\r
-      NextMenuOption = MENU_OPTION_FROM_LINK (Link);\r
-      Index = TopRow + NextMenuOption->Skip - SkipValue;\r
-      //\r
-      // Count to the menu option which will show at the top of the next form.\r
-      //\r
-      while ((Index <= BottomRow + 1) && (Link->ForwardLink != &gMenuOption)) {\r
-        Link           = Link->ForwardLink;\r
-        NextMenuOption = MENU_OPTION_FROM_LINK (Link);\r
-        Index = Index + NextMenuOption->Skip;\r
-      }\r
-\r
-      if ((Link->ForwardLink == &gMenuOption) && (Index <= BottomRow + 1)) {\r
-        //\r
-        // Finally we know that NewPos is the last MenuOption can be focused.\r
-        //\r
-        Repaint = FALSE;\r
-        MoveToNextStatement (Selection, TRUE, &Link, Index - TopRow);\r
-        SkipValue = 0;\r
-      } else {\r
-        //\r
-        // Calculate the skip line for top of screen menu.\r
-        //\r
-        if (Link == TopOfScreen) {\r
-          //\r
-          // The top of screen menu option occupies the entire form.\r
-          //\r
-          SkipValue += BottomRow - TopRow + 1;\r
-        } else {\r
-          SkipValue = NextMenuOption->Skip - (Index - (BottomRow + 1));\r
-        }\r
-\r
-        TopOfScreen = Link;\r
-        MenuOption = NULL;\r
-        //\r
-        // Move to the Next selectable menu.\r
-        //\r
-        MoveToNextStatement (Selection, FALSE, &Link, BottomRow - TopRow);\r
-      }\r
-\r
-      //\r
-      // Save the menu as the next highlight menu.\r
-      //\r
-      NewPos  = Link;\r
-\r
-      //\r
-      // If we encounter a Date/Time op-code set, rewind to the first op-code of the set.\r
-      // Don't do this when we are already in the last page.\r
-      //\r
-      AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
-      AdjustDateAndTimePosition (TRUE, &NewPos);\r
-      break;\r
-\r
-    case CfUiDown:\r
-      //\r
-      // SkipValue means lines is skipped when show the top menu option.\r
-      // NewPos  points to the menu which is highlighted now.\r
-      //\r
-      ControlFlag = CfCheckSelection;\r
-      //\r
-      // Since the behavior of hitting the down arrow on a Date/Time op-code is intended\r
-      // to be one that progresses to the next set of op-codes, we need to advance to the last\r
-      // Date/Time op-code and leave the remaining logic in UiDown intact so the appropriate\r
-      // checking can be done.  The only other logic we need to introduce is that if a Date/Time\r
-      // op-code is the last entry in the menu, we need to rewind back to the first op-code of\r
-      // the Date/Time op-code.\r
-      //\r
-      SavedListEntry = NewPos;\r
-      AdjustDateAndTimePosition (FALSE, &NewPos);\r
-\r
-      if (NewPos->ForwardLink != &gMenuOption) {\r
-        MenuOption      = MENU_OPTION_FROM_LINK (NewPos);\r
-        NewLine         = TRUE;\r
-        NewPos          = NewPos->ForwardLink;\r
-\r
-        Difference      = 0;\r
-        //\r
-        // Current menu not at the bottom of the form.\r
-        //\r
-        if (BottomRow >= MenuOption->Row + MenuOption->Skip) {\r
-          //\r
-          // Find the next selectable menu.\r
-          //\r
-          Difference = MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - MenuOption->Row - MenuOption->Skip);\r
-          //\r
-          // We hit the end of MenuOption that can be focused\r
-          // so we simply scroll to the first page.\r
-          //\r
-          if (Difference < 0) {\r
-            //\r
-            // Scroll to the first page.\r
-            //\r
-            if (TopOfScreen != gMenuOption.ForwardLink) {\r
-              TopOfScreen = gMenuOption.ForwardLink;\r
-              Repaint     = TRUE;\r
-              MenuOption  = NULL;\r
-            } else {\r
-              MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-            }\r
-            NewPos        = gMenuOption.ForwardLink;\r
-            MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);\r
-\r
-            SkipValue = 0;\r
-            //\r
-            // If we are at the end of the list and sitting on a Date/Time op, rewind to the head.\r
-            //\r
-            AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
-            AdjustDateAndTimePosition (TRUE, &NewPos);\r
-            break;\r
-          }\r
-        }\r
-        NextMenuOption  = MENU_OPTION_FROM_LINK (NewPos);\r
-        if (NextMenuOption->Row == 0) {\r
-          UpdateOptionSkipLines (Selection, NextMenuOption);\r
-        }\r
-        DistanceValue  = Difference + NextMenuOption->Skip;\r
-\r
-        Temp = MenuOption->Row + MenuOption->Skip + DistanceValue - 1;\r
-        if ((MenuOption->Row + MenuOption->Skip == BottomRow + 1) &&\r
-            (NextMenuOption->ThisTag->Operand == EFI_IFR_DATE_OP ||\r
-             NextMenuOption->ThisTag->Operand == EFI_IFR_TIME_OP)\r
-            ) {\r
-          Temp ++;\r
-        }\r
-\r
-        //\r
-        // If we are going to scroll, update TopOfScreen\r
-        //\r
-        if (Temp > BottomRow) {\r
-          do {\r
-            //\r
-            // Is the current top of screen a zero-advance op-code?\r
-            // If so, keep moving forward till we hit a >0 advance op-code\r
-            //\r
-            SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);\r
-\r
-            //\r
-            // If bottom op-code is more than one line or top op-code is more than one line\r
-            //\r
-            if ((DistanceValue > 1) || (SavedMenuOption->Skip > 1)) {\r
-              //\r
-              // Is the bottom op-code greater than or equal in size to the top op-code?\r
-              //\r
-              if ((Temp - BottomRow) >= (SavedMenuOption->Skip - SkipValue)) {\r
-                //\r
-                // Skip the top op-code\r
-                //\r
-                TopOfScreen     = TopOfScreen->ForwardLink;\r
-                Difference      = (Temp - BottomRow) - (SavedMenuOption->Skip - SkipValue);\r
-\r
-                SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);\r
-\r
-                //\r
-                // If we have a remainder, skip that many more op-codes until we drain the remainder\r
-                //\r
-                while (Difference >= (INTN) SavedMenuOption->Skip) {\r
-                  //\r
-                  // Since the Difference is greater than or equal to this op-code's skip value, skip it\r
-                  //\r
-                  Difference      = Difference - (INTN) SavedMenuOption->Skip;\r
-                  TopOfScreen     = TopOfScreen->ForwardLink;\r
-                  SavedMenuOption = MENU_OPTION_FROM_LINK (TopOfScreen);\r
-                }\r
-                //\r
-                // Since we will act on this op-code in the next routine, and increment the\r
-                // SkipValue, set the skips to one less than what is required.\r
-                //\r
-                SkipValue = Difference - 1;\r
-              } else {\r
-                //\r
-                // Since we will act on this op-code in the next routine, and increment the\r
-                // SkipValue, set the skips to one less than what is required.\r
-                //\r
-                SkipValue += (Temp - BottomRow) - 1;\r
-              }\r
-            } else {\r
-              if ((SkipValue + 1) == (INTN) SavedMenuOption->Skip) {\r
-                TopOfScreen = TopOfScreen->ForwardLink;\r
-                break;\r
-              }\r
-            }\r
-            //\r
-            // If the op-code at the top of the screen is more than one line, let's not skip it yet\r
-            // Let's set a skip flag to smoothly scroll the top of the screen.\r
-            //\r
-            if (SavedMenuOption->Skip > 1) {\r
-              if (SavedMenuOption == NextMenuOption) {\r
-                SkipValue = 0;\r
-              } else {\r
-                SkipValue++;\r
-              }\r
-            } else if (SavedMenuOption->Skip == 1) {\r
-              SkipValue   = 0;\r
-            } else {\r
-              SkipValue   = 0;\r
-              TopOfScreen = TopOfScreen->ForwardLink;\r
-            }\r
-          } while (SavedMenuOption->Skip == 0);\r
-\r
-          Repaint       = TRUE;\r
-        } else if (!IsSelectable (NextMenuOption)) {\r
-          //\r
-          // Continue to go down until scroll to next page or the selectable option is found.\r
-          //\r
-          ScreenOperation = UiDown;\r
-          ControlFlag     = CfScreenOperation;\r
-        }\r
-\r
-        MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-\r
-        UpdateStatusBar (Selection, INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);\r
-\r
-      } else {\r
-        //\r
-        // Scroll to the first page.\r
-        //\r
-        if (TopOfScreen != gMenuOption.ForwardLink) {\r
-          TopOfScreen = gMenuOption.ForwardLink;\r
-          Repaint     = TRUE;\r
-          MenuOption  = NULL;\r
-        } else {\r
-          //\r
-          // Need to remove the current highlight menu.\r
-          // MenuOption saved the last highlight menu info.\r
-          //\r
-          MenuOption = MENU_OPTION_FROM_LINK (SavedListEntry);\r
-        }\r
-\r
-        SkipValue     = 0;\r
-        NewLine       = TRUE;\r
-        //\r
-        // Get the next highlight menu.\r
-        //\r
-        NewPos        = gMenuOption.ForwardLink;\r
-        MoveToNextStatement (Selection, FALSE, &NewPos, BottomRow - TopRow);\r
-      }\r
-\r
-      //\r
-      // If we are at the end of the list and sitting on a Date/Time op, rewind to the head.\r
-      //\r
-      AdjustDateAndTimePosition (TRUE, &TopOfScreen);\r
-      AdjustDateAndTimePosition (TRUE, &NewPos);\r
-      break;\r
-\r
-    case CfUiHotKey:\r
-      ControlFlag = CfCheckSelection;\r
-      \r
-      Status = EFI_SUCCESS;\r
-      //\r
-      // Discard changes. After it, no NV flag is showed.\r
-      //\r
-      if ((HotKey->Action & BROWSER_ACTION_DISCARD) == BROWSER_ACTION_DISCARD) {\r
-        Status = DiscardForm (Selection->FormSet, Selection->Form, gBrowserSettingScope);\r
-        if (!EFI_ERROR (Status)) {\r
-          Selection->Action = UI_ACTION_REFRESH_FORM;\r
-          Selection->Statement = NULL;\r
-          gResetRequired = FALSE;\r
-        } else {\r
-          do {\r
-            CreateDialog (4, TRUE, 0, NULL, &Key, HotKey->HelpString, gDiscardFailed, gPressEnter, gEmptyString);\r
-          } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-          //\r
-          // Still show current page.\r
-          //\r
-          Selection->Action = UI_ACTION_NONE;\r
-          Repaint = TRUE;\r
-          NewLine = TRUE;\r
-          break;\r
-        }\r
-      }\r
-\r
-      //\r
-      // Reterieve default setting. After it. NV flag will be showed.\r
-      //\r
-      if ((HotKey->Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) {\r
-        Status = ExtractDefault (Selection->FormSet, Selection->Form, HotKey->DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE);\r
-        if (!EFI_ERROR (Status)) {\r
-          Selection->Action = UI_ACTION_REFRESH_FORM;\r
-          Selection->Statement = NULL;\r
-          gResetRequired = TRUE;\r
-        } else {\r
-          do {\r
-            CreateDialog (4, TRUE, 0, NULL, &Key, HotKey->HelpString, gDefaultFailed, gPressEnter, gEmptyString);\r
-          } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-          //\r
-          // Still show current page.\r
-          //\r
-          Selection->Action = UI_ACTION_NONE;\r
-          Repaint = TRUE;\r
-          NewLine = TRUE;\r
-          break;\r
-        }\r
-      }\r
-\r
-      //\r
-      // Save changes. After it, no NV flag is showed.\r
-      //\r
-      if ((HotKey->Action & BROWSER_ACTION_SUBMIT) == BROWSER_ACTION_SUBMIT) {\r
-        Status = SubmitForm (Selection->FormSet, Selection->Form, gBrowserSettingScope);\r
-        if (!EFI_ERROR (Status)) {\r
-          ASSERT(MenuOption != NULL);\r
-          UpdateStatusBar (Selection, INPUT_ERROR, MenuOption->ThisTag->QuestionFlags, FALSE);\r
-          UpdateStatusBar (Selection, NV_UPDATE_REQUIRED, MenuOption->ThisTag->QuestionFlags, FALSE);\r
-        } else {\r
-          do {\r
-            CreateDialog (4, TRUE, 0, NULL, &Key, HotKey->HelpString, gSaveFailed, gPressEnter, gEmptyString);\r
-          } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-          //\r
-          // Still show current page.\r
-          //\r
-          Selection->Action = UI_ACTION_NONE;\r
-          Repaint = TRUE;\r
-          NewLine = TRUE;\r
-          break;\r
-        }\r
-      }\r
-      \r
-      //\r
-      // Set Reset required Flag\r
-      //\r
-      if ((HotKey->Action & BROWSER_ACTION_RESET) == BROWSER_ACTION_RESET) {\r
-        gResetRequired = TRUE;\r
-      }\r
-      \r
-      //\r
-      // Exit Action\r
-      //\r
-      if ((HotKey->Action & BROWSER_ACTION_EXIT) == BROWSER_ACTION_EXIT) {\r
-        //\r
-        // Form Exit without saving, Similar to ESC Key.\r
-        // FormSet Exit without saving, Exit SendForm.\r
-        // System Exit without saving, CallExitHandler and Exit SendForm.\r
-        //\r
-        DiscardForm (Selection->FormSet, Selection->Form, gBrowserSettingScope);\r
-        if (gBrowserSettingScope == FormLevel) {\r
-          ControlFlag = CfUiReset;\r
-        } else if (gBrowserSettingScope == FormSetLevel) {\r
-          Selection->Action = UI_ACTION_EXIT;\r
-        } else if (gBrowserSettingScope == SystemLevel) {\r
-          if (ExitHandlerFunction != NULL) {\r
-            ExitHandlerFunction ();\r
-          }\r
-          Selection->Action = UI_ACTION_EXIT;\r
-        }\r
-        Selection->Statement = NULL;\r
-      }\r
-      break;\r
-\r
-    case CfUiDefault:\r
-      ControlFlag = CfCheckSelection;\r
-      //\r
-      // Reset to default value for all forms in the whole system.\r
-      //\r
-      Status = ExtractDefault (Selection->FormSet, NULL, DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE);\r
-\r
-      if (!EFI_ERROR (Status)) {\r
-        Selection->Action = UI_ACTION_REFRESH_FORM;\r
-        Selection->Statement = NULL;\r
-        gResetRequired = TRUE;\r
-      }\r
-      break;\r
-\r
-    case CfUiNoOperation:\r
-      ControlFlag = CfCheckSelection;\r
-      break;\r
-\r
-    case CfExit:\r
-      UiFreeRefreshList ();\r
-\r
-      gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
-      gST->ConOut->SetCursorPosition (gST->ConOut, 0, Row + 4);\r
-      gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
-      gST->ConOut->OutputString (gST->ConOut, L"\n");\r
-      if (HelpString != NULL) {\r
-        FreePool (HelpString);\r
-      }\r
-      if (HelpHeaderString != NULL) {\r
-        FreePool (HelpHeaderString);\r
-      }\r
-      if (HelpBottomString != NULL) {\r
-        FreePool (HelpBottomString);\r
-      }\r
-\r
-      return EFI_SUCCESS;\r
-\r
-    default:\r
-      break;\r
-    }\r
-  }\r
-}\r
diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Ui.h b/MdeModulePkg/Universal/SetupBrowserDxe/Ui.h
deleted file mode 100644 (file)
index 03cb0cd..0000000
+++ /dev/null
@@ -1,1067 +0,0 @@
-/** @file\r
-Private structure, MACRO and function definitions for User Interface related functionalities.\r
-\r
-Copyright (c) 2004 - 2013, Intel Corporation. All rights reserved.<BR>\r
-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
-#ifndef _UI_H_\r
-#define _UI_H_\r
-\r
-//\r
-// Globals\r
-//\r
-#define REGULAR_NUMERIC 0\r
-#define TIME_NUMERIC    1\r
-#define DATE_NUMERIC    2\r
-\r
-#define SUBTITLE_INDENT  2\r
-\r
-\r
-//\r
-// It take 23 characters including the NULL to print a 64 bits number with "[" and "]".\r
-// pow(2, 64) = [18446744073709551616]\r
-//\r
-#define MAX_NUMERIC_INPUT_WIDTH 23\r
-\r
-typedef enum {\r
-  UiNoOperation,\r
-  UiSelect,\r
-  UiUp,\r
-  UiDown,\r
-  UiLeft,\r
-  UiRight,\r
-  UiReset,\r
-  UiPrevious,\r
-  UiPageUp,\r
-  UiPageDown,\r
-  UiHotKey,\r
-  UiMaxOperation\r
-} UI_SCREEN_OPERATION;\r
-\r
-typedef enum {\r
-  CfInitialization,\r
-  CfCheckSelection,\r
-  CfRepaint,\r
-  CfRefreshHighLight,\r
-  CfUpdateHelpString,\r
-  CfPrepareToReadKey,\r
-  CfReadKey,\r
-  CfScreenOperation,\r
-  CfUiSelect,\r
-  CfUiReset,\r
-  CfUiLeft,\r
-  CfUiRight,\r
-  CfUiUp,\r
-  CfUiPageUp,\r
-  CfUiPageDown,\r
-  CfUiDown,\r
-  CfUiDefault,\r
-  CfUiNoOperation,\r
-  CfExit,\r
-  CfUiHotKey,\r
-  CfMaxControlFlag\r
-} UI_CONTROL_FLAG;\r
-\r
-#define UI_ACTION_NONE               0\r
-#define UI_ACTION_REFRESH_FORM       1\r
-#define UI_ACTION_REFRESH_FORMSET    2\r
-#define UI_ACTION_EXIT               3\r
-\r
-typedef struct _UI_MENU_LIST UI_MENU_LIST;\r
-\r
-typedef struct {\r
-  EFI_HII_HANDLE  Handle;\r
-\r
-  //\r
-  // Target formset/form/Question information\r
-  //\r
-  EFI_GUID        FormSetGuid;\r
-  UINT16          FormId;\r
-  UINT16          QuestionId;\r
-  UINTN           Sequence;  // used for time/date only.\r
-\r
-  UINTN           TopRow;\r
-  UINTN           BottomRow;\r
-  UINTN           PromptCol;\r
-  UINTN           OptionCol;\r
-  UINTN           CurrentRow;\r
-\r
-  //\r
-  // Ation for Browser to taken:\r
-  //   UI_ACTION_NONE            - navigation inside a form\r
-  //   UI_ACTION_REFRESH_FORM    - re-evaluate expressions and repaint form\r
-  //   UI_ACTION_REFRESH_FORMSET - re-parse formset IFR binary\r
-  //\r
-  UINTN           Action;\r
-\r
-  //\r
-  // Current selected fomset/form/Question\r
-  //\r
-  FORM_BROWSER_FORMSET    *FormSet;\r
-  FORM_BROWSER_FORM       *Form;\r
-  FORM_BROWSER_STATEMENT  *Statement;\r
-\r
-  //\r
-  // Whether the Form is editable\r
-  //\r
-  BOOLEAN                 FormEditable;\r
-\r
-  UI_MENU_LIST            *CurrentMenu;\r
-} UI_MENU_SELECTION;\r
-\r
-#define UI_MENU_OPTION_SIGNATURE  SIGNATURE_32 ('u', 'i', 'm', 'm')\r
-#define UI_MENU_LIST_SIGNATURE    SIGNATURE_32 ('u', 'i', 'm', 'l')\r
-\r
-typedef struct {\r
-  UINTN                   Signature;\r
-  LIST_ENTRY              Link;\r
-\r
-  EFI_HII_HANDLE          Handle;\r
-  FORM_BROWSER_STATEMENT  *ThisTag;\r
-  UINT16                  EntryNumber;\r
-\r
-  UINTN                   Row;\r
-  UINTN                   Col;\r
-  UINTN                   OptCol;\r
-  CHAR16                  *Description;\r
-  UINTN                   Skip;           // Number of lines\r
-\r
-  //\r
-  // Display item sequence for date/time\r
-  //  Date:      Month/Day/Year\r
-  //  Sequence:  0     1   2\r
-  //\r
-  //  Time:      Hour : Minute : Second\r
-  //  Sequence:  0      1        2\r
-  //\r
-  //\r
-  UINTN                   Sequence;\r
-\r
-  BOOLEAN                 GrayOut;\r
-  BOOLEAN                 ReadOnly;\r
-\r
-  //\r
-  // Whether user could change value of this item\r
-  //\r
-  BOOLEAN                 IsQuestion;\r
-} UI_MENU_OPTION;\r
-\r
-#define MENU_OPTION_FROM_LINK(a)  CR (a, UI_MENU_OPTION, Link, UI_MENU_OPTION_SIGNATURE)\r
-\r
-struct _UI_MENU_LIST {\r
-  UINTN           Signature;\r
-  LIST_ENTRY      Link;\r
-\r
-  EFI_HII_HANDLE  HiiHandle;\r
-  EFI_GUID        FormSetGuid;\r
-  UINT16          FormId;\r
-  UINT16          QuestionId;\r
-  UINTN           Sequence;    // used for time/date only.\r
-\r
-  UI_MENU_LIST    *Parent;\r
-  LIST_ENTRY      ChildListHead;\r
-};\r
-\r
-#define UI_MENU_LIST_FROM_LINK(a)  CR (a, UI_MENU_LIST, Link, UI_MENU_LIST_SIGNATURE)\r
-\r
-typedef struct _MENU_REFRESH_ENTRY MENU_REFRESH_ENTRY;\r
-struct _MENU_REFRESH_ENTRY {\r
-  MENU_REFRESH_ENTRY          *Next;\r
-  UI_MENU_OPTION              *MenuOption;  // Describes the entry needing an update\r
-  UI_MENU_SELECTION           *Selection;\r
-  UINTN                       CurrentColumn;\r
-  UINTN                       CurrentRow;\r
-  UINTN                       CurrentAttribute;\r
-  EFI_EVENT                   Event;\r
-};\r
-\r
-typedef struct {\r
-  UINT16              ScanCode;\r
-  UI_SCREEN_OPERATION ScreenOperation;\r
-} SCAN_CODE_TO_SCREEN_OPERATION;\r
-\r
-typedef struct {\r
-  UI_SCREEN_OPERATION ScreenOperation;\r
-  UI_CONTROL_FLAG     ControlFlag;\r
-} SCREEN_OPERATION_T0_CONTROL_FLAG;\r
-\r
-\r
-extern LIST_ENTRY          gMenuOption;\r
-extern LIST_ENTRY          gMenuList;\r
-extern MENU_REFRESH_ENTRY  *gMenuRefreshHead;\r
-extern UI_MENU_SELECTION   *gCurrentSelection;\r
-extern BOOLEAN             mHiiPackageListUpdated;\r
-\r
-//\r
-// Global Functions\r
-//\r
-/**\r
-  Initialize Menu option list.\r
-\r
-**/\r
-VOID\r
-UiInitMenu (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Initialize Menu option list.\r
-\r
-**/\r
-VOID\r
-UiInitMenuList (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Free Menu option linked list.\r
-\r
-**/\r
-VOID\r
-UiFreeMenu (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Create a menu with specified formset GUID and form ID, and add it as a child\r
-  of the given parent menu.\r
-\r
-  @param  Parent                 The parent of menu to be added.\r
-  @param  HiiHandle              Hii handle related to this formset.\r
-  @param  FormSetGuid            The Formset Guid of menu to be added.\r
-  @param  FormId                 The Form ID of menu to be added.\r
-\r
-  @return A pointer to the newly added menu or NULL if memory is insufficient.\r
-\r
-**/\r
-UI_MENU_LIST *\r
-UiAddMenuList (\r
-  IN OUT UI_MENU_LIST     *Parent,\r
-  IN EFI_HII_HANDLE       HiiHandle,\r
-  IN EFI_GUID             *FormSetGuid,\r
-  IN UINT16               FormId\r
-  );\r
-\r
-/**\r
-  Search Menu with given FormId, FormSetGuid and Handle in all cached menu list.\r
-\r
-  @param  Parent                 The parent of menu to search.\r
-  @param  Handle                 Hii handle related to this formset.\r
-  @param  FormSetGuid            The Formset GUID of the menu to search.  \r
-  @param  FormId                 The Form ID of menu to search.\r
-\r
-  @return A pointer to menu found or NULL if not found.\r
-\r
-**/\r
-UI_MENU_LIST *\r
-UiFindChildMenuList (\r
-  IN UI_MENU_LIST         *Parent,\r
-  IN EFI_HII_HANDLE       Handle,\r
-  IN EFI_GUID             *FormSetGuid, \r
-  IN UINT16               FormId\r
-  );\r
-\r
-/**\r
-  Search Menu with given Handle, FormSetGuid and FormId in all cached menu list.\r
-\r
-  @param  Handle                 Hii handle related to this formset.\r
-  @param  FormSetGuid            The Formset GUID of the menu to search.\r
-  @param  FormId                 The Form ID of menu to search.\r
-\r
-  @return A pointer to menu found or NULL if not found.\r
-\r
-**/\r
-UI_MENU_LIST *\r
-UiFindMenuList (\r
-  IN EFI_HII_HANDLE       Handle,\r
-  IN EFI_GUID             *FormSetGuid,\r
-  IN UINT16               FormId\r
-  );\r
-\r
-/**\r
-  Free Menu list linked list.\r
-\r
-  @param  MenuListHead    One Menu list point in the menu list.\r
-\r
-**/\r
-VOID\r
-UiFreeMenuList (\r
-  LIST_ENTRY   *MenuListHead\r
-  );\r
-\r
-/**\r
-  Free Menu option linked list.\r
-\r
-**/\r
-VOID\r
-UiFreeRefreshList (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Add one menu option by specified description and context.\r
-\r
-  @param  String                 String description for this option.\r
-  @param  Handle                 Hii handle for the package list.\r
-  @param  Form                   The form this statement belong to.\r
-  @param  Statement              Statement of this Menu Option.\r
-  @param  NumberOfLines          Display lines for this Menu Option.\r
-  @param  MenuItemCount          The index for this Option in the Menu.\r
-\r
-  @retval Pointer                Pointer to the added Menu Option.\r
-\r
-**/\r
-UI_MENU_OPTION *\r
-UiAddMenuOption (\r
-  IN CHAR16                  *String,\r
-  IN EFI_HII_HANDLE          Handle,\r
-  IN FORM_BROWSER_FORM       *Form,\r
-  IN FORM_BROWSER_STATEMENT  *Statement,\r
-  IN UINT16                  NumberOfLines,\r
-  IN UINT16                  MenuItemCount\r
-  );\r
-\r
-/**\r
-  Display menu and wait for user to select one menu option, then return it.\r
-  If AutoBoot is enabled, then if user doesn't select any option,\r
-  after period of time, it will automatically return the first menu option.\r
-\r
-  @param  Selection              Menu selection.\r
-\r
-  @return Return the pointer of the menu which selected,\r
-  @return otherwise return NULL.\r
-\r
-**/\r
-EFI_STATUS\r
-UiDisplayMenu (\r
-  IN OUT UI_MENU_SELECTION           *Selection\r
-  );\r
-\r
-/**\r
-  Free up the resource allocated for all strings required\r
-  by Setup Browser.\r
-\r
-**/\r
-VOID\r
-FreeBrowserStrings (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Process the goto op code, update the info in the selection structure.\r
-\r
-  @param Statement    The statement belong to goto op code.\r
-  @param Selection    The selection info.\r
-  @param Repaint      Whether need to repaint the menu.\r
-  @param NewLine      Whether need to create new line.\r
-\r
-  @retval EFI_SUCCESS    The menu process successfully.\r
-  @return Other value if the process failed.\r
-**/\r
-EFI_STATUS\r
-ProcessGotoOpCode (\r
-  IN OUT   FORM_BROWSER_STATEMENT      *Statement,\r
-  IN OUT   UI_MENU_SELECTION           *Selection,\r
-  OUT      BOOLEAN                     *Repaint,\r
-  OUT      BOOLEAN                     *NewLine\r
-  );\r
-\r
-\r
-/**\r
-  The worker function that send the displays to the screen. On output,\r
-  the selection made by user is returned.\r
-\r
-  @param Selection       On input, Selection tell setup browser the information\r
-                         about the Selection, form and formset to be displayed.\r
-                         On output, Selection return the screen item that is selected\r
-                         by user.\r
-\r
-  @retval EFI_SUCCESS    The page is displayed successfully.\r
-  @return Other value if the page failed to be diplayed.\r
-\r
-**/\r
-EFI_STATUS\r
-SetupBrowser (\r
-  IN OUT UI_MENU_SELECTION    *Selection\r
-  );\r
-\r
-/**\r
-  Set Buffer to Value for Size bytes.\r
-\r
-  @param  Buffer                 Memory to set.\r
-  @param  Size                   Number of bytes to set\r
-  @param  Value                  Value of the set operation.\r
-\r
-**/\r
-VOID\r
-SetUnicodeMem (\r
-  IN VOID   *Buffer,\r
-  IN UINTN  Size,\r
-  IN CHAR16 Value\r
-  );\r
-\r
-/**\r
-  Wait for a given event to fire, or for an optional timeout to expire.\r
-\r
-  @param  Event                  The event to wait for\r
-  @param  Timeout                An optional timeout value in 100 ns units.\r
-  @param  RefreshInterval        Menu refresh interval (in seconds).\r
-\r
-  @retval EFI_SUCCESS            Event fired before Timeout expired.\r
-  @retval EFI_TIME_OUT           Timout expired before Event fired.\r
-\r
-**/\r
-EFI_STATUS\r
-UiWaitForSingleEvent (\r
-  IN EFI_EVENT                Event,\r
-  IN UINT64                   Timeout, OPTIONAL\r
-  IN UINT8                    RefreshInterval OPTIONAL\r
-  );\r
-\r
-/**\r
-  Draw a pop up windows based on the dimension, number of lines and\r
-  strings specified.\r
-\r
-  @param ScreenWidth     The width of the pop-up.\r
-  @param NumberOfLines   The number of lines.\r
-  @param ...             A series of text strings that displayed in the pop-up.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-CreateMultiStringPopUp (\r
-  IN  UINTN                       ScreenWidth,\r
-  IN  UINTN                       NumberOfLines,\r
-  ...\r
-  );\r
-\r
-/**\r
-  Get string or password input from user.\r
-\r
-  @param  MenuOption        Pointer to the current input menu.\r
-  @param  Prompt            The prompt string shown on popup window.\r
-  @param  StringPtr         Old user input and destination for use input string.\r
-\r
-  @retval EFI_SUCCESS       If string input is read successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-ReadString (\r
-  IN     UI_MENU_OPTION              *MenuOption,\r
-  IN     CHAR16                      *Prompt,\r
-  IN OUT CHAR16                      *StringPtr\r
-  );\r
-\r
-/**\r
-  Get selection for OneOf and OrderedList (Left/Right will be ignored).\r
-\r
-  @param  Selection         Pointer to current selection.\r
-  @param  MenuOption        Pointer to the current input menu.\r
-\r
-  @retval EFI_SUCCESS       If Option input is processed successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-GetSelectionInputPopUp (\r
-  IN  UI_MENU_SELECTION           *Selection,\r
-  IN  UI_MENU_OPTION              *MenuOption\r
-  );\r
-\r
-/**\r
-  This routine reads a numeric value from the user input.\r
-\r
-  @param  Selection         Pointer to current selection.\r
-  @param  MenuOption        Pointer to the current input menu.\r
-\r
-  @retval EFI_SUCCESS       If numerical input is read successfully\r
-  @retval EFI_DEVICE_ERROR  If operation fails\r
-\r
-**/\r
-EFI_STATUS\r
-GetNumericInput (\r
-  IN  UI_MENU_SELECTION           *Selection,\r
-  IN  UI_MENU_OPTION              *MenuOption\r
-  );\r
-\r
-/**\r
-  Update status bar on the bottom of menu.\r
-\r
-  @param  Selection              Current selection info.\r
-  @param  MessageType            The type of message to be shown.\r
-  @param  Flags                  The flags in Question header.\r
-  @param  State                  Set or clear.\r
-\r
-**/\r
-VOID\r
-UpdateStatusBar (\r
-  IN  UI_MENU_SELECTION           *Selection,\r
-  IN  UINTN                       MessageType,\r
-  IN  UINT8                       Flags,\r
-  IN  BOOLEAN                     State\r
-  );\r
-\r
-/**\r
-  Process Question Config.\r
-\r
-  @param  Selection              The UI menu selection.\r
-  @param  Question               The Question to be peocessed.\r
-\r
-  @retval EFI_SUCCESS            Question Config process success.\r
-  @retval Other                  Question Config process fail.\r
-\r
-**/\r
-EFI_STATUS\r
-ProcessQuestionConfig (\r
-  IN  UI_MENU_SELECTION       *Selection,\r
-  IN  FORM_BROWSER_STATEMENT  *Question\r
-  );\r
-\r
-/**\r
-  Print Question Value according to it's storage width and display attributes.\r
-\r
-  @param  Question               The Question to be printed.\r
-  @param  FormattedNumber        Buffer for output string.\r
-  @param  BufferSize             The FormattedNumber buffer size in bytes.\r
-\r
-  @retval EFI_SUCCESS            Print success.\r
-  @retval EFI_BUFFER_TOO_SMALL   Buffer size is not enough for formatted number.\r
-\r
-**/\r
-EFI_STATUS\r
-PrintFormattedNumber (\r
-  IN FORM_BROWSER_STATEMENT   *Question,\r
-  IN OUT CHAR16               *FormattedNumber,\r
-  IN UINTN                    BufferSize\r
-  );\r
-\r
-/**\r
-  Search an Option of a Question by its value.\r
-\r
-  @param  Question               The Question\r
-  @param  OptionValue            Value for Option to be searched.\r
-\r
-  @retval Pointer                Pointer to the found Option.\r
-  @retval NULL                   Option not found.\r
-\r
-**/\r
-QUESTION_OPTION *\r
-ValueToOption (\r
-  IN FORM_BROWSER_STATEMENT   *Question,\r
-  IN EFI_HII_VALUE            *OptionValue\r
-  );\r
-\r
-/**\r
-  Return data element in an Array by its Index.\r
-\r
-  @param  Array                  The data array.\r
-  @param  Type                   Type of the data in this array.\r
-  @param  Index                  Zero based index for data in this array.\r
-\r
-  @retval Value                  The data to be returned\r
-\r
-**/\r
-UINT64\r
-GetArrayData (\r
-  IN VOID                     *Array,\r
-  IN UINT8                    Type,\r
-  IN UINTN                    Index\r
-  );\r
-\r
-/**\r
-  Set value of a data element in an Array by its Index.\r
-\r
-  @param  Array                  The data array.\r
-  @param  Type                   Type of the data in this array.\r
-  @param  Index                  Zero based index for data in this array.\r
-  @param  Value                  The value to be set.\r
-\r
-**/\r
-VOID\r
-SetArrayData (\r
-  IN VOID                     *Array,\r
-  IN UINT8                    Type,\r
-  IN UINTN                    Index,\r
-  IN UINT64                   Value\r
-  );\r
-\r
-/**\r
-  Check whether this value already in the array, if yes, return the index.\r
-\r
-  @param  Array                  The data array.\r
-  @param  Type                   Type of the data in this array.\r
-  @param  Value                  The value to be find.\r
-  @param  Index                  The index in the array which has same value with Value.\r
-  \r
-  @retval   TRUE Found the value in the array.\r
-  @retval   FALSE Not found the value.\r
-\r
-**/\r
-BOOLEAN \r
-FindArrayData (\r
-  IN VOID                     *Array,\r
-  IN UINT8                    Type,\r
-  IN UINT64                   Value,\r
-  OUT UINTN                   *Index OPTIONAL\r
-  );\r
-\r
-/**\r
-  Process a Question's Option (whether selected or un-selected).\r
-\r
-  @param  Selection              Pointer to UI_MENU_SELECTION.\r
-  @param  MenuOption             The MenuOption for this Question.\r
-  @param  Selected               TRUE: if Question is selected.\r
-  @param  OptionString           Pointer of the Option String to be displayed.\r
-\r
-  @retval EFI_SUCCESS            Question Option process success.\r
-  @retval Other                  Question Option process fail.\r
-\r
-**/\r
-EFI_STATUS\r
-ProcessOptions (\r
-  IN  UI_MENU_SELECTION           *Selection,\r
-  IN  UI_MENU_OPTION              *MenuOption,\r
-  IN  BOOLEAN                     Selected,\r
-  OUT CHAR16                      **OptionString\r
-  );\r
-\r
-/**\r
-  Process the help string: Split StringPtr to several lines of strings stored in\r
-  FormattedString and the glyph width of each line cannot exceed gHelpBlockWidth.\r
-\r
-  @param  StringPtr              The entire help string.\r
-  @param  FormattedString        The oupput formatted string.\r
-  @param  EachLineWidth          The string length of each line in the formatted string.\r
-  @param  RowCount               TRUE: if Question is selected.\r
-\r
-**/\r
-UINTN\r
-ProcessHelpString (\r
-  IN  CHAR16  *StringPtr,\r
-  OUT CHAR16  **FormattedString,\r
-  OUT UINT16  *EachLineWidth,\r
-  IN  UINTN   RowCount\r
-  );\r
-\r
-/**\r
-  Update key's help imformation.\r
-\r
-  @param Selection       Tell setup browser the information about the Selection\r
-  @param  MenuOption     The Menu option\r
-  @param  Selected       Whether or not a tag be selected\r
-\r
-**/\r
-VOID\r
-UpdateKeyHelp (\r
-  IN  UI_MENU_SELECTION           *Selection,\r
-  IN  UI_MENU_OPTION              *MenuOption,\r
-  IN  BOOLEAN                     Selected\r
-  );\r
-\r
-/**\r
-  Clear retangle with specified text attribute.\r
-\r
-  @param  LeftColumn     Left column of retangle.\r
-  @param  RightColumn    Right column of retangle.\r
-  @param  TopRow         Start row of retangle.\r
-  @param  BottomRow      End row of retangle.\r
-  @param  TextAttribute  The character foreground and background.\r
-\r
-**/\r
-VOID\r
-ClearLines (\r
-  IN UINTN               LeftColumn,\r
-  IN UINTN               RightColumn,\r
-  IN UINTN               TopRow,\r
-  IN UINTN               BottomRow,\r
-  IN UINTN               TextAttribute\r
-  );\r
-\r
-/**\r
-  Count the storage space of a Unicode string.\r
-\r
-  This function handles the Unicode string with NARROW_CHAR\r
-  and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR\r
-  does not count in the resultant output. If a WIDE_CHAR is\r
-  hit, then 2 Unicode character will consume an output storage\r
-  space with size of CHAR16 till a NARROW_CHAR is hit.\r
-\r
-  If String is NULL, then ASSERT ().\r
-\r
-  @param String          The input string to be counted.\r
-\r
-  @return Storage space for the input string.\r
-\r
-**/\r
-UINTN\r
-GetStringWidth (\r
-  IN CHAR16               *String\r
-  );\r
-\r
-/**\r
-  Will copy LineWidth amount of a string in the OutputString buffer and return the\r
-  number of CHAR16 characters that were copied into the OutputString buffer.\r
-  In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.\r
-\r
-  @param  InputString            String description for this option.\r
-  @param  LineWidth              Width of the desired string to extract in CHAR16\r
-                                 characters\r
-  @param  GlyphWidth             The glyph width of the beging char in the string.\r
-  @param  Index                  Where in InputString to start the copy process\r
-  @param  OutputString           Buffer to copy the string into\r
-\r
-  @return Returns the number of CHAR16 characters that were copied into the OutputString buffer.\r
-\r
-**/\r
-UINT16\r
-GetLineByWidth (\r
-  IN      CHAR16                      *InputString,\r
-  IN      UINT16                      LineWidth,\r
-  IN OUT  UINT16                      *GlyphWidth,\r
-  IN OUT  UINTN                       *Index,\r
-  OUT     CHAR16                      **OutputString\r
-  );\r
-\r
-/**\r
-  Get the supported width for a particular op-code\r
-\r
-  @param  Statement              The FORM_BROWSER_STATEMENT structure passed in.\r
-  @param  Handle                 The handle in the HII database being used\r
-\r
-  @return Returns the number of CHAR16 characters that is support.\r
-\r
-**/\r
-UINT16\r
-GetWidth (\r
-  IN FORM_BROWSER_STATEMENT        *Statement,\r
-  IN EFI_HII_HANDLE                 Handle\r
-  );\r
-\r
-/**\r
-  Concatenate a narrow string to another string.\r
-\r
-  @param Destination The destination string.\r
-  @param Source      The source string. The string to be concatenated.\r
-                     to the end of Destination.\r
-\r
-**/\r
-VOID\r
-NewStrCat (\r
-  IN OUT CHAR16               *Destination,\r
-  IN     CHAR16               *Source\r
-  );\r
-\r
-/**\r
-  Wait for a key to be pressed by user.\r
-\r
-  @param Key         The key which is pressed by user.\r
-\r
-  @retval EFI_SUCCESS The function always completed successfully.\r
-\r
-**/\r
-EFI_STATUS\r
-WaitForKeyStroke (\r
-  OUT  EFI_INPUT_KEY           *Key\r
-  );\r
-\r
-/**\r
-  Reset stack pointer to begin of the stack.\r
-\r
-**/\r
-VOID\r
-ResetScopeStack (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Push the expression options onto the Stack.\r
-\r
-  @param  Pointer                Pointer to the current expression.\r
-  @param  Level                  Which type this expression belong to. Form, \r
-                                 statement or option?\r
-\r
-  @retval EFI_SUCCESS            The value was pushed onto the stack.\r
-  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.\r
-\r
-**/\r
-EFI_STATUS\r
-PushConditionalExpression (\r
-  IN FORM_EXPRESSION     *Pointer,\r
-  IN EXPRESS_LEVEL               Level\r
-  );\r
-\r
-/**\r
-  Pop the expression options from the Stack\r
-\r
-  @param  Level                  Which type this expression belong to. Form, \r
-                                 statement or option?\r
-\r
-  @retval EFI_SUCCESS            The value was pushed onto the stack.\r
-  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.\r
-\r
-**/\r
-EFI_STATUS\r
-PopConditionalExpression (\r
-  IN  EXPRESS_LEVEL      Level\r
-  );\r
-  \r
-/**\r
-  Get the expression Buffer pointer.\r
-  \r
-  @param  Level                  Which type this expression belong to. Form, \r
-                                 statement or option?\r
-\r
-  @retval  The start pointer of the expression buffer or NULL.\r
-\r
-**/\r
-FORM_EXPRESSION **\r
-GetConditionalExpressionList (\r
-  IN EXPRESS_LEVEL       Level\r
-  );\r
-\r
-/**\r
-  Get the expression list count.\r
-  \r
-  @param  Level                  Which type this expression belong to. Form, \r
-                                 statement or option?\r
-\r
-  @retval >=0                    The expression count\r
-  @retval -1                     Input parameter error.\r
-\r
-**/\r
-INTN \r
-GetConditionalExpressionCount (\r
-  IN EXPRESS_LEVEL       Level\r
-  );\r
-\r
-/**\r
-  Push an Operand onto the Stack\r
-\r
-  @param  Operand                Operand to push.\r
-\r
-  @retval EFI_SUCCESS            The value was pushed onto the stack.\r
-  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the\r
-                                 stack.\r
-\r
-**/\r
-EFI_STATUS\r
-PushScope (\r
-  IN UINT8   Operand\r
-  );\r
-\r
-/**\r
-  Pop an Operand from the Stack\r
-\r
-  @param  Operand                Operand to pop.\r
-\r
-  @retval EFI_SUCCESS            The value was pushed onto the stack.\r
-  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the\r
-                                 stack.\r
-\r
-**/\r
-EFI_STATUS\r
-PopScope (\r
-  OUT UINT8     *Operand\r
-  );\r
-\r
-/**\r
-  Reset stack pointer to begin of the stack.\r
-\r
-**/\r
-VOID\r
-ResetCurrentExpressionStack (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Push current expression onto the Stack\r
-\r
-  @param  Pointer                Pointer to current expression.\r
-\r
-  @retval EFI_SUCCESS            The value was pushed onto the stack.\r
-  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.\r
-\r
-**/\r
-EFI_STATUS\r
-PushCurrentExpression (\r
-  IN VOID  *Pointer\r
-  );\r
-\r
-/**\r
-  Pop current expression from the Stack\r
-\r
-  @param  Pointer                Pointer to current expression to be pop.\r
-\r
-  @retval EFI_SUCCESS            The value was pushed onto the stack.\r
-  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.\r
-\r
-**/\r
-EFI_STATUS\r
-PopCurrentExpression (\r
-  OUT VOID    **Pointer\r
-  );\r
-\r
-/**\r
-  Reset stack pointer to begin of the stack.\r
-\r
-**/\r
-VOID\r
-ResetMapExpressionListStack (\r
-  VOID\r
-  );\r
-\r
-/**\r
-  Push the list of map expression onto the Stack\r
-\r
-  @param  Pointer                Pointer to the list of map expression to be pushed.\r
-\r
-  @retval EFI_SUCCESS            The value was pushed onto the stack.\r
-  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.\r
-\r
-**/\r
-EFI_STATUS\r
-PushMapExpressionList (\r
-  IN VOID  *Pointer\r
-  );\r
-\r
-/**\r
-  Pop the list of map expression from the Stack\r
-\r
-  @param  Pointer                Pointer to the list of map expression to be pop.\r
-\r
-  @retval EFI_SUCCESS            The value was pushed onto the stack.\r
-  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.\r
-\r
-**/\r
-EFI_STATUS\r
-PopMapExpressionList (\r
-  OUT VOID    **Pointer\r
-  );\r
-\r
-/**\r
-  Get Form given its FormId.\r
-\r
-  @param  FormSet                The formset which contains this form.\r
-  @param  FormId                 Id of this form.\r
-\r
-  @retval Pointer                The form.\r
-  @retval NULL                   Specified Form is not found in the formset.\r
-\r
-**/\r
-FORM_BROWSER_FORM *\r
-IdToForm (\r
-  IN FORM_BROWSER_FORMSET  *FormSet,\r
-  IN UINT16                FormId\r
-  );\r
-\r
-/**\r
-  Search a Question in Formset scope using its QuestionId.\r
-\r
-  @param  FormSet                The formset which contains this form.\r
-  @param  Form                   The form which contains this Question.\r
-  @param  QuestionId             Id of this Question.\r
-\r
-  @retval Pointer                The Question.\r
-  @retval NULL                   Specified Question not found in the form.\r
-\r
-**/\r
-FORM_BROWSER_STATEMENT *\r
-IdToQuestion (\r
-  IN FORM_BROWSER_FORMSET  *FormSet,\r
-  IN FORM_BROWSER_FORM     *Form,\r
-  IN UINT16                QuestionId\r
-  );\r
-\r
-/**\r
-  Zero extend integer/boolean/date/time to UINT64 for comparing.\r
-\r
-  @param  Value                  HII Value to be converted.\r
-\r
-**/\r
-VOID\r
-ExtendValueToU64 (\r
-  IN  EFI_HII_VALUE   *Value\r
-  );\r
-\r
-/**\r
-  Compare two Hii value.\r
-\r
-  @param  Value1                 Expression value to compare on left-hand.\r
-  @param  Value2                 Expression value to compare on right-hand.\r
-  @param  Result                 Return value after compare.\r
-                                 retval 0                      Two operators equal.\r
-                                 return Positive value if Value1 is greater than Value2.\r
-                                 retval Negative value if Value1 is less than Value2.\r
-  @param  HiiHandle              Only required for string compare.\r
-\r
-  @retval other                  Could not perform compare on two values.\r
-  @retval EFI_SUCCESS            Compare the value success.\r
-\r
-**/\r
-EFI_STATUS\r
-CompareHiiValue (\r
-  IN  EFI_HII_VALUE   *Value1,\r
-  IN  EFI_HII_VALUE   *Value2,\r
-  OUT INTN            *Result,\r
-  IN  EFI_HII_HANDLE  HiiHandle OPTIONAL\r
-  );\r
-\r
-/**\r
-  Evaluate the result of a HII expression\r
-\r
-  If Expression is NULL, then ASSERT.\r
-\r
-  @param  FormSet                FormSet associated with this expression.\r
-  @param  Form                   Form associated with this expression.\r
-  @param  Expression             Expression to be evaluated.\r
-\r
-  @retval EFI_SUCCESS            The expression evaluated successfuly\r
-  @retval EFI_NOT_FOUND          The Question which referenced by a QuestionId\r
-                                 could not be found.\r
-  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the\r
-                                 stack.\r
-  @retval EFI_ACCESS_DENIED      The pop operation underflowed the stack\r
-  @retval EFI_INVALID_PARAMETER  Syntax error with the Expression\r
-\r
-**/\r
-EFI_STATUS\r
-EvaluateExpression (\r
-  IN FORM_BROWSER_FORMSET  *FormSet,\r
-  IN FORM_BROWSER_FORM     *Form,\r
-  IN OUT FORM_EXPRESSION   *Expression\r
-  );\r
-\r
-/**\r
-  Return the result of the expression list. Check the expression list and \r
-  return the highest priority express result.  \r
-  Priority: DisableIf > SuppressIf > GrayOutIf > FALSE\r
-\r
-  @param  ExpList             The input expression list.\r
-  @param  Evaluate            Whether need to evaluate the expression first.\r
-  @param  FormSet             FormSet associated with this expression. Only \r
-                              needed when Evaluate is TRUE\r
-  @param  Form                Form associated with this expression. Only \r
-                              needed when Evaluate is TRUE \r
-\r
-  @retval EXPRESS_RESULT      Return the higher priority express result. \r
-                              DisableIf > SuppressIf > GrayOutIf > FALSE\r
-\r
-**/\r
-EXPRESS_RESULT \r
-EvaluateExpressionList (\r
-  IN FORM_EXPRESSION_LIST *ExpList,\r
-  IN BOOLEAN              Evaluate,\r
-  IN FORM_BROWSER_FORMSET *FormSet, OPTIONAL\r
-  IN FORM_BROWSER_FORM    *Form OPTIONAL\r
-  );\r
-\r
-#endif // _UI_H\r