VOID\r
)\r
{\r
- CHAR16 *ErrorInfo;\r
- EFI_INPUT_KEY Key;\r
+ CHAR16 *ErrorInfo;\r
+ EFI_INPUT_KEY Key;\r
+ EFI_EVENT WaitList[2];\r
+ EFI_EVENT RefreshIntervalEvent;\r
+ EFI_EVENT TimeOutEvent;\r
+ UINT8 TimeOut;\r
+ EFI_STATUS Status;\r
+ UINTN Index;\r
+ WARNING_IF_CONTEXT EventContext;\r
+ EFI_IFR_OP_HEADER *OpCodeBuf;\r
+ EFI_STRING_ID StringToken;\r
\r
if (gFormData->BrowserStatus == BROWSER_SUCCESS) {\r
return;\r
}\r
\r
- if (gFormData->ErrorString != NULL) {\r
+ StringToken = 0;\r
+ TimeOutEvent = NULL;\r
+ RefreshIntervalEvent = NULL;\r
+ OpCodeBuf = NULL;\r
+ if (gFormData->HighLightedStatement != NULL) {\r
+ OpCodeBuf = gFormData->HighLightedStatement->OpCode;\r
+ }\r
+\r
+ if (gFormData->BrowserStatus == (BROWSER_WARNING_IF)) {\r
+ ASSERT (OpCodeBuf != NULL && OpCodeBuf->OpCode == EFI_IFR_WARNING_IF_OP);\r
+\r
+ TimeOut = ((EFI_IFR_WARNING_IF *) OpCodeBuf)->TimeOut;\r
+ StringToken = ((EFI_IFR_WARNING_IF *) OpCodeBuf)->Warning;\r
+ } else {\r
+ TimeOut = 0;\r
+ if ((gFormData->BrowserStatus == (BROWSER_NO_SUBMIT_IF)) &&\r
+ (OpCodeBuf != NULL && OpCodeBuf->OpCode == EFI_IFR_NO_SUBMIT_IF_OP)) {\r
+ StringToken = ((EFI_IFR_NO_SUBMIT_IF *) OpCodeBuf)->Error;\r
+ } else if ((gFormData->BrowserStatus == (BROWSER_INCONSISTENT_IF)) &&\r
+ (OpCodeBuf != NULL && OpCodeBuf->OpCode == EFI_IFR_INCONSISTENT_IF_OP)) {\r
+ StringToken = ((EFI_IFR_INCONSISTENT_IF *) OpCodeBuf)->Error;\r
+ }\r
+ }\r
+\r
+ if (StringToken != 0) {\r
+ ErrorInfo = GetToken (StringToken, gFormData->HiiHandle);\r
+ } else if (gFormData->ErrorString != NULL) {\r
+ //\r
+ // Only used to compatible with old setup browser.\r
+ // Not use this field in new browser core.\r
+ //\r
ErrorInfo = gFormData->ErrorString;\r
} else {\r
switch (gFormData->BrowserStatus) {\r
ErrorInfo = gSaveFailed;\r
break;\r
\r
- case BROWSER_NO_SUBMIT_IF:\r
- ErrorInfo = gNoSubmitIf;\r
- break;\r
-\r
case BROWSER_FORM_NOT_FOUND:\r
ErrorInfo = gFormNotFound;\r
break;\r
}\r
}\r
\r
- //\r
- // Error occur, prompt error message.\r
- //\r
- do {\r
- CreateDialog (&Key, gEmptyString, ErrorInfo, gPressEnter, gEmptyString, NULL);\r
- } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+ if (TimeOut == 0) {\r
+ do {\r
+ CreateDialog (&Key, gEmptyString, ErrorInfo, gPressEnter, gEmptyString, NULL);\r
+ } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+ } else {\r
+ Status = gBS->CreateEvent (EVT_NOTIFY_WAIT, TPL_CALLBACK, EmptyEventProcess, NULL, &TimeOutEvent);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ EventContext.SyncEvent = TimeOutEvent;\r
+ EventContext.TimeOut = &TimeOut;\r
+ EventContext.ErrorInfo = ErrorInfo;\r
+\r
+ Status = gBS->CreateEvent (EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_CALLBACK, RefreshTimeOutProcess, &EventContext, &RefreshIntervalEvent);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ //\r
+ // Show the dialog first to avoid long time not reaction.\r
+ //\r
+ gBS->SignalEvent (RefreshIntervalEvent);\r
+\r
+ Status = gBS->SetTimer (RefreshIntervalEvent, TimerPeriodic, ONE_SECOND);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ while (TRUE) {\r
+ Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);\r
+ if (!EFI_ERROR (Status) && Key.UnicodeChar == CHAR_CARRIAGE_RETURN) {\r
+ break;\r
+ }\r
+\r
+ if (Status != EFI_NOT_READY) {\r
+ continue;\r
+ }\r
+\r
+ WaitList[0] = TimeOutEvent;\r
+ WaitList[1] = gST->ConIn->WaitForKey;\r
+\r
+ Status = gBS->WaitForEvent (2, WaitList, &Index);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+ if (Index == 0) {\r
+ //\r
+ // Timeout occur, close the hoot time out event.\r
+ //\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ gBS->CloseEvent (TimeOutEvent);\r
+ gBS->CloseEvent (RefreshIntervalEvent);\r
+\r
+ if (StringToken != 0) {\r
+ FreePool (ErrorInfo);\r
+ }\r
}\r
\r
/**\r