+++ /dev/null
-/*++\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