]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Universal/UserInterface/SetupBrowser/Dxe/Presentation.c
Retiring the ANT/JAVA build and removing the older EDK II packages that required...
[mirror_edk2.git] / EdkModulePkg / Universal / UserInterface / SetupBrowser / Dxe / Presentation.c
diff --git a/EdkModulePkg/Universal/UserInterface/SetupBrowser/Dxe/Presentation.c b/EdkModulePkg/Universal/UserInterface/SetupBrowser/Dxe/Presentation.c
deleted file mode 100644 (file)
index 6bbe810..0000000
+++ /dev/null
@@ -1,1485 +0,0 @@
-/*++\r
-Copyright (c) 2006 - 2007, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-  Presentation.c\r
-\r
-Abstract:\r
-\r
-  Some presentation routines.\r
-\r
-Revision History:\r
-\r
---*/\r
-\r
-#include "Setup.h"\r
-#include "Ui.h"\r
-#include "Colors.h"\r
-\r
-VOID\r
-ClearLines (\r
-  UINTN                                       LeftColumn,\r
-  UINTN                                       RightColumn,\r
-  UINTN                                       TopRow,\r
-  UINTN                                       BottomRow,\r
-  UINTN                                       TextAttribute\r
-  )\r
-{\r
-  CHAR16  *Buffer;\r
-  UINTN   Row;\r
-\r
-  //\r
-  // For now, allocate an arbitrarily long buffer\r
-  //\r
-  Buffer = AllocateZeroPool (0x10000);\r
-  ASSERT (Buffer != NULL);\r
-\r
-  //\r
-  // Set foreground and background as defined\r
-  //\r
-  gST->ConOut->SetAttribute (gST->ConOut, TextAttribute);\r
-\r
-  //\r
-  // Much faster to buffer the long string instead of print it a character at a time\r
-  //\r
-  SetUnicodeMem (Buffer, RightColumn - LeftColumn, L' ');\r
-\r
-  //\r
-  // Clear the desired area with the appropriate foreground/background\r
-  //\r
-  for (Row = TopRow; Row <= BottomRow; Row++) {\r
-    PrintStringAt (LeftColumn, Row, Buffer);\r
-  }\r
-\r
-  gST->ConOut->SetCursorPosition (gST->ConOut, LeftColumn, TopRow);\r
-\r
-  FreePool (Buffer);\r
-  return ;\r
-}\r
-\r
-VOID\r
-NewStrCat (\r
-  CHAR16                                      *Destination,\r
-  CHAR16                                      *Source\r
-  )\r
-{\r
-  UINTN Length;\r
-\r
-  for (Length = 0; Destination[Length] != 0; Length++)\r
-    ;\r
-\r
-  //\r
-  // We now have the length of the original string\r
-  // We can safely assume for now that we are concatenating a narrow value to this string.\r
-  // For instance, the string is "XYZ" and cat'ing ">"\r
-  // If this assumption changes, we need to make this routine a bit more complex\r
-  //\r
-  Destination[Length] = (CHAR16) NARROW_CHAR;\r
-  Length++;\r
-\r
-  StrCpy (Destination + Length, Source);\r
-}\r
-\r
-UINTN\r
-GetStringWidth (\r
-  CHAR16                                      *String\r
-  )\r
-{\r
-  UINTN Index;\r
-  UINTN Count;\r
-  UINTN IncrementValue;\r
-\r
-  Index           = 0;\r
-  Count           = 0;\r
-  IncrementValue  = 1;\r
-\r
-  do {\r
-    //\r
-    // Advance to the null-terminator or to the first width directive\r
-    //\r
-    for (;\r
-         (String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);\r
-         Index++, Count = Count + IncrementValue\r
-        )\r
-      ;\r
-\r
-    //\r
-    // We hit the null-terminator, we now have a count\r
-    //\r
-    if (String[Index] == 0) {\r
-      break;\r
-    }\r
-    //\r
-    // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed\r
-    // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2)\r
-    //\r
-    if (String[Index] == NARROW_CHAR) {\r
-      //\r
-      // Skip to the next character\r
-      //\r
-      Index++;\r
-      IncrementValue = 1;\r
-    } else {\r
-      //\r
-      // Skip to the next character\r
-      //\r
-      Index++;\r
-      IncrementValue = 2;\r
-    }\r
-  } while (String[Index] != 0);\r
-\r
-  //\r
-  // Increment by one to include the null-terminator in the size\r
-  //\r
-  Count++;\r
-\r
-  return Count * sizeof (CHAR16);\r
-}\r
-\r
-VOID\r
-DisplayPageFrame (\r
-  VOID\r
-  )\r
-{\r
-  UINTN             Index;\r
-  UINT8             Line;\r
-  UINT8             Alignment;\r
-  CHAR16            Character;\r
-  CHAR16            *Buffer;\r
-  CHAR16            *StrFrontPageBanner;\r
-  EFI_SCREEN_DESCRIPTOR LocalScreen;\r
-  UINTN             Row;\r
-\r
-  ZeroMem (&LocalScreen, sizeof (EFI_SCREEN_DESCRIPTOR));\r
-  gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &LocalScreen.RightColumn, &LocalScreen.BottomRow);\r
-  ClearLines (0, LocalScreen.RightColumn, 0, LocalScreen.BottomRow, KEYHELP_BACKGROUND);\r
-\r
-  CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
-\r
-  //\r
-  // For now, allocate an arbitrarily long buffer\r
-  //\r
-  Buffer = AllocateZeroPool (0x10000);\r
-  ASSERT (Buffer != NULL);\r
-\r
-  Character = (CHAR16) BOXDRAW_HORIZONTAL;\r
-\r
-  for (Index = 0; Index + 2 < (LocalScreen.RightColumn - LocalScreen.LeftColumn); Index++) {\r
-    Buffer[Index] = Character;\r
-  }\r
-\r
-  if (gClassOfVfr == EFI_FRONT_PAGE_SUBCLASS) {\r
-    //\r
-    //    ClearLines(0, LocalScreen.RightColumn, 0, BANNER_HEIGHT-1, BANNER_TEXT | BANNER_BACKGROUND);\r
-    //\r
-    ClearLines (\r
-      LocalScreen.LeftColumn,\r
-      LocalScreen.RightColumn,\r
-      LocalScreen.TopRow,\r
-      FRONT_PAGE_HEADER_HEIGHT - 1 + LocalScreen.TopRow,\r
-      BANNER_TEXT | BANNER_BACKGROUND\r
-      );\r
-    //\r
-    //    for (Line = 0; Line < BANNER_HEIGHT; Line++) {\r
-    //\r
-    for (Line = (UINT8) LocalScreen.TopRow; Line < BANNER_HEIGHT + (UINT8) LocalScreen.TopRow; Line++) {\r
-      //\r
-      //      for (Alignment = 0; Alignment < BANNER_COLUMNS; Alignment++) {\r
-      //\r
-      for (Alignment = (UINT8) LocalScreen.LeftColumn;\r
-           Alignment < BANNER_COLUMNS + (UINT8) LocalScreen.LeftColumn;\r
-           Alignment++\r
-          ) {\r
-        if (BannerData->Banner[Line - (UINT8) LocalScreen.TopRow][Alignment - (UINT8) LocalScreen.LeftColumn] != 0x0000) {\r
-          StrFrontPageBanner = GetToken (\r
-                                BannerData->Banner[Line - (UINT8) LocalScreen.TopRow][Alignment - (UINT8) LocalScreen.LeftColumn],\r
-                                FrontPageHandle\r
-                                );\r
-        } else {\r
-          continue;\r
-        }\r
-\r
-        switch (Alignment - LocalScreen.LeftColumn) {\r
-        case 0:\r
-          //\r
-          // Handle left column\r
-          //\r
-          PrintStringAt (LocalScreen.LeftColumn, Line, StrFrontPageBanner);\r
-          break;\r
-\r
-        case 1:\r
-          //\r
-          // Handle center column\r
-          //\r
-          PrintStringAt (\r
-            LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3,\r
-            Line,\r
-            StrFrontPageBanner\r
-            );\r
-          break;\r
-\r
-        case 2:\r
-          //\r
-          // Handle right column\r
-          //\r
-          PrintStringAt (\r
-            LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) * 2 / 3,\r
-            Line,\r
-            StrFrontPageBanner\r
-            );\r
-          break;\r
-        }\r
-\r
-        FreePool (StrFrontPageBanner);\r
-      }\r
-    }\r
-  }\r
-\r
-  ClearLines (\r
-    LocalScreen.LeftColumn,\r
-    LocalScreen.RightColumn,\r
-    LocalScreen.BottomRow - STATUS_BAR_HEIGHT - FOOTER_HEIGHT,\r
-    LocalScreen.BottomRow - STATUS_BAR_HEIGHT - 1,\r
-    KEYHELP_TEXT | KEYHELP_BACKGROUND\r
-    );\r
-\r
-  if (gClassOfVfr != EFI_FRONT_PAGE_SUBCLASS) {\r
-    ClearLines (\r
-      LocalScreen.LeftColumn,\r
-      LocalScreen.RightColumn,\r
-      LocalScreen.TopRow,\r
-      LocalScreen.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 = (CHAR16) BOXDRAW_DOWN_RIGHT;\r
-\r
-    PrintChar (Character);\r
-    PrintString (Buffer);\r
-\r
-    Character = (CHAR16) BOXDRAW_DOWN_LEFT;\r
-    PrintChar (Character);\r
-\r
-    Character = (CHAR16) BOXDRAW_VERTICAL;\r
-    for (Row = LocalScreen.TopRow + 1; Row <= LocalScreen.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 2; Row++) {\r
-      PrintCharAt (LocalScreen.LeftColumn, Row, Character);\r
-      PrintCharAt (LocalScreen.RightColumn - 1, Row, Character);\r
-    }\r
-\r
-    Character = (CHAR16) BOXDRAW_UP_RIGHT;\r
-    PrintCharAt (LocalScreen.LeftColumn, LocalScreen.TopRow + NONE_FRONT_PAGE_HEADER_HEIGHT - 1, Character);\r
-    PrintString (Buffer);\r
-\r
-    Character = (CHAR16) BOXDRAW_UP_LEFT;\r
-    PrintChar (Character);\r
-\r
-    if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
-      //\r
-      // Print Bottom border line\r
-      // +------------------------------------------------------------------------------+\r
-      // ?                                                                             ?\r
-      // +------------------------------------------------------------------------------+\r
-      //\r
-      Character = (CHAR16) BOXDRAW_DOWN_RIGHT;\r
-      PrintCharAt (LocalScreen.LeftColumn, LocalScreen.BottomRow - STATUS_BAR_HEIGHT - FOOTER_HEIGHT, Character);\r
-\r
-      PrintString (Buffer);\r
-\r
-      Character = (CHAR16) BOXDRAW_DOWN_LEFT;\r
-      PrintChar (Character);\r
-      Character = (CHAR16) BOXDRAW_VERTICAL;\r
-      for (Row = LocalScreen.BottomRow - STATUS_BAR_HEIGHT - FOOTER_HEIGHT + 1;\r
-           Row <= LocalScreen.BottomRow - STATUS_BAR_HEIGHT - 2;\r
-           Row++\r
-          ) {\r
-        PrintCharAt (LocalScreen.LeftColumn, Row, Character);\r
-        PrintCharAt (LocalScreen.RightColumn - 1, Row, Character);\r
-      }\r
-\r
-      Character = (CHAR16) BOXDRAW_UP_RIGHT;\r
-      PrintCharAt (LocalScreen.LeftColumn, LocalScreen.BottomRow - STATUS_BAR_HEIGHT - 1, Character);\r
-\r
-      PrintString (Buffer);\r
-\r
-      Character = (CHAR16) BOXDRAW_UP_LEFT;\r
-      PrintChar (Character);\r
-    }\r
-  }\r
-\r
-  FreePool (Buffer);\r
-\r
-}\r
-\r
-/*\r
-+------------------------------------------------------------------------------+\r
-?F2=Previous Page                 Setup Page                                  ?\r
-+------------------------------------------------------------------------------+\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-+------------------------------------------------------------------------------+\r
-?F1=Scroll Help                 F9=Reset to Defaults        F10=Save and Exit ?\r
-| ^"=Move Highlight          <Spacebar> Toggles Checkbox   Esc=Discard Changes |\r
-+------------------------------------------------------------------------------+\r
-*/\r
-STATIC\r
-UI_MENU_OPTION *\r
-DisplayForm (\r
-  OUT UI_MENU_OPTION              *Selection,\r
-  IN  UINT16                      FormHandle,\r
-  IN  UINT16                      TitleToken,\r
-  IN  EFI_FORM_TAGS               FormTags,\r
-  IN  EFI_FILE_FORM_TAGS          *FileFormTagsHead,\r
-  IN  UINT8                       *CallbackData\r
-  )\r
-{\r
-  CHAR16              *StringPtr;\r
-  UINTN               Index;\r
-  UINTN               Count;\r
-  UINT16              MenuItemCount;\r
-  EFI_HII_HANDLE      Handle;\r
-  UINT16              FormId;\r
-  STRING_REF          String;\r
-  EFI_FILE_FORM_TAGS  *FileFormTags;\r
-  BOOLEAN             SuppressIf;\r
-  BOOLEAN             Suppress;\r
-  BOOLEAN             GrayOut;\r
-  BOOLEAN             Conditional;\r
-  EFI_SCREEN_DESCRIPTOR   LocalScreen;\r
-  UINT16              Width;\r
-  UINTN               ArrayEntry;\r
-  CHAR16              *OutputString;\r
-\r
-  Handle        = Selection->Handle;\r
-  FormId        = 0;\r
-  String        = 0;\r
-  MenuItemCount = 0;\r
-  ArrayEntry    = 0;\r
-  OutputString  = NULL;\r
-\r
-  CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
-\r
-  //\r
-  // If we hit a F2 (previous) we already nuked the menu and are simply carrying around what information we need\r
-  //\r
-  if (Selection->Previous) {\r
-    Selection->Previous = FALSE;\r
-  } else {\r
-    UiFreeMenu ();\r
-    UiInitMenu ();\r
-  }\r
-\r
-  StringPtr = GetToken (TitleToken, Handle);\r
-\r
-  if (gClassOfVfr != EFI_FRONT_PAGE_SUBCLASS) {\r
-    gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
-    PrintStringAt (\r
-      (LocalScreen.RightColumn + LocalScreen.LeftColumn - GetStringWidth (StringPtr) / 2) / 2,\r
-      LocalScreen.TopRow + 1,\r
-      StringPtr\r
-      );\r
-  }\r
-\r
-  if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
-    gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
-\r
-    //\r
-    // Display the infrastructure strings\r
-    //\r
-    if (!IsListEmpty (&gMenuList)) {\r
-      PrintStringAt (LocalScreen.LeftColumn + 2, LocalScreen.TopRow + 1, gFunctionTwoString);\r
-    }\r
-\r
-    PrintStringAt (LocalScreen.LeftColumn + 2, LocalScreen.BottomRow - 4, gFunctionOneString);\r
-    PrintStringAt (\r
-      LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3,\r
-      LocalScreen.BottomRow - 4,\r
-      gFunctionNineString\r
-      );\r
-    PrintStringAt (\r
-      LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) * 2 / 3,\r
-      LocalScreen.BottomRow - 4,\r
-      gFunctionTenString\r
-      );\r
-    PrintAt (LocalScreen.LeftColumn + 2, LocalScreen.BottomRow - 3, (CHAR16 *) L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-    PrintStringAt (\r
-      LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3,\r
-      LocalScreen.BottomRow - 3,\r
-      gEscapeString\r
-      );\r
-  }\r
-  //\r
-  // Remove Buffer allocated for StringPtr after it has been used.\r
-  //\r
-  FreePool (StringPtr);\r
-\r
-  for (Index = 0; FormTags.Tags[Index].Operand != EFI_IFR_END_FORM_OP; Index++) {\r
-    GrayOut       = FALSE;\r
-    Suppress      = FALSE;\r
-    SuppressIf    = FALSE;\r
-    Conditional   = FALSE;\r
-    FileFormTags  = FileFormTagsHead;\r
-\r
-    if (FormTags.Tags[Index].Operand == EFI_IFR_FORM_OP) {\r
-      FormId = FormTags.Tags[Index].Id;\r
-    }\r
-    //\r
-    // This gives us visibility to the FileFormTags->NvRamMap to check things\r
-    // ActiveIfr is a global maintained by the menuing code to ensure that we\r
-    // are pointing to the correct formset's file data.\r
-    //\r
-    for (Count = 0; Count < gActiveIfr; Count++) {\r
-      FileFormTags = FileFormTags->NextFile;\r
-    }\r
-    //\r
-    //  GrayoutIf [SuppressIf]\r
-    //    <BOOLEANS>\r
-    //      OpCode(s)\r
-    //  EndIf\r
-    //\r
-    //  SuppressIf [GrayoutIf]\r
-    //    <BOOLEANS>\r
-    //      OpCode(s)\r
-    //  EndIf\r
-    //\r
-    Count = 0;\r
-\r
-    do {\r
-      switch (FormTags.Tags[Index].Operand) {\r
-      case EFI_IFR_SUPPRESS_IF_OP:\r
-        SuppressIf = TRUE;\r
-\r
-      case EFI_IFR_GRAYOUT_IF_OP:\r
-\r
-        Conditional = TRUE;\r
-\r
-        //\r
-        // Advance to the next op-code\r
-        //\r
-        Index++;\r
-\r
-        //\r
-        // We are now pointing to the beginning of the consistency checking.  Let's fast forward\r
-        // through the AND/OR/NOT data to come up with some meaningful ID data.\r
-        //\r
-        for (;\r
-             FormTags.Tags[Index].Operand == EFI_IFR_AND_OP   ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_OR_OP    ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_GT_OP    ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_GE_OP    ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_NOT_OP;\r
-           Index++\r
-            )\r
-          ;\r
-\r
-        //\r
-        // We need to walk through the consistency checks until we hit the end of the consistency\r
-        // FALSE means evaluate this single expression\r
-        // The ConsistencyId refers to which expression in the Consistency database to use\r
-        //\r
-        if (SuppressIf) {\r
-          Suppress = ValueIsNotValid (\r
-                      FALSE,\r
-                      FormTags.Tags[Index].ConsistencyId,\r
-                      &FormTags.Tags[Index],\r
-                      FileFormTags,\r
-                      &String\r
-                      );\r
-          SuppressIf = FALSE;\r
-        } else {\r
-          GrayOut = ValueIsNotValid (\r
-                      FALSE,\r
-                      FormTags.Tags[Index].ConsistencyId,\r
-                      &FormTags.Tags[Index],\r
-                      FileFormTags,\r
-                      &String\r
-                      );\r
-        }\r
-        //\r
-        // Advance to the end of the expression (Will land us at a grayoutif/suppressif or the op-code being affected)\r
-        //\r
-        for (;\r
-             FormTags.Tags[Index].Operand == EFI_IFR_EQ_ID_VAL_OP ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_EQ_VAR_VAL_OP ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_EQ_ID_ID_OP ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_EQ_ID_LIST_OP ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_NOT_OP ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_AND_OP ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_OR_OP ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_TRUE_OP ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_FALSE_OP ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_GT_OP    ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_GE_OP    ||\r
-             FormTags.Tags[Index].Operand == EFI_IFR_LABEL_OP;\r
-           Index++\r
-            )\r
-          ;\r
-        break;\r
-\r
-      default:\r
-        goto GetOut;\r
-      }\r
-      //\r
-      // Do this two times (at most will see a suppress and grayout combination\r
-      //\r
-      Count++;\r
-    } while (Count < 2);\r
-\r
-GetOut:\r
-    do {\r
-      if (GrayOut) {\r
-        FormTags.Tags[Index].GrayOut = TRUE;\r
-      } else {\r
-        FormTags.Tags[Index].GrayOut = FALSE;\r
-      }\r
-      if (Suppress && FormTags.Tags[Index].Operand == EFI_IFR_ONE_OF_OPTION_OP) {\r
-        //\r
-        // Only need .Suppress field when the tag is a one_of_option. For other cases, omit them directly.\r
-        //\r
-        FormTags.Tags[Index].Suppress = TRUE;\r
-      } else {\r
-        FormTags.Tags[Index].Suppress = FALSE;\r
-      }\r
-\r
-      if ((\r
-            FormTags.Tags[Index].NumberOfLines > 0 ||\r
-            FormTags.Tags[Index].Operand == EFI_IFR_DATE_OP ||\r
-            FormTags.Tags[Index].Operand == EFI_IFR_TIME_OP\r
-          ) &&\r
-          !Suppress\r
-          ) {\r
-\r
-        StringPtr = GetToken (FormTags.Tags[Index].Text, Handle);\r
-\r
-        Width     = GetWidth (&FormTags.Tags[Index], Handle);\r
-\r
-        //\r
-        // This data can be retrieved over and over again.  Therefore, reset to original values\r
-        // before processing otherwise things will start growing linearly\r
-        //\r
-        if (FormTags.Tags[Index].NumberOfLines > 1) {\r
-          FormTags.Tags[Index].NumberOfLines = 1;\r
-        }\r
-\r
-        for (Count = 0; GetLineByWidth (StringPtr, Width, &ArrayEntry, &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 (&StringPtr[ArrayEntry])) {\r
-            FormTags.Tags[Index].NumberOfLines++;\r
-          }\r
-\r
-          FreePool (OutputString);\r
-        }\r
-\r
-        ArrayEntry = 0;\r
-\r
-        //\r
-        // We are NOT!! removing this StringPtr buffer via FreePool since it is being used in the menuoptions, we will do\r
-        // it in UiFreeMenu.\r
-        //\r
-        UiAddSubMenuOption (StringPtr, Handle, FormTags.Tags, Index, FormId, MenuItemCount);\r
-        MenuItemCount++;\r
-      }\r
-      //\r
-      // Keep processing menu entries based on the resultant suppress/grayout results until we hit an end-if\r
-      //\r
-      Index++;\r
-    } while (FormTags.Tags[Index].Operand != EFI_IFR_END_IF_OP && Conditional);\r
-\r
-    //\r
-    // We advanced the index for the above conditional, rewind it to keep harmony with the for loop logic\r
-    //\r
-    Index--;\r
-  }\r
-\r
-  Selection = UiDisplayMenu (TRUE, FileFormTagsHead, (EFI_IFR_DATA_ARRAY *) CallbackData);\r
-\r
-  return Selection;\r
-}\r
-\r
-VOID\r
-InitializeBrowserStrings (\r
-  VOID\r
-  )\r
-{\r
-  gFunctionOneString    = GetToken (STRING_TOKEN (FUNCTION_ONE_STRING), gHiiHandle);\r
-  gFunctionTwoString    = GetToken (STRING_TOKEN (FUNCTION_TWO_STRING), gHiiHandle);\r
-  gFunctionNineString   = GetToken (STRING_TOKEN (FUNCTION_NINE_STRING), gHiiHandle);\r
-  gFunctionTenString    = GetToken (STRING_TOKEN (FUNCTION_TEN_STRING), gHiiHandle);\r
-  gEnterString          = GetToken (STRING_TOKEN (ENTER_STRING), gHiiHandle);\r
-  gEnterCommitString    = GetToken (STRING_TOKEN (ENTER_COMMIT_STRING), gHiiHandle);\r
-  gEscapeString         = GetToken (STRING_TOKEN (ESCAPE_STRING), gHiiHandle);\r
-  gMoveHighlight        = GetToken (STRING_TOKEN (MOVE_HIGHLIGHT), gHiiHandle);\r
-  gMakeSelection        = GetToken (STRING_TOKEN (MAKE_SELECTION), gHiiHandle);\r
-  gNumericInput         = GetToken (STRING_TOKEN (NUMERIC_INPUT), gHiiHandle);\r
-  gToggleCheckBox       = GetToken (STRING_TOKEN (TOGGLE_CHECK_BOX), gHiiHandle);\r
-  gPromptForPassword    = GetToken (STRING_TOKEN (PROMPT_FOR_PASSWORD), gHiiHandle);\r
-  gPromptForNewPassword = GetToken (STRING_TOKEN (PROMPT_FOR_NEW_PASSWORD), gHiiHandle);\r
-  gConfirmPassword      = GetToken (STRING_TOKEN (CONFIRM_PASSWORD), gHiiHandle);\r
-  gConfirmError         = GetToken (STRING_TOKEN (CONFIRM_ERROR), gHiiHandle);\r
-  gPressEnter           = GetToken (STRING_TOKEN (PRESS_ENTER), gHiiHandle);\r
-  gEmptyString          = GetToken (STRING_TOKEN (EMPTY_STRING), gHiiHandle);\r
-  gAreYouSure           = GetToken (STRING_TOKEN (ARE_YOU_SURE), gHiiHandle);\r
-  gYesResponse          = GetToken (STRING_TOKEN (ARE_YOU_SURE_YES), gHiiHandle);\r
-  gNoResponse           = GetToken (STRING_TOKEN (ARE_YOU_SURE_NO), gHiiHandle);\r
-  gMiniString           = GetToken (STRING_TOKEN (MINI_STRING), gHiiHandle);\r
-  gPlusString           = GetToken (STRING_TOKEN (PLUS_STRING), gHiiHandle);\r
-  gMinusString          = GetToken (STRING_TOKEN (MINUS_STRING), gHiiHandle);\r
-  gAdjustNumber         = GetToken (STRING_TOKEN (ADJUST_NUMBER), gHiiHandle);\r
-  return ;\r
-}\r
-\r
-VOID\r
-UpdateKeyHelp (\r
-  IN  UI_MENU_OPTION              *Selection,\r
-  IN  BOOLEAN                     Selected\r
-  )\r
-/*++\r
-Routine Description:\r
-  Update key's help imformation\r
-\r
-Arguments:\r
-  Selection C The form that current display\r
-  Selected C  Whether or not a tag be selected\r
-\r
-Returns:\r
-  None\r
---*/\r
-{\r
-  UINTN             SecCol;\r
-  UINTN             ThdCol;\r
-  UINTN             LeftColumnOfHelp;\r
-  UINTN             RightColumnOfHelp;\r
-  UINTN             TopRowOfHelp;\r
-  UINTN             BottomRowOfHelp;\r
-  UINTN             StartColumnOfHelp;\r
-  EFI_SCREEN_DESCRIPTOR LocalScreen;\r
-\r
-  CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
-\r
-  SecCol            = LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 3;\r
-  ThdCol            = LocalScreen.LeftColumn + (LocalScreen.RightColumn - LocalScreen.LeftColumn) * 2 / 3;\r
-\r
-  StartColumnOfHelp = LocalScreen.LeftColumn + 2;\r
-  LeftColumnOfHelp  = LocalScreen.LeftColumn + 1;\r
-  RightColumnOfHelp = LocalScreen.RightColumn - 2;\r
-  TopRowOfHelp      = LocalScreen.BottomRow - 4;\r
-  BottomRowOfHelp   = LocalScreen.BottomRow - 3;\r
-\r
-  if (gClassOfVfr == EFI_GENERAL_APPLICATION_SUBCLASS) {\r
-    return ;\r
-  }\r
-\r
-  gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
-\r
-  switch (Selection->ThisTag->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
-    ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
-\r
-    if (!Selected) {\r
-      if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
-        PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
-        PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
-\r
-      }\r
-\r
-      if ((Selection->ThisTag->Operand == EFI_IFR_DATE_OP) || (Selection->ThisTag->Operand == EFI_IFR_TIME_OP)) {\r
-        PrintAt (\r
-          StartColumnOfHelp,\r
-          BottomRowOfHelp,\r
-          (CHAR16 *) L"%c%c%c%c%s",\r
-          ARROW_UP,\r
-          ARROW_DOWN,\r
-          ARROW_RIGHT,\r
-          ARROW_LEFT,\r
-          gMoveHighlight\r
-          );\r
-        PrintStringAt (SecCol, BottomRowOfHelp, gAdjustNumber);\r
-      } else {\r
-        PrintAt (StartColumnOfHelp, BottomRowOfHelp, (CHAR16 *) L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-        PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
-      }\r
-    } else {\r
-      PrintStringAt (SecCol, BottomRowOfHelp, gEnterCommitString);\r
-\r
-      //\r
-      // If it is a selected numeric with manual input, display different message\r
-      //\r
-      if ((Selection->ThisTag->Operand == EFI_IFR_NUMERIC_OP) && (Selection->ThisTag->Step == 0)) {\r
-        PrintStringAt (SecCol, TopRowOfHelp, gNumericInput);\r
-      } else if (Selection->ThisTag->Operand != EFI_IFR_ORDERED_LIST_OP) {\r
-        PrintAt (StartColumnOfHelp, BottomRowOfHelp, L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-      }\r
-\r
-      if (Selection->ThisTag->Operand == EFI_IFR_ORDERED_LIST_OP) {\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gPlusString);\r
-        PrintStringAt (ThdCol, TopRowOfHelp, gMinusString);\r
-      }\r
-\r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
-    }\r
-    break;\r
-\r
-  case EFI_IFR_CHECKBOX_OP:\r
-    ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
-\r
-    if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
-      PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
-      PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
-      PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
-      PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
-    }\r
-\r
-    PrintAt (StartColumnOfHelp, BottomRowOfHelp, (CHAR16 *) L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-    PrintStringAt (SecCol, BottomRowOfHelp, gToggleCheckBox);\r
-    break;\r
-\r
-  case EFI_IFR_REF_OP:\r
-  case EFI_IFR_PASSWORD_OP:\r
-  case EFI_IFR_STRING_OP:\r
-    ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
-\r
-    if (!Selected) {\r
-      if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
-        PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
-        PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
-        PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
-      }\r
-\r
-      PrintAt (StartColumnOfHelp, BottomRowOfHelp, (CHAR16 *) L"%c%c%s", ARROW_UP, ARROW_DOWN, gMoveHighlight);\r
-      PrintStringAt (SecCol, BottomRowOfHelp, gEnterString);\r
-    } else {\r
-      if (Selection->ThisTag->Operand != EFI_IFR_REF_OP) {\r
-        PrintStringAt (\r
-          (LocalScreen.RightColumn - GetStringWidth (gEnterCommitString) / 2) / 2,\r
-          BottomRowOfHelp,\r
-          gEnterCommitString\r
-          );\r
-        PrintStringAt (ThdCol, BottomRowOfHelp, gEscapeString);\r
-      }\r
-    }\r
-    break;\r
-  }\r
-\r
-}\r
-\r
-STATIC\r
-VOID\r
-ExtractFormHandle (\r
-  IN  UI_MENU_OPTION              *Selection,\r
-  IN  EFI_FILE_FORM_TAGS          *FileFormTagsHead,\r
-  IN  UINTN                       IdValue,\r
-  OUT UINT16                      *FormHandle,\r
-  OUT UINT16                      *TitleToken,\r
-  OUT EFI_FORM_TAGS               *FormTags\r
-  )\r
-{\r
-  UINTN               Index;\r
-  EFI_FILE_FORM_TAGS  *FileFormTags;\r
-  EFI_FORM_TAGS       LocalTags;\r
-\r
-  FileFormTags = FileFormTagsHead;\r
-\r
-  //\r
-  // Advance FileFormTags to the correct file's tag information.\r
-  // For instance, if Selection->IfrNumber is 3, that means the 4th\r
-  // file (0-based) in the FileFormTags linked-list contains the tag\r
-  // information.\r
-  //\r
-  for (Index = 0; Index < Selection->IfrNumber; Index++) {\r
-    FileFormTags = FileFormTags->NextFile;\r
-  }\r
-\r
-  LocalTags = FileFormTags->FormTags;\r
-\r
-  if (IdValue == 0) {\r
-    //\r
-    // Advance Index to the first FormOp tag information\r
-    //\r
-    for (Index = 0; FileFormTags->FormTags.Tags[Index].Operand != EFI_IFR_FORM_OP; Index++)\r
-      ;\r
-  } else {\r
-    //\r
-    // Advance Index to the FormOp with the correct ID value\r
-    //\r
-    for (; LocalTags.Next != NULL; LocalTags = *LocalTags.Next) {\r
-      for (Index = 0; LocalTags.Tags[Index].Operand != EFI_IFR_FORM_OP; Index++)\r
-        ;\r
-      if (LocalTags.Tags[Index].Id == IdValue) {\r
-        break;\r
-      }\r
-    }\r
-  }\r
-  //\r
-  // return the Form Id, Text, and the File's FormTags structure\r
-  //\r
-  *FormHandle = LocalTags.Tags[Index].Id;\r
-  *TitleToken = LocalTags.Tags[Index].Text;\r
-  *FormTags   = LocalTags;\r
-  return ;\r
-}\r
-\r
-STATIC\r
-EFI_STATUS\r
-UpdateNewTagData (\r
-  IN  UINT8                                     *FormData,\r
-  IN  UINT16                                    ConsistencyId,\r
-  IN  UINT16                                    CurrentVariable,\r
-  IN  EFI_FORM_TAGS                             *FormTags,\r
-  OUT EFI_FILE_FORM_TAGS                        *FileFormTags\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-  UINT16      Index;\r
-  UINT16      QuestionIndex;\r
-  UINT16      NumberOfTags;\r
-  INT16       CurrTag;\r
-  UINT8       TagLength;\r
-  UINTN       Count;\r
-  BOOLEAN     Finished;\r
-\r
-  //\r
-  // Initialize some Index variable and Status\r
-  //\r
-  Count         = 0;\r
-  QuestionIndex = 0;\r
-  NumberOfTags  = 1;\r
-  Index         = 0;\r
-  Status        = EFI_SUCCESS;\r
-  Finished      = FALSE;\r
-\r
-  //\r
-  // Determine the number of tags for the first form\r
-  //\r
-  GetTagCount (&FormData[Index], &NumberOfTags);\r
-\r
-  //\r
-  // Allocate memory for our tags on the first form\r
-  //\r
-  FormTags->Tags = AllocateZeroPool (NumberOfTags * sizeof (EFI_TAG));\r
-  ASSERT (FormTags->Tags != NULL);\r
-\r
-  for (CurrTag = 0; FormData[Index] != EFI_IFR_END_FORM_SET_OP; CurrTag++) {\r
-    //\r
-    // Operand = IFR OpCode\r
-    //\r
-    FormTags->Tags[CurrTag].Operand = FormData[Index];\r
-\r
-    //\r
-    // Assume for now 0 lines occupied by this OpCode\r
-    //\r
-    FormTags->Tags[CurrTag].NumberOfLines = 0;\r
-\r
-    //\r
-    // Determine the length of the Tag so we can later skip to the next tag in the form\r
-    //\r
-    //\r
-    // get the length\r
-    //\r
-    TagLength = FormData[Index + 1];\r
-    //\r
-    // Operate on the Found OpCode\r
-    //\r
-    switch (FormData[Index]) {\r
-\r
-    case EFI_IFR_FORM_OP:\r
-    case EFI_IFR_SUBTITLE_OP:\r
-    case EFI_IFR_TEXT_OP:\r
-    case EFI_IFR_REF_OP:\r
-      IfrToFormTag (FormData[Index], &FormTags->Tags[CurrTag], (VOID *) &FormData[Index], NULL);\r
-      break;\r
-\r
-    case EFI_IFR_VARSTORE_SELECT_OP:\r
-      IfrToFormTag (FormData[Index], &FormTags->Tags[CurrTag], (VOID *) &FormData[Index], NULL);\r
-      CopyMem (&CurrentVariable, &((EFI_IFR_VARSTORE_SELECT *) &FormData[Index])->VarId, sizeof (UINT16));\r
-      break;\r
-\r
-    case EFI_IFR_END_FORM_OP:\r
-      FormTags->Tags[CurrTag].Operand       = FormData[Index];\r
-      FormTags->Tags[CurrTag].NumberOfLines = 0;\r
-\r
-      Finished = TRUE;\r
-      break;\r
-\r
-    case EFI_IFR_ORDERED_LIST_OP:\r
-    case EFI_IFR_ONE_OF_OP:\r
-      GetQuestionHeader (&FormTags->Tags[CurrTag], FormData, Index, FileFormTags, CurrentVariable);\r
-\r
-      //\r
-      // Store away the CurrTag since what follows will be the answer that we\r
-      // need to place into the appropriate location in the tag array\r
-      //\r
-      //\r
-      // record for setting default later\r
-      //\r
-      QuestionIndex = (UINT16) CurrTag;\r
-      break;\r
-\r
-    case EFI_IFR_ONE_OF_OPTION_OP:\r
-      IfrToFormTag (FormData[Index], &FormTags->Tags[CurrTag], (VOID *) &FormData[Index], NULL);\r
-      FormTags->Tags[QuestionIndex].Key = ((EFI_IFR_ONE_OF_OPTION *) &FormData[Index])->Key;\r
-      FormTags->Tags[QuestionIndex].ResetRequired = (BOOLEAN) (FormTags->Tags[QuestionIndex].Flags & EFI_IFR_FLAG_RESET_REQUIRED);\r
-      break;\r
-\r
-    case EFI_IFR_CHECKBOX_OP:\r
-      GetQuestionHeader (&FormTags->Tags[CurrTag], FormData, Index, FileFormTags, CurrentVariable);\r
-      IfrToFormTag (FormData[Index], &FormTags->Tags[CurrTag], (VOID *) &FormData[Index], NULL);\r
-      break;\r
-\r
-    case EFI_IFR_NUMERIC_OP:\r
-      GetNumericHeader (&FormTags->Tags[CurrTag], FormData, Index, (UINT16) 1, FileFormTags, CurrentVariable);\r
-      IfrToFormTag (FormData[Index], &FormTags->Tags[CurrTag], (VOID *) &FormData[Index], NULL);\r
-      break;\r
-\r
-    case EFI_IFR_DATE_OP:\r
-      //\r
-      // Date elements come in as a Year, Month, Day.  We need to process them as a country-based\r
-      // Order.  It is much easier to do it here than anywhere else.\r
-      //\r
-      // For US standards - we want Month/Day/Year, thus we advance "i" +1, +2, +0 while CurrTag is +0, +1, +2\r
-      //\r
-      GetNumericHeader (\r
-        &FormTags->Tags[CurrTag],\r
-        FormData,\r
-        (UINT16) (Index + TagLength),\r
-        (UINT16) 0,\r
-        FileFormTags,\r
-        CurrentVariable\r
-        );\r
-\r
-      //\r
-      // The current language selected + the Date operand\r
-      //\r
-      FormTags->Tags[CurrTag + 1].Operand = FormData[Index];\r
-      GetNumericHeader (\r
-        &FormTags->Tags[CurrTag + 1],\r
-        FormData,\r
-        (UINT16) (Index + TagLength + FormData[Index + TagLength + 1]),\r
-        (UINT16) 0,\r
-        FileFormTags,\r
-        CurrentVariable\r
-        );\r
-\r
-      //\r
-      // The current language selected + the Date operand\r
-      //\r
-      FormTags->Tags[CurrTag + 2].Operand = FormData[Index];\r
-      GetNumericHeader (&FormTags->Tags[CurrTag + 2], FormData, Index, (UINT16) 1, FileFormTags, CurrentVariable);\r
-\r
-      CurrTag   = (INT16) (CurrTag + 2);\r
-\r
-      Index     = (UINT16) (Index + TagLength);\r
-      //\r
-      // get the length\r
-      //\r
-      TagLength = FormData[Index + 1];\r
-      Index     = (UINT16) (Index + TagLength);\r
-      //\r
-      // get the length\r
-      //\r
-      TagLength = FormData[Index + 1];\r
-      break;\r
-\r
-    case EFI_IFR_TIME_OP:\r
-      GetNumericHeader (&FormTags->Tags[CurrTag], FormData, Index, (UINT16) 0, FileFormTags, CurrentVariable);\r
-\r
-      if (Count == 2) {\r
-        //\r
-        // Override the GetQuestionHeader information - date/time are treated very differently\r
-        //\r
-        FormTags->Tags[CurrTag].NumberOfLines = 1;\r
-        Count = 0;\r
-      } else {\r
-        //\r
-        // The premise is that every date/time op-code have 3 elements, the first 2 have 0 lines\r
-        // associated with them, and the third has 1 line to allow to space beyond the choice.\r
-        //\r
-        Count++;\r
-      }\r
-      break;\r
-\r
-    case EFI_IFR_PASSWORD_OP:\r
-    case EFI_IFR_STRING_OP:\r
-      GetQuestionHeader (&FormTags->Tags[CurrTag], FormData, Index, FileFormTags, CurrentVariable);\r
-      IfrToFormTag (FormData[Index], &FormTags->Tags[CurrTag], (VOID *) &FormData[Index], NULL);\r
-      break;\r
-\r
-    case EFI_IFR_INCONSISTENT_IF_OP:\r
-    case EFI_IFR_SUPPRESS_IF_OP:\r
-    case EFI_IFR_GRAYOUT_IF_OP:\r
-      ConsistencyId++;\r
-      break;\r
-\r
-    case EFI_IFR_EQ_ID_VAL_OP:\r
-      IfrToFormTag (FormData[Index], &FormTags->Tags[CurrTag], (VOID *) &FormData[Index], NULL);\r
-      FormTags->Tags[CurrTag].ConsistencyId = ConsistencyId;\r
-      break;\r
-\r
-    case EFI_IFR_EQ_VAR_VAL_OP:\r
-      IfrToFormTag (FormData[Index], &FormTags->Tags[CurrTag], (VOID *) &FormData[Index], NULL);\r
-      FormTags->Tags[CurrTag].ConsistencyId = ConsistencyId;\r
-      break;\r
-\r
-    case EFI_IFR_EQ_ID_ID_OP:\r
-      IfrToFormTag (FormData[Index], &FormTags->Tags[CurrTag], (VOID *) &FormData[Index], NULL);\r
-      FormTags->Tags[CurrTag].ConsistencyId = ConsistencyId;\r
-      break;\r
-\r
-    case EFI_IFR_AND_OP:\r
-    case EFI_IFR_OR_OP:\r
-    case EFI_IFR_NOT_OP:\r
-    case EFI_IFR_TRUE_OP:\r
-    case EFI_IFR_FALSE_OP:\r
-    case EFI_IFR_GT_OP:\r
-    case EFI_IFR_GE_OP:\r
-      FormTags->Tags[CurrTag].ConsistencyId = ConsistencyId;\r
-      break;\r
-\r
-    case EFI_IFR_EQ_ID_LIST_OP:\r
-      IfrToFormTag (FormData[Index], &FormTags->Tags[CurrTag], (VOID *) &FormData[Index], NULL);\r
-\r
-      FormTags->Tags[CurrTag].ConsistencyId = ConsistencyId;\r
-      break;\r
-\r
-    default:\r
-      break;\r
-    }\r
-    //\r
-    // End of switch\r
-    //\r
-    if (Finished) {\r
-      break;\r
-    }\r
-    //\r
-    // Per spec., we ignore ops that we don't know how to deal with.  Skip to next tag\r
-    //\r
-    Index = (UINT16) (Index + TagLength);\r
-  }\r
-  //\r
-  // End of Index\r
-  //\r
-  return Status;\r
-}\r
-\r
-STATIC\r
-VOID\r
-ExtractDynamicFormHandle (\r
-  IN  UI_MENU_OPTION              *Selection,\r
-  IN  UINT8                       *CallbackData,\r
-  IN  EFI_FILE_FORM_TAGS          *FileFormTagsHead,\r
-  IN  UINTN                       IdValue,\r
-  OUT UINT16                      *FormHandle,\r
-  OUT UINT16                      *TitleToken,\r
-  OUT EFI_FORM_TAGS               *FormTags\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  The function does the most of the works when the EFI_TAG that\r
-  user selects on is EFI_IFR_FLAG_INTERACTIVE or EFI_IFR_PASSWORD_OP:\r
-  invoke CallBack, update the new form data.\r
-\r
-Arguments:\r
-\r
-  Selection         - The current selection of the form.\r
-  CallbackData      - The pointer to host the data passed back by the callback function.\r
-  FileFormTagsHead  - Prompt string token of the one-of box\r
-  IdValue           - The current page number.\r
-  FormHandle        - Output the  the handle of the form.\r
-  TitleToken        - Output the  TitleToken of the new page.\r
-  FormTags          - Output the  FormFags of the new page.\r
-\r
-Returns:\r
-  VOID\r
-\r
---*/\r
-{\r
-  UINTN                       Index;\r
-  UINTN                       BackupIndex;\r
-  EFI_FILE_FORM_TAGS          *FileFormTags;\r
-  EFI_FORM_TAGS               *LocalTags;\r
-  EFI_FORM_CALLBACK_PROTOCOL  *FormCallback;\r
-  EFI_STATUS                  Status;\r
-  UINTN                       Length;\r
-  UINT8                       *Buffer;\r
-  EFI_PHYSICAL_ADDRESS        CallbackHandle;\r
-  EFI_GUID                    TagGuid;\r
-  UINT16                      TargetPage;\r
-  EFI_HII_CALLBACK_PACKET     *Packet;\r
-  UINTN                       ScreenSize;\r
-  CHAR16                      NullCharacter;\r
-  EFI_INPUT_KEY               Key;\r
-  UINT16                      ConsistencyId;\r
-  UINT16                      CurrentVariable;\r
-  EFI_VARIABLE_DEFINITION     *VariableDefinition;\r
-  EFI_IFR_DATA_ENTRY          *DataEntry;\r
-\r
-  VariableDefinition  = NULL;\r
-  NullCharacter       = CHAR_NULL;\r
-\r
-  CurrentVariable     = 0;\r
-  FileFormTags        = FileFormTagsHead;\r
-  Length              = 0;\r
-  CallbackHandle      = 0;\r
-  TargetPage          = (UINT16) IdValue;\r
-  Packet              = NULL;\r
-  ConsistencyId       = 0;\r
-\r
-  //\r
-  // Advance FileFormTags to the correct file's tag information.\r
-  // For instance, if Selection->IfrNumber is 3, that means the 4th\r
-  // file (0-based) in the FileFormTags linked-list contains the tag\r
-  // information.\r
-  //\r
-  for (Index = 0; Index < Selection->IfrNumber; Index++) {\r
-    FileFormTags = FileFormTags->NextFile;\r
-  }\r
-\r
-  LocalTags = &FileFormTags->FormTags;\r
-\r
-  //\r
-  // Advance Index to the FormOp with the correct ID value\r
-  //\r
-  for (; LocalTags->Next != NULL; LocalTags = LocalTags->Next) {\r
-    if ((LocalTags->Tags[0].CallbackHandle != 0) && (CallbackHandle == 0)) {\r
-      CallbackHandle = LocalTags->Tags[0].CallbackHandle;\r
-      CopyMem (&TagGuid, &LocalTags->Tags[0].GuidValue, sizeof (EFI_GUID));\r
-    }\r
-\r
-    for (Index = 0; LocalTags->Tags[Index].Operand != EFI_IFR_FORM_OP; Index++)\r
-      ;\r
-    if (LocalTags->Tags[Index].Id == IdValue) {\r
-      break;\r
-    }\r
-  }\r
-  //\r
-  // If we are going to callback on a non-goto opcode, make sure we don't change pages\r
-  //\r
-  if (Selection->ThisTag->Operand != EFI_IFR_REF_OP) {\r
-    TargetPage = Selection->FormId;\r
-  }\r
-  //\r
-  // The first tag below should be the form op-code.  We need to store away the\r
-  // current variable setting to ensure if we have to reload the page, that we\r
-  // can correctly restore the values for the active variable\r
-  //\r
-  CurrentVariable = Selection->Tags[0].VariableNumber;\r
-\r
-  //\r
-  // Remember that dynamic pages in an environment where all pages are not\r
-  // dynamic require us to call back to the user to give them an opportunity\r
-  // to register fresh information in the HII database so that we can extract it.\r
-  //\r
-  Status = gBS->HandleProtocol (\r
-                  (VOID *) (UINTN) CallbackHandle,\r
-                  &gEfiFormCallbackProtocolGuid,\r
-                  (VOID **) &FormCallback\r
-                  );\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    FreePool (LocalTags->Tags);\r
-    return ;\r
-  }\r
-\r
-  ExtractRequestedNvMap (FileFormTags, CurrentVariable, &VariableDefinition);\r
-\r
-  if (Selection->ThisTag->Flags & (EFI_IFR_FLAG_INTERACTIVE | EFI_IFR_FLAG_NV_ACCESS)) {\r
-    ((EFI_IFR_DATA_ARRAY *) CallbackData)->NvRamMap = VariableDefinition->NvRamMap;\r
-  } else {\r
-    ((EFI_IFR_DATA_ARRAY *) CallbackData)->NvRamMap = NULL;\r
-  }\r
-\r
-  if ((FormCallback != NULL) && (FormCallback->Callback != NULL)) {\r
-    Status = FormCallback->Callback (\r
-                            FormCallback,\r
-                            Selection->ThisTag->Key,\r
-                            (EFI_IFR_DATA_ARRAY *) CallbackData,\r
-                            &Packet\r
-                            );\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    //\r
-    // Restore Previous Value\r
-    //\r
-    CopyMem (\r
-      &VariableDefinition->NvRamMap[Selection->ThisTag->StorageStart],\r
-      gPreviousValue,\r
-      Selection->ThisTag->StorageWidth\r
-      );\r
-\r
-    if (Packet != NULL) {\r
-      //\r
-      // Upon error, we will likely receive a string to print out\r
-      //\r
-      ScreenSize = GetStringWidth (Packet->String) / 2;\r
-\r
-      //\r
-      // Display error popup\r
-      //\r
-      CreatePopUp (ScreenSize, 3, &NullCharacter, Packet->String, &NullCharacter);\r
-\r
-      do {\r
-        Status = WaitForKeyStroke (&Key);\r
-      } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-    } else {\r
-      UpdateStatusBar (INPUT_ERROR, (UINT8) 0, TRUE);\r
-    }\r
-\r
-  } else {\r
-    if (Packet != NULL) {\r
-      //\r
-      // We need to on a non-error, look in the outbound Packet for information and update the NVRAM\r
-      // location associated with the op-code specified there.  This is used on single op-code instances\r
-      // and not for when a hyperlink sent us a whole page of data.\r
-      //\r
-      DataEntry = (EFI_IFR_DATA_ENTRY *) (&Packet->DataArray + 1);\r
-      if (Packet->DataArray.EntryCount == 1) {\r
-        switch (DataEntry->OpCode) {\r
-        case EFI_IFR_STRING_OP:\r
-        case EFI_IFR_NUMERIC_OP:\r
-        case EFI_IFR_ORDERED_LIST_OP:\r
-        case EFI_IFR_ONE_OF_OP:\r
-        case EFI_IFR_CHECKBOX_OP:\r
-          CopyMem (\r
-            &VariableDefinition->NvRamMap[Selection->ThisTag->StorageStart],\r
-            &DataEntry->Data,\r
-            Selection->ThisTag->StorageWidth\r
-            );\r
-          break;\r
-\r
-        case EFI_IFR_NV_ACCESS_COMMAND:\r
-          CopyMem (\r
-            &VariableDefinition->NvRamMap[((EFI_IFR_NV_DATA *) Packet)->QuestionId],\r
-            ((EFI_IFR_NV_DATA *) Packet) + 1,\r
-            ((EFI_IFR_NV_DATA *) Packet)->StorageWidth\r
-            );\r
-          break;\r
-\r
-        }\r
-\r
-        if (DataEntry->Flags & RESET_REQUIRED) {\r
-          gResetRequired = TRUE;\r
-        }\r
-\r
-        if (DataEntry->Flags & EXIT_REQUIRED) {\r
-          gExitRequired = TRUE;\r
-        }\r
-\r
-        if (DataEntry->Flags & SAVE_REQUIRED) {\r
-          gSaveRequired = TRUE;\r
-        }\r
-\r
-        if (DataEntry->Flags & NV_CHANGED) {\r
-          gNvUpdateRequired = TRUE;\r
-        }\r
-\r
-        if (DataEntry->Flags & NV_NOT_CHANGED) {\r
-          gNvUpdateRequired = FALSE;\r
-        }\r
-      }\r
-    }\r
-  }\r
-\r
-  if (Packet != NULL) {\r
-    FreePool (Packet);\r
-  }\r
-\r
-  for (BackupIndex = 0; LocalTags->Tags[BackupIndex].Operand != EFI_IFR_END_FORM_OP; BackupIndex++) {\r
-    switch (LocalTags->Tags[BackupIndex].Operand) {\r
-    case EFI_IFR_EQ_VAR_VAL_OP:\r
-    case EFI_IFR_EQ_ID_VAL_OP:\r
-    case EFI_IFR_EQ_ID_ID_OP:\r
-    case EFI_IFR_AND_OP:\r
-    case EFI_IFR_OR_OP:\r
-    case EFI_IFR_NOT_OP:\r
-    case EFI_IFR_TRUE_OP:\r
-    case EFI_IFR_FALSE_OP:\r
-    case EFI_IFR_GT_OP:\r
-    case EFI_IFR_GE_OP:\r
-    case EFI_IFR_EQ_ID_LIST_OP:\r
-      //\r
-      // If we encountered a ConsistencyId value, on this page they will be incremental\r
-      // So register the first value we encounter.  We will pass this in when we re-create this page\r
-      //\r
-      if ((LocalTags->Tags[BackupIndex].ConsistencyId != 0) && (ConsistencyId == 0)) {\r
-        ConsistencyId = (UINT16) (LocalTags->Tags[BackupIndex].ConsistencyId - 1);\r
-      }\r
-      break;\r
-    }\r
-  }\r
-  //\r
-  // Delete the buffer associated with previous dynamic page\r
-  // We will re-allocate a buffer....\r
-  //\r
-  FreePool (LocalTags->Tags);\r
-\r
-  Length  = 0xF000;\r
-  Buffer  = AllocateZeroPool (Length);\r
-  ASSERT (Buffer != NULL);\r
-\r
-  //\r
-  // Get the form that was updated by the callback\r
-  //\r
-  Hii->GetForms (\r
-        Hii,\r
-        Selection->Handle,\r
-        TargetPage,\r
-        &Length,\r
-        Buffer\r
-        );\r
-\r
-  //\r
-  // Ok, we have the new page.....now we must purge the old page and re-allocate\r
-  // the tag page with the new data\r
-  //\r
-  UpdateNewTagData (\r
-    Buffer,\r
-    ConsistencyId,\r
-    CurrentVariable,\r
-    LocalTags,\r
-    FileFormTags\r
-    );\r
-\r
-  //\r
-  // return the Form Id, Text, and the File's FormTags structure\r
-  //\r
-  *FormHandle                       = LocalTags->Tags[0].Id;\r
-  *TitleToken                       = LocalTags->Tags[0].Text;\r
-  *FormTags                         = *LocalTags;\r
-\r
-  FormTags->Tags[0].CallbackHandle  = CallbackHandle;\r
-  CopyMem (&FormTags->Tags[0].GuidValue, &TagGuid, sizeof (EFI_GUID));\r
-\r
-  return ;\r
-}\r
-\r
-UI_MENU_OPTION *\r
-SetupBrowser (\r
-  IN  UI_MENU_OPTION              *Selection,\r
-  IN  BOOLEAN                     Callback,\r
-  IN  EFI_FILE_FORM_TAGS          *FileFormTagsHead,\r
-  IN  UINT8                       *CallbackData\r
-  )\r
-{\r
-  UINT16        FormHandle;\r
-  UINT16        TitleToken;\r
-  EFI_FORM_TAGS FormTags;\r
-\r
-  gEntryNumber  = -1;\r
-  gLastOpr      = FALSE;\r
-  //\r
-  // Displays the Header and Footer borders\r
-  //\r
-  DisplayPageFrame ();\r
-\r
-  //\r
-  // Id of 0 yields the getting of the top form whatever the ID is.  Usually the first form in the IFR\r
-  //\r
-  ExtractFormHandle (Selection, FileFormTagsHead, 0, &FormHandle, &TitleToken, &FormTags);\r
-\r
-  Selection = DisplayForm (Selection, FormHandle, TitleToken, FormTags, FileFormTagsHead, CallbackData);\r
-\r
-  //\r
-  // If selection is null use the former selection\r
-  //\r
-  if (Selection == NULL) {\r
-    return Selection;\r
-  }\r
-\r
-  if (Callback) {\r
-    return Selection;\r
-  }\r
-\r
-  while (Selection->Tags != NULL) {\r
-    if (Selection->Previous) {\r
-      ExtractFormHandle (Selection, FileFormTagsHead, Selection->FormId, &FormHandle, &TitleToken, &FormTags);\r
-    } else {\r
-      //\r
-      // True if a hyperlink/jump is selected\r
-      //\r
-      if (Selection->ThisTag->Operand == EFI_IFR_REF_OP && Selection->ThisTag->Id != 0x0000) {\r
-        if (Selection->ThisTag->Flags & EFI_IFR_FLAG_INTERACTIVE) {\r
-          ExtractDynamicFormHandle (\r
-            Selection,\r
-            CallbackData,\r
-            FileFormTagsHead,\r
-            Selection->ThisTag->Id,\r
-            &FormHandle,\r
-            &TitleToken,\r
-            &FormTags\r
-            );\r
-          goto DisplayPage;\r
-        } else {\r
-          ExtractFormHandle (Selection, FileFormTagsHead, Selection->ThisTag->Id, &FormHandle, &TitleToken, &FormTags);\r
-          goto DisplayPage;\r
-        }\r
-      }\r
-\r
-      if ((Selection->ThisTag->Flags & EFI_IFR_FLAG_INTERACTIVE) &&\r
-          (Selection->ThisTag->Operand != EFI_IFR_PASSWORD_OP)\r
-          ) {\r
-        ExtractDynamicFormHandle (\r
-          Selection,\r
-          CallbackData,\r
-          FileFormTagsHead,\r
-          Selection->FormId,\r
-          &FormHandle,\r
-          &TitleToken,\r
-          &FormTags\r
-          );\r
-      } else {\r
-        ExtractFormHandle (Selection, FileFormTagsHead, Selection->FormId, &FormHandle, &TitleToken, &FormTags);\r
-      }\r
-    }\r
-\r
-DisplayPage:\r
-    //\r
-    // Displays the Header and Footer borders\r
-    //\r
-    DisplayPageFrame ();\r
-\r
-    Selection = DisplayForm (Selection, FormHandle, TitleToken, FormTags, FileFormTagsHead, CallbackData);\r
-\r
-    if (Selection == NULL) {\r
-      break;\r
-    }\r
-  };\r
-\r
-  return Selection;\r
-}\r