ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_TIME);\r
break;\r
\r
+ case EFI_IFR_TYPE_REF:\r
+ ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_REF);\r
+ break;\r
+\r
case EFI_IFR_TYPE_OTHER:\r
case EFI_IFR_TYPE_UNDEFINED:\r
case EFI_IFR_TYPE_ACTION:\r
case EFI_IFR_REF_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
ASSERT (CurrentStatement != NULL);\r
- CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_UNDEFINED;\r
- CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
- if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
- CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
+ Value = &CurrentStatement->HiiValue;\r
+ Value->Type = EFI_IFR_TYPE_REF;\r
+ if (OpCodeLength >= sizeof (EFI_IFR_REF)) {\r
+ CopyMem (&Value->Value.ref.FormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
\r
- if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
- CopyMem (&CurrentStatement->RefFormSetId, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
+ if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
+ CopyMem (&Value->Value.ref.QuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
\r
- if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
- CopyMem (&CurrentStatement->RefDevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
+ if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
+ CopyMem (&Value->Value.ref.FormSetGuid, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
+\r
+ if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
+ CopyMem (&Value->Value.ref.DevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
+ }\r
}\r
}\r
}\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_REF); \r
+ InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
break;\r
\r
case EFI_IFR_ONE_OF_OP:\r
return HiiHandle;\r
}\r
\r
+/**\r
+ Process the goto op code, update the info in the selection structure.\r
+\r
+ @param Statement The statement belong to goto op code.\r
+ @param Selection The selection info.\r
+ @param Repaint Whether need to repaint the menu.\r
+ @param NewLine Whether need to create new line.\r
+\r
+ @retval EFI_SUCCESS The menu process successfully.\r
+ @return Other value if the process failed.\r
+**/\r
+EFI_STATUS\r
+ProcessGotoOpCode (\r
+ IN OUT FORM_BROWSER_STATEMENT *Statement,\r
+ IN OUT UI_MENU_SELECTION *Selection,\r
+ OUT BOOLEAN *Repaint,\r
+ OUT BOOLEAN *NewLine\r
+ )\r
+{\r
+ CHAR16 *StringPtr;\r
+ UINTN BufferSize;\r
+ EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+ CHAR16 TemStr[2];\r
+ UINT8 *DevicePathBuffer;\r
+ UINTN Index;\r
+ UINT8 DigitUint8;\r
+ FORM_BROWSER_FORM *RefForm;\r
+ EFI_INPUT_KEY Key;\r
+ EFI_STATUS Status;\r
+ UI_MENU_LIST *MenuList;\r
+ \r
+ Status = EFI_SUCCESS;\r
+\r
+ if (Statement->HiiValue.Value.ref.DevicePath != 0) {\r
+ if (Selection->Form->ModalForm) {\r
+ return Status;\r
+ }\r
+ //\r
+ // Goto another Hii Package list\r
+ //\r
+ Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+\r
+ StringPtr = GetToken (Statement->HiiValue.Value.ref.DevicePath, Selection->FormSet->HiiHandle);\r
+ if (StringPtr == NULL) {\r
+ //\r
+ // No device path string not found, exit\r
+ //\r
+ Selection->Action = UI_ACTION_EXIT;\r
+ Selection->Statement = NULL;\r
+ return Status;\r
+ }\r
+ BufferSize = StrLen (StringPtr) / 2;\r
+ DevicePath = AllocatePool (BufferSize);\r
+ ASSERT (DevicePath != NULL);\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
+ Selection->Handle = DevicePathToHiiHandle (DevicePath);\r
+ if (Selection->Handle == NULL) {\r
+ //\r
+ // If target Hii Handle not found, exit\r
+ //\r
+ Selection->Action = UI_ACTION_EXIT;\r
+ Selection->Statement = NULL;\r
+ return Status;\r
+ }\r
+\r
+ FreePool (StringPtr);\r
+ FreePool (DevicePath);\r
+\r
+ CopyMem (&Selection->FormSetGuid,&Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
+ Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
+ Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
+ } else if (!CompareGuid (&Statement->HiiValue.Value.ref.FormSetGuid, &gZeroGuid)) {\r
+ if (Selection->Form->ModalForm) {\r
+ return Status;\r
+ } \r
+ //\r
+ // Goto another Formset, check for uncommitted data\r
+ //\r
+ Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
+\r
+ CopyMem (&Selection->FormSetGuid, &Statement->HiiValue.Value.ref.FormSetGuid, sizeof (EFI_GUID));\r
+ Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
+ Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
+ } else if (Statement->HiiValue.Value.ref.FormId != 0) {\r
+ //\r
+ // Check whether target From is suppressed.\r
+ //\r
+ RefForm = IdToForm (Selection->FormSet, Statement->HiiValue.Value.ref.FormId);\r
+\r
+ if ((RefForm != NULL) && (RefForm->SuppressExpression != NULL)) {\r
+ Status = EvaluateExpression (Selection->FormSet, RefForm, RefForm->SuppressExpression);\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ if (RefForm->SuppressExpression->Result.Value.b) {\r
+ //\r
+ // Form is suppressed. \r
+ //\r
+ do {\r
+ CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);\r
+ } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+ if (Repaint != NULL) {\r
+ *Repaint = TRUE;\r
+ }\r
+ return Status;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Goto another form inside this formset,\r
+ //\r
+ Selection->Action = UI_ACTION_REFRESH_FORM;\r
+\r
+ //\r
+ // Link current form so that we can always go back when someone hits the ESC\r
+ //\r
+ MenuList = UiFindMenuList (&Selection->FormSetGuid, Statement->HiiValue.Value.ref.FormId);\r
+ if (MenuList == NULL && Selection->CurrentMenu != NULL) {\r
+ MenuList = UiAddMenuList (Selection->CurrentMenu, &Selection->FormSetGuid, Statement->HiiValue.Value.ref.FormId);\r
+ }\r
+\r
+ Selection->FormId = Statement->HiiValue.Value.ref.FormId;\r
+ Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
+ } else if (Statement->HiiValue.Value.ref.QuestionId != 0) {\r
+ //\r
+ // Goto another Question\r
+ //\r
+ Selection->QuestionId = Statement->HiiValue.Value.ref.QuestionId;\r
+\r
+ if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
+ Selection->Action = UI_ACTION_REFRESH_FORM;\r
+ } else {\r
+ if (Repaint != NULL) {\r
+ *Repaint = TRUE;\r
+ }\r
+ if (NewLine != NULL) {\r
+ *NewLine = TRUE;\r
+ }\r
+ }\r
+ } else {\r
+ if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
+ Selection->Action = UI_ACTION_REFRESH_FORM;\r
+ }\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
/**\r
Display menu and wait for user to select one menu option, then return it.\r
If AutoBoot is enabled, then if user doesn't select any option,\r
MENU_REFRESH_ENTRY *MenuUpdateEntry; \r
UI_SCREEN_OPERATION ScreenOperation;\r
UINT8 MinRefreshInterval;\r
- UINTN BufferSize;\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
UI_MENU_LIST *CurrentMenu;\r
- UI_MENU_LIST *MenuList;\r
- FORM_BROWSER_FORM *RefForm;\r
UINTN ModalSkipColumn;\r
\r
CopyMem (&LocalScreen, &gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
NextMenuOption = NULL;\r
PreviousMenuOption = NULL;\r
SavedMenuOption = NULL;\r
- RefForm = NULL;\r
ModalSkipColumn = (LocalScreen.RightColumn - LocalScreen.LeftColumn) / 6;\r
\r
ZeroMem (&Key, sizeof (EFI_INPUT_KEY));\r
\r
switch (Statement->Operand) {\r
case EFI_IFR_REF_OP:\r
- if (Statement->RefDevicePath != 0) {\r
- if (Selection->Form->ModalForm) {\r
- break;\r
- }\r
- //\r
- // Goto another Hii Package list\r
- //\r
- Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-\r
- StringPtr = GetToken (Statement->RefDevicePath, Selection->FormSet->HiiHandle);\r
- if (StringPtr == NULL) {\r
- //\r
- // No device path string not found, exit\r
- //\r
- Selection->Action = UI_ACTION_EXIT;\r
- Selection->Statement = NULL;\r
- break;\r
- }\r
- BufferSize = StrLen (StringPtr) / 2;\r
- DevicePath = AllocatePool (BufferSize);\r
- ASSERT (DevicePath != NULL);\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
- Selection->Handle = DevicePathToHiiHandle (DevicePath);\r
- if (Selection->Handle == NULL) {\r
- //\r
- // If target Hii Handle not found, exit\r
- //\r
- Selection->Action = UI_ACTION_EXIT;\r
- Selection->Statement = NULL;\r
- break;\r
- }\r
-\r
- FreePool (StringPtr);\r
- FreePool (DevicePath);\r
-\r
- CopyMem (&Selection->FormSetGuid, &Statement->RefFormSetId, sizeof (EFI_GUID));\r
- Selection->FormId = Statement->RefFormId;\r
- Selection->QuestionId = Statement->RefQuestionId;\r
- } else if (!CompareGuid (&Statement->RefFormSetId, &gZeroGuid)) {\r
- if (Selection->Form->ModalForm) {\r
- break;\r
- }\r
- //\r
- // Goto another Formset, check for uncommitted data\r
- //\r
- Selection->Action = UI_ACTION_REFRESH_FORMSET;\r
-\r
- CopyMem (&Selection->FormSetGuid, &Statement->RefFormSetId, sizeof (EFI_GUID));\r
- Selection->FormId = Statement->RefFormId;\r
- Selection->QuestionId = Statement->RefQuestionId;\r
- } else if (Statement->RefFormId != 0) {\r
- //\r
- // Check whether target From is suppressed.\r
- //\r
- RefForm = IdToForm (Selection->FormSet, Statement->RefFormId);\r
-\r
- if ((RefForm != NULL) && (RefForm->SuppressExpression != NULL)) {\r
- Status = EvaluateExpression (Selection->FormSet, RefForm, RefForm->SuppressExpression);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- if (RefForm->SuppressExpression->Result.Value.b) {\r
- //\r
- // Form is suppressed. \r
- //\r
- do {\r
- CreateDialog (4, TRUE, 0, NULL, &Key, gEmptyString, gFormSuppress, gPressEnter, gEmptyString);\r
- } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
-\r
- Repaint = TRUE;\r
- break;\r
- }\r
- }\r
-\r
- //\r
- // Goto another form inside this formset,\r
- //\r
- Selection->Action = UI_ACTION_REFRESH_FORM;\r
-\r
- //\r
- // Link current form so that we can always go back when someone hits the ESC\r
- //\r
- MenuList = UiFindMenuList (&Selection->FormSetGuid, Statement->RefFormId);\r
- if (MenuList == NULL) {\r
- MenuList = UiAddMenuList (CurrentMenu, &Selection->FormSetGuid, Statement->RefFormId);\r
- }\r
-\r
- Selection->FormId = Statement->RefFormId;\r
- Selection->QuestionId = Statement->RefQuestionId;\r
- } else if (Statement->RefQuestionId != 0) {\r
- //\r
- // Goto another Question\r
- //\r
- Selection->QuestionId = Statement->RefQuestionId;\r
-\r
- if ((Statement->QuestionFlags & EFI_IFR_FLAG_CALLBACK) != 0) {\r
- Selection->Action = UI_ACTION_REFRESH_FORM;\r
- } else {\r
- Repaint = TRUE;\r
- NewLine = TRUE;\r
- break;\r
- }\r
- }\r
+ ProcessGotoOpCode(Statement, Selection, &Repaint, &NewLine);\r
break;\r
\r
case EFI_IFR_ACTION_OP:\r