CHAR16 *gNoSubmitIf;\r
CHAR16 *gBrwoserError;\r
CHAR16 *gSaveFailed;\r
+CHAR16 *gNoSubmitIfFailed;\r
+CHAR16 *gSaveProcess;\r
+CHAR16 *gSaveNoSubmitProcess;\r
+CHAR16 *gDiscardChange;\r
+CHAR16 *gJumpToFormSet;\r
+CHAR16 *gCheckError;\r
CHAR16 *gPromptForData;\r
CHAR16 *gPromptForPassword;\r
CHAR16 *gPromptForNewPassword;\r
{\r
mUnknownString = GetToken (STRING_TOKEN (UNKNOWN_STRING), gHiiHandle);\r
gSaveFailed = GetToken (STRING_TOKEN (SAVE_FAILED), gHiiHandle);\r
+ gNoSubmitIfFailed = GetToken (STRING_TOKEN (NO_SUBMIT_IF_CHECK_FAILED), gHiiHandle);\r
+ gSaveProcess = GetToken (STRING_TOKEN (DISCARD_OR_JUMP), gHiiHandle);\r
+ gSaveNoSubmitProcess = GetToken (STRING_TOKEN (DISCARD_OR_CHECK), gHiiHandle);\r
+ gDiscardChange = GetToken (STRING_TOKEN (DISCARD_OR_JUMP_DISCARD), gHiiHandle);\r
+ gJumpToFormSet = GetToken (STRING_TOKEN (DISCARD_OR_JUMP_JUMP), gHiiHandle);\r
+ gCheckError = GetToken (STRING_TOKEN (DISCARD_OR_CHECK_CHECK), gHiiHandle);\r
gPromptForData = GetToken (STRING_TOKEN (PROMPT_FOR_DATA), gHiiHandle);\r
gPromptForPassword = GetToken (STRING_TOKEN (PROMPT_FOR_PASSWORD), gHiiHandle);\r
gPromptForNewPassword = GetToken (STRING_TOKEN (PROMPT_FOR_NEW_PASSWORD), gHiiHandle);\r
FreePool (mUnknownString);\r
FreePool (gEmptyString);\r
FreePool (gSaveFailed);\r
+ FreePool (gNoSubmitIfFailed);\r
+ FreePool (gSaveProcess);\r
+ FreePool (gSaveNoSubmitProcess);\r
+ FreePool (gDiscardChange);\r
+ FreePool (gJumpToFormSet);\r
+ FreePool (gCheckError);\r
FreePool (gPromptForData);\r
FreePool (gPromptForPassword);\r
FreePool (gPromptForNewPassword);\r
WARNING_IF_CONTEXT EventContext;\r
EFI_IFR_OP_HEADER *OpCodeBuf;\r
EFI_STRING_ID StringToken;\r
+ CHAR16 DiscardChange;\r
+ CHAR16 JumpToFormSet;\r
+ CHAR16 *PrintString;\r
\r
if (gFormData->BrowserStatus == BROWSER_SUCCESS) {\r
return;\r
ErrorInfo = gProtocolNotFound;\r
break;\r
\r
+ case BROWSER_SUBMIT_FAIL_NO_SUBMIT_IF:\r
+ ErrorInfo = gNoSubmitIfFailed;\r
+ break;\r
+\r
default:\r
ErrorInfo = gBrwoserError;\r
break;\r
}\r
}\r
\r
- if (TimeOut == 0) {\r
+ switch (gFormData->BrowserStatus) {\r
+ case BROWSER_SUBMIT_FAIL:\r
+ case BROWSER_SUBMIT_FAIL_NO_SUBMIT_IF:\r
+ ASSERT (gUserInput != NULL);\r
+ if (gFormData->BrowserStatus == (BROWSER_SUBMIT_FAIL)) {\r
+ PrintString = gSaveProcess;\r
+ JumpToFormSet = gJumpToFormSet[0];\r
+ } else {\r
+ PrintString = gSaveNoSubmitProcess;\r
+ JumpToFormSet = gCheckError[0];\r
+ }\r
+ DiscardChange = gDiscardChange[0];\r
+\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
+ CreateDialog (&Key, gEmptyString, ErrorInfo, PrintString, gEmptyString, NULL);\r
+ } while (((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (DiscardChange | UPPER_LOWER_CASE_OFFSET)) &&\r
+ ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) != (JumpToFormSet | UPPER_LOWER_CASE_OFFSET)));\r
\r
- EventContext.SyncEvent = TimeOutEvent;\r
- EventContext.TimeOut = &TimeOut;\r
- EventContext.ErrorInfo = ErrorInfo;\r
+ if ((Key.UnicodeChar | UPPER_LOWER_CASE_OFFSET) == (DiscardChange | UPPER_LOWER_CASE_OFFSET)) {\r
+ gUserInput->Action = BROWSER_ACTION_DISCARD;\r
+ } else {\r
+ gUserInput->Action = BROWSER_ACTION_GOTO;\r
+ }\r
+ break;\r
\r
- Status = gBS->CreateEvent (EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_CALLBACK, RefreshTimeOutProcess, &EventContext, &RefreshIntervalEvent);\r
- ASSERT_EFI_ERROR (Status);\r
+ default:\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
- //\r
- // Show the dialog first to avoid long time not reaction.\r
- //\r
- gBS->SignalEvent (RefreshIntervalEvent);\r
+ EventContext.SyncEvent = TimeOutEvent;\r
+ EventContext.TimeOut = &TimeOut;\r
+ EventContext.ErrorInfo = ErrorInfo;\r
\r
- Status = gBS->SetTimer (RefreshIntervalEvent, TimerPeriodic, ONE_SECOND);\r
- ASSERT_EFI_ERROR (Status);\r
+ Status = gBS->CreateEvent (EVT_TIMER | EVT_NOTIFY_SIGNAL, TPL_CALLBACK, RefreshTimeOutProcess, &EventContext, &RefreshIntervalEvent);\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
+ // 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
- if (Status != EFI_NOT_READY) {\r
- continue;\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
- WaitList[0] = TimeOutEvent;\r
- WaitList[1] = gST->ConIn->WaitForKey;\r
+ if (Status != EFI_NOT_READY) {\r
+ continue;\r
+ }\r
\r
- Status = gBS->WaitForEvent (2, WaitList, &Index);\r
- ASSERT_EFI_ERROR (Status);\r
+ WaitList[0] = TimeOutEvent;\r
+ WaitList[1] = gST->ConIn->WaitForKey;\r
\r
- if (Index == 0) {\r
- //\r
- // Timeout occur, close the hoot time out event.\r
- //\r
- break;\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
+ gBS->CloseEvent (TimeOutEvent);\r
+ gBS->CloseEvent (RefreshIntervalEvent);\r
}\r
+ break;\r
}\r
\r
- gBS->CloseEvent (TimeOutEvent);\r
- gBS->CloseEvent (RefreshIntervalEvent);\r
-\r
if (StringToken != 0) {\r
FreePool (ErrorInfo);\r
}\r
// Process the status info first.\r
//\r
BrowserStatusProcess();\r
- if (UserInputData == NULL) {\r
+ if (gFormData->BrowserStatus != BROWSER_SUCCESS) {\r
//\r
- // UserInputData == NULL, means only need to print the error info, return here.\r
+ // gFormData->BrowserStatus != BROWSER_SUCCESS, means only need to print the error info, return here.\r
//\r
return EFI_SUCCESS;\r
}\r