X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdeModulePkg%2FUniversal%2FSetupBrowserDxe%2FSetup.c;h=b077a3c0a0335d29ee62788629e478ab777d0b51;hb=94f3aae730d22aa46dd589f2c8e1ac870204b4b7;hp=60f96f4970743f17473f6a04307ee36b8861fd8f;hpb=938baa1fe2c57b9b9eac48e08f3a34ebfd83692b;p=mirror_edk2.git diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c index 60f96f4970..b077a3c0a0 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c @@ -38,6 +38,7 @@ UINTN gBrowserContextCount = 0; LIST_ENTRY gBrowserContextList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserContextList); LIST_ENTRY gBrowserFormSetList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserFormSetList); LIST_ENTRY gBrowserHotKeyList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserHotKeyList); +LIST_ENTRY gBrowserStorageList = INITIALIZE_LIST_HEAD_VARIABLE (gBrowserStorageList); BANNER_DATA *gBannerData; EFI_HII_HANDLE gFrontPageHandle; @@ -47,7 +48,7 @@ BOOLEAN gResetRequired; EFI_HII_HANDLE gHiiHandle; UINT16 gDirection; EFI_SCREEN_DESCRIPTOR gScreenDimensions; -BROWSER_SETTING_SCOPE gBrowserSettingScope = SystemLevel; +BROWSER_SETTING_SCOPE gBrowserSettingScope = FormSetLevel; BOOLEAN mBrowserScopeFirstSet = TRUE; EXIT_HANDLER ExitHandlerFunction = NULL; UINTN gFooterHeight; @@ -244,6 +245,11 @@ SendForm ( // gFooterHeight = FOOTER_HEIGHT + (Index / 3); + // + // Clean the history menu list. + // + InitializeListHead (&gMenuList); + // // Save globals used by SendForm() // @@ -305,8 +311,6 @@ SendForm ( // InitializeBrowserStrings (); - gFunctionKeySetting = ENABLE_FUNCTION_KEY_SETTING; - // // Ensure we are in Text mode // @@ -380,6 +384,7 @@ SendForm ( } FreeBrowserStrings (); + UiFreeMenuList(&gMenuList); gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK)); gST->ConOut->ClearScreen (gST->ConOut); @@ -471,9 +476,9 @@ BrowserCallback ( Storage = FORMSET_STORAGE_FROM_LINK (Link); Link = GetNextNode (&FormSet->StorageListHead, Link); - if (CompareGuid (&Storage->Guid, (EFI_GUID *) VariableGuid)) { - if (Storage->Type == EFI_HII_VARSTORE_BUFFER || - Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) { + if (CompareGuid (&Storage->BrowserStorage->Guid, (EFI_GUID *) VariableGuid)) { + if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER || + Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) { // // Buffer storage require both GUID and Name // @@ -481,7 +486,7 @@ BrowserCallback ( return EFI_NOT_FOUND; } - if (StrCmp (Storage->Name, (CHAR16 *) VariableName) != 0) { + if (StrCmp (Storage->BrowserStorage->Name, (CHAR16 *) VariableName) != 0) { continue; } } @@ -511,7 +516,7 @@ BrowserCallback ( // // Generate // - Status = StorageToConfigResp (Storage, &ConfigResp, FALSE); + Status = StorageToConfigResp (Storage->BrowserStorage, &ConfigResp, Storage->ConfigRequest); if (EFI_ERROR (Status)) { return Status; } @@ -519,7 +524,7 @@ BrowserCallback ( // // Skip and '&' to point to // - StrPtr = ConfigResp + StrLen (Storage->ConfigHdr) + 1; + StrPtr = ConfigResp + StrLen (Storage->BrowserStorage->ConfigHdr) + 1; BufferSize = StrSize (StrPtr); if (*ResultsDataSize < BufferSize) { @@ -538,18 +543,18 @@ BrowserCallback ( // Prepare // TmpSize = StrLen (ResultsData); - BufferSize = (TmpSize + StrLen (Storage->ConfigHdr) + 2) * sizeof (CHAR16); + BufferSize = (TmpSize + StrLen (Storage->BrowserStorage->ConfigHdr) + 2) * sizeof (CHAR16); ConfigResp = AllocateZeroPool (BufferSize); ASSERT (ConfigResp != NULL); - StrCpy (ConfigResp, Storage->ConfigHdr); + StrCpy (ConfigResp, Storage->BrowserStorage->ConfigHdr); StrCat (ConfigResp, L"&"); StrCat (ConfigResp, ResultsData); // // Update Browser uncommited data // - Status = ConfigRespToStorage (Storage, ConfigResp); + Status = ConfigRespToStorage (Storage->BrowserStorage, ConfigResp); if (EFI_ERROR (Status)) { return Status; } @@ -822,7 +827,7 @@ NewStringCat ( **/ VOID SynchronizeStorage ( - IN FORMSET_STORAGE *Storage, + IN BROWSER_STORAGE *Storage, IN BOOLEAN SyncOrRestore ) { @@ -875,7 +880,7 @@ SynchronizeStorage ( **/ EFI_STATUS GetValueByName ( - IN FORMSET_STORAGE *Storage, + IN BROWSER_STORAGE *Storage, IN CHAR16 *Name, IN OUT CHAR16 **Value, IN GET_SET_QUESTION_VALUE_WITH GetValueFrom @@ -924,7 +929,7 @@ GetValueByName ( **/ EFI_STATUS SetValueByName ( - IN FORMSET_STORAGE *Storage, + IN BROWSER_STORAGE *Storage, IN CHAR16 *Name, IN CHAR16 *Value, IN GET_SET_QUESTION_VALUE_WITH SetValueTo @@ -971,9 +976,9 @@ SetValueByName ( /** Convert setting of Buffer Storage or NameValue Storage to . - @param Buffer The Storage to be conveted. + @param Storage The Storage to be conveted. @param ConfigResp The returned . - @param SingleForm Whether update data for single form or formset level. + @param ConfigRequest The ConfigRequest string. @retval EFI_SUCCESS Convert success. @retval EFI_INVALID_PARAMETER Incorrect storage type. @@ -981,28 +986,17 @@ SetValueByName ( **/ EFI_STATUS StorageToConfigResp ( - IN VOID *Buffer, + IN BROWSER_STORAGE *Storage, IN CHAR16 **ConfigResp, - IN BOOLEAN SingleForm + IN CHAR16 *ConfigRequest ) { - EFI_STATUS Status; - EFI_STRING Progress; + EFI_STATUS Status; + EFI_STRING Progress; LIST_ENTRY *Link; NAME_VALUE_NODE *Node; - CHAR16 *ConfigRequest; - FORMSET_STORAGE *Storage; - FORM_BROWSER_CONFIG_REQUEST *ConfigInfo; Status = EFI_SUCCESS; - if (SingleForm) { - ConfigInfo = (FORM_BROWSER_CONFIG_REQUEST *) Buffer; - Storage = ConfigInfo->Storage; - ConfigRequest = ConfigInfo->ConfigRequest; - } else { - Storage = (FORMSET_STORAGE *) Buffer; - ConfigRequest = Storage->ConfigRequest; - } switch (Storage->Type) { case EFI_HII_VARSTORE_BUFFER: @@ -1057,7 +1051,7 @@ StorageToConfigResp ( **/ EFI_STATUS ConfigRespToStorage ( - IN FORMSET_STORAGE *Storage, + IN BROWSER_STORAGE *Storage, IN CHAR16 *ConfigResp ) { @@ -1149,7 +1143,7 @@ GetQuestionValue ( UINT8 *Dst; UINTN StorageWidth; EFI_TIME EfiTime; - FORMSET_STORAGE *Storage; + BROWSER_STORAGE *Storage; EFI_IFR_TYPE_VALUE *QuestionValue; CHAR16 *ConfigRequest; CHAR16 *Progress; @@ -1574,7 +1568,7 @@ SetQuestionValue ( EFI_TIME EfiTime; UINTN BufferLen; UINTN StorageWidth; - FORMSET_STORAGE *Storage; + BROWSER_STORAGE *Storage; EFI_IFR_TYPE_VALUE *QuestionValue; CHAR16 *ConfigResp; CHAR16 *Progress; @@ -2300,7 +2294,7 @@ DiscardForm ( Storage = FORMSET_STORAGE_FROM_LINK (Link); Link = GetNextNode (&FormSet->StorageListHead, Link); - if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) { + if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) { continue; } @@ -2311,7 +2305,7 @@ DiscardForm ( continue; } - SynchronizeStorage(Storage, FALSE); + SynchronizeStorage(Storage->BrowserStorage, FALSE); } Link = GetFirstNode (&FormSet->FormListHead); @@ -2377,7 +2371,8 @@ SubmitForm ( LIST_ENTRY *Link; EFI_STRING ConfigResp; EFI_STRING Progress; - FORMSET_STORAGE *Storage; + BROWSER_STORAGE *Storage; + FORMSET_STORAGE *FormSetStorage; UINTN BufferSize; UINT8 *TmpBuf; FORM_BROWSER_FORMSET *LocalFormSet; @@ -2425,7 +2420,7 @@ SubmitForm ( // // 1. Prepare // - Status = StorageToConfigResp (ConfigInfo, &ConfigResp, TRUE); + Status = StorageToConfigResp (ConfigInfo->Storage, &ConfigResp, ConfigInfo->ConfigRequest); if (EFI_ERROR (Status)) { return Status; } @@ -2514,7 +2509,8 @@ SubmitForm ( // Link = GetFirstNode (&FormSet->StorageListHead); while (!IsNull (&FormSet->StorageListHead, Link)) { - Storage = FORMSET_STORAGE_FROM_LINK (Link); + FormSetStorage = (FORMSET_STORAGE_FROM_LINK (Link)); + Storage = FormSetStorage->BrowserStorage; Link = GetNextNode (&FormSet->StorageListHead, Link); if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) { @@ -2524,14 +2520,14 @@ SubmitForm ( // // Skip if there is no RequestElement // - if (Storage->ElementCount == 0) { + if (FormSetStorage->ElementCount == 0) { continue; } // // 1. Prepare // - Status = StorageToConfigResp (Storage, &ConfigResp, FALSE); + Status = StorageToConfigResp (Storage, &ConfigResp, FormSetStorage->ConfigRequest); if (EFI_ERROR (Status)) { return Status; } @@ -2659,7 +2655,7 @@ GetDefaultValueFromAltCfg ( BOOLEAN IsBufferStorage; BOOLEAN IsString; UINTN Length; - FORMSET_STORAGE *Storage; + BROWSER_STORAGE *Storage; CHAR16 *ConfigRequest; CHAR16 *Progress; CHAR16 *Result; @@ -3147,7 +3143,7 @@ ExtractDefault ( IN UINT16 DefaultId, IN BROWSER_SETTING_SCOPE SettingScope, IN BROWSER_GET_DEFAULT_VALUE GetDefaultValueScope, - IN FORMSET_STORAGE *Storage OPTIONAL, + IN BROWSER_STORAGE *Storage OPTIONAL, IN BOOLEAN RetrieveValueFirst ) { @@ -3460,17 +3456,17 @@ LoadStorage ( EFI_STRING Result; CHAR16 *StrPtr; - if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) { + if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) { return EFI_SUCCESS; } - if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) { + if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) { Status = gRT->GetVariable ( - Storage->Name, - &Storage->Guid, + Storage->BrowserStorage->Name, + &Storage->BrowserStorage->Guid, NULL, - (UINTN*)&Storage->Size, - Storage->EditBuffer + (UINTN*)&Storage->BrowserStorage->Size, + Storage->BrowserStorage->EditBuffer ); return Status; } @@ -3507,136 +3503,11 @@ LoadStorage ( *StrPtr = L'\0'; } - Status = ConfigRespToStorage (Storage, Result); + Status = ConfigRespToStorage (Storage->BrowserStorage, Result); FreePool (Result); return Status; } - -/** - Copy uncommitted data from source Storage to destination Storage. - - @param Dst Target Storage for uncommitted data. - @param Src Source Storage for uncommitted data. - - @retval EFI_SUCCESS The function completed successfully. - @retval EFI_INVALID_PARAMETER Source and destination Storage is not the same type. - -**/ -EFI_STATUS -CopyStorage ( - IN OUT FORMSET_STORAGE *Dst, - IN FORMSET_STORAGE *Src - ) -{ - LIST_ENTRY *Link; - NAME_VALUE_NODE *Node; - - if ((Dst->Type != Src->Type) || (Dst->Size != Src->Size)) { - return EFI_INVALID_PARAMETER; - } - - switch (Src->Type) { - case EFI_HII_VARSTORE_BUFFER: - case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER: - CopyMem (Dst->EditBuffer, Src->EditBuffer, Src->Size); - CopyMem (Dst->Buffer, Src->Buffer, Src->Size); - break; - - case EFI_HII_VARSTORE_NAME_VALUE: - Link = GetFirstNode (&Src->NameValueListHead); - while (!IsNull (&Src->NameValueListHead, Link)) { - Node = NAME_VALUE_NODE_FROM_LINK (Link); - - SetValueByName (Dst, Node->Name, Node->EditValue, GetSetValueWithEditBuffer); - SetValueByName (Dst, Node->Name, Node->Value, GetSetValueWithBuffer); - - Link = GetNextNode (&Src->NameValueListHead, Link); - } - break; - - case EFI_HII_VARSTORE_EFI_VARIABLE: - default: - break; - } - - return EFI_SUCCESS; -} - -/** - Get old question value from the saved formset. - - @param Statement The question which need to get old question value. - @param OldFormSet FormSet data structure saved in the list. - -**/ -VOID -GetOldQuestionValue ( - IN OUT FORM_BROWSER_STATEMENT *Statement, - IN FORM_BROWSER_FORMSET *OldFormSet - ) -{ - LIST_ENTRY *FormLink; - LIST_ENTRY *Link; - FORM_BROWSER_STATEMENT *Question; - FORM_BROWSER_FORM *Form; - - FormLink = GetFirstNode (&OldFormSet->FormListHead); - while (!IsNull (&OldFormSet->FormListHead, FormLink)) { - Form = FORM_BROWSER_FORM_FROM_LINK (FormLink); - FormLink = GetNextNode (&OldFormSet->FormListHead, FormLink); - - Link = GetFirstNode (&Form->StatementListHead); - while (!IsNull (&Form->StatementListHead, Link)) { - Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link); - Link = GetNextNode (&Form->StatementListHead, Link); - - if (Question->QuestionId != Statement->QuestionId) { - continue; - } - - CopyMem (&Statement->HiiValue, &Question->HiiValue, sizeof (EFI_HII_VALUE)); - return; - } - } -} - -/** - Get old question value from the saved formset, all these questions not have - storage. - - @param FormSet FormSet data structure which is used now. - @param OldFormSet FormSet data structure saved in the list. - -**/ -VOID -CopyOldValueForNoStorageQst ( - IN OUT FORM_BROWSER_FORMSET *FormSet, - IN FORM_BROWSER_FORMSET *OldFormSet - ) -{ - LIST_ENTRY *FormLink; - LIST_ENTRY *Link; - FORM_BROWSER_STATEMENT *Question; - FORM_BROWSER_FORM *Form; - - FormLink = GetFirstNode (&FormSet->FormListHead); - while (!IsNull (&FormSet->FormListHead, FormLink)) { - Form = FORM_BROWSER_FORM_FROM_LINK (FormLink); - FormLink = GetNextNode (&FormSet->FormListHead, FormLink); - - Link = GetFirstNode (&Form->StatementListHead); - while (!IsNull (&Form->StatementListHead, Link)) { - Question = FORM_BROWSER_STATEMENT_FROM_LINK (Link); - Link = GetNextNode (&Form->StatementListHead, Link); - - if (Question->Storage == NULL) { - GetOldQuestionValue (Question, OldFormSet); - } - } - } -} - /** Get current setting of Questions. @@ -3689,17 +3560,18 @@ InitializeCurrentSetting ( } } - if (OldStorage == NULL) { - // - // Storage is not found in backup formset, request it from ConfigDriver - // + // + // Storage is not found in backup formset and current global storage not has other driver used, + // request it from ConfigDriver + // + if (OldStorage == NULL && Storage->BrowserStorage->ReferenceCount == 1) { Status = LoadStorage (FormSet, Storage); if (EFI_ERROR (Status)) { // // If get last time changed value failed, extract default from IFR binary // - ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage, TRUE); + ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE); // // ExtractDefault will set the NV flag to TRUE, so need this function to clean the flag // in current situation. @@ -3711,12 +3583,7 @@ InitializeCurrentSetting ( // Now Edit Buffer is filled with default values(lower priority) or current // settings(higher priority), sychronize it to shadow Buffer // - SynchronizeStorage (Storage, TRUE); - } else { - // - // Storage found in backup formset, use it - // - Status = CopyStorage (Storage, OldStorage); + SynchronizeStorage (Storage->BrowserStorage, TRUE); } Link = GetNextNode (&FormSet->StorageListHead, Link); @@ -4009,6 +3876,8 @@ InitializeFormSet ( } } + gFunctionKeySetting = ENABLE_FUNCTION_KEY_SETTING; + if ((gClassOfVfr & FORMSET_CLASS_FRONT_PAGE) == FORMSET_CLASS_FRONT_PAGE) { gFrontPageHandle = FormSet->HiiHandle; gFunctionKeySetting = NONE_FUNCTION_KEY_SETTING;