};\r
\r
BOOLEAN mInputError;\r
+BOOLEAN GetLineByWidthFinished = FALSE;\r
\r
\r
/**\r
Selection->FormId = UiMenuList->FormId;\r
Selection->QuestionId = UiMenuList->QuestionId;\r
RemoveEntryList (&UiMenuList->MenuLink);\r
- gBS->FreePool (UiMenuList);\r
+ FreePool (UiMenuList);\r
}\r
}\r
\r
while (!IsListEmpty (&gMenuList)) {\r
UiMenuList = CR (gMenuList.ForwardLink, UI_MENU_LIST, MenuLink, UI_MENU_LIST_SIGNATURE);\r
RemoveEntryList (&UiMenuList->MenuLink);\r
- gBS->FreePool (UiMenuList);\r
+ FreePool (UiMenuList);\r
}\r
}\r
\r
// Data format : [01/02/2004] [11:22:33]\r
// Line number : 0 0 1 0 0 1\r
//\r
- gBS->FreePool (MenuOption->Description);\r
+ FreePool (MenuOption->Description);\r
}\r
- gBS->FreePool (MenuOption);\r
+ FreePool (MenuOption);\r
}\r
}\r
\r
\r
while (gMenuRefreshHead != NULL) {\r
OldMenuRefreshEntry = gMenuRefreshHead->Next;\r
- gBS->FreePool (gMenuRefreshHead);\r
+ FreePool (gMenuRefreshHead);\r
gMenuRefreshHead = OldMenuRefreshEntry;\r
}\r
\r
Refresh screen.\r
\r
**/\r
-VOID\r
+EFI_STATUS\r
RefreshForm (\r
VOID\r
)\r
{\r
- CHAR16 *OptionString;\r
- MENU_REFRESH_ENTRY *MenuRefreshEntry;\r
- UINTN Index;\r
- UINTN Loop;\r
- EFI_STATUS Status;\r
- UI_MENU_SELECTION *Selection;\r
- FORM_BROWSER_STATEMENT *Question;\r
-\r
- OptionString = NULL;\r
+ CHAR16 *OptionString;\r
+ MENU_REFRESH_ENTRY *MenuRefreshEntry;\r
+ UINTN Index;\r
+ EFI_STATUS Status;\r
+ UI_MENU_SELECTION *Selection;\r
+ FORM_BROWSER_STATEMENT *Question;\r
+ EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccess;\r
+ EFI_HII_VALUE *HiiValue;\r
+ EFI_BROWSER_ACTION_REQUEST ActionRequest;\r
\r
if (gMenuRefreshHead != NULL) {\r
\r
MenuRefreshEntry = gMenuRefreshHead;\r
\r
+ //\r
+ // Reset FormPackage update flag\r
+ //\r
+ mHiiPackageListUpdated = FALSE;\r
+\r
do {\r
gST->ConOut->SetAttribute (gST->ConOut, MenuRefreshEntry->CurrentAttribute);\r
\r
Selection = MenuRefreshEntry->Selection;\r
Question = MenuRefreshEntry->MenuOption->ThisTag;\r
\r
+ Status = GetQuestionValue (Selection->FormSet, Selection->Form, Question, FALSE);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ OptionString = NULL;\r
+ ProcessOptions (Selection, MenuRefreshEntry->MenuOption, FALSE, &OptionString);\r
+\r
+ if (OptionString != NULL) {\r
+ //\r
+ // If leading spaces on OptionString - remove the spaces\r
+ //\r
+ for (Index = 0; OptionString[Index] == L' '; Index++)\r
+ ;\r
+\r
+ PrintStringAt (MenuRefreshEntry->CurrentColumn, MenuRefreshEntry->CurrentRow, &OptionString[Index]);\r
+ FreePool (OptionString);\r
+ }\r
+\r
//\r
- // Don't update Question being edited\r
+ // Question value may be changed, need invoke its Callback()\r
//\r
- if (Question != MenuRefreshEntry->Selection->Statement) {\r
+ ConfigAccess = Selection->FormSet->ConfigAccess;\r
+ if (((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) && (ConfigAccess != NULL)) {\r
+ ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;\r
\r
- Status = GetQuestionValue (Selection->FormSet, Selection->Form, Question, FALSE);\r
- if (EFI_ERROR (Status)) {\r
- return;\r
+ HiiValue = &Question->HiiValue;\r
+ if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
+ //\r
+ // Create String in HII database for Configuration Driver to retrieve\r
+ //\r
+ HiiValue->Value.string = NewString ((CHAR16 *) Question->BufferValue, Selection->FormSet->HiiHandle);\r
}\r
\r
- ProcessOptions (Selection, MenuRefreshEntry->MenuOption, FALSE, &OptionString);\r
+ Status = ConfigAccess->Callback (\r
+ ConfigAccess,\r
+ EFI_BROWSER_ACTION_CHANGING,\r
+ Question->QuestionId,\r
+ HiiValue->Type,\r
+ &HiiValue->Value,\r
+ &ActionRequest\r
+ );\r
\r
- if (OptionString != NULL) {\r
+ if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
//\r
- // If leading spaces on OptionString - remove the spaces\r
+ // Clean the String in HII Database\r
//\r
- for (Index = 0; OptionString[Index] == L' '; Index++)\r
- ;\r
+ DeleteString (HiiValue->Value.string, Selection->FormSet->HiiHandle);\r
+ }\r
\r
- for (Loop = 0; OptionString[Index] != CHAR_NULL; Index++) {\r
- OptionString[Loop] = OptionString[Index];\r
- Loop++;\r
- }\r
+ if (!EFI_ERROR (Status)) {\r
+ switch (ActionRequest) {\r
+ case EFI_BROWSER_ACTION_REQUEST_RESET:\r
+ gResetRequired = TRUE;\r
+ break;\r
\r
- OptionString[Loop] = CHAR_NULL;\r
+ case EFI_BROWSER_ACTION_REQUEST_SUBMIT:\r
+ SubmitForm (Selection->FormSet, Selection->Form);\r
+ break;\r
\r
- PrintStringAt (MenuRefreshEntry->CurrentColumn, MenuRefreshEntry->CurrentRow, OptionString);\r
- gBS->FreePool (OptionString);\r
+ case EFI_BROWSER_ACTION_REQUEST_EXIT:\r
+ Selection->Action = UI_ACTION_EXIT;\r
+ gNvUpdateRequired = FALSE;\r
+ break;\r
+\r
+ default:\r
+ break;\r
+ }\r
}\r
}\r
\r
MenuRefreshEntry = MenuRefreshEntry->Next;\r
\r
} while (MenuRefreshEntry != NULL);\r
+\r
+ if (mHiiPackageListUpdated) {\r
+ //\r
+ // Package list is updated, force to reparse IFR binary of target Formset\r
+ //\r
+ mHiiPackageListUpdated = FALSE;\r
+ Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+ return EFI_SUCCESS;\r
+ }\r
}\r
+\r
+ return EFI_TIMEOUT;\r
}\r
\r
\r
if (!EFI_ERROR (Status) && Index == 1) {\r
Status = EFI_TIMEOUT;\r
if (RefreshInterval != 0) {\r
- RefreshForm ();\r
+ Status = RefreshForm ();\r
}\r
}\r
\r
case CHAR_NULL:\r
switch (Key.ScanCode) {\r
case SCAN_ESC:\r
- gBS->FreePool (TempString);\r
- gBS->FreePool (BufferedString);\r
+ FreePool (TempString);\r
+ FreePool (BufferedString);\r
gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);\r
gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
return EFI_DEVICE_ERROR;\r
\r
case CHAR_CARRIAGE_RETURN:\r
SelectionComplete = TRUE;\r
- gBS->FreePool (TempString);\r
- gBS->FreePool (BufferedString);\r
+ FreePool (TempString);\r
+ FreePool (BufferedString);\r
gST->ConOut->SetAttribute (gST->ConOut, CurrentAttribute);\r
gST->ConOut->EnableCursor (gST->ConOut, TRUE);\r
return EFI_SUCCESS;\r
break;\r
\r
case 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
break;\r
}\r
\r
- gBS->FreePool (InputErrorMessage);\r
- gBS->FreePool (NvUpdateMessage);\r
+ FreePool (InputErrorMessage);\r
+ FreePool (NvUpdateMessage);\r
return ;\r
}\r
\r
if ((Statement->Operand == EFI_IFR_TEXT_OP) && (Statement->TextTwo != 0)) {\r
String = GetToken (Statement->TextTwo, Handle);\r
Size = StrLen (String);\r
- gBS->FreePool (String);\r
+ FreePool (String);\r
}\r
\r
if ((Statement->Operand == EFI_IFR_SUBTITLE_OP) ||\r
return Width;\r
}\r
\r
-\r
-BOOLEAN GetLineByWidthFinished = FALSE;\r
-\r
/**\r
Will copy LineWidth amount of a string in the OutputString buffer and return the\r
number of CHAR16 characters that were copied into the OutputString buffer.\r
//\r
// If there is more string to process print on the next row and increment the Skip value\r
//\r
- if (StrLen (&OptionString[Index])) {\r
+ if (StrLen (&OptionString[Index]) != 0) {\r
if (SkipValue == 0) {\r
Row++;\r
//\r
}\r
}\r
\r
- gBS->FreePool (OutputString);\r
+ FreePool (OutputString);\r
if (SkipValue != 0) {\r
SkipValue--;\r
}\r
return PadLineNumber;\r
}\r
\r
+/**\r
+ Find HII Handle in the HII database associated with given Device Path.\r
+\r
+ If DevicePath is NULL, then ASSERT.\r
+\r
+ @param DevicePath Device Path associated with the HII package list\r
+ handle.\r
+\r
+ @retval Handle HII package list Handle associated with the Device\r
+ Path.\r
+ @retval NULL Hii Package list handle is not found.\r
+\r
+**/\r
+EFI_HII_HANDLE\r
+EFIAPI\r
+DevicePathToHiiHandle (\r
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;\r
+ UINTN BufferSize;\r
+ UINTN HandleCount;\r
+ UINTN Index;\r
+ EFI_HANDLE Handle;\r
+ EFI_HANDLE DriverHandle;\r
+ EFI_HII_HANDLE *HiiHandles;\r
+ EFI_HII_HANDLE HiiHandle;\r
+\r
+ ASSERT (DevicePath != NULL);\r
+\r
+ TmpDevicePath = DevicePath;\r
+ //\r
+ // Locate Device Path Protocol handle buffer\r
+ //\r
+ Status = gBS->LocateDevicePath (\r
+ &gEfiDevicePathProtocolGuid,\r
+ &TmpDevicePath,\r
+ &DriverHandle\r
+ );\r
+ if (EFI_ERROR (Status) || !IsDevicePathEnd (TmpDevicePath)) {\r
+ return NULL;\r
+ }\r
+\r
+ //\r
+ // Retrieve all HII Handles from HII database\r
+ //\r
+ BufferSize = 0x1000;\r
+ HiiHandles = AllocatePool (BufferSize);\r
+ ASSERT (HiiHandles != NULL);\r
+ Status = mHiiDatabase->ListPackageLists (\r
+ mHiiDatabase,\r
+ EFI_HII_PACKAGE_TYPE_ALL,\r
+ NULL,\r
+ &BufferSize,\r
+ HiiHandles\r
+ );\r
+ if (Status == EFI_BUFFER_TOO_SMALL) {\r
+ FreePool (HiiHandles);\r
+ HiiHandles = AllocatePool (BufferSize);\r
+ ASSERT (HiiHandles != NULL);\r
+\r
+ Status = mHiiDatabase->ListPackageLists (\r
+ mHiiDatabase,\r
+ EFI_HII_PACKAGE_TYPE_ALL,\r
+ NULL,\r
+ &BufferSize,\r
+ HiiHandles\r
+ );\r
+ }\r
+\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (HiiHandles);\r
+ return NULL;\r
+ }\r
+\r
+ //\r
+ // Search Hii Handle by Driver Handle\r
+ //\r
+ HiiHandle = NULL;\r
+ HandleCount = BufferSize / sizeof (EFI_HII_HANDLE);\r
+ for (Index = 0; Index < HandleCount; Index++) {\r
+ Status = mHiiDatabase->GetPackageListHandle (\r
+ mHiiDatabase,\r
+ HiiHandles[Index],\r
+ &Handle\r
+ );\r
+ if (!EFI_ERROR (Status) && (Handle == DriverHandle)) {\r
+ HiiHandle = HiiHandles[Index];\r
+ break;\r
+ }\r
+ }\r
+\r
+ FreePool (HiiHandles);\r
+ return HiiHandle;\r
+}\r
\r
/**\r
Display menu and wait for user to select one menu option, then return it.\r
UINT16 DefaultId;\r
EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
FORM_BROWSER_STATEMENT *Statement;\r
+ CHAR16 TemStr[2];\r
+ UINT8 *DevicePathBuffer;\r
+ UINT8 DigitUint8;\r
\r
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
\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
//\r
// If there is more string to process print on the next row and increment the Skip value\r
//\r
- if (StrLen (&MenuOption->Description[Index])) {\r
+ if (StrLen (&MenuOption->Description[Index]) != 0) {\r
if (Temp == 0) {\r
Row++;\r
}\r
}\r
\r
- gBS->FreePool (OutputString);\r
+ FreePool (OutputString);\r
if (Temp != 0) {\r
Temp--;\r
}\r
Row = OriginalRow;\r
\r
gST->ConOut->SetAttribute (gST->ConOut, FIELD_TEXT | FIELD_BACKGROUND);\r
- ProcessOptions (Selection, MenuOption, FALSE, &OptionString);\r
+ Status = ProcessOptions (Selection, MenuOption, FALSE, &OptionString);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Repaint to clear possible error prompt pop-up\r
+ //\r
+ Repaint = TRUE;\r
+ NewLine = TRUE;\r
+ ControlFlag = CfRepaint;\r
+ break;\r
+ }\r
\r
if (OptionString != NULL) {\r
if (Statement->Operand == EFI_IFR_DATE_OP || Statement->Operand == EFI_IFR_TIME_OP) {\r
//\r
// If there is more string to process print on the next row and increment the Skip value\r
//\r
- if (StrLen (&OptionString[Index])) {\r
+ if (StrLen (&OptionString[Index]) != 0) {\r
if (Temp2 == 0) {\r
Row++;\r
//\r
}\r
}\r
\r
- gBS->FreePool (OutputString);\r
+ FreePool (OutputString);\r
if (Temp2 != 0) {\r
Temp2--;\r
}\r
Temp2 = 0;\r
Row = OriginalRow;\r
\r
- gBS->FreePool (OptionString);\r
+ FreePool (OptionString);\r
}\r
//\r
// If this is a text op with secondary text information\r
//\r
// If there is more string to process print on the next row and increment the Skip value\r
//\r
- if (StrLen (&StringPtr[Index])) {\r
+ if (StrLen (&StringPtr[Index]) != 0) {\r
if (Temp2 == 0) {\r
Row++;\r
//\r
}\r
}\r
\r
- gBS->FreePool (OutputString);\r
+ FreePool (OutputString);\r
if (Temp2 != 0) {\r
Temp2--;\r
}\r
}\r
\r
Row = OriginalRow;\r
- gBS->FreePool (StringPtr);\r
+ FreePool (StringPtr);\r
}\r
\r
//\r
//\r
// If there is more string to process print on the next row and increment the Skip value\r
//\r
- if (StrLen (&OptionString[Index])) {\r
+ if (StrLen (&OptionString[Index]) != 0) {\r
MenuOption->Row++;\r
}\r
\r
- gBS->FreePool (OutputString);\r
+ FreePool (OutputString);\r
}\r
\r
MenuOption->Row = OriginalRow;\r
\r
- gBS->FreePool (OptionString);\r
+ FreePool (OptionString);\r
} else {\r
if (NewLine) {\r
if (MenuOption->GrayOut) {\r
//\r
// If there is more string to process print on the next row and increment the Skip value\r
//\r
- if (StrLen (&MenuOption->Description[Index])) {\r
+ if (StrLen (&MenuOption->Description[Index]) != 0) {\r
MenuOption->Row++;\r
}\r
\r
- gBS->FreePool (OutputString);\r
+ FreePool (OutputString);\r
}\r
\r
MenuOption->Row = OriginalRow;\r
//\r
// If there is more string to process print on the next row and increment the Skip value\r
//\r
- if (StrLen (&OptionString[Index])) {\r
+ if (StrLen (&OptionString[Index]) != 0) {\r
MenuOption->Row++;\r
}\r
\r
- gBS->FreePool (OutputString);\r
+ FreePool (OutputString);\r
}\r
\r
MenuOption->Row = OriginalRow;\r
\r
- gBS->FreePool (OptionString);\r
+ FreePool (OptionString);\r
} else {\r
if (NewLine) {\r
OriginalRow = MenuOption->Row;\r
//\r
// If there is more string to process print on the next row and increment the Skip value\r
//\r
- if (StrLen (&MenuOption->Description[Index])) {\r
+ if (StrLen (&MenuOption->Description[Index]) != 0) {\r
MenuOption->Row++;\r
}\r
\r
- gBS->FreePool (OutputString);\r
+ FreePool (OutputString);\r
}\r
\r
MenuOption->Row = OriginalRow;\r
}\r
}\r
\r
- if (((NewPos->ForwardLink != &Menu) && (ScreenOperation == UiDown)) ||\r
- ((NewPos->BackLink != &Menu) && (ScreenOperation == UiUp)) ||\r
- (ScreenOperation == UiNoOperation)\r
- ) {\r
- UpdateKeyHelp (MenuOption, FALSE);\r
- }\r
+ UpdateKeyHelp (MenuOption, FALSE);\r
+\r
//\r
// Clear reverse attribute\r
//\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
Status = UiWaitForSingleEvent (gST->ConIn->WaitForKey, 0, MinRefreshInterval);\r
} while (Status == EFI_TIMEOUT);\r
\r
- if (Status == EFI_TIMEOUT) {\r
- Key.UnicodeChar = CHAR_CARRIAGE_RETURN;\r
- } else {\r
- Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+ if (Selection->Action == UI_ACTION_REFRESH_FORMSET) {\r
//\r
- // if we encounter error, continue to read another key in.\r
+ // IFR is updated in Callback of refresh opcode, re-parse it\r
//\r
- if (EFI_ERROR (Status)) {\r
- ControlFlag = CfReadKey;\r
- continue;\r
- }\r
+ ControlFlag = CfUiReset;\r
+ Selection->Statement = NULL;\r
+ break;\r
+ }\r
+\r
+ Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+ //\r
+ // if we encounter error, continue to read another key in.\r
+ //\r
+ if (EFI_ERROR (Status)) {\r
+ ControlFlag = CfReadKey;\r
+ break;\r
}\r
\r
if (IsListEmpty (&Menu) && Key.UnicodeChar != CHAR_NULL) {\r
gDirection = SCAN_LEFT;\r
}\r
Status = ProcessOptions (Selection, MenuOption, TRUE, &OptionString);\r
+ if (EFI_ERROR (Status)) {\r
+ //\r
+ // Repaint to clear possible error prompt pop-up\r
+ //\r
+ Repaint = TRUE;\r
+ NewLine = TRUE;\r
+ }\r
if (OptionString != NULL) {\r
FreePool (OptionString);\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
BufferSize = StrLen (StringPtr) / 2;\r
DevicePath = AllocatePool (BufferSize);\r
+ \r
+ //\r
+ // Convert from Device Path String to DevicePath Buffer in the reverse order.\r
+ //\r
+ DevicePathBuffer = (UINT8 *) DevicePath;\r
+ for (Index = 0; StringPtr[Index] != L'\0'; Index ++) {\r
+ TemStr[0] = StringPtr[Index];\r
+ DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+ if (DigitUint8 == 0 && TemStr[0] != L'0') {\r
+ //\r
+ // Invalid Hex Char as the tail.\r
+ //\r
+ break;\r
+ }\r
+ if ((Index & 1) == 0) {\r
+ DevicePathBuffer [Index/2] = DigitUint8;\r
+ } else {\r
+ DevicePathBuffer [Index/2] = (UINT8) ((DevicePathBuffer [Index/2] << 4) + DigitUint8);\r
+ }\r
+ }\r
\r
- HexStringToBufInReverseOrder ((UINT8 *) DevicePath, &BufferSize, StringPtr);\r
- Selection->Handle = HiiLibDevicePathToHiiHandle (DevicePath);\r
+ Selection->Handle = DevicePathToHiiHandle (DevicePath);\r
if (Selection->Handle == NULL) {\r
//\r
// If target Hii Handle not found, exit\r
break;\r
}\r
\r
- gBS->FreePool (StringPtr);\r
- gBS->FreePool (DevicePath);\r
+ FreePool (StringPtr);\r
+ FreePool (DevicePath);\r
\r
CopyMem (&Selection->FormSetGuid, &Statement->RefFormSetId, sizeof (EFI_GUID));\r
Selection->FormId = Statement->RefFormId;\r
if (EFI_ERROR (Status)) {\r
Repaint = TRUE;\r
NewLine = TRUE;\r
- break;\r
- }\r
-\r
- if (OptionString != NULL) {\r
- PrintStringAt (LocalScreen.LeftColumn + gPromptBlockWidth + 1, MenuOption->Row, OptionString);\r
- gBS->FreePool (OptionString);\r
- }\r
+ UpdateKeyHelp (MenuOption, FALSE);\r
+ } else {\r
+ Selection->Action = UI_ACTION_REFRESH_FORM;\r
+ }\r
\r
- Selection->Action = UI_ACTION_REFRESH_FORM;\r
+ if (OptionString != NULL) {\r
+ FreePool (OptionString);\r
+ }\r
break;\r
}\r
break;\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