BOOLEAN mInScopeSubtitle;\r
BOOLEAN mInScopeSuppress;\r
BOOLEAN mInScopeGrayOut;\r
+BOOLEAN mInScopeDisable;\r
FORM_EXPRESSION *mSuppressExpression;\r
FORM_EXPRESSION *mGrayOutExpression;\r
+FORM_EXPRESSION *mDisableExpression;\r
\r
/**\r
Initialize Statement header members.\r
Statement->GrayOutExpression = mGrayOutExpression;\r
}\r
\r
+\r
+ if (mInScopeDisable) {\r
+ Statement->DisableExpression = mDisableExpression;\r
+ }\r
+\r
Statement->InSubtitle = mInScopeSubtitle;\r
\r
//\r
BOOLEAN SuppressForOption;\r
BOOLEAN InScopeOptionSuppress;\r
FORM_EXPRESSION *OptionSuppressExpression;\r
- BOOLEAN InScopeDisable;\r
UINT16 DepthOfDisable;\r
BOOLEAN OpCodeDisabled;\r
BOOLEAN SingleOpCodeExpression;\r
mInScopeSuppress = FALSE;\r
InScopeOptionSuppress = FALSE;\r
mInScopeGrayOut = FALSE;\r
- InScopeDisable = FALSE;\r
+ mInScopeDisable = FALSE;\r
DepthOfDisable = 0;\r
OpCodeDisabled = FALSE;\r
SingleOpCodeExpression = FALSE;\r
\r
if (ScopeOpCode == EFI_IFR_DISABLE_IF_OP) {\r
if (DepthOfDisable == 0) {\r
- InScopeDisable = FALSE;\r
+ mInScopeDisable = FALSE;\r
OpCodeDisabled = FALSE;\r
} else {\r
DepthOfDisable--;\r
//\r
SingleOpCodeExpression = FALSE;\r
\r
- if (InScopeDisable) {\r
+ if (mInScopeDisable && CurrentForm == NULL) {\r
//\r
- // Evaluate DisableIf expression\r
+ // This is DisableIf expression for Form, it should be a constant expression\r
//\r
Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
if (EFI_ERROR (Status)) {\r
\r
CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
CopyMem (&FormSet->Help, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
+\r
+ //\r
+ // The formset OpCode contains ClassGuid\r
+ //\r
+ FormSet->NumberOfClassGuid = ((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3;\r
+ CopyMem (FormSet->ClassGuid, OpCodeData + sizeof (EFI_IFR_FORM_SET), FormSet->NumberOfClassGuid * sizeof (EFI_GUID));\r
break;\r
\r
case EFI_IFR_FORM_OP:\r
break;\r
\r
case EFI_IFR_RESET_BUTTON_OP:\r
- CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+ //\r
+ // Create Statement todo\r
+ //\r
+ CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
break;\r
\r
CurrentExpression->Type = EFI_HII_EXPRESSION_DISABLE_IF;\r
InitializeListHead (&CurrentExpression->OpCodeListHead);\r
\r
- InScopeDisable = TRUE;\r
- OpCodeDisabled = FALSE;\r
+ if (CurrentForm != NULL) {\r
+ //\r
+ // This is DisableIf for Question, enqueue it to Form expression list\r
+ //\r
+ InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
+ }\r
+\r
+ mDisableExpression = CurrentExpression;\r
+ mInScopeDisable = TRUE;\r
+ OpCodeDisabled = FALSE;\r
\r
//\r
// Take a look at next OpCode to see whether current expression consists\r
break;\r
\r
case EFI_IFR_EXTEND_OP_BANNER:\r
+ //\r
+ // By SubClass or By ClassGuid to get Banner Data?\r
+ //\r
if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
CopyMem (\r
- &BannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
+ &gBannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
&((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
sizeof (EFI_STRING_ID)\r
break;\r
\r
case EFI_IFR_DISABLE_IF_OP:\r
- InScopeDisable = FALSE;\r
+ mInScopeDisable = FALSE;\r
OpCodeDisabled = FALSE;\r
break;\r
\r
\r
default:\r
if (IsExpressionOpCode (ScopeOpCode)) {\r
- if (InScopeDisable) {\r
+ if (mInScopeDisable && CurrentForm == NULL) {\r
//\r
- // Evaluate DisableIf expression\r
+ // This is DisableIf expression for Form, it should be a constant expression\r
//\r
Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
if (EFI_ERROR (Status)) {\r
Buffer[Index] = Character;\r
}\r
\r
- if (gClassOfVfr == EFI_FRONT_PAGE_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
//\r
// ClearLines(0, LocalScreen.RightColumn, 0, BANNER_HEIGHT-1, BANNER_TEXT | BANNER_BACKGROUND);\r
//\r
ASSERT (RowIdx < BANNER_HEIGHT);\r
ASSERT (ColumnIdx < BANNER_COLUMNS);\r
\r
- if (BannerData->Banner[RowIdx][ColumnIdx] != 0x0000) {\r
+ if (gBannerData->Banner[RowIdx][ColumnIdx] != 0x0000) {\r
StrFrontPageBanner = GetToken (\r
- BannerData->Banner[RowIdx][ColumnIdx],\r
- FrontPageHandle\r
+ gBannerData->Banner[RowIdx][ColumnIdx],\r
+ gFrontPageHandle\r
);\r
} else {\r
continue;\r
KEYHELP_TEXT | KEYHELP_BACKGROUND\r
);\r
\r
- if (gClassOfVfr != EFI_FRONT_PAGE_SUBCLASS) {\r
+ if (gClassOfVfr != FORMSET_CLASS_FRONT_PAGE) {\r
ClearLines (\r
LocalScreen.LeftColumn,\r
LocalScreen.RightColumn,\r
Character = BOXDRAW_UP_LEFT;\r
PrintChar (Character);\r
\r
- if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
//\r
// Print Bottom border line\r
// +------------------------------------------------------------------------------+\r
\r
StringPtr = GetToken (Selection->Form->FormTitle, Handle);\r
\r
- if (gClassOfVfr != EFI_FRONT_PAGE_SUBCLASS) {\r
+ if (gClassOfVfr != FORMSET_CLASS_FRONT_PAGE) {\r
gST->ConOut->SetAttribute (gST->ConOut, TITLE_TEXT | TITLE_BACKGROUND);\r
PrintStringAt (\r
(LocalScreen.RightColumn + LocalScreen.LeftColumn - GetStringWidth (StringPtr) / 2) / 2,\r
);\r
}\r
\r
- if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
gST->ConOut->SetAttribute (gST->ConOut, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
\r
//\r
Suppress = FALSE;\r
}\r
\r
+ if (Statement->DisableExpression != NULL) {\r
+ Suppress = Suppress || Statement->DisableExpression->Result.Value.b;\r
+ }\r
+\r
if (!Suppress) {\r
StringPtr = GetToken (Statement->Prompt, Handle);\r
\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
Statement = MenuOption->ThisTag;\r
ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
\r
if (!Selected) {\r
- if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\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
+ if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
ClearLines (LeftColumnOfHelp, RightColumnOfHelp, TopRowOfHelp, BottomRowOfHelp, KEYHELP_TEXT | KEYHELP_BACKGROUND);\r
\r
if (!Selected) {\r
- if (gClassOfVfr == EFI_SETUP_APPLICATION_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_PLATFORM_SETUP) {\r
PrintStringAt (StartColumnOfHelp, TopRowOfHelp, gFunctionOneString);\r
PrintStringAt (SecCol, TopRowOfHelp, gFunctionNineString);\r
PrintStringAt (ThdCol, TopRowOfHelp, gFunctionTenString);\r
Selection->Form = IdToForm (Selection->FormSet, Selection->FormId);\r
}\r
\r
+ if (Selection->Form == NULL) {\r
+ //\r
+ // No Form to display\r
+ //\r
+ return EFI_NOT_FOUND;\r
+ }\r
+\r
//\r
// Load Questions' Value for display\r
//\r
EFI_HII_STRING_PROTOCOL *mHiiString;\r
EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting;\r
\r
-BANNER_DATA *BannerData;\r
-EFI_HII_HANDLE FrontPageHandle;\r
+BANNER_DATA *gBannerData;\r
+EFI_HII_HANDLE gFrontPageHandle;\r
UINTN gClassOfVfr;\r
UINTN gFunctionKeySetting;\r
BOOLEAN gResetRequired;\r
InitializeBrowserStrings ();\r
\r
gFunctionKeySetting = DEFAULT_FUNCTION_KEY_SETTING;\r
- gClassOfVfr = EFI_SETUP_APPLICATION_SUBCLASS;\r
+ gClassOfVfr = FORMSET_CLASS_PLATFORM_SETUP;\r
\r
//\r
// Ensure we are in Text mode\r
//\r
// Initialize Driver private data\r
//\r
- BannerData = AllocateZeroPool (sizeof (BANNER_DATA));\r
- ASSERT (BannerData != NULL);\r
+ gBannerData = AllocateZeroPool (sizeof (BANNER_DATA));\r
+ ASSERT (gBannerData != NULL);\r
\r
//\r
// Install FormBrowser2 protocol\r
// For Questions without default\r
//\r
switch (Question->Operand) {\r
- case EFI_IFR_NUMERIC_OP:\r
- //\r
- // Take minimal value as numeric's default value\r
- //\r
- HiiValue->Value.u64 = Question->Minimum;\r
- break;\r
-\r
case EFI_IFR_ONE_OF_OP:\r
//\r
// Take first oneof option as oneof's default value\r
//\r
- Link = GetFirstNode (&Question->OptionListHead);\r
- if (!IsNull (&Question->OptionListHead, Link)) {\r
- Option = QUESTION_OPTION_FROM_LINK (Link);\r
- CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));\r
+ if (ValueToOption (Question, HiiValue) == NULL) { \r
+ Link = GetFirstNode (&Question->OptionListHead);\r
+ if (!IsNull (&Question->OptionListHead, Link)) {\r
+ Option = QUESTION_OPTION_FROM_LINK (Link);\r
+ CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));\r
+ }\r
}\r
break;\r
\r
Link = GetNextNode (&Form->StatementListHead, Link);\r
\r
//\r
- // If Question is suppressed, don't reset it to default\r
+ // If Question is disabled, don't reset it to default\r
//\r
- if (Question->SuppressExpression != NULL) {\r
- Status = EvaluateExpression (FormSet, Form, Question->SuppressExpression);\r
- if (!EFI_ERROR (Status) && Question->SuppressExpression->Result.Value.b) {\r
+ if (Question->DisableExpression != NULL) {\r
+ Status = EvaluateExpression (FormSet, Form, Question->DisableExpression);\r
+ if (!EFI_ERROR (Status) && Question->DisableExpression->Result.Value.b) {\r
continue;\r
}\r
}\r
BOOLEAN ReturnDefault;\r
UINT32 PackageListLength;\r
EFI_HII_PACKAGE_HEADER PackageHeader;\r
+ UINT8 Index;\r
+ UINT8 NumberOfClassGuid;\r
+ BOOLEAN IsSetupClassGuid;\r
+ EFI_GUID *ClassGuid;\r
\r
OpCodeData = NULL;\r
Package = NULL;\r
// Check whether return default FormSet\r
//\r
if (ReturnDefault) {\r
- break;\r
+ //\r
+ // Check ClassGuid of formset OpCode\r
+ //\r
+ IsSetupClassGuid = FALSE;\r
+ NumberOfClassGuid = ((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3;\r
+ ClassGuid = (EFI_GUID *) (OpCodeData + sizeof (EFI_IFR_FORM_SET));\r
+ for (Index = 0; Index < NumberOfClassGuid; Index++) {\r
+ if (CompareGuid (ClassGuid + Index, &gEfiHiiPlatformSetupFormsetGuid)) {\r
+ IsSetupClassGuid = TRUE;\r
+ break;\r
+ }\r
+ }\r
+ if (IsSetupClassGuid) {\r
+ break;\r
+ }\r
}\r
\r
//\r
return Status;\r
}\r
\r
- gClassOfVfr = FormSet->SubClass;\r
- if (gClassOfVfr == EFI_FRONT_PAGE_SUBCLASS) {\r
- FrontPageHandle = FormSet->HiiHandle;\r
+ gClassOfVfr = FORMSET_CLASS_PLATFORM_SETUP;\r
+ if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
+ gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+ gFrontPageHandle = FormSet->HiiHandle;\r
}\r
\r
//\r
#include <Protocol/HiiString.h>\r
\r
#include <Guid/MdeModuleHii.h>\r
+#include <Guid/HiiPlatformSetupFormset.h>\r
\r
#include <Library/PrintLib.h>\r
#include <Library/DebugLib.h>\r
#define FORM_INCONSISTENT_VALIDATION 0\r
#define FORM_NO_SUBMIT_VALIDATION 1\r
\r
+#define FORMSET_CLASS_PLATFORM_SETUP 0\r
+#define FORMSET_CLASS_FRONT_PAGE 1\r
+\r
typedef struct {\r
UINT8 Type;\r
EFI_IFR_TYPE_VALUE Value;\r
LIST_ENTRY NoSubmitListHead; // nested nosubmit expression list (FORM_EXPRESSION)\r
FORM_EXPRESSION *GrayOutExpression; // nesting inside of GrayOutIf\r
FORM_EXPRESSION *SuppressExpression; // nesting inside of SuppressIf\r
+ FORM_EXPRESSION *DisableExpression; // nesting inside of DisableIf\r
\r
} FORM_BROWSER_STATEMENT;\r
\r
EFI_GUID Guid;\r
EFI_STRING_ID FormSetTitle;\r
EFI_STRING_ID Help;\r
- UINT16 Class;\r
- UINT16 SubClass;\r
+ UINT8 NumberOfClassGuid;\r
+ EFI_GUID ClassGuid[3]; // Up to three ClassGuid\r
+ UINT16 Class; // Tiano extended Class code\r
+ UINT16 SubClass; // Tiano extended Subclass code\r
EFI_IMAGE_ID ImageId;\r
\r
FORM_BROWSER_STATEMENT *StatementBuffer; // Buffer for all Statements and Questions\r
extern EFI_HII_STRING_PROTOCOL *mHiiString;\r
extern EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting;\r
\r
-extern BANNER_DATA *BannerData;\r
-extern EFI_HII_HANDLE FrontPageHandle;\r
+extern BANNER_DATA *gBannerData;\r
+extern EFI_HII_HANDLE gFrontPageHandle;\r
extern UINTN gClassOfVfr;\r
extern UINTN gFunctionKeySetting;\r
extern BOOLEAN gResetRequired;\r
[Guids]\r
gEfiIfrTianoGuid ## CONSUMES ## GUID\r
gEfiIfrFrameworkGuid ## CONSUMES ## GUID\r
+ gEfiHiiPlatformSetupFormsetGuid\r
\r
[Protocols]\r
gEfiHiiConfigAccessProtocolGuid ## CONSUMES\r
break;\r
\r
case NV_UPDATE_REQUIRED:\r
- if (gClassOfVfr != EFI_FRONT_PAGE_SUBCLASS) {\r
+ if (gClassOfVfr != FORMSET_CLASS_FRONT_PAGE) {\r
if (State) {\r
gST->ConOut->SetAttribute (gST->ConOut, INFO_TEXT);\r
PrintStringAt (\r
\r
ZeroMem (&Key, sizeof (EFI_INPUT_KEY));\r
\r
- if (gClassOfVfr == EFI_FRONT_PAGE_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
TopRow = LocalScreen.TopRow + FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;\r
Row = LocalScreen.TopRow + FRONT_PAGE_HEADER_HEIGHT + SCROLL_ARROW_HEIGHT;\r
} else {\r
case CfUpdateHelpString:\r
ControlFlag = CfPrepareToReadKey;\r
\r
- if ((Repaint || NewLine) && (gClassOfVfr != EFI_GENERAL_APPLICATION_SUBCLASS)) {\r
+ if (Repaint || NewLine) {\r
//\r
// Don't print anything if it is a NULL help token\r
//\r
break;\r
\r
case ' ':\r
- if (gClassOfVfr != EFI_FRONT_PAGE_SUBCLASS) {\r
+ if (gClassOfVfr != FORMSET_CLASS_FRONT_PAGE) {\r
if (MenuOption->ThisTag->Operand == EFI_IFR_CHECKBOX_OP && !MenuOption->GrayOut) {\r
ScreenOperation = UiSelect;\r
}\r
//\r
ControlFlag = CfCheckSelection;\r
\r
- if (gClassOfVfr == EFI_FRONT_PAGE_SUBCLASS) {\r
+ if (gClassOfVfr == FORMSET_CLASS_FRONT_PAGE) {\r
//\r
// There is no parent menu for FrontPage\r
//\r