]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c
Refine data copy and data compare logic.
[mirror_edk2.git] / MdeModulePkg / Universal / DisplayEngineDxe / ProcessOptions.c
index cf9f6836b3e4d47312def718942eed3f11bd789c..8da563ba700cc7ee3a5ffbe7a20ccdf53b498c4f 100644 (file)
@@ -54,6 +54,56 @@ NewStrCat (
   StrCpy (Destination + Length, Source);\r
 }\r
 \r
+/**\r
+  Get UINT64 type value.\r
+\r
+  @param  Value                  Input Hii value.\r
+\r
+  @retval UINT64                 Return the UINT64 type value.\r
+\r
+**/\r
+UINT64\r
+HiiValueToUINT64 (\r
+  IN EFI_HII_VALUE      *Value\r
+  )\r
+{\r
+  UINT64  RetVal;\r
+\r
+  RetVal = 0;\r
+\r
+  switch (Value->Type) {\r
+  case EFI_IFR_TYPE_NUM_SIZE_8:\r
+    RetVal = Value->Value.u8;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_16:\r
+    RetVal = Value->Value.u16;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_NUM_SIZE_32:\r
+    RetVal = Value->Value.u32;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_BOOLEAN:\r
+    RetVal = Value->Value.b;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_DATE:\r
+    RetVal = *(UINT64*) &Value->Value.date;\r
+    break;\r
+\r
+  case EFI_IFR_TYPE_TIME:\r
+    RetVal = (*(UINT64*) &Value->Value.time) & 0xffffff;\r
+    break;\r
+\r
+  default:\r
+    RetVal = Value->Value.u64;\r
+    break;\r
+  }\r
+\r
+  return RetVal;\r
+}\r
+\r
 /**\r
   Compare two Hii value.\r
 \r
@@ -153,7 +203,7 @@ CompareHiiValue (
   //\r
   // Take remain types(integer, boolean, date/time) as integer\r
   //\r
-  Temp64 = (INT64) (Value1->Value.u64 - Value2->Value.u64);\r
+  Temp64 = HiiValueToUINT64(Value1) - HiiValueToUINT64(Value2);\r
   if (Temp64 > 0) {\r
     *Result = 1;\r
   } else if (Temp64 < 0) {\r
@@ -1178,8 +1228,24 @@ ProcessOptions (
           Link = GetFirstNode (&Question->OptionListHead);\r
           Option = DISPLAY_QUESTION_OPTION_FROM_LINK (Link);\r
 \r
-          CopyMem (&gUserInput->InputValue.Value, &Option->OptionOpCode->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
           gUserInput->InputValue.Type = Option->OptionOpCode->Type;\r
+          switch (gUserInput->InputValue.Type) {\r
+          case EFI_IFR_TYPE_NUM_SIZE_8:\r
+            gUserInput->InputValue.Value.u8 = Option->OptionOpCode->Value.u8;\r
+            break;\r
+          case EFI_IFR_TYPE_NUM_SIZE_16:\r
+            CopyMem (&gUserInput->InputValue.Value.u16, &Option->OptionOpCode->Value.u16, sizeof (UINT16));\r
+            break;\r
+          case EFI_IFR_TYPE_NUM_SIZE_32:\r
+            CopyMem (&gUserInput->InputValue.Value.u32, &Option->OptionOpCode->Value.u32, sizeof (UINT32));\r
+            break;\r
+          case EFI_IFR_TYPE_NUM_SIZE_64:\r
+            CopyMem (&gUserInput->InputValue.Value.u64, &Option->OptionOpCode->Value.u64, sizeof (UINT64));\r
+            break;\r
+          default:\r
+            ASSERT (FALSE);\r
+            break;\r
+          }\r
           gUserInput->SelectedStatement = Question;\r
 \r
           FreePool (*OptionString);\r