]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Move ConfigHdr from browser_storage to Formset_storage, avoid device path lost for...
authorEric Dong <eric.dong@intel.com>
Fri, 30 Jan 2015 05:35:30 +0000 (05:35 +0000)
committerydong10 <ydong10@Edk2>
Fri, 30 Jan 2015 05:35:30 +0000 (05:35 +0000)
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@16680 6f19259b-4bc3-4df7-8a09-765794883524

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

index d82e08ed9125bfc27b8d6e6beabf2889e4a731e1..0e9c82363d61f02fe2dee4a4754e3317ae610415 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Parser for IFR binary encoding.\r
 \r
-Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -320,20 +320,20 @@ CreateExpression (
 EFI_STATUS\r
 InitializeConfigHdr (\r
   IN FORM_BROWSER_FORMSET  *FormSet,\r
-  IN OUT BROWSER_STORAGE   *Storage\r
+  IN OUT FORMSET_STORAGE   *Storage\r
   )\r
 {\r
   CHAR16      *Name;\r
 \r
-  if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
-      Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
-    Name = Storage->Name;\r
+  if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER || \r
+      Storage->BrowserStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
+    Name = Storage->BrowserStorage->Name;\r
   } else {\r
     Name = NULL;\r
   }\r
 \r
   Storage->ConfigHdr = HiiConstructConfigHdr (\r
-                         &Storage->Guid,\r
+                         &Storage->BrowserStorage->Guid,\r
                          Name,\r
                          FormSet->DriverHandle\r
                          );\r
@@ -559,29 +559,108 @@ CreateStorage (
     }\r
 \r
     BrowserStorage->HiiHandle = FormSet->HiiHandle;\r
-    InitializeConfigHdr (FormSet, BrowserStorage);\r
 \r
     BrowserStorage->Initialized = FALSE;\r
-  } else {\r
-    if ((StorageType == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) && \r
-        (FormSet->DriverHandle != NULL) && \r
-        (!IsDevicePathExist (BrowserStorage->ConfigHdr))) {\r
-      //\r
-      // If this storage not has device path info but new formset has,\r
-      // update the device path info.\r
-      //\r
-      FreePool (BrowserStorage->ConfigHdr);\r
-      InitializeConfigHdr (FormSet, BrowserStorage);\r
-    }\r
   }\r
 \r
   Storage->BrowserStorage = BrowserStorage;\r
-  Storage->ConfigRequest = AllocateCopyPool (StrSize (BrowserStorage->ConfigHdr), BrowserStorage->ConfigHdr);\r
+  InitializeConfigHdr (FormSet, Storage);\r
+  Storage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);\r
   Storage->SpareStrLen = 0;\r
 \r
   return Storage;\r
 }\r
 \r
+/**\r
+  Get Formset_storage base on the input varstoreid info.\r
+\r
+  @param  FormSet                Pointer of the current FormSet.\r
+  @param  VarStoreId             Varstore ID info.\r
+\r
+  @return Pointer to a FORMSET_STORAGE data structure.\r
+\r
+**/\r
+FORMSET_STORAGE *\r
+GetFstStgFromVarId (\r
+  IN FORM_BROWSER_FORMSET  *FormSet,\r
+  IN EFI_VARSTORE_ID       VarStoreId\r
+  )\r
+{\r
+  FORMSET_STORAGE  *FormsetStorage;\r
+  LIST_ENTRY       *Link;\r
+  BOOLEAN          Found;\r
+\r
+  Found = FALSE;\r
+  FormsetStorage = NULL;\r
+  //\r
+  // Find Formset Storage for this Question\r
+  //\r
+  Link = GetFirstNode (&FormSet->StorageListHead);\r
+  while (!IsNull (&FormSet->StorageListHead, Link)) {\r
+    FormsetStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
+\r
+    if (FormsetStorage->VarStoreId == VarStoreId) {\r
+      Found = TRUE;\r
+      break;\r
+    }\r
+\r
+    Link = GetNextNode (&FormSet->StorageListHead, Link);\r
+  }\r
+\r
+  return Found ? FormsetStorage : NULL;\r
+}\r
+\r
+/**\r
+  Get Formset_storage base on the input browser storage.\r
+\r
+  More than one formsets may share the same browser storage,\r
+  this function just get the first formset storage which\r
+  share the browser storage.\r
+\r
+  @param  Storage              browser storage info.\r
+\r
+  @return Pointer to a FORMSET_STORAGE data structure.\r
+  \r
+\r
+**/\r
+FORMSET_STORAGE *\r
+GetFstStgFromBrsStg (\r
+  IN BROWSER_STORAGE       *Storage\r
+  )\r
+{\r
+  FORMSET_STORAGE      *FormsetStorage;\r
+  LIST_ENTRY           *Link;\r
+  LIST_ENTRY           *FormsetLink;\r
+  FORM_BROWSER_FORMSET *FormSet;\r
+  BOOLEAN              Found;\r
+\r
+  Found = FALSE;\r
+  FormsetStorage = NULL;\r
+\r
+  FormsetLink = GetFirstNode (&gBrowserFormSetList);\r
+  while (!IsNull (&gBrowserFormSetList, FormsetLink)) {\r
+    FormSet = FORM_BROWSER_FORMSET_FROM_LINK (FormsetLink);\r
+    FormsetLink = GetNextNode (&gBrowserFormSetList, FormsetLink);\r
+\r
+    Link = GetFirstNode (&FormSet->StorageListHead);\r
+    while (!IsNull (&FormSet->StorageListHead, Link)) {\r
+      FormsetStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
+      Link = GetNextNode (&FormSet->StorageListHead, Link);\r
+\r
+      if (FormsetStorage->BrowserStorage == Storage) {\r
+        Found = TRUE;\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (Found) {\r
+      break;\r
+    }\r
+  }\r
+\r
+  return Found ? FormsetStorage : NULL;\r
+}\r
+\r
 /**\r
   Initialize Request Element of a Question. <RequestElement> ::= '&'<BlockName> | '&'<Label>\r
 \r
@@ -651,17 +730,7 @@ InitializeRequestElement (
   //\r
   // Find Formset Storage for this Question\r
   //\r
-  FormsetStorage = NULL;\r
-  Link = GetFirstNode (&FormSet->StorageListHead);\r
-  while (!IsNull (&FormSet->StorageListHead, Link)) {\r
-    FormsetStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
-\r
-    if (FormsetStorage->VarStoreId == Question->VarStoreId) {\r
-      break;\r
-    }\r
-\r
-    Link = GetNextNode (&FormSet->StorageListHead, Link);\r
-  }\r
+  FormsetStorage = GetFstStgFromVarId(FormSet, Question->VarStoreId);\r
   ASSERT (FormsetStorage != NULL);\r
 \r
   //\r
@@ -695,7 +764,7 @@ InitializeRequestElement (
   while (!IsNull (&Form->ConfigRequestHead, Link)) {\r
     ConfigInfo = FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link);\r
 \r
-    if (ConfigInfo != NULL && ConfigInfo->Storage == Storage) {\r
+    if (ConfigInfo != NULL && ConfigInfo->Storage == FormsetStorage->BrowserStorage) {\r
       Find = TRUE;\r
       break;\r
     }\r
@@ -707,10 +776,10 @@ InitializeRequestElement (
     ConfigInfo = AllocateZeroPool(sizeof (FORM_BROWSER_CONFIG_REQUEST));\r
     ASSERT (ConfigInfo != NULL);\r
     ConfigInfo->Signature     = FORM_BROWSER_CONFIG_REQUEST_SIGNATURE;\r
-    ConfigInfo->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);\r
+    ConfigInfo->ConfigRequest = AllocateCopyPool (StrSize (FormsetStorage->ConfigHdr), FormsetStorage->ConfigHdr);\r
     ASSERT (ConfigInfo->ConfigRequest != NULL);\r
     ConfigInfo->SpareStrLen   = 0;\r
-    ConfigInfo->Storage       = Storage;\r
+    ConfigInfo->Storage       = FormsetStorage->BrowserStorage;\r
     InsertTailList(&Form->ConfigRequestHead, &ConfigInfo->Link);\r
   }\r
 \r
index fb88956a24d85b4170d285bbbc594fa08cc28247..964682399c54fc38ffa62dc1f5e5e622765868cc 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Entry and initialization module for the browser.\r
 \r
-Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -621,6 +621,7 @@ ProcessStorage (
   CHAR16                *StrPtr;\r
   UINTN                 BufferSize;\r
   UINTN                 TmpSize;\r
+  FORMSET_STORAGE       *BrowserStorage;\r
 \r
   if (RetrieveData) {\r
     //\r
@@ -635,10 +636,12 @@ ProcessStorage (
     // Skip <ConfigHdr> and '&' to point to <ConfigBody> when first copy the configbody.\r
     // Also need to consider add "\0" at first time.\r
     //\r
-    StrPtr     = ConfigResp + StrLen (Storage->ConfigHdr) + 1;\r
+    StrPtr = StrStr (ConfigResp, L"PATH");\r
+    ASSERT (StrPtr != NULL);\r
+    StrPtr = StrStr (StrPtr, L"&");\r
+    StrPtr += 1;\r
     BufferSize = StrSize (StrPtr);\r
 \r
-\r
     //\r
     // Copy the data if the input buffer is bigger enough.\r
     //\r
@@ -652,12 +655,14 @@ ProcessStorage (
     //\r
     // Prepare <ConfigResp>\r
     //\r
+    BrowserStorage = GetFstStgFromBrsStg (Storage);\r
+    ASSERT (BrowserStorage != NULL);\r
     TmpSize = StrLen (*ResultsData);\r
-    BufferSize = (TmpSize + StrLen (Storage->ConfigHdr) + 2) * sizeof (CHAR16);\r
+    BufferSize = (TmpSize + StrLen (BrowserStorage->ConfigHdr) + 2) * sizeof (CHAR16);\r
     ConfigResp = AllocateZeroPool (BufferSize);\r
     ASSERT (ConfigResp != NULL);\r
 \r
-    StrCpy (ConfigResp, Storage->ConfigHdr);\r
+    StrCpy (ConfigResp, BrowserStorage->ConfigHdr);\r
     StrCat (ConfigResp, L"&");\r
     StrCat (ConfigResp, *ResultsData);\r
 \r
@@ -1217,6 +1222,7 @@ StorageToConfigResp (
   LIST_ENTRY              *Link;\r
   NAME_VALUE_NODE         *Node;\r
   UINT8                   *SourceBuf;\r
+  FORMSET_STORAGE         *FormsetStorage;\r
 \r
   Status = EFI_SUCCESS;\r
 \r
@@ -1236,7 +1242,9 @@ StorageToConfigResp (
 \r
   case EFI_HII_VARSTORE_NAME_VALUE:\r
     *ConfigResp = NULL;\r
-    NewStringCat (ConfigResp, Storage->ConfigHdr);\r
+    FormsetStorage = GetFstStgFromBrsStg(Storage);\r
+    ASSERT (FormsetStorage != NULL);\r
+    NewStringCat (ConfigResp, FormsetStorage->ConfigHdr);\r
 \r
     Link = GetFirstNode (&Storage->NameValueListHead);\r
     while (!IsNull (&Storage->NameValueListHead, Link)) {\r
@@ -1475,6 +1483,7 @@ GetQuestionValue (
   UINTN               StorageWidth;\r
   EFI_TIME            EfiTime;\r
   BROWSER_STORAGE     *Storage;\r
+  FORMSET_STORAGE     *FormsetStorage;\r
   EFI_IFR_TYPE_VALUE  *QuestionValue;\r
   CHAR16              *ConfigRequest;\r
   CHAR16              *Progress;\r
@@ -1659,21 +1668,23 @@ GetQuestionValue (
       FreePool (Value);\r
     }\r
   } else {\r
+    FormsetStorage = GetFstStgFromVarId(FormSet, Question->VarStoreId);\r
+    ASSERT (FormsetStorage != NULL);\r
     //\r
     // <ConfigRequest> ::= <ConfigHdr> + <BlockName> ||\r
     //                   <ConfigHdr> + "&" + <VariableName>\r
     //\r
     if (IsBufferStorage) {\r
-      Length = StrLen (Storage->ConfigHdr);\r
+      Length = StrLen (FormsetStorage->ConfigHdr);\r
       Length += StrLen (Question->BlockName);\r
     } else {\r
-      Length = StrLen (Storage->ConfigHdr);\r
+      Length = StrLen (FormsetStorage->ConfigHdr);\r
       Length += StrLen (Question->VariableName) + 1;\r
     }\r
     ConfigRequest = AllocateZeroPool ((Length + 1) * sizeof (CHAR16));\r
     ASSERT (ConfigRequest != NULL);\r
 \r
-    StrCpy (ConfigRequest, Storage->ConfigHdr);\r
+    StrCpy (ConfigRequest, FormsetStorage->ConfigHdr);\r
     if (IsBufferStorage) {\r
       StrCat (ConfigRequest, Question->BlockName);\r
     } else {\r
@@ -1771,6 +1782,7 @@ SetQuestionValue (
   UINTN               BufferLen;\r
   UINTN               StorageWidth;\r
   BROWSER_STORAGE     *Storage;\r
+  FORMSET_STORAGE     *FormsetStorage;\r
   EFI_IFR_TYPE_VALUE  *QuestionValue;\r
   CHAR16              *ConfigResp;\r
   CHAR16              *Progress;\r
@@ -1965,10 +1977,12 @@ SetQuestionValue (
     } else {\r
       Length += (StorageWidth * 2);\r
     }\r
-    ConfigResp = AllocateZeroPool ((StrLen (Storage->ConfigHdr) + Length + 1) * sizeof (CHAR16));\r
+    FormsetStorage = GetFstStgFromVarId(FormSet, Question->VarStoreId);\r
+    ASSERT (FormsetStorage != NULL);\r
+    ConfigResp = AllocateZeroPool ((StrLen (FormsetStorage->ConfigHdr) + Length + 1) * sizeof (CHAR16));\r
     ASSERT (ConfigResp != NULL);\r
 \r
-    StrCpy (ConfigResp, Storage->ConfigHdr);\r
+    StrCpy (ConfigResp, FormsetStorage->ConfigHdr);\r
     if (IsBufferStorage) {\r
       StrCat (ConfigResp, Question->BlockName);\r
       StrCat (ConfigResp, L"&VALUE=");\r
@@ -2681,6 +2695,11 @@ FindQuestionFromProgress (
           *RetQuestion = Statement;\r
           break;\r
         }\r
+\r
+        if (Statement->VariableName != NULL && StrStr (Statement->VariableName, Progress) != NULL) {\r
+          *RetQuestion = Statement;\r
+          break;\r
+        }\r
       }\r
     }\r
 \r
@@ -4645,13 +4664,13 @@ RemoveElement (
 /**\r
   Adjust config request in storage, remove the request elements existed in the input ConfigRequest.\r
 \r
-  @param  Storage                Pointer to the browser storage.\r
+  @param  Storage                Pointer to the formset storage.\r
   @param  ConfigRequest          The pointer to the Request element.\r
 \r
 **/\r
 VOID\r
 RemoveConfigRequest (\r
-  BROWSER_STORAGE   *Storage,\r
+  FORMSET_STORAGE   *Storage,\r
   CHAR16            *ConfigRequest\r
   )\r
 {\r
@@ -4666,7 +4685,7 @@ RemoveConfigRequest (
     return;\r
   }\r
 \r
-  if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+  if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
     //\r
     // "&Name1&Name2" section for EFI_HII_VARSTORE_NAME_VALUE storage\r
     //\r
@@ -4681,7 +4700,7 @@ RemoveConfigRequest (
   //\r
   // Find SearchKey storage\r
   //\r
-  if (Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
+  if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
     RequestElement = StrStr (ConfigRequest, L"PATH");\r
     ASSERT (RequestElement != NULL);\r
     RequestElement = StrStr (RequestElement, SearchKey);    \r
@@ -4705,7 +4724,7 @@ RemoveConfigRequest (
       *NextRequestElement = L'\0';\r
     }\r
 \r
-    RemoveElement (Storage, RequestElement);\r
+    RemoveElement (Storage->BrowserStorage, RequestElement);\r
 \r
     if (NextRequestElement != NULL) {\r
       //\r
@@ -4720,10 +4739,10 @@ RemoveConfigRequest (
   //\r
   // If no request element remain, just remove the ConfigRequest string.\r
   //\r
-  if (StrCmp (Storage->ConfigRequest, Storage->ConfigHdr) == 0) {\r
-    FreePool (Storage->ConfigRequest);\r
-    Storage->ConfigRequest = NULL;\r
-    Storage->SpareStrLen   = 0;\r
+  if (StrCmp (Storage->BrowserStorage->ConfigRequest, Storage->ConfigHdr) == 0) {\r
+    FreePool (Storage->BrowserStorage->ConfigRequest);\r
+    Storage->BrowserStorage->ConfigRequest = NULL;\r
+    Storage->BrowserStorage->SpareStrLen   = 0;\r
   }\r
 }\r
 \r
@@ -4751,7 +4770,7 @@ CleanBrowserStorage (
         continue;\r
       }\r
 \r
-      RemoveConfigRequest (Storage->BrowserStorage, Storage->ConfigRequest);\r
+      RemoveConfigRequest (Storage, Storage->ConfigRequest);\r
     } else if (Storage->BrowserStorage->Type == EFI_HII_VARSTORE_BUFFER ||\r
                Storage->BrowserStorage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
       if (Storage->BrowserStorage->ConfigRequest != NULL) { \r
@@ -5011,14 +5030,14 @@ LoadStorage (
     // Allocate and fill a buffer large enough to hold the <ConfigHdr> template\r
     // followed by "&OFFSET=0&WIDTH=WWWW"followed by a Null-terminator\r
     //\r
-    StrLen = StrSize (Storage->BrowserStorage->ConfigHdr) + 20 * sizeof (CHAR16);\r
+    StrLen = StrSize (Storage->ConfigHdr) + 20 * sizeof (CHAR16);\r
     ConfigRequest = AllocateZeroPool (StrLen);\r
     ASSERT (ConfigRequest != NULL);\r
     UnicodeSPrint (\r
                ConfigRequest, \r
                StrLen, \r
                L"%s&OFFSET=0&WIDTH=%04x", \r
-               Storage->BrowserStorage->ConfigHdr,\r
+               Storage->ConfigHdr,\r
                Storage->BrowserStorage->Size);\r
   } else {\r
     ConfigRequest = Storage->ConfigRequest;\r
index f431bb0f365c77d82c599f20b8d2fec4366b7631..9a300fa966d81583315adf661fac55f8b29f20e4 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Private MACRO, structure and function definitions for Setup Browser module.\r
 \r
-Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2015, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -150,7 +150,6 @@ typedef struct {
 \r
   UINT32           Attributes;     // For EFI_IFR_VARSTORE_EFI: EFI Variable attribute\r
 \r
-  CHAR16           *ConfigHdr;     // <ConfigHdr>\r
   CHAR16           *ConfigRequest; // <ConfigRequest> = <ConfigHdr> + <RequestElement>\r
                                    // <RequestElement> includes all fields which is used by current form sets.\r
   UINTN            SpareStrLen;    // Spare length of ConfigRequest string buffer\r
@@ -170,6 +169,8 @@ typedef struct {
 \r
   BROWSER_STORAGE  *BrowserStorage;\r
 \r
+  CHAR16           *ConfigHdr;     // <ConfigHdr>\r
+\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
@@ -1795,4 +1796,37 @@ IsTrue (
   IN EFI_HII_VALUE     *Result\r
   );\r
 \r
+/**\r
+  Get Formset_storage base on the input varstoreid info.\r
+\r
+  @param  FormSet                Pointer of the current FormSet.\r
+  @param  VarStoreId             Varstore ID info.\r
+\r
+  @return Pointer to a FORMSET_STORAGE data structure.\r
+\r
+**/\r
+FORMSET_STORAGE *\r
+GetFstStgFromVarId (\r
+  IN FORM_BROWSER_FORMSET  *FormSet,\r
+  IN EFI_VARSTORE_ID       VarStoreId\r
+  );\r
+\r
+/**\r
+  Get Formset_storage base on the input browser storage.\r
+\r
+  More than one formsets may share the same browser storage,\r
+  this function just get the first formset storage which\r
+  share the browser storage.\r
+\r
+  @param  Storage              browser storage info.\r
+\r
+  @return Pointer to a FORMSET_STORAGE data structure.\r
+  \r
+\r
+**/\r
+FORMSET_STORAGE *\r
+GetFstStgFromBrsStg (\r
+  IN BROWSER_STORAGE       *Storage\r
+  );\r
+\r
 #endif\r