+\r
+\r
+/**\r
+ Save globals used by previous call to SendForm(). SendForm() may be called from \r
+ HiiConfigAccess.Callback(), this will cause SendForm() be reentried.\r
+ So, save globals of previous call to SendForm() and restore them upon exit.\r
+\r
+**/\r
+VOID\r
+SaveBrowserContext (\r
+ VOID\r
+ )\r
+{\r
+ BROWSER_CONTEXT *Context;\r
+\r
+ gBrowserContextCount++;\r
+ if (gBrowserContextCount == 1) {\r
+ //\r
+ // This is not reentry of SendForm(), no context to save\r
+ //\r
+ return;\r
+ }\r
+\r
+ Context = AllocatePool (sizeof (BROWSER_CONTEXT));\r
+ ASSERT (Context != NULL);\r
+\r
+ Context->Signature = BROWSER_CONTEXT_SIGNATURE;\r
+\r
+ //\r
+ // Save FormBrowser context\r
+ //\r
+ Context->BannerData = gBannerData;\r
+ Context->ClassOfVfr = gClassOfVfr;\r
+ Context->FunctionKeySetting = gFunctionKeySetting;\r
+ Context->ResetRequired = gResetRequired;\r
+ Context->NvUpdateRequired = gNvUpdateRequired;\r
+ Context->Direction = gDirection;\r
+ Context->FunctionNineString = gFunctionNineString;\r
+ Context->FunctionTenString = gFunctionTenString;\r
+ Context->EnterString = gEnterString;\r
+ Context->EnterCommitString = gEnterCommitString;\r
+ Context->EnterEscapeString = gEnterEscapeString;\r
+ Context->EscapeString = gEscapeString;\r
+ Context->SaveFailed = gSaveFailed;\r
+ Context->MoveHighlight = gMoveHighlight;\r
+ Context->MakeSelection = gMakeSelection;\r
+ Context->DecNumericInput = gDecNumericInput;\r
+ Context->HexNumericInput = gHexNumericInput;\r
+ Context->ToggleCheckBox = gToggleCheckBox;\r
+ Context->PromptForData = gPromptForData;\r
+ Context->PromptForPassword = gPromptForPassword;\r
+ Context->PromptForNewPassword = gPromptForNewPassword;\r
+ Context->ConfirmPassword = gConfirmPassword;\r
+ Context->ConfirmError = gConfirmError;\r
+ Context->PassowordInvalid = gPassowordInvalid;\r
+ Context->PressEnter = gPressEnter;\r
+ Context->EmptyString = gEmptyString;\r
+ Context->AreYouSure = gAreYouSure;\r
+ Context->YesResponse = gYesResponse;\r
+ Context->NoResponse = gNoResponse;\r
+ Context->MiniString = gMiniString;\r
+ Context->PlusString = gPlusString;\r
+ Context->MinusString = gMinusString;\r
+ Context->AdjustNumber = gAdjustNumber;\r
+ Context->SaveChanges = gSaveChanges;\r
+ Context->OptionMismatch = gOptionMismatch;\r
+ Context->PromptBlockWidth = gPromptBlockWidth;\r
+ Context->OptionBlockWidth = gOptionBlockWidth;\r
+ Context->HelpBlockWidth = gHelpBlockWidth;\r
+ Context->OldFormSet = gOldFormSet;\r
+ Context->MenuRefreshHead = gMenuRefreshHead;\r
+\r
+ CopyMem (&Context->ScreenDimensions, &gScreenDimensions, sizeof (gScreenDimensions));\r
+ CopyMem (&Context->MenuOption, &gMenuOption, sizeof (gMenuOption));\r
+\r
+ //\r
+ // Insert to FormBrowser context list\r
+ //\r
+ InsertHeadList (&gBrowserContextList, &Context->Link);\r
+}\r
+\r
+\r
+/**\r
+ Restore globals used by previous call to SendForm().\r
+\r
+**/\r
+VOID\r
+RestoreBrowserContext (\r
+ VOID\r
+ )\r
+{\r
+ LIST_ENTRY *Link;\r
+ BROWSER_CONTEXT *Context;\r
+\r
+ ASSERT (gBrowserContextCount != 0);\r
+ gBrowserContextCount--;\r
+ if (gBrowserContextCount == 0) {\r
+ //\r
+ // This is not reentry of SendForm(), no context to restore\r
+ //\r
+ return;\r
+ }\r
+\r
+ ASSERT (!IsListEmpty (&gBrowserContextList));\r
+\r
+ Link = GetFirstNode (&gBrowserContextList);\r
+ Context = BROWSER_CONTEXT_FROM_LINK (Link);\r
+\r
+ //\r
+ // Restore FormBrowser context\r
+ //\r
+ gBannerData = Context->BannerData;\r
+ gClassOfVfr = Context->ClassOfVfr;\r
+ gFunctionKeySetting = Context->FunctionKeySetting;\r
+ gResetRequired = Context->ResetRequired;\r
+ gNvUpdateRequired = Context->NvUpdateRequired;\r
+ gDirection = Context->Direction;\r
+ gFunctionNineString = Context->FunctionNineString;\r
+ gFunctionTenString = Context->FunctionTenString;\r
+ gEnterString = Context->EnterString;\r
+ gEnterCommitString = Context->EnterCommitString;\r
+ gEnterEscapeString = Context->EnterEscapeString;\r
+ gEscapeString = Context->EscapeString;\r
+ gSaveFailed = Context->SaveFailed;\r
+ gMoveHighlight = Context->MoveHighlight;\r
+ gMakeSelection = Context->MakeSelection;\r
+ gDecNumericInput = Context->DecNumericInput;\r
+ gHexNumericInput = Context->HexNumericInput;\r
+ gToggleCheckBox = Context->ToggleCheckBox;\r
+ gPromptForData = Context->PromptForData;\r
+ gPromptForPassword = Context->PromptForPassword;\r
+ gPromptForNewPassword = Context->PromptForNewPassword;\r
+ gConfirmPassword = Context->ConfirmPassword;\r
+ gConfirmError = Context->ConfirmError;\r
+ gPassowordInvalid = Context->PassowordInvalid;\r
+ gPressEnter = Context->PressEnter;\r
+ gEmptyString = Context->EmptyString;\r
+ gAreYouSure = Context->AreYouSure;\r
+ gYesResponse = Context->YesResponse;\r
+ gNoResponse = Context->NoResponse;\r
+ gMiniString = Context->MiniString;\r
+ gPlusString = Context->PlusString;\r
+ gMinusString = Context->MinusString;\r
+ gAdjustNumber = Context->AdjustNumber;\r
+ gSaveChanges = Context->SaveChanges;\r
+ gOptionMismatch = Context->OptionMismatch;\r
+ gPromptBlockWidth = Context->PromptBlockWidth;\r
+ gOptionBlockWidth = Context->OptionBlockWidth;\r
+ gHelpBlockWidth = Context->HelpBlockWidth;\r
+ gOldFormSet = Context->OldFormSet;\r
+ gMenuRefreshHead = Context->MenuRefreshHead;\r
+\r
+ CopyMem (&gScreenDimensions, &Context->ScreenDimensions, sizeof (gScreenDimensions));\r
+ CopyMem (&gMenuOption, &Context->MenuOption, sizeof (gMenuOption));\r
+\r
+ //\r
+ // Remove from FormBrowser context list\r
+ //\r
+ RemoveEntryList (&Context->Link);\r
+ gBS->FreePool (Context);\r
+}\r