mirror of https://github.com/acidanthera/audk.git
653 lines
18 KiB
C
653 lines
18 KiB
C
/** @file
|
|
FormDiplay protocol to show Form
|
|
|
|
Copyright (c) 2013 - 2014, Intel Corporation. All rights reserved.<BR>
|
|
This program and the accompanying materials are licensed and made available under
|
|
the terms and conditions of the BSD License that accompanies this distribution.
|
|
The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php.
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
#ifndef __FORM_DISPLAY_H__
|
|
#define __FORM_DISPLAY_H__
|
|
|
|
|
|
#include <Library/UefiBootServicesTableLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/BaseLib.h>
|
|
#include <Library/HiiLib.h>
|
|
#include <Library/MemoryAllocationLib.h>
|
|
#include <Library/PrintLib.h>
|
|
#include <Library/CustomizedDisplayLib.h>
|
|
|
|
#include <Protocol/FormBrowserEx2.h>
|
|
#include <Protocol/SimpleTextIn.h>
|
|
#include <Protocol/DisplayProtocol.h>
|
|
|
|
#include <Guid/MdeModuleHii.h>
|
|
|
|
//
|
|
// This is the generated header file which includes whatever needs to be exported (strings + IFR)
|
|
//
|
|
extern UINT8 DisplayEngineStrings[];
|
|
extern EFI_SCREEN_DESCRIPTOR gStatementDimensions;
|
|
extern USER_INPUT *gUserInput;
|
|
extern FORM_DISPLAY_ENGINE_FORM *gFormData;
|
|
extern EFI_HII_HANDLE gHiiHandle;
|
|
extern UINT16 gDirection;
|
|
extern LIST_ENTRY gMenuOption;
|
|
|
|
//
|
|
// Browser Global Strings
|
|
//
|
|
extern CHAR16 *gSaveFailed;
|
|
extern CHAR16 *gPromptForData;
|
|
extern CHAR16 *gPromptForPassword;
|
|
extern CHAR16 *gPromptForNewPassword;
|
|
extern CHAR16 *gConfirmPassword;
|
|
extern CHAR16 *gConfirmError;
|
|
extern CHAR16 *gPassowordInvalid;
|
|
extern CHAR16 *gPressEnter;
|
|
extern CHAR16 *gEmptyString;
|
|
extern CHAR16 *gMiniString;
|
|
extern CHAR16 *gOptionMismatch;
|
|
extern CHAR16 *gFormSuppress;
|
|
extern CHAR16 *gProtocolNotFound;
|
|
|
|
extern CHAR16 gPromptBlockWidth;
|
|
extern CHAR16 gOptionBlockWidth;
|
|
extern CHAR16 gHelpBlockWidth;
|
|
extern CHAR16 *mUnknownString;
|
|
extern BOOLEAN gMisMatch;
|
|
|
|
//
|
|
// Screen definitions
|
|
//
|
|
|
|
#define LEFT_SKIPPED_COLUMNS 3
|
|
#define SCROLL_ARROW_HEIGHT 1
|
|
#define POPUP_PAD_SPACE_COUNT 5
|
|
#define POPUP_FRAME_WIDTH 2
|
|
|
|
#define UPPER_LOWER_CASE_OFFSET 0x20
|
|
|
|
//
|
|
// Display definitions
|
|
//
|
|
#define LEFT_ONEOF_DELIMITER L'<'
|
|
#define RIGHT_ONEOF_DELIMITER L'>'
|
|
|
|
#define LEFT_NUMERIC_DELIMITER L'['
|
|
#define RIGHT_NUMERIC_DELIMITER L']'
|
|
|
|
#define LEFT_CHECKBOX_DELIMITER L'['
|
|
#define RIGHT_CHECKBOX_DELIMITER L']'
|
|
|
|
#define CHECK_ON L'X'
|
|
#define CHECK_OFF L' '
|
|
|
|
#define TIME_SEPARATOR L':'
|
|
#define DATE_SEPARATOR L'/'
|
|
|
|
#define SUBTITLE_INDENT 2
|
|
|
|
//
|
|
// This is the Input Error Message
|
|
//
|
|
#define INPUT_ERROR 1
|
|
|
|
//
|
|
// This is the NV RAM update required Message
|
|
//
|
|
#define NV_UPDATE_REQUIRED 2
|
|
//
|
|
// Time definitions
|
|
//
|
|
#define ONE_SECOND 10000000
|
|
|
|
//
|
|
// It take 23 characters including the NULL to print a 64 bits number with "[" and "]".
|
|
// pow(2, 64) = [18446744073709551616]
|
|
// with extra '-' flat, set the width to 24.
|
|
//
|
|
#define MAX_NUMERIC_INPUT_WIDTH 24
|
|
|
|
#define EFI_HII_EXPRESSION_INCONSISTENT_IF 0
|
|
#define EFI_HII_EXPRESSION_NO_SUBMIT_IF 1
|
|
#define EFI_HII_EXPRESSION_GRAY_OUT_IF 2
|
|
#define EFI_HII_EXPRESSION_SUPPRESS_IF 3
|
|
#define EFI_HII_EXPRESSION_DISABLE_IF 4
|
|
|
|
//
|
|
// Character definitions
|
|
//
|
|
#define CHAR_SPACE 0x0020
|
|
|
|
#define FORM_DISPLAY_DRIVER_SIGNATURE SIGNATURE_32 ('F', 'D', 'D', 'V')
|
|
typedef struct {
|
|
UINT32 Signature;
|
|
|
|
EFI_HANDLE Handle;
|
|
|
|
//
|
|
// Produced protocol
|
|
//
|
|
EDKII_FORM_DISPLAY_ENGINE_PROTOCOL FromDisplayProt;
|
|
} FORM_DISPLAY_DRIVER_PRIVATE_DATA;
|
|
|
|
|
|
typedef enum {
|
|
UiNoOperation,
|
|
UiSelect,
|
|
UiUp,
|
|
UiDown,
|
|
UiLeft,
|
|
UiRight,
|
|
UiReset,
|
|
UiPrevious,
|
|
UiPageUp,
|
|
UiPageDown,
|
|
UiHotKey,
|
|
UiMaxOperation
|
|
} UI_SCREEN_OPERATION;
|
|
|
|
typedef enum {
|
|
CfInitialization,
|
|
CfCheckSelection,
|
|
CfRepaint,
|
|
CfRefreshHighLight,
|
|
CfUpdateHelpString,
|
|
CfPrepareToReadKey,
|
|
CfReadKey,
|
|
CfScreenOperation,
|
|
CfUiSelect,
|
|
CfUiReset,
|
|
CfUiLeft,
|
|
CfUiRight,
|
|
CfUiUp,
|
|
CfUiPageUp,
|
|
CfUiPageDown,
|
|
CfUiDown,
|
|
CfUiNoOperation,
|
|
CfExit,
|
|
CfUiHotKey,
|
|
CfMaxControlFlag
|
|
} UI_CONTROL_FLAG;
|
|
|
|
typedef enum {
|
|
UIEventNone,
|
|
UIEventKey,
|
|
UIEventTimeOut,
|
|
UIEventDriver
|
|
} UI_EVENT_TYPE;
|
|
|
|
typedef struct {
|
|
UINT16 ScanCode;
|
|
UI_SCREEN_OPERATION ScreenOperation;
|
|
} SCAN_CODE_TO_SCREEN_OPERATION;
|
|
|
|
typedef struct {
|
|
UI_SCREEN_OPERATION ScreenOperation;
|
|
UI_CONTROL_FLAG ControlFlag;
|
|
} SCREEN_OPERATION_T0_CONTROL_FLAG;
|
|
|
|
typedef struct {
|
|
EFI_HII_HANDLE HiiHandle;
|
|
UINT16 FormId;
|
|
|
|
//
|
|
// Info for the highlight question.
|
|
// HLT means highlight
|
|
//
|
|
// If one statement has questionid, save questionid info to find the question.
|
|
// If one statement not has questionid info, save the opcode info to find the
|
|
// statement. If more than one statement has same opcode in one form(just like
|
|
// empty subtitle info may has more than one info one form), also use Index
|
|
// info to find the statement.
|
|
//
|
|
EFI_QUESTION_ID HLTQuestionId;
|
|
EFI_IFR_OP_HEADER *HLTOpCode;
|
|
UINTN HLTIndex;
|
|
UINTN HLTSequence;
|
|
|
|
//
|
|
// Info for the top of screen question.
|
|
// TOS means Top Of Screen
|
|
//
|
|
EFI_QUESTION_ID TOSQuestionId;
|
|
EFI_IFR_OP_HEADER *TOSOpCode;
|
|
UINTN TOSIndex;
|
|
|
|
UINT16 SkipValue;
|
|
} DISPLAY_HIGHLIGHT_MENU_INFO;
|
|
|
|
typedef struct {
|
|
EFI_EVENT SyncEvent;
|
|
UINT8 *TimeOut;
|
|
CHAR16 *ErrorInfo;
|
|
} WARNING_IF_CONTEXT;
|
|
|
|
#define UI_MENU_OPTION_SIGNATURE SIGNATURE_32 ('u', 'i', 'm', 'm')
|
|
|
|
typedef struct {
|
|
UINTN Signature;
|
|
LIST_ENTRY Link;
|
|
|
|
EFI_HII_HANDLE Handle;
|
|
FORM_DISPLAY_ENGINE_STATEMENT *ThisTag;
|
|
UINT16 EntryNumber;
|
|
|
|
UINTN Row;
|
|
UINTN Col;
|
|
UINTN OptCol;
|
|
CHAR16 *Description;
|
|
UINTN Skip; // Number of lines
|
|
|
|
//
|
|
// Display item sequence for date/time
|
|
// Date: Month/Day/Year
|
|
// Sequence: 0 1 2
|
|
//
|
|
// Time: Hour : Minute : Second
|
|
// Sequence: 0 1 2
|
|
//
|
|
//
|
|
UINTN Sequence;
|
|
|
|
BOOLEAN GrayOut;
|
|
BOOLEAN ReadOnly;
|
|
|
|
//
|
|
// Whether user could change value of this item
|
|
//
|
|
BOOLEAN IsQuestion;
|
|
BOOLEAN NestInStatement;
|
|
} UI_MENU_OPTION;
|
|
|
|
#define MENU_OPTION_FROM_LINK(a) CR (a, UI_MENU_OPTION, Link, UI_MENU_OPTION_SIGNATURE)
|
|
|
|
/**
|
|
Print Question Value according to it's storage width and display attributes.
|
|
|
|
@param Question The Question to be printed.
|
|
@param FormattedNumber Buffer for output string.
|
|
@param BufferSize The FormattedNumber buffer size in bytes.
|
|
|
|
@retval EFI_SUCCESS Print success.
|
|
@retval EFI_BUFFER_TOO_SMALL Buffer size is not enough for formatted number.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
PrintFormattedNumber (
|
|
IN FORM_DISPLAY_ENGINE_STATEMENT *Question,
|
|
IN OUT CHAR16 *FormattedNumber,
|
|
IN UINTN BufferSize
|
|
);
|
|
|
|
/**
|
|
Set value of a data element in an Array by its Index.
|
|
|
|
@param Array The data array.
|
|
@param Type Type of the data in this array.
|
|
@param Index Zero based index for data in this array.
|
|
@param Value The value to be set.
|
|
|
|
**/
|
|
VOID
|
|
SetArrayData (
|
|
IN VOID *Array,
|
|
IN UINT8 Type,
|
|
IN UINTN Index,
|
|
IN UINT64 Value
|
|
);
|
|
|
|
/**
|
|
Return data element in an Array by its Index.
|
|
|
|
@param Array The data array.
|
|
@param Type Type of the data in this array.
|
|
@param Index Zero based index for data in this array.
|
|
|
|
@retval Value The data to be returned
|
|
|
|
**/
|
|
UINT64
|
|
GetArrayData (
|
|
IN VOID *Array,
|
|
IN UINT8 Type,
|
|
IN UINTN Index
|
|
);
|
|
|
|
/**
|
|
Search an Option of a Question by its value.
|
|
|
|
@param Question The Question
|
|
@param OptionValue Value for Option to be searched.
|
|
|
|
@retval Pointer Pointer to the found Option.
|
|
@retval NULL Option not found.
|
|
|
|
**/
|
|
DISPLAY_QUESTION_OPTION *
|
|
ValueToOption (
|
|
IN FORM_DISPLAY_ENGINE_STATEMENT *Question,
|
|
IN EFI_HII_VALUE *OptionValue
|
|
);
|
|
|
|
/**
|
|
Compare two Hii value.
|
|
|
|
@param Value1 Expression value to compare on left-hand.
|
|
@param Value2 Expression value to compare on right-hand.
|
|
@param Result Return value after compare.
|
|
retval 0 Two operators equal.
|
|
return Positive value if Value1 is greater than Value2.
|
|
retval Negative value if Value1 is less than Value2.
|
|
@param HiiHandle Only required for string compare.
|
|
|
|
@retval other Could not perform compare on two values.
|
|
@retval EFI_SUCCESS Compare the value success.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
CompareHiiValue (
|
|
IN EFI_HII_VALUE *Value1,
|
|
IN EFI_HII_VALUE *Value2,
|
|
OUT INTN *Result,
|
|
IN EFI_HII_HANDLE HiiHandle OPTIONAL
|
|
);
|
|
|
|
/**
|
|
Draw a pop up windows based on the dimension, number of lines and
|
|
strings specified.
|
|
|
|
@param RequestedWidth The width of the pop-up.
|
|
@param NumberOfLines The number of lines.
|
|
@param ... A series of text strings that displayed in the pop-up.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
CreateMultiStringPopUp (
|
|
IN UINTN RequestedWidth,
|
|
IN UINTN NumberOfLines,
|
|
...
|
|
);
|
|
|
|
/**
|
|
Will copy LineWidth amount of a string in the OutputString buffer and return the
|
|
number of CHAR16 characters that were copied into the OutputString buffer.
|
|
The output string format is:
|
|
Glyph Info + String info + '\0'.
|
|
|
|
In the code, it deals \r,\n,\r\n same as \n\r, also it not process the \r or \g.
|
|
|
|
@param InputString String description for this option.
|
|
@param LineWidth Width of the desired string to extract in CHAR16
|
|
characters
|
|
@param GlyphWidth The glyph width of the begin of the char in the string.
|
|
@param Index Where in InputString to start the copy process
|
|
@param OutputString Buffer to copy the string into
|
|
|
|
@return Returns the number of CHAR16 characters that were copied into the OutputString
|
|
buffer, include extra glyph info and '\0' info.
|
|
|
|
**/
|
|
UINT16
|
|
GetLineByWidth (
|
|
IN CHAR16 *InputString,
|
|
IN UINT16 LineWidth,
|
|
IN OUT UINT16 *GlyphWidth,
|
|
IN OUT UINTN *Index,
|
|
OUT CHAR16 **OutputString
|
|
);
|
|
|
|
|
|
/**
|
|
Get the string based on the StringId and HII Package List Handle.
|
|
|
|
@param Token The String's ID.
|
|
@param HiiHandle The Hii handle for this string package.
|
|
|
|
@return The output string.
|
|
|
|
**/
|
|
CHAR16 *
|
|
GetToken (
|
|
IN EFI_STRING_ID Token,
|
|
IN EFI_HII_HANDLE HiiHandle
|
|
);
|
|
|
|
/**
|
|
Count the storage space of a Unicode string.
|
|
|
|
This function handles the Unicode string with NARROW_CHAR
|
|
and WIDE_CHAR control characters. NARROW_HCAR and WIDE_CHAR
|
|
does not count in the resultant output. If a WIDE_CHAR is
|
|
hit, then 2 Unicode character will consume an output storage
|
|
space with size of CHAR16 till a NARROW_CHAR is hit.
|
|
|
|
If String is NULL, then ASSERT ().
|
|
|
|
@param String The input string to be counted.
|
|
|
|
@return Storage space for the input string.
|
|
|
|
**/
|
|
UINTN
|
|
GetStringWidth (
|
|
IN CHAR16 *String
|
|
);
|
|
|
|
/**
|
|
This routine reads a numeric value from the user input.
|
|
|
|
@param MenuOption Pointer to the current input menu.
|
|
|
|
@retval EFI_SUCCESS If numerical input is read successfully
|
|
@retval EFI_DEVICE_ERROR If operation fails
|
|
|
|
**/
|
|
EFI_STATUS
|
|
GetNumericInput (
|
|
IN UI_MENU_OPTION *MenuOption
|
|
);
|
|
|
|
/**
|
|
Get string or password input from user.
|
|
|
|
@param MenuOption Pointer to the current input menu.
|
|
@param Prompt The prompt string shown on popup window.
|
|
@param StringPtr Old user input and destination for use input string.
|
|
|
|
@retval EFI_SUCCESS If string input is read successfully
|
|
@retval EFI_DEVICE_ERROR If operation fails
|
|
|
|
**/
|
|
EFI_STATUS
|
|
ReadString (
|
|
IN UI_MENU_OPTION *MenuOption,
|
|
IN CHAR16 *Prompt,
|
|
IN OUT CHAR16 *StringPtr
|
|
);
|
|
|
|
/**
|
|
Draw a pop up windows based on the dimension, number of lines and
|
|
strings specified.
|
|
|
|
@param RequestedWidth The width of the pop-up.
|
|
@param NumberOfLines The number of lines.
|
|
@param Marker The variable argument list for the list of string to be printed.
|
|
|
|
**/
|
|
VOID
|
|
CreateSharedPopUp (
|
|
IN UINTN RequestedWidth,
|
|
IN UINTN NumberOfLines,
|
|
IN VA_LIST Marker
|
|
);
|
|
|
|
/**
|
|
Wait for a key to be pressed by user.
|
|
|
|
@param Key The key which is pressed by user.
|
|
|
|
@retval EFI_SUCCESS The function always completed successfully.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
WaitForKeyStroke (
|
|
OUT EFI_INPUT_KEY *Key
|
|
);
|
|
|
|
/**
|
|
Get selection for OneOf and OrderedList (Left/Right will be ignored).
|
|
|
|
@param MenuOption Pointer to the current input menu.
|
|
|
|
@retval EFI_SUCCESS If Option input is processed successfully
|
|
@retval EFI_DEVICE_ERROR If operation fails
|
|
|
|
**/
|
|
EFI_STATUS
|
|
GetSelectionInputPopUp (
|
|
IN UI_MENU_OPTION *MenuOption
|
|
);
|
|
|
|
/**
|
|
Process the help string: Split StringPtr to several lines of strings stored in
|
|
FormattedString and the glyph width of each line cannot exceed gHelpBlockWidth.
|
|
|
|
@param StringPtr The entire help string.
|
|
@param FormattedString The oupput formatted string.
|
|
@param EachLineWidth The max string length of each line in the formatted string.
|
|
@param RowCount TRUE: if Question is selected.
|
|
|
|
**/
|
|
UINTN
|
|
ProcessHelpString (
|
|
IN CHAR16 *StringPtr,
|
|
OUT CHAR16 **FormattedString,
|
|
OUT UINT16 *EachLineWidth,
|
|
IN UINTN RowCount
|
|
);
|
|
|
|
/**
|
|
Process a Question's Option (whether selected or un-selected).
|
|
|
|
@param MenuOption The MenuOption for this Question.
|
|
@param Selected TRUE: if Question is selected.
|
|
@param OptionString Pointer of the Option String to be displayed.
|
|
@param SkipErrorValue Whether need to return when value without option for it.
|
|
|
|
@retval EFI_SUCCESS Question Option process success.
|
|
@retval Other Question Option process fail.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
ProcessOptions (
|
|
IN UI_MENU_OPTION *MenuOption,
|
|
IN BOOLEAN Selected,
|
|
OUT CHAR16 **OptionString,
|
|
IN BOOLEAN SkipErrorValue
|
|
);
|
|
|
|
/**
|
|
Set Buffer to Value for Size bytes.
|
|
|
|
@param Buffer Memory to set.
|
|
@param Size Number of bytes to set
|
|
@param Value Value of the set operation.
|
|
|
|
**/
|
|
VOID
|
|
SetUnicodeMem (
|
|
IN VOID *Buffer,
|
|
IN UINTN Size,
|
|
IN CHAR16 Value
|
|
);
|
|
|
|
/**
|
|
Display one form, and return user input.
|
|
|
|
@param FormData Form Data to be shown.
|
|
@param UserInputData User input data.
|
|
|
|
@retval EFI_SUCCESS Form Data is shown, and user input is got.
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
FormDisplay (
|
|
IN FORM_DISPLAY_ENGINE_FORM *FormData,
|
|
OUT USER_INPUT *UserInputData
|
|
);
|
|
|
|
/**
|
|
Clear Screen to the initial state.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
DriverClearDisplayPage (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Exit Display and Clear Screen to the original state.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
ExitDisplay (
|
|
VOID
|
|
);
|
|
|
|
/**
|
|
Process nothing.
|
|
|
|
@param Event The Event need to be process
|
|
@param Context The context of the event.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
EmptyEventProcess (
|
|
IN EFI_EVENT Event,
|
|
IN VOID *Context
|
|
);
|
|
|
|
/**
|
|
Process for the refresh interval statement.
|
|
|
|
@param Event The Event need to be process
|
|
@param Context The context of the event.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
RefreshTimeOutProcess (
|
|
IN EFI_EVENT Event,
|
|
IN VOID *Context
|
|
);
|
|
|
|
/**
|
|
Record the highlight menu and top of screen menu info.
|
|
|
|
@param Highlight The menu opton which is highlight.
|
|
@param TopOfScreen The menu opton which is at the top of the form.
|
|
@param SkipValue The skip line info for the top of screen menu.
|
|
|
|
**/
|
|
VOID
|
|
UpdateHighlightMenuInfo (
|
|
IN LIST_ENTRY *Highlight,
|
|
IN LIST_ENTRY *TopOfScreen,
|
|
IN UINTN SkipValue
|
|
);
|
|
|
|
#endif
|