]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/DisplayEngineDxe/ProcessOptions.c
MdeModulePkg: Clean up source files
[mirror_edk2.git] / MdeModulePkg / Universal / DisplayEngineDxe / ProcessOptions.c
index 65d2a749951de3edc9352f85e67cec1927bd8b6f..709dabc7f556c360b0cc8c134e59f3fe5529966d 100644 (file)
@@ -2,7 +2,7 @@
 Implementation for handling the User Interface option processing.\r
 \r
 \r
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2004 - 2018, 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
@@ -21,6 +21,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
   Concatenate a narrow string to another string.\r
 \r
   @param Destination The destination string.\r
+  @param DestMax     The Max length of destination string.\r
   @param Source      The source string. The string to be concatenated.\r
                      to the end of Destination.\r
 \r
@@ -28,6 +29,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 VOID\r
 NewStrCat (\r
   IN OUT CHAR16               *Destination,\r
+  IN     UINTN                DestMax,\r
   IN     CHAR16               *Source\r
   )\r
 {\r
@@ -45,7 +47,7 @@ NewStrCat (
   Destination[Length] = NARROW_CHAR;\r
   Length++;\r
 \r
-  StrCpy (Destination + Length, Source);\r
+  StrCpyS (Destination + Length, DestMax - Length, Source);\r
 }\r
 \r
 /**\r
@@ -100,8 +102,8 @@ HiiValueToUINT64 (
 \r
 /**\r
   Check whether this value type can be transfer to EFI_IFR_TYPE_BUFFER type.\r
-  \r
-  EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to \r
+\r
+  EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to\r
   EFI_IFR_TYPE_BUFFER when do the value compare.\r
 \r
   @param  Value                  Expression value to compare on.\r
@@ -156,8 +158,8 @@ IsTypeInUINT64 (
 \r
 /**\r
   Return the buffer length and buffer pointer for this value.\r
-  \r
-  EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to \r
+\r
+  EFI_IFR_TYPE_REF, EFI_IFR_TYPE_DATE and EFI_IFR_TYPE_TIME are converted to\r
   EFI_IFR_TYPE_BUFFER when do the value compare.\r
 \r
   @param  Value                  Expression value to compare on.\r
@@ -283,7 +285,7 @@ CompareHiiValue (
       *Result = Buf1Len > Buf2Len ? 1 : -1;\r
     }\r
     return EFI_SUCCESS;\r
-  }  \r
+  }\r
 \r
   //\r
   // Take remain types(integer, boolean, date/time) as integer\r
@@ -331,7 +333,7 @@ ValueToOption (
     ZeroMem (&Value, sizeof (EFI_HII_VALUE));\r
     Value.Type = Option->OptionOpCode->Type;\r
     CopyMem (&Value.Value, &Option->OptionOpCode->Value, Option->OptionOpCode->Header.Length - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));\r
-    \r
+\r
     if ((CompareHiiValue (&Value, OptionValue, &Result, NULL) == EFI_SUCCESS) && (Result == 0)) {\r
       return Option;\r
     }\r
@@ -439,12 +441,12 @@ SetArrayData (
   @param  Type                   Type of the data in this array.\r
   @param  Value                  The value to be find.\r
   @param  Index                  The index in the array which has same value with Value.\r
-  \r
+\r
   @retval   TRUE Found the value in the array.\r
   @retval   FALSE Not found the value.\r
 \r
 **/\r
-BOOLEAN \r
+BOOLEAN\r
 FindArrayData (\r
   IN VOID                     *Array,\r
   IN UINT8                    Type,\r
@@ -455,7 +457,7 @@ FindArrayData (
   UINTN  Count;\r
   UINT64 TmpValue;\r
   UINT64 ValueComp;\r
-  \r
+\r
   ASSERT (Array != NULL);\r
 \r
   Count    = 0;\r
@@ -566,7 +568,6 @@ PrintFormattedNumber (
 \r
   default:\r
     return EFI_UNSUPPORTED;\r
-    break;\r
   }\r
 \r
   UnicodeSPrint (FormattedNumber, BufferSize, Format, Value);\r
@@ -803,7 +804,7 @@ PasswordProcess (
 \r
   StringPtr = AllocateZeroPool ((Maximum + 1) * sizeof (CHAR16));\r
   ASSERT (StringPtr);\r
-  \r
+\r
   //\r
   // Use a NULL password to test whether old password is required\r
   //\r
@@ -811,8 +812,13 @@ PasswordProcess (
   Status = Question->PasswordCheck (gFormData, Question, StringPtr);\r
   if (Status == EFI_NOT_AVAILABLE_YET || Status == EFI_UNSUPPORTED) {\r
     //\r
-    // Password can't be set now. \r
+    // Password can't be set now.\r
     //\r
+    if (Status == EFI_UNSUPPORTED) {\r
+      do {\r
+        CreateDialog (&Key, gEmptyString, gPasswordUnsupported, gPressEnter, gEmptyString, NULL);\r
+      } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN);\r
+    }\r
     FreePool (StringPtr);\r
     return EFI_SUCCESS;\r
   }\r
@@ -845,7 +851,7 @@ PasswordProcess (
       return Status;\r
     }\r
   }\r
-  \r
+\r
   //\r
   // Ask for new password\r
   //\r
@@ -859,7 +865,7 @@ PasswordProcess (
     FreePool (StringPtr);\r
     return Status;\r
   }\r
-  \r
+\r
   //\r
   // Confirm new password\r
   //\r
@@ -875,33 +881,23 @@ PasswordProcess (
     FreePool (TempString);\r
     return Status;\r
   }\r
-  \r
+\r
   //\r
   // Compare two typed-in new passwords\r
   //\r
-  if (StrCmp (StringPtr, TempString) == 0) {     \r
+  if (StrCmp (StringPtr, TempString) == 0) {\r
     gUserInput->InputValue.Buffer = AllocateCopyPool (Question->CurrentValue.BufferLen, StringPtr);\r
     gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen;\r
     gUserInput->InputValue.Type = Question->CurrentValue.Type;\r
     gUserInput->InputValue.Value.string = HiiSetString(gFormData->HiiHandle, gUserInput->InputValue.Value.string, StringPtr, NULL);\r
-    FreePool (StringPtr); \r
 \r
     Status = EFI_SUCCESS;\r
-\r
-    if (EFI_ERROR (Status)) {\r
-      //\r
-      // Reset state machine for password\r
-      //\r
-      Question->PasswordCheck (gFormData, Question, NULL);\r
-    }\r
-\r
-    return Status;\r
   } else {\r
     //\r
     // Reset state machine for password\r
     //\r
     Question->PasswordCheck (gFormData, Question, NULL);\r
-  \r
+\r
     //\r
     // Two password mismatch, prompt error message\r
     //\r
@@ -911,7 +907,8 @@ PasswordProcess (
 \r
     Status = EFI_INVALID_PARAMETER;\r
   }\r
-  \r
+  ZeroMem (TempString, (Maximum + 1) * sizeof (CHAR16));\r
+  ZeroMem (StringPtr, (Maximum + 1) * sizeof (CHAR16));\r
   FreePool (TempString);\r
   FreePool (StringPtr);\r
 \r
@@ -955,16 +952,15 @@ ProcessOptions (
   UINTN                           Index2;\r
   UINT8                           *ValueArray;\r
   UINT8                           ValueType;\r
-  EFI_STRING_ID                   StringId;\r
   EFI_IFR_ORDERED_LIST            *OrderList;\r
   BOOLEAN                         ValueInvalid;\r
+  UINTN                           MaxLen;\r
 \r
   Status        = EFI_SUCCESS;\r
 \r
   StringPtr     = NULL;\r
   Character[1]  = L'\0';\r
   *OptionString = NULL;\r
-  StringId      = 0;\r
   ValueInvalid  = FALSE;\r
 \r
   ZeroMem (FormattedNumber, 21 * sizeof (CHAR16));\r
@@ -1001,7 +997,8 @@ ProcessOptions (
       // We now know how many strings we will have, so we can allocate the\r
       // space required for the array or strings.\r
       //\r
-      *OptionString = AllocateZeroPool (OrderList->MaxContainers * BufferSize);\r
+      MaxLen = OrderList->MaxContainers * BufferSize / sizeof (CHAR16);\r
+      *OptionString = AllocateZeroPool (MaxLen * sizeof (CHAR16));\r
       ASSERT (*OptionString);\r
 \r
       HiiValue.Type = ValueType;\r
@@ -1036,13 +1033,13 @@ ProcessOptions (
           // Exit current DisplayForm with new value.\r
           //\r
           gUserInput->SelectedStatement = Question;\r
-          \r
+          gMisMatch = TRUE;\r
           ValueArray = AllocateZeroPool (Question->CurrentValue.BufferLen);\r
           ASSERT (ValueArray != NULL);\r
           gUserInput->InputValue.Buffer    = ValueArray;\r
           gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen;\r
           gUserInput->InputValue.Type      = Question->CurrentValue.Type;\r
-          \r
+\r
           Link = GetFirstNode (&Question->OptionListHead);\r
           Index2 = 0;\r
           while (!IsNull (&Question->OptionListHead, Link) && Index2 < OrderList->MaxContainers) {\r
@@ -1059,14 +1056,14 @@ ProcessOptions (
         }\r
 \r
         Character[0] = LEFT_ONEOF_DELIMITER;\r
-        NewStrCat (OptionString[0], Character);\r
+        NewStrCat (OptionString[0], MaxLen, Character);\r
         StringPtr = GetToken (OneOfOption->OptionOpCode->Option, gFormData->HiiHandle);\r
         ASSERT (StringPtr != NULL);\r
-        NewStrCat (OptionString[0], StringPtr);\r
+        NewStrCat (OptionString[0], MaxLen, StringPtr);\r
         Character[0] = RIGHT_ONEOF_DELIMITER;\r
-        NewStrCat (OptionString[0], Character);\r
+        NewStrCat (OptionString[0], MaxLen, Character);\r
         Character[0] = CHAR_CARRIAGE_RETURN;\r
-        NewStrCat (OptionString[0], Character);\r
+        NewStrCat (OptionString[0], MaxLen, Character);\r
         FreePool (StringPtr);\r
       }\r
 \r
@@ -1094,14 +1091,14 @@ ProcessOptions (
           // Not report error, just get the correct option string info.\r
           //\r
           Character[0] = LEFT_ONEOF_DELIMITER;\r
-          NewStrCat (OptionString[0], Character);\r
+          NewStrCat (OptionString[0], MaxLen, Character);\r
           StringPtr = GetToken (OneOfOption->OptionOpCode->Option, gFormData->HiiHandle);\r
           ASSERT (StringPtr != NULL);\r
-          NewStrCat (OptionString[0], StringPtr);\r
+          NewStrCat (OptionString[0], MaxLen, StringPtr);\r
           Character[0] = RIGHT_ONEOF_DELIMITER;\r
-          NewStrCat (OptionString[0], Character);\r
+          NewStrCat (OptionString[0], MaxLen, Character);\r
           Character[0] = CHAR_CARRIAGE_RETURN;\r
-          NewStrCat (OptionString[0], Character);\r
+          NewStrCat (OptionString[0], MaxLen, Character);\r
           FreePool (StringPtr);\r
 \r
           continue;\r
@@ -1121,14 +1118,14 @@ ProcessOptions (
           // Exit current DisplayForm with new value.\r
           //\r
           gUserInput->SelectedStatement = Question;\r
-          \r
+          gMisMatch = TRUE;\r
           ValueArray = AllocateCopyPool (Question->CurrentValue.BufferLen, Question->CurrentValue.Buffer);\r
           ASSERT (ValueArray != NULL);\r
           gUserInput->InputValue.Buffer    = ValueArray;\r
           gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen;\r
           gUserInput->InputValue.Type      = Question->CurrentValue.Type;\r
         }\r
-       \r
+\r
         SetArrayData (ValueArray, ValueType, Index++, OneOfOption->OptionOpCode->Value.u64);\r
       }\r
 \r
@@ -1153,6 +1150,7 @@ ProcessOptions (
       //\r
       Status = GetSelectionInputPopUp (MenuOption);\r
     } else {\r
+      MaxLen = BufferSize / sizeof(CHAR16);\r
       *OptionString = AllocateZeroPool (BufferSize);\r
       ASSERT (*OptionString);\r
 \r
@@ -1161,7 +1159,7 @@ ProcessOptions (
         if (SkipErrorValue) {\r
           //\r
           // Not report error, just get the correct option string info.\r
-          //          \r
+          //\r
           Link = GetFirstNode (&Question->OptionListHead);\r
           OneOfOption = DISPLAY_QUESTION_OPTION_FROM_LINK (Link);\r
         } else {\r
@@ -1198,7 +1196,7 @@ ProcessOptions (
             break;\r
           }\r
           gUserInput->SelectedStatement = Question;\r
-\r
+          gMisMatch = TRUE;\r
           FreePool (*OptionString);\r
           *OptionString = NULL;\r
           return EFI_NOT_FOUND;\r
@@ -1206,12 +1204,12 @@ ProcessOptions (
       }\r
 \r
       Character[0] = LEFT_ONEOF_DELIMITER;\r
-      NewStrCat (OptionString[0], Character);\r
+      NewStrCat (OptionString[0], MaxLen, Character);\r
       StringPtr = GetToken (OneOfOption->OptionOpCode->Option, gFormData->HiiHandle);\r
       ASSERT (StringPtr != NULL);\r
-      NewStrCat (OptionString[0], StringPtr);\r
+      NewStrCat (OptionString[0], MaxLen, StringPtr);\r
       Character[0] = RIGHT_ONEOF_DELIMITER;\r
-      NewStrCat (OptionString[0], Character);\r
+      NewStrCat (OptionString[0], MaxLen, Character);\r
 \r
       FreePool (StringPtr);\r
     }\r
@@ -1229,7 +1227,7 @@ ProcessOptions (
       // Perform inconsistent check\r
       //\r
       return EFI_SUCCESS;\r
-    } else {    \r
+    } else {\r
       *OptionString = AllocateZeroPool (BufferSize);\r
       ASSERT (*OptionString);\r
 \r
@@ -1280,19 +1278,31 @@ ProcessOptions (
       switch (MenuOption->Sequence) {\r
       case 0:\r
         *OptionString[0] = LEFT_NUMERIC_DELIMITER;\r
-        UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Month);\r
+        if (QuestionValue->Value.date.Month == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Month);\r
+        }\r
         *(OptionString[0] + 3) = DATE_SEPARATOR;\r
         break;\r
 \r
       case 1:\r
         SetUnicodeMem (OptionString[0], 4, L' ');\r
-        UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Day);\r
+        if (QuestionValue->Value.date.Day == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.date.Day);\r
+        }\r
         *(OptionString[0] + 6) = DATE_SEPARATOR;\r
         break;\r
 \r
       case 2:\r
         SetUnicodeMem (OptionString[0], 7, L' ');\r
-        UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%04d", QuestionValue->Value.date.Year);\r
+        if (QuestionValue->Value.date.Year == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"????");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%04d", QuestionValue->Value.date.Year);\r
+        }\r
         *(OptionString[0] + 11) = RIGHT_NUMERIC_DELIMITER;\r
         break;\r
       }\r
@@ -1312,19 +1322,31 @@ ProcessOptions (
       switch (MenuOption->Sequence) {\r
       case 0:\r
         *OptionString[0] = LEFT_NUMERIC_DELIMITER;\r
-        UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Hour);\r
+        if (QuestionValue->Value.time.Hour == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 1, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Hour);\r
+        }\r
         *(OptionString[0] + 3) = TIME_SEPARATOR;\r
         break;\r
 \r
       case 1:\r
         SetUnicodeMem (OptionString[0], 4, L' ');\r
-        UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Minute);\r
+        if (QuestionValue->Value.time.Minute == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 4, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Minute);\r
+        }\r
         *(OptionString[0] + 6) = TIME_SEPARATOR;\r
         break;\r
 \r
       case 2:\r
         SetUnicodeMem (OptionString[0], 7, L' ');\r
-        UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Second);\r
+        if (QuestionValue->Value.time.Second == 0xff){\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"??");\r
+        } else {\r
+          UnicodeSPrint (OptionString[0] + 7, 21 * sizeof (CHAR16), L"%02d", QuestionValue->Value.time.Second);\r
+        }\r
         *(OptionString[0] + 9) = RIGHT_NUMERIC_DELIMITER;\r
         break;\r
       }\r
@@ -1342,7 +1364,7 @@ ProcessOptions (
         FreePool (StringPtr);\r
         return Status;\r
       }\r
-      \r
+\r
       gUserInput->InputValue.Buffer = AllocateCopyPool (Question->CurrentValue.BufferLen, StringPtr);\r
       gUserInput->InputValue.BufferLen = Question->CurrentValue.BufferLen;\r
       gUserInput->InputValue.Type = Question->CurrentValue.Type;\r
@@ -1444,5 +1466,5 @@ ProcessHelpString (
     FreePool (OutputString);\r
   }\r
 \r
-  return TotalRowNum; \r
+  return TotalRowNum;\r
 }\r