]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg: Refine the get default value logic.
authorEric Dong <eric.dong@intel.com>
Fri, 21 Nov 2014 01:23:09 +0000 (01:23 +0000)
committerydong10 <ydong10@Edk2>
Fri, 21 Nov 2014 01:23:09 +0000 (01:23 +0000)
Based on the input request to get default value for questions.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Eric Dong <eric.dong@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@16413 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.h

index bfb8afc140f52d9b42b064e846e61000164a8355..7db775e4b4f235762780d60a34c3c53bad35b84c 100644 (file)
@@ -928,7 +928,7 @@ ProcessAction (
   }\r
 \r
   if ((Action & BROWSER_ACTION_DEFAULT) == BROWSER_ACTION_DEFAULT) {\r
-    ExtractDefault (gCurrentSelection->FormSet, gCurrentSelection->Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE);\r
+    ExtractDefault (gCurrentSelection->FormSet, gCurrentSelection->Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE, FALSE);\r
     UpdateStatementStatus (gCurrentSelection->FormSet, gCurrentSelection->Form, gBrowserSettingScope);\r
   }\r
 \r
@@ -1542,7 +1542,7 @@ ProcessUserInput (
       //\r
       // Reset Question to default value specified by DefaultId\r
       //\r
-      Status = ExtractDefault (gCurrentSelection->FormSet, NULL, Statement->DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE);\r
+      Status = ExtractDefault (gCurrentSelection->FormSet, NULL, Statement->DefaultId, FormSetLevel, GetDefaultForAll, NULL, FALSE, FALSE);\r
       UpdateStatementStatus (gCurrentSelection->FormSet, NULL, FormSetLevel);\r
       break;\r
 \r
index a25150165c7c42ef91f82d50098c246e2d8a9e70..fb88956a24d85b4170d285bbbc594fa08cc28247 100644 (file)
@@ -3986,13 +3986,15 @@ GetQuestionDefault (
   @param  FormSet                Form data structure.\r
   @param  Form                   Form data structure.\r
   @param  DefaultId              The Class of the default.\r
+  @param  BrowserStorage         The input request storage for the questions.\r
 \r
 **/\r
 VOID\r
 ExtractAltCfgForForm (\r
   IN FORM_BROWSER_FORMSET   *FormSet,\r
   IN FORM_BROWSER_FORM      *Form,\r
-  IN UINT16                 DefaultId\r
+  IN UINT16                 DefaultId,\r
+  IN BROWSER_STORAGE        *BrowserStorage\r
   )\r
 {\r
   EFI_STATUS                   Status;\r
@@ -4013,10 +4015,13 @@ ExtractAltCfgForForm (
     FormSetStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
     Storage        = FormSetStorage->BrowserStorage;\r
     Link = GetNextNode (&FormSet->StorageListHead, Link);\r
+    if (BrowserStorage != NULL && BrowserStorage != Storage) {\r
+      continue;\r
+    }\r
 \r
     if (Storage->Type != EFI_HII_VARSTORE_EFI_VARIABLE &&\r
         FormSetStorage->ElementCount != 0 &&\r
-        FormSetStorage->ConfigAltResp != NULL) {\r
+        FormSetStorage->HasCallAltCfg) {\r
       return;\r
     }\r
   }\r
@@ -4030,6 +4035,10 @@ ExtractAltCfgForForm (
     Link = GetNextNode (&Form->ConfigRequestHead, Link);\r
 \r
     Storage = ConfigInfo->Storage;\r
+    if (BrowserStorage != NULL && BrowserStorage != Storage) {\r
+      continue;\r
+    }\r
+\r
     if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
       continue;\r
     }\r
@@ -4107,12 +4116,14 @@ CleanAltCfgForForm (
 \r
   @param  FormSet                Form data structure.\r
   @param  DefaultId              The Class of the default.\r
+  @param  BrowserStorage         The input request storage for the questions.\r
 \r
 **/\r
 VOID\r
 ExtractAltCfgForFormSet (\r
   IN FORM_BROWSER_FORMSET   *FormSet,\r
-  IN UINT16                 DefaultId\r
+  IN UINT16                 DefaultId,\r
+  IN BROWSER_STORAGE        *BrowserStorage\r
   )\r
 {\r
   EFI_STATUS              Status;\r
@@ -4129,6 +4140,10 @@ ExtractAltCfgForFormSet (
     Storage        = FormSetStorage->BrowserStorage;\r
     Link = GetNextNode (&FormSet->StorageListHead, Link);\r
 \r
+    if (BrowserStorage != NULL && BrowserStorage != Storage) {\r
+      continue;\r
+    }\r
+\r
     if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
       continue;\r
     }\r
@@ -4140,6 +4155,8 @@ ExtractAltCfgForFormSet (
       continue;\r
     }\r
 \r
+    FormSetStorage->HasCallAltCfg = TRUE;\r
+\r
     //\r
     // 2. Get value through hii config routine protocol.\r
     //\r
@@ -4200,6 +4217,8 @@ CleanAltCfgForFormSet (
       FreePool (FormSetStorage->ConfigAltResp);\r
       FormSetStorage->ConfigAltResp = NULL;\r
     }\r
+\r
+    FormSetStorage->HasCallAltCfg = FALSE;\r
   }\r
 }\r
 \r
@@ -4218,6 +4237,7 @@ CleanAltCfgForFormSet (
   @param  RetrieveValueFirst     Whether call the retrieve call back to\r
                                  get the initial value before get default\r
                                  value.\r
+  @param  SkipGetAltCfg          Whether skip the get altcfg string process.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
   @retval EFI_UNSUPPORTED        Unsupport SettingScope.\r
@@ -4231,7 +4251,8 @@ ExtractDefault (
   IN BROWSER_SETTING_SCOPE            SettingScope,\r
   IN BROWSER_GET_DEFAULT_VALUE        GetDefaultValueScope,\r
   IN BROWSER_STORAGE                  *Storage OPTIONAL,\r
-  IN BOOLEAN                          RetrieveValueFirst\r
+  IN BOOLEAN                          RetrieveValueFirst,\r
+  IN BOOLEAN                          SkipGetAltCfg\r
   )\r
 {\r
   EFI_STATUS              Status;\r
@@ -4258,7 +4279,9 @@ ExtractDefault (
     //\r
     // Prepare the AltCfg String for form.\r
     //\r
-    ExtractAltCfgForForm (FormSet, Form, DefaultId);\r
+    if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) {\r
+      ExtractAltCfgForForm (FormSet, Form, DefaultId, Storage);\r
+    }\r
 \r
     //\r
     // Extract Form default\r
@@ -4320,24 +4343,30 @@ ExtractDefault (
     //\r
     // Clean the AltCfg String.\r
     //\r
-    CleanAltCfgForForm(Form);\r
+    if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) {\r
+      CleanAltCfgForForm(Form);\r
+    }\r
   } else if (SettingScope == FormSetLevel) {\r
     //\r
     // Prepare the AltCfg String for formset.\r
     //\r
-    ExtractAltCfgForFormSet (FormSet, DefaultId);\r
+    if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) {\r
+      ExtractAltCfgForFormSet (FormSet, DefaultId, Storage);\r
+    }\r
 \r
     FormLink = GetFirstNode (&FormSet->FormListHead);\r
     while (!IsNull (&FormSet->FormListHead, FormLink)) {\r
       Form = FORM_BROWSER_FORM_FROM_LINK (FormLink);\r
-      ExtractDefault (FormSet, Form, DefaultId, FormLevel, GetDefaultValueScope, Storage, RetrieveValueFirst);\r
+      ExtractDefault (FormSet, Form, DefaultId, FormLevel, GetDefaultValueScope, Storage, RetrieveValueFirst, SkipGetAltCfg);\r
       FormLink = GetNextNode (&FormSet->FormListHead, FormLink);\r
     }\r
 \r
     //\r
     // Clean the AltCfg String.\r
     //\r
-    CleanAltCfgForFormSet (FormSet);\r
+    if (!SkipGetAltCfg && (GetDefaultValueScope != GetDefaultForNoStorage)) {\r
+      CleanAltCfgForFormSet (FormSet);\r
+    }\r
   } else if (SettingScope == SystemLevel) {\r
     //\r
     // Preload all Hii formset.\r
@@ -4359,7 +4388,7 @@ ExtractDefault (
 \r
       mSystemLevelFormSet = LocalFormSet;\r
 \r
-      ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage, RetrieveValueFirst);\r
+      ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, GetDefaultValueScope, Storage, RetrieveValueFirst, SkipGetAltCfg);\r
     }\r
 \r
     mSystemLevelFormSet = OldFormSet;\r
@@ -4919,158 +4948,6 @@ ConfigRequestAdjust (
   return RetVal;\r
 }\r
 \r
-/**\r
-\r
-  Base on ConfigRequest info to get default value for current formset. \r
-\r
-  ConfigRequest info include the info about which questions in current formset need to \r
-  get default value. This function only get these questions default value.\r
-  \r
-  @param  FormSet                FormSet data structure.\r
-  @param  Storage                Storage need to update value.\r
-  @param  ConfigRequest          The config request string.\r
-\r
-**/\r
-VOID\r
-GetDefaultForFormset (\r
-  IN FORM_BROWSER_FORMSET    *FormSet,\r
-  IN BROWSER_STORAGE         *Storage,\r
-  IN CHAR16                  *ConfigRequest\r
-  )\r
-{\r
-  UINT8             *BackUpBuf;\r
-  UINTN             BufferSize;\r
-  LIST_ENTRY        BackUpList;\r
-  NAME_VALUE_NODE   *Node;\r
-  LIST_ENTRY        *Link;\r
-  LIST_ENTRY        *NodeLink;\r
-  NAME_VALUE_NODE   *TmpNode;\r
-  EFI_STATUS        Status;\r
-  EFI_STRING        Progress;\r
-  EFI_STRING        Result;\r
-\r
-  BackUpBuf = NULL;\r
-  InitializeListHead(&BackUpList);\r
-\r
-  //\r
-  // Back update the edit buffer.\r
-  // \r
-  if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
-      (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
-    BackUpBuf = AllocateCopyPool (Storage->Size, Storage->EditBuffer);\r
-    ASSERT (BackUpBuf != NULL);\r
-  } else if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
-    Link = GetFirstNode (&Storage->NameValueListHead);\r
-    while (!IsNull (&Storage->NameValueListHead, Link)) {\r
-      Node = NAME_VALUE_NODE_FROM_LINK (Link);\r
-      Link = GetNextNode (&Storage->NameValueListHead, Link);\r
-\r
-      //\r
-      // Only back Node belong to this formset.\r
-      //\r
-      if (StrStr (Storage->ConfigRequest, Node->Name) == NULL) {\r
-        continue;\r
-      }\r
-\r
-      TmpNode = AllocateCopyPool (sizeof (NAME_VALUE_NODE), Node);\r
-      ASSERT (TmpNode != NULL);\r
-      TmpNode->Name = AllocateCopyPool (StrSize(Node->Name) * sizeof (CHAR16), Node->Name);\r
-      ASSERT (TmpNode->Name != NULL);\r
-      TmpNode->EditValue = AllocateCopyPool (StrSize(Node->EditValue) * sizeof (CHAR16), Node->EditValue);\r
-      ASSERT (TmpNode->EditValue != NULL);\r
-\r
-      InsertTailList(&BackUpList, &TmpNode->Link);\r
-    }\r
-  }\r
-\r
-  //\r
-  // Get default value.\r
-  //\r
-  ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage, TRUE);\r
-\r
-  //\r
-  // Update the question value based on the input ConfigRequest.\r
-  //\r
-  if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
-      (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER)) {\r
-    ASSERT (BackUpBuf != NULL);\r
-    BufferSize = Storage->Size;\r
-    Status = mHiiConfigRouting->BlockToConfig(\r
-                                  mHiiConfigRouting,\r
-                                  ConfigRequest,\r
-                                  Storage->EditBuffer,\r
-                                  BufferSize,\r
-                                  &Result,\r
-                                  &Progress\r
-                                  );\r
-    ASSERT_EFI_ERROR (Status);\r
-    \r
-    Status = mHiiConfigRouting->ConfigToBlock (\r
-                                  mHiiConfigRouting,\r
-                                  Result,\r
-                                  BackUpBuf,\r
-                                  &BufferSize,\r
-                                  &Progress\r
-                                  );\r
-    ASSERT_EFI_ERROR (Status);\r
-\r
-    if (Result != NULL) {\r
-      FreePool (Result);\r
-    }\r
-    \r
-    CopyMem (Storage->EditBuffer, BackUpBuf, Storage->Size);\r
-    FreePool (BackUpBuf);\r
-  } else if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
-    //\r
-    // Update question value, only element in ConfigReqeust will be update.\r
-    //\r
-    Link = GetFirstNode (&BackUpList);\r
-    while (!IsNull (&BackUpList, Link)) {\r
-      Node = NAME_VALUE_NODE_FROM_LINK (Link);\r
-      Link = GetNextNode (&BackUpList, Link);\r
-\r
-      if (StrStr (ConfigRequest, Node->Name) != NULL) {\r
-        continue;\r
-      }\r
-\r
-      NodeLink = GetFirstNode (&Storage->NameValueListHead);\r
-      while (!IsNull (&Storage->NameValueListHead, NodeLink)) {\r
-        TmpNode  = NAME_VALUE_NODE_FROM_LINK (NodeLink);\r
-        NodeLink = GetNextNode (&Storage->NameValueListHead, NodeLink);\r
-      \r
-        if (StrCmp (Node->Name, TmpNode->Name) != 0) {\r
-          continue;\r
-        }\r
-\r
-        FreePool (TmpNode->EditValue);\r
-        TmpNode->EditValue = AllocateCopyPool (StrSize(Node->EditValue) * sizeof (CHAR16), Node->EditValue);\r
-\r
-        RemoveEntryList (&Node->Link);\r
-        FreePool (Node->EditValue);\r
-        FreePool (Node->Name);\r
-        FreePool (Node);\r
-      }\r
-    }\r
-\r
-    //\r
-    // Restore the Name/Value node.\r
-    //  \r
-    Link = GetFirstNode (&BackUpList);\r
-    while (!IsNull (&BackUpList, Link)) {\r
-      Node = NAME_VALUE_NODE_FROM_LINK (Link);\r
-      Link = GetNextNode (&BackUpList, Link);\r
\r
-      //\r
-      // Free this node.\r
-      //\r
-      RemoveEntryList (&Node->Link);\r
-      FreePool (Node->EditValue);\r
-      FreePool (Node->Name);\r
-      FreePool (Node);\r
-    }\r
-  }\r
-}\r
-\r
 /**\r
   Fill storage's edit copy with settings requested from Configuration Driver.\r
 \r
@@ -5161,7 +5038,7 @@ LoadStorage (
   // If get value fail, extract default from IFR binary\r
   //\r
   if (EFI_ERROR (Status)) {\r
-    ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE);\r
+    ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForStorage, Storage->BrowserStorage, TRUE, TRUE);\r
   } else {\r
     //\r
     // Convert Result from <ConfigAltResp> to <ConfigResp>\r
@@ -5307,7 +5184,7 @@ InitializeCurrentSetting (
   //\r
   // Extract default from IFR binary for no storage questions.\r
   //  \r
-  ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForNoStorage, NULL, TRUE);\r
+  ExtractDefault (FormSet, NULL, EFI_HII_DEFAULT_CLASS_STANDARD, FormSetLevel, GetDefaultForNoStorage, NULL, TRUE, FALSE);\r
 \r
   //\r
   // Request current settings from Configuration Driver\r
@@ -6100,7 +5977,7 @@ ExecuteAction (
   // Executet the difault action.\r
   //\r
   if ((Action & BROWSER_ACTION_DEFAULT) != 0) {\r
-    Status = ExtractDefault (FormSet, Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE);\r
+    Status = ExtractDefault (FormSet, Form, DefaultId, gBrowserSettingScope, GetDefaultForAll, NULL, FALSE, FALSE);\r
     if (EFI_ERROR (Status)) {\r
       return Status;\r
     }\r
index b2c3c2010e3ea3c19afa1920b2c4fd5281329413..f431bb0f365c77d82c599f20b8d2fec4366b7631 100644 (file)
@@ -172,6 +172,7 @@ typedef struct {
 \r
   CHAR16           *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>\r
   CHAR16           *ConfigAltResp; // Alt config response string for this ConfigRequest.\r
+  BOOLEAN          HasCallAltCfg;  // Flag to show whether browser has call ExtractConfig to get Altcfg string.\r
   UINTN            ElementCount;   // Number of <RequestElement> in the <ConfigRequest>\r
   UINTN            SpareStrLen;    // Spare length of ConfigRequest string buffer\r
 } FORMSET_STORAGE;\r
@@ -917,6 +918,7 @@ InitializeFormSet (
   @param  RetrieveValueFirst     Whether call the retrieve call back to\r
                                  get the initial value before get default\r
                                  value.\r
+  @param  SkipGetAltCfg          Whether skip the get altcfg string process.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
   @retval EFI_UNSUPPORTED        Unsupport SettingScope.\r
@@ -930,7 +932,8 @@ ExtractDefault (
   IN BROWSER_SETTING_SCOPE            SettingScope,\r
   IN BROWSER_GET_DEFAULT_VALUE        GetDefaultValueScope,\r
   IN BROWSER_STORAGE                  *Storage,\r
-  IN BOOLEAN                          RetrieveValueFirst\r
+  IN BOOLEAN                          RetrieveValueFirst,\r
+  IN BOOLEAN                          SkipGetAltCfg\r
   );\r
 \r
 /**\r