]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Library/UefiHiiLib/HiiLib.c
Base on the type field to generate oneof opcode.
[mirror_edk2.git] / MdeModulePkg / Library / UefiHiiLib / HiiLib.c
index a2d31e7fda1ef1cadb34ef3e6ba49a7f3fa19e7a..02887bf76c7bb155d0bf944d641ba3e3dbd93913 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   HII Library implementation that uses DXE protocols and services.\r
 \r
-  Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2006 - 2013, 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
@@ -2959,9 +2959,11 @@ HiiCreateNumericOpCode (
 {\r
   EFI_IFR_NUMERIC  OpCode;\r
   UINTN            Position;\r
+  UINTN            Length;\r
 \r
   ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED))) == 0);\r
 \r
+  Length  = 0;\r
   ZeroMem (&OpCode, sizeof (OpCode));\r
   OpCode.Question.QuestionId             = QuestionId;\r
   OpCode.Question.VarStoreId             = VarStoreId;\r
@@ -2976,33 +2978,39 @@ HiiCreateNumericOpCode (
     OpCode.data.u8.MinValue = (UINT8)Minimum;\r
     OpCode.data.u8.MaxValue = (UINT8)Maximum;\r
     OpCode.data.u8.Step     = (UINT8)Step;\r
+    Length                  = 3;\r
     break;\r
 \r
   case EFI_IFR_NUMERIC_SIZE_2:\r
     OpCode.data.u16.MinValue = (UINT16)Minimum;\r
     OpCode.data.u16.MaxValue = (UINT16)Maximum;\r
     OpCode.data.u16.Step     = (UINT16)Step;\r
+    Length                   = 6;\r
     break;\r
 \r
   case EFI_IFR_NUMERIC_SIZE_4:\r
     OpCode.data.u32.MinValue = (UINT32)Minimum;\r
     OpCode.data.u32.MaxValue = (UINT32)Maximum;\r
     OpCode.data.u32.Step     = (UINT32)Step;\r
+    Length                   = 12;\r
     break;\r
 \r
   case EFI_IFR_NUMERIC_SIZE_8:\r
     OpCode.data.u64.MinValue = Minimum;\r
     OpCode.data.u64.MaxValue = Maximum;\r
     OpCode.data.u64.Step     = Step;\r
+    Length                   = 24;\r
     break;\r
   }\r
 \r
+  Length += OFFSET_OF (EFI_IFR_NUMERIC, data);\r
+\r
   if (DefaultsOpCodeHandle == NULL) {\r
-    return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_NUMERIC_OP, sizeof (OpCode));\r
+    return InternalHiiCreateOpCode (OpCodeHandle, &OpCode, EFI_IFR_NUMERIC_OP, Length);\r
   }\r
 \r
   Position = InternalHiiOpCodeHandlePosition (OpCodeHandle);\r
-  InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_NUMERIC_OP, sizeof (OpCode), 0, 1);\r
+  InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_NUMERIC_OP, Length, 0, 1);\r
   InternalHiiAppendOpCodes (OpCodeHandle, DefaultsOpCodeHandle);\r
   HiiCreateEndOpCode (OpCodeHandle);\r
   return InternalHiiOpCodeHandleBuffer (OpCodeHandle) + Position;\r
@@ -3115,6 +3123,7 @@ HiiCreateOneOfOpCode (
 {\r
   EFI_IFR_ONE_OF  OpCode;\r
   UINTN           Position;\r
+  UINTN           Length;\r
 \r
   ASSERT (OptionsOpCodeHandle != NULL);\r
   ASSERT ((QuestionFlags & (~(EFI_IFR_FLAG_READ_ONLY | EFI_IFR_FLAG_CALLBACK | EFI_IFR_FLAG_RESET_REQUIRED | EFI_IFR_FLAG_OPTIONS_ONLY))) == 0);\r
@@ -3128,8 +3137,11 @@ HiiCreateOneOfOpCode (
   OpCode.Question.Flags                  = QuestionFlags;\r
   OpCode.Flags                           = OneOfFlags;\r
 \r
+  Length  = OFFSET_OF (EFI_IFR_ONE_OF, data);\r
+  Length += (1 << (OneOfFlags & EFI_IFR_NUMERIC_SIZE)) * 3;\r
+\r
   Position = InternalHiiOpCodeHandlePosition (OpCodeHandle);\r
-  InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_ONE_OF_OP, sizeof (OpCode), 0, 1);\r
+  InternalHiiCreateOpCodeExtended (OpCodeHandle, &OpCode, EFI_IFR_ONE_OF_OP, Length, 0, 1);\r
   InternalHiiAppendOpCodes (OpCodeHandle, OptionsOpCodeHandle);\r
   if (DefaultsOpCodeHandle != NULL) {\r
     InternalHiiAppendOpCodes (OpCodeHandle, DefaultsOpCodeHandle);\r