Revision: 16413
          http://sourceforge.net/p/edk2/code/16413
Author:   ydong10
Date:     2014-11-21 01:23:09 +0000 (Fri, 21 Nov 2014)
Log Message:
-----------
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 <[email protected]>
Reviewed-by: Liming Gao <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
    trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
    trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h

Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c    
2014-11-20 23:08:00 UTC (rev 16412)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Presentation.c    
2014-11-21 01:23:09 UTC (rev 16413)
@@ -928,7 +928,7 @@
   }
 
   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 @@
       //
       // 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;
 

Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c   2014-11-20 
23:08:00 UTC (rev 16412)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.c   2014-11-21 
01:23:09 UTC (rev 16413)
@@ -3986,13 +3986,15 @@
   @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 @@
     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 @@
     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 @@
 
   @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 @@
     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 @@
       continue;
     }
 
+    FormSetStorage->HasCallAltCfg = TRUE;
+
     //
     // 2. Get value through hii config routine protocol.
     //
@@ -4200,6 +4217,8 @@
       FreePool (FormSetStorage->ConfigAltResp);
       FormSetStorage->ConfigAltResp = NULL;
     }
+
+    FormSetStorage->HasCallAltCfg = FALSE;
   }
 }
 
@@ -4218,6 +4237,7 @@
   @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 @@
   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 @@
     //
     // 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 @@
     //
     // 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 @@
 
       mSystemLevelFormSet = LocalFormSet;
 
-      ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, 
GetDefaultValueScope, Storage, RetrieveValueFirst);
+      ExtractDefault (LocalFormSet, NULL, DefaultId, FormSetLevel, 
GetDefaultValueScope, Storage, RetrieveValueFirst, SkipGetAltCfg);
     }
 
     mSystemLevelFormSet = OldFormSet;
@@ -4920,158 +4949,6 @@
 }
 
 /**
-
-  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.
 
   @param  FormSet                FormSet data structure.
@@ -5161,7 +5038,7 @@
   // 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 <ConfigAltResp> to <ConfigResp>
@@ -5307,7 +5184,7 @@
   //
   // 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 @@
   // 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;
     }

Modified: trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h
===================================================================
--- trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h   2014-11-20 
23:08:00 UTC (rev 16412)
+++ trunk/edk2/MdeModulePkg/Universal/SetupBrowserDxe/Setup.h   2014-11-21 
01:23:09 UTC (rev 16413)
@@ -172,6 +172,7 @@
 
   CHAR16           *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + 
<RequestElement>
   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 <RequestElement> in the 
<ConfigRequest>
   UINTN            SpareStrLen;    // Spare length of ConfigRequest string 
buffer
 } FORMSET_STORAGE;
@@ -917,6 +918,7 @@
   @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 @@
   IN BROWSER_SETTING_SCOPE            SettingScope,
   IN BROWSER_GET_DEFAULT_VALUE        GetDefaultValueScope,
   IN BROWSER_STORAGE                  *Storage,
-  IN BOOLEAN                          RetrieveValueFirst
+  IN BOOLEAN                          RetrieveValueFirst,
+  IN BOOLEAN                          SkipGetAltCfg
   );
 
 /**


------------------------------------------------------------------------------
Download BIRT iHub F-Type - The Free Enterprise-Grade BIRT Server
from Actuate! Instantly Supercharge Your Business Reports and Dashboards
with Interactivity, Sharing, Native Excel Exports, App Integration & more
Get technology previously reserved for billion-dollar corporations, FREE
http://pubads.g.doubleclick.net/gampad/clk?id=157005751&iu=/4140/ostg.clktrk
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to