]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Use the minimum value for Numeric and the first option value for OneOf as their defau...
authorlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 1 Apr 2011 09:39:11 +0000 (09:39 +0000)
committerlgao4 <lgao4@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 1 Apr 2011 09:39:11 +0000 (09:39 +0000)
HII IFR Numeric and OneOf opcode may not specify their default value in opcode. And, zero may not be valid value for them. To make sure the valid value is set to default value, the minimum value for Numeric and the first option value for OneOf will be chosen as default value.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11497 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Universal/HiiDatabaseDxe/ConfigRouting.c
MdeModulePkg/Universal/SetupBrowserDxe/Setup.c

index 7ab6a6e5f0a36e5fd3b4ca949c8c551f36408deb..e51de1371ad520762870b7b559f66c9baa2fffad 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
 Implementation of interfaces function for EFI_HII_CONFIG_ROUTING_PROTOCOL.\r
 \r
-Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2007 - 2011, 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
@@ -860,6 +860,7 @@ ParseIfrData (
   EFI_STRING               NameStr;\r
   EFI_STRING               TempStr;\r
   UINTN                    LengthString;\r
+  BOOLEAN                  FirstOneOfOption;\r
 \r
   LengthString     = 0;\r
   Status           = EFI_SUCCESS;\r
@@ -869,6 +870,7 @@ ParseIfrData (
   BlockData        = NULL;\r
   DefaultData      = NULL;\r
   VarDefaultName   = 0;\r
+  FirstOneOfOption = FALSE;\r
 \r
   //\r
   // Go through the form package to parse OpCode one by one.\r
@@ -1023,6 +1025,59 @@ ParseIfrData (
       // Add Block Data into VarStorageData BlockEntry\r
       //\r
       InsertBlockData (&VarStorageData->BlockEntry, &BlockData);\r
+      \r
+      if (IfrOpHdr->OpCode == EFI_IFR_ONE_OF_OP) {\r
+        //\r
+        // Set this flag to TRUE for the first oneof option.\r
+        //\r
+        FirstOneOfOption = TRUE;\r
+      } else if (IfrOpHdr->OpCode == EFI_IFR_NUMERIC_OP) {\r
+        //\r
+        // Numeric minimum value will be used as default value when no default is specified. \r
+        //\r
+\r
+        //\r
+        // Set standard ID and Get DefaultName String ID\r
+        //\r
+        VarDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
+        Status       = FindDefaultName (DefaultIdArray, VarDefaultId, &VarDefaultName);\r
+        if (EFI_ERROR (Status)) {\r
+          goto Done;\r
+        }\r
+        //\r
+        // Prepare new DefaultValue\r
+        //\r
+        DefaultData = (IFR_DEFAULT_DATA *) AllocateZeroPool (sizeof (IFR_DEFAULT_DATA));\r
+        if (DefaultData == NULL) {\r
+          Status = EFI_OUT_OF_RESOURCES;\r
+          goto Done;\r
+        }\r
+        DefaultData->OpCode      = IfrOpHdr->OpCode;\r
+        DefaultData->DefaultId   = VarDefaultId;\r
+        DefaultData->DefaultName = VarDefaultName;\r
+\r
+        switch (IfrOneOf->Flags & EFI_IFR_NUMERIC_SIZE) {\r
+        case EFI_IFR_NUMERIC_SIZE_1:\r
+          DefaultData->Value = (UINT64) IfrOneOf->data.u8.MinValue;\r
+          break;\r
+  \r
+        case EFI_IFR_NUMERIC_SIZE_2:\r
+          CopyMem (&DefaultData->Value, &IfrOneOf->data.u16.MinValue, sizeof (UINT16));\r
+          break;\r
+  \r
+        case EFI_IFR_NUMERIC_SIZE_4:\r
+          CopyMem (&DefaultData->Value, &IfrOneOf->data.u32.MinValue, sizeof (UINT32));\r
+          break;\r
+  \r
+        case EFI_IFR_NUMERIC_SIZE_8:\r
+          CopyMem (&DefaultData->Value, &IfrOneOf->data.u64.MinValue, sizeof (UINT64));\r
+          break;\r
+        }\r
+        //\r
+        // Add DefaultValue into current BlockData\r
+        //\r
+        InsertDefaultValue (BlockData, DefaultData);      \r
+      }\r
       break;\r
 \r
     case EFI_IFR_ORDERED_LIST_OP:\r
@@ -1402,7 +1457,13 @@ ParseIfrData (
         break;\r
       }\r
 \r
-      if ((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT) {\r
+      if (((IfrOneOfOption->Flags & EFI_IFR_OPTION_DEFAULT) == EFI_IFR_OPTION_DEFAULT) ||\r
+          (BlockData->OpCode == EFI_IFR_ONE_OF_OP && FirstOneOfOption)) {\r
+        //\r
+        // This flag is used to specify whether this option is the first. Set it to FALSE for the following options. \r
+        // The first oneof option value will be used as default value when no default value is specified. \r
+        //\r
+        FirstOneOfOption = FALSE;\r
         //\r
         // Set standard ID to Manufacture ID and Get DefaultName String ID\r
         //\r
index 6513071cd4bd809c08df4c9b9d9cc6ccf3ee5a0b..ea98d46db9c5f30f5dd1723cfb1698cba8361d37 100644 (file)
@@ -1940,6 +1940,15 @@ GetQuestionDefault (
   // For Questions without default\r
   //\r
   switch (Question->Operand) {\r
+  case EFI_IFR_NUMERIC_OP:\r
+    //\r
+    // Take minimum value as numeric default value\r
+    //\r
+    if ((HiiValue->Value.u64 < Question->Minimum) || (HiiValue->Value.u64 > Question->Maximum)) {\r
+      HiiValue->Value.u64 = Question->Minimum;\r
+    }\r
+    break;\r
+\r
   case EFI_IFR_ONE_OF_OP:\r
     //\r
     // Take first oneof option as oneof's default value\r