]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/SetupBrowserDxe/Setup.c
Update the code to follow the spec when evaluate the expression.
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / Setup.c
index 00462a270fde4f13bec19611a7dfbfbbebf7e43b..d4f3fa01d61f19286a8d82bd677bab1f2bf20dfa 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Entry and initialization module for the browser.\r
 \r
-Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2012, 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
@@ -329,7 +329,7 @@ SendForm (
       //\r
       // Initialize internal data structures of FormSet\r
       //\r
-      Status = InitializeFormSet (Selection->Handle, &Selection->FormSetGuid, FormSet);\r
+      Status = InitializeFormSet (Selection->Handle, &Selection->FormSetGuid, FormSet, TRUE);\r
       if (EFI_ERROR (Status) || IsListEmpty (&FormSet->FormListHead)) {\r
         DestroyFormSet (FormSet);\r
         break;\r
@@ -1220,6 +1220,7 @@ GetQuestionValue (
 \r
   Status = EFI_SUCCESS;\r
   Value  = NULL;\r
+  Result = NULL;\r
 \r
   //\r
   // Statement don't have storage, skip them\r
@@ -1234,7 +1235,19 @@ GetQuestionValue (
   if (Question->ValueExpression != NULL) {\r
     Status = EvaluateExpression (FormSet, Form, Question->ValueExpression);\r
     if (!EFI_ERROR (Status)) {\r
-      CopyMem (&Question->HiiValue, &Question->ValueExpression->Result, sizeof (EFI_HII_VALUE));\r
+      if (Question->ValueExpression->Result.Type == EFI_IFR_TYPE_BUFFER) {\r
+        ASSERT (Question->HiiValue.Type == EFI_IFR_TYPE_BUFFER && Question->HiiValue.Buffer != NULL);\r
+        if (Question->StorageWidth > Question->ValueExpression->Result.BufferLen) {\r
+          CopyMem (Question->HiiValue.Buffer, Question->ValueExpression->Result.Buffer, Question->ValueExpression->Result.BufferLen);\r
+          Question->HiiValue.BufferLen = Question->ValueExpression->Result.BufferLen;\r
+        } else {\r
+          CopyMem (Question->HiiValue.Buffer, Question->ValueExpression->Result.Buffer, Question->StorageWidth);\r
+          Question->HiiValue.BufferLen = Question->StorageWidth;\r
+        }\r
+        FreePool (Question->ValueExpression->Result.Buffer);\r
+      }\r
+      Question->HiiValue.Type = Question->ValueExpression->Result.Type;\r
+      CopyMem (&Question->HiiValue.Value, &Question->ValueExpression->Result.Value, sizeof (EFI_IFR_TYPE_VALUE));      \r
     }\r
     return Status;\r
   }\r
@@ -1244,11 +1257,24 @@ GetQuestionValue (
   //\r
   if (Question->ReadExpression != NULL && Form->FormType == STANDARD_MAP_FORM_TYPE) {\r
     Status = EvaluateExpression (FormSet, Form, Question->ReadExpression);\r
-    if (!EFI_ERROR (Status) && (Question->ReadExpression->Result.Type < EFI_IFR_TYPE_OTHER)) {\r
+    if (!EFI_ERROR (Status) && \r
+      ((Question->ReadExpression->Result.Type < EFI_IFR_TYPE_OTHER) || (Question->ReadExpression->Result.Type == EFI_IFR_TYPE_BUFFER))) {\r
       //\r
       // Only update question value to the valid result.\r
       //\r
-      CopyMem (&Question->HiiValue, &Question->ReadExpression->Result, sizeof (EFI_HII_VALUE));\r
+      if (Question->ReadExpression->Result.Type == EFI_IFR_TYPE_BUFFER) {\r
+        ASSERT (Question->HiiValue.Type == EFI_IFR_TYPE_BUFFER && Question->HiiValue.Buffer != NULL);\r
+        if (Question->StorageWidth > Question->ReadExpression->Result.BufferLen) {\r
+          CopyMem (Question->HiiValue.Buffer, Question->ReadExpression->Result.Buffer, Question->ReadExpression->Result.BufferLen);\r
+          Question->HiiValue.BufferLen = Question->ReadExpression->Result.BufferLen;\r
+        } else {\r
+          CopyMem (Question->HiiValue.Buffer, Question->ReadExpression->Result.Buffer, Question->StorageWidth);\r
+          Question->HiiValue.BufferLen = Question->StorageWidth;\r
+        }\r
+        FreePool (Question->ReadExpression->Result.Buffer);\r
+      }\r
+      Question->HiiValue.Type = Question->ReadExpression->Result.Type;\r
+      CopyMem (&Question->HiiValue.Value, &Question->ReadExpression->Result.Value, sizeof (EFI_IFR_TYPE_VALUE));       \r
       return EFI_SUCCESS;\r
     }\r
   }\r
@@ -1403,7 +1429,7 @@ GetQuestionValue (
       FreePool (Value);\r
     }\r
   } else {\r
-    if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+    if (Storage->Type == EFI_HII_VARSTORE_BUFFER || Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
       //\r
       // Request current settings from Configuration Driver\r
       //\r
@@ -1516,9 +1542,9 @@ GetQuestionValue (
           }\r
         }\r
       }\r
-      FreePool (Result);\r
 \r
       if (EFI_ERROR (Status)) {\r
+        FreePool (Result);\r
         return Status;\r
       }\r
     } else if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
@@ -1554,6 +1580,10 @@ GetQuestionValue (
     } else {\r
       SetValueByName (Storage, Question->VariableName, Value, TRUE);\r
     }\r
+\r
+    if (Result != NULL) {\r
+      FreePool (Result);\r
+    }\r
   }\r
 \r
   return Status;\r
@@ -1758,7 +1788,7 @@ SetQuestionValue (
   }\r
 \r
   if (!Cached) {\r
-    if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
+    if (Storage->Type == EFI_HII_VARSTORE_BUFFER || Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
       //\r
       // <ConfigResp> ::= <ConfigHdr> + <BlockName> + "&VALUE=" + "<HexCh>StorageWidth * 2" ||\r
       //                <ConfigHdr> + "&" + <VariableName> + "=" + "<string>"\r
@@ -1920,7 +1950,7 @@ ValidateQuestion (
       return Status;\r
     }\r
 \r
-    if (Expression->Result.Value.b) {\r
+    if ((Expression->Result.Type == EFI_IFR_TYPE_BOOLEAN) && Expression->Result.Value.b) {\r
       //\r
       // Condition meet, show up error message\r
       //\r
@@ -2795,7 +2825,19 @@ GetQuestionDefault (
             return Status;\r
           }\r
 \r
-          CopyMem (HiiValue, &Default->ValueExpression->Result, sizeof (EFI_HII_VALUE));\r
+          if (Default->ValueExpression->Result.Type == EFI_IFR_TYPE_BUFFER) {\r
+            ASSERT (HiiValue->Type == EFI_IFR_TYPE_BUFFER && Question->BufferValue != NULL);\r
+            if (Question->StorageWidth > Default->ValueExpression->Result.BufferLen) {\r
+              CopyMem (Question->HiiValue.Buffer, Default->ValueExpression->Result.Buffer, Default->ValueExpression->Result.BufferLen);\r
+              Question->HiiValue.BufferLen = Default->ValueExpression->Result.BufferLen;\r
+            } else {\r
+              CopyMem (Question->HiiValue.Buffer, Default->ValueExpression->Result.Buffer, Question->StorageWidth);\r
+              Question->HiiValue.BufferLen = Question->StorageWidth;\r
+            }\r
+            FreePool (Default->ValueExpression->Result.Buffer);\r
+          }\r
+          HiiValue->Type = Default->ValueExpression->Result.Type;\r
+          CopyMem (&HiiValue->Value, &Default->ValueExpression->Result.Value, sizeof (EFI_IFR_TYPE_VALUE));       \r
         } else {\r
           //\r
           // Default value is embedded in EFI_IFR_DEFAULT\r
@@ -2954,7 +2996,6 @@ ExtractDefault (
   EFI_HII_HANDLE          *HiiHandles;\r
   UINTN                   Index;\r
   EFI_GUID                ZeroGuid;\r
-  UINTN                   BackUpClassOfVfr;\r
 \r
   //\r
   // Check the supported setting level.\r
@@ -2975,9 +3016,8 @@ ExtractDefault (
       //\r
       // If Question is disabled, don't reset it to default\r
       //\r
-      if (Question->DisableExpression != NULL) {\r
-        Status = EvaluateExpression (FormSet, Form, Question->DisableExpression);\r
-        if (!EFI_ERROR (Status) && Question->DisableExpression->Result.Value.b) {\r
+      if (Question->Expression != NULL) {\r
+        if (EvaluateExpressionList(Question->Expression, TRUE, FormSet, Form) == ExpressDisable) {\r
           continue;\r
         }\r
       }\r
@@ -3014,7 +3054,6 @@ ExtractDefault (
     // Open all FormSet by locate HII packages.\r
     // Initiliaze the maintain FormSet to store default data as back up data.\r
     //\r
-    BackUpClassOfVfr = gClassOfVfr;\r
     BackUpFormSet    = gOldFormSet;\r
     gOldFormSet      = NULL;\r
 \r
@@ -3041,7 +3080,7 @@ ExtractDefault (
       LocalFormSet = AllocateZeroPool (sizeof (FORM_BROWSER_FORMSET));\r
       ASSERT (LocalFormSet != NULL);\r
       ZeroMem (&ZeroGuid, sizeof (ZeroGuid));\r
-      Status = InitializeFormSet (HiiHandles[Index], &ZeroGuid, LocalFormSet);\r
+      Status = InitializeFormSet (HiiHandles[Index], &ZeroGuid, LocalFormSet, FALSE);\r
       if (EFI_ERROR (Status) || IsListEmpty (&LocalFormSet->FormListHead)) {\r
         DestroyFormSet (LocalFormSet);\r
         continue;\r
@@ -3051,7 +3090,15 @@ ExtractDefault (
         DestroyFormSet (LocalFormSet);\r
         continue;\r
       }\r
-      \r
+      //\r
+      // Initilize Questions' Value\r
+      //\r
+      LoadFormSetConfig (NULL, LocalFormSet);\r
+      if (EFI_ERROR (Status)) {\r
+        DestroyFormSet (LocalFormSet);\r
+        continue;\r
+      }\r
+\r
       //\r
       // Add FormSet into the maintain list.\r
       //\r
@@ -3063,7 +3110,6 @@ ExtractDefault (
     //\r
     FreePool (HiiHandles);\r
     gOldFormSet = BackUpFormSet;\r
-    gClassOfVfr = BackUpClassOfVfr;\r
        \r
     //\r
     // Set Default Value for each FormSet in the maintain list.\r
@@ -3085,6 +3131,7 @@ ExtractDefault (
   @param  Selection              Selection contains the information about \r
                                  the Selection, form and formset to be displayed.\r
                                  Selection action may be updated in retrieve callback.\r
+                                 If Selection is NULL, only initialize Question value.\r
   @param  FormSet                FormSet data structure.\r
   @param  Form                   Form data structure.\r
 \r
@@ -3123,7 +3170,7 @@ LoadFormConfig (
     //\r
     // According the spec, ref opcode try to get value from call back with "retrieve" type.\r
     //\r
-    if ((Question->Operand == EFI_IFR_REF_OP) && (FormSet->ConfigAccess != NULL)) {\r
+    if ((Question->Operand == EFI_IFR_REF_OP) && (FormSet->ConfigAccess != NULL) && (Selection != NULL)) {\r
       Status = ProcessCallBackFunction(Selection, Question, EFI_BROWSER_ACTION_RETRIEVE, TRUE);\r
       if (EFI_ERROR (Status)) {\r
         return Status;\r
@@ -3134,6 +3181,7 @@ LoadFormConfig (
     // Check whether EfiVarstore with CallBack can be got.\r
     //\r
     if ((FormSet->ConfigAccess != NULL) &&\r
+        (Selection != NULL) &&\r
         (Selection->Action != UI_ACTION_REFRESH_FORMSET) &&\r
         (Question->QuestionId != 0) && \r
         (Question->Storage != NULL) &&\r
@@ -3174,6 +3222,7 @@ LoadFormConfig (
   @param  Selection              Selection contains the information about \r
                                  the Selection, form and formset to be displayed.\r
                                  Selection action may be updated in retrieve callback.\r
+                                 If Selection is NULL, only initialize Question value.\r
   @param  FormSet                FormSet data structure.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
@@ -3612,6 +3661,7 @@ GetIfrBinaryData (
                                  found in package list.\r
                                  On output, GUID of the formset found(if not NULL).\r
   @param  FormSet                FormSet data structure.\r
+  @param  UpdateGlobalVar        Whether need to update the global variable.\r
 \r
   @retval EFI_SUCCESS            The function completed successfully.\r
   @retval EFI_NOT_FOUND          The specified FormSet could not be found.\r
@@ -3621,7 +3671,8 @@ EFI_STATUS
 InitializeFormSet (\r
   IN  EFI_HII_HANDLE                   Handle,\r
   IN OUT EFI_GUID                      *FormSetGuid,\r
-  OUT FORM_BROWSER_FORMSET             *FormSet\r
+  OUT FORM_BROWSER_FORMSET             *FormSet,\r
+  IN  BOOLEAN                          UpdateGlobalVar                   \r
   )\r
 {\r
   EFI_STATUS                Status;\r
@@ -3666,6 +3717,13 @@ InitializeFormSet (
     return Status;\r
   }\r
 \r
+  // \r
+  // If not need to update the global variable, just return.\r
+  //\r
+  if (!UpdateGlobalVar) {\r
+    return Status;\r
+  }\r
+\r
   //\r
   // Set VFR type by FormSet SubClass field\r
   //\r