From 787fc2a6006cb2d44c6a63485679b58aa4ee34ad Mon Sep 17 00:00:00 2001 From: Eric Dong Date: Fri, 21 Nov 2014 01:23:09 +0000 Subject: [PATCH] MdeModulePkg: Refine the get default value logic. Based on the input request to get default value for questions. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Eric Dong Reviewed-by: Liming Gao git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16413 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Universal/SetupBrowserDxe/Presentation.c | 4 +- .../Universal/SetupBrowserDxe/Setup.c | 207 ++++-------------- .../Universal/SetupBrowserDxe/Setup.h | 5 +- 3 files changed, 48 insertions(+), 168 deletions(-) diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c index bfb8afc140..7db775e4b4 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c @@ -928,7 +928,7 @@ ProcessAction ( } if ((Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) { - ExtractDefault (gCurrentSelection->FormSet, gCurrentSelection->Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE); + ExtractDefault (gCurrentSelection->FormSet, gCurrentSelection->Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE, FALSE); UpdateStatementStatus (gCurrentSelection->FormSet, gCurrentSelection->Form, gBrowserSettingScope); } @@ -1542,7 +1542,7 @@ ProcessUserInput ( // // Reset Question to default value specified by DefaultId // - Status = ExtractDefault (gCurrentSelection->FormSet, NULL, Statement->DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE); + Status = ExtractDefault (gCurrentSelection->FormSet, NULL, Statement->DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE, FALSE); UpdateStatementStatus (gCurrentSelection->FormSet, NULL, FormSetLevel); break; diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c index a25150165c..fb88956a24 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c @@ -3986,13 +3986,15 @@ GetQuestionDefault ( @param FormSet Form data structure. @param Form Form data structure. @param DefaultId The Class of the default. + @param BrowserStorage The input request storage for the questions. **/ VOID ExtractAltCfgForForm ( IN FORM_BROWSER_FORMSET *FormSet, IN FORM_BROWSER_FORM *Form, - IN UINT16 DefaultId + IN UINT16 DefaultId, + IN BROWSER_STORAGE *BrowserStorage ) { EFI_STATUS Status; @@ -4013,10 +4015,13 @@ ExtractAltCfgForForm ( FormSetStorage = FORMSET_STORAGE_FROM_LINK (Link); Storage = FormSetStorage->BrowserStorage; Link = GetNextNode (&FormSet->StorageListHead, Link); + if (BrowserStorage != NULL && BrowserStorage != Storage) { + continue; + } if (Storage->Type != EFI_HII_VARSTORE_EFI_VARIABLE && FormSetStorage->ElementCount != 0 && - FormSetStorage->ConfigAltResp != NULL) { + FormSetStorage->HasCallAltCfg) { return; } } @@ -4030,6 +4035,10 @@ ExtractAltCfgForForm ( Link = GetNextNode (&Form->ConfigRequestHead, Link); Storage = ConfigInfo->Storage; + if (BrowserStorage != NULL && BrowserStorage != Storage) { + continue; + } + if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) { continue; } @@ -4107,12 +4116,14 @@ CleanAltCfgForForm ( @param FormSet Form data structure. @param DefaultId The Class of the default. + @param BrowserStorage The input request storage for the questions. **/ VOID ExtractAltCfgForFormSet ( IN FORM_BROWSER_FORMSET *FormSet, - IN UINT16 DefaultId + IN UINT16 DefaultId, + IN BROWSER_STORAGE *BrowserStorage ) { EFI_STATUS Status; @@ -4129,6 +4140,10 @@ ExtractAltCfgForFormSet ( Storage = FormSetStorage->BrowserStorage; Link = GetNextNode (&FormSet->StorageListHead, Link); + if (BrowserStorage != NULL && BrowserStorage != Storage) { + continue; + } + if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) { continue; } @@ -4140,6 +4155,8 @@ ExtractAltCfgForFormSet ( continue; } + FormSetStorage->HasCallAltCfg = TRUE; + // // 2. Get value through hii config routine protocol. // @@ -4200,6 +4217,8 @@ CleanAltCfgForFormSet ( FreePool (FormSetStorage->ConfigAltResp); FormSetStorage->ConfigAltResp = NULL; } + + FormSetStorage->HasCallAltCfg = FALSE; } } @@ -4218,6 +4237,7 @@ CleanAltCfgForFormSet ( @param RetrieveValueFirst Whether call the retrieve call back to get the initial value before get default value. + @param SkipGetAltCfg Whether skip the get altcfg string process. @retval EFI_SUCCESS The function completed successfully. @retval EFI_UNSUPPORTED Unsupport SettingScope. @@ -4231,7 +4251,8 @@ ExtractDefault ( IN BROWSER_SETTING_SCOPE SettingScope, IN BROWSER_GET_DEFAULT_VALUE GetDefaultValueScope, IN BROWSER_STORAGE *Storage OPTIONAL, - IN BOOLEAN RetrieveValueFirst + IN BOOLEAN RetrieveValueFirst, + IN BOOLEAN SkipGetAltCfg ) { EFI_STATUS Status; @@ -4258,7 +4279,9 @@ ExtractDefault ( // // Prepare the AltCfg String for form. // - ExtractAltCfgForForm (FormSet, Form, DefaultId); + if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) { + ExtractAltCfgForForm (FormSet, Form, DefaultId, Storage); + } // // Extract Form default @@ -4320,24 +4343,30 @@ ExtractDefault ( // // Clean the AltCfg String. // - CleanAltCfgForForm(Form); + if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) { + CleanAltCfgForForm(Form); + } } else if (SettingScope == FormSetLevel) { // // Prepare the AltCfg String for formset. // - ExtractAltCfgForFormSet (FormSet, DefaultId); + if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) { + ExtractAltCfgForFormSet (FormSet, DefaultId, Storage); + } FormLink = GetFirstNode (&FormSet->FormListHead); while (!IsNull (&FormSet->FormListHead, FormLink)) { Form = FORM_BROWSER_FORM_FROM_LINK (FormLink); - ExtractDefault (FormSet, Form, DefaultId, FormLevel, GetDefaultValueScope, Storage, RetrieveValueFirst); + ExtractDefault (FormSet, Form, DefaultId, FormLevel, GetDefaultValueScope, Storage, RetrieveValueFirst, SkipGetAltCfg); FormLink = GetNextNode (&FormSet->FormListHead, FormLink); } // // Clean the AltCfg String. // - CleanAltCfgForFormSet (FormSet); + if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) { + CleanAltCfgForFormSet (FormSet); + } } else if (SettingScope == SystemLevel) { // // Preload all Hii formset. @@ -4359,7 +4388,7 @@ ExtractDefault ( mSystemLevelFormSet = LocalFormSet; - ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage, RetrieveValueFirst); + ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage, RetrieveValueFirst, SkipGetAltCfg); } mSystemLevelFormSet = OldFormSet; @@ -4919,158 +4948,6 @@ ConfigRequestAdjust ( return RetVal; } -/** - - Base on ConfigRequest info to get default value for current formset. - - ConfigRequest info include the info about which questions in current formset need to - get default value. This function only get these questions default value. - - @param FormSet FormSet data structure. - @param Storage Storage need to update value. - @param ConfigRequest The config request string. - -**/ -VOID -GetDefaultForFormset ( - IN FORM_BROWSER_FORMSET *FormSet, - IN BROWSER_STORAGE *Storage, - IN CHAR16 *ConfigRequest - ) -{ - UINT8 *BackUpBuf; - UINTN BufferSize; - LIST_ENTRY BackUpList; - NAME_VALUE_NODE *Node; - LIST_ENTRY *Link; - LIST_ENTRY *NodeLink; - NAME_VALUE_NODE *TmpNode; - EFI_STATUS Status; - EFI_STRING Progress; - EFI_STRING Result; - - BackUpBuf = NULL; - InitializeListHead(&BackUpList); - - // - // Back update the edit buffer. - // - if (Storage->Type == EFI_HII_VARSTORE_BUFFER || - (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) { - BackUpBuf = AllocateCopyPool (Storage->Size, Storage->EditBuffer); - ASSERT (BackUpBuf != NULL); - } else if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) { - Link = GetFirstNode (&Storage->NameValueListHead); - while (!IsNull (&Storage->NameValueListHead, Link)) { - Node = NAME_VALUE_NODE_FROM_LINK (Link); - Link = GetNextNode (&Storage->NameValueListHead, Link); - - // - // Only back Node belong to this formset. - // - if (StrStr (Storage->ConfigRequest, Node->Name) == NULL) { - continue; - } - - TmpNode = AllocateCopyPool (sizeof (NAME_VALUE_NODE), Node); - ASSERT (TmpNode != NULL); - TmpNode->Name = AllocateCopyPool (StrSize(Node->Name) * sizeof (CHAR16), Node->Name); - ASSERT (TmpNode->Name != NULL); - TmpNode->EditValue = AllocateCopyPool (StrSize(Node->EditValue) * sizeof (CHAR16), Node->EditValue); - ASSERT (TmpNode->EditValue != NULL); - - InsertTailList(&BackUpList, &TmpNode->Link); - } - } - - // - // Get default value. - // - ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage, TRUE); - - // - // Update the question value based on the input ConfigRequest. - // - if (Storage->Type == EFI_HII_VARSTORE_BUFFER || - (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) { - ASSERT (BackUpBuf != NULL); - BufferSize = Storage->Size; - Status = mHiiConfigRouting->BlockToConfig( - mHiiConfigRouting, - ConfigRequest, - Storage->EditBuffer, - BufferSize, - &Result, - &Progress - ); - ASSERT_EFI_ERROR (Status); - - Status = mHiiConfigRouting->ConfigToBlock ( - mHiiConfigRouting, - Result, - BackUpBuf, - &BufferSize, - &Progress - ); - ASSERT_EFI_ERROR (Status); - - if (Result != NULL) { - FreePool (Result); - } - - CopyMem (Storage->EditBuffer, BackUpBuf, Storage->Size); - FreePool (BackUpBuf); - } else if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) { - // - // Update question value, only element in ConfigReqeust will be update. - // - Link = GetFirstNode (&BackUpList); - while (!IsNull (&BackUpList, Link)) { - Node = NAME_VALUE_NODE_FROM_LINK (Link); - Link = GetNextNode (&BackUpList, Link); - - if (StrStr (ConfigRequest, Node->Name) != NULL) { - continue; - } - - NodeLink = GetFirstNode (&Storage->NameValueListHead); - while (!IsNull (&Storage->NameValueListHead, NodeLink)) { - TmpNode = NAME_VALUE_NODE_FROM_LINK (NodeLink); - NodeLink = GetNextNode (&Storage->NameValueListHead, NodeLink); - - if (StrCmp (Node->Name, TmpNode->Name) != 0) { - continue; - } - - FreePool (TmpNode->EditValue); - TmpNode->EditValue = AllocateCopyPool (StrSize(Node->EditValue) * sizeof (CHAR16), Node->EditValue); - - RemoveEntryList (&Node->Link); - FreePool (Node->EditValue); - FreePool (Node->Name); - FreePool (Node); - } - } - - // - // Restore the Name/Value node. - // - Link = GetFirstNode (&BackUpList); - while (!IsNull (&BackUpList, Link)) { - Node = NAME_VALUE_NODE_FROM_LINK (Link); - Link = GetNextNode (&BackUpList, Link); - - // - // Free this node. - // - RemoveEntryList (&Node->Link); - FreePool (Node->EditValue); - FreePool (Node->Name); - FreePool (Node); - } - } -} - /** Fill storage's edit copy with settings requested from Configuration Driver. @@ -5161,7 +5038,7 @@ LoadStorage ( // If get value fail, extract default from IFR binary // if (EFI_ERROR (Status)) { - ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE); + ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE, TRUE); } else { // // Convert Result from to @@ -5307,7 +5184,7 @@ InitializeCurrentSetting ( // // Extract default from IFR binary for no storage questions. // - ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForNoStorage, NULL, TRUE); + ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForNoStorage, NULL, TRUE, FALSE); // // Request current settings from Configuration Driver @@ -6100,7 +5977,7 @@ ExecuteAction ( // Executet the difault action. // if ((Action & BROWSER_ACTION_DEFAULT) != 0) { - Status = ExtractDefault (FormSet, Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE); + Status = ExtractDefault (FormSet, Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE, FALSE); if (EFI_ERROR (Status)) { return Status; } diff --git a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h index b2c3c2010e..f431bb0f36 100644 --- a/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h +++ b/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h @@ -172,6 +172,7 @@ typedef struct { CHAR16 *ConfigRequest; // = + CHAR16 *ConfigAltResp; // Alt config response string for this ConfigRequest. + BOOLEAN HasCallAltCfg; // Flag to show whether browser has call ExtractConfig to get Altcfg string. UINTN ElementCount; // Number of in the UINTN SpareStrLen; // Spare length of ConfigRequest string buffer } FORMSET_STORAGE; @@ -917,6 +918,7 @@ InitializeFormSet ( @param RetrieveValueFirst Whether call the retrieve call back to get the initial value before get default value. + @param SkipGetAltCfg Whether skip the get altcfg string process. @retval EFI_SUCCESS The function completed successfully. @retval EFI_UNSUPPORTED Unsupport SettingScope. @@ -930,7 +932,8 @@ ExtractDefault ( IN BROWSER_SETTING_SCOPE SettingScope, IN BROWSER_GET_DEFAULT_VALUE GetDefaultValueScope, IN BROWSER_STORAGE *Storage, - IN BOOLEAN RetrieveValueFirst + IN BOOLEAN RetrieveValueFirst, + IN BOOLEAN SkipGetAltCfg ); /**