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
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
VOID\r
NewStrCat (\r
IN OUT CHAR16 *Destination,\r
+ IN UINTN DestMax,\r
IN CHAR16 *Source\r
)\r
{\r
Destination[Length] = NARROW_CHAR;\r
Length++;\r
\r
- StrCpy (Destination + Length, Source);\r
+ StrCpyS (Destination + Length, DestMax - Length, Source);\r
}\r
\r
/**\r
\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
\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
*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
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
@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
UINTN Count;\r
UINT64 TmpValue;\r
UINT64 ValueComp;\r
- \r
+\r
ASSERT (Array != NULL);\r
\r
Count = 0;\r
\r
default:\r
return EFI_UNSUPPORTED;\r
- break;\r
}\r
\r
UnicodeSPrint (FormattedNumber, BufferSize, Format, Value);\r
\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
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
return Status;\r
}\r
}\r
- \r
+\r
//\r
// Ask for new password\r
//\r
FreePool (StringPtr);\r
return Status;\r
}\r
- \r
+\r
//\r
// Confirm new password\r
//\r
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
\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
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
// 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
// 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
}\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
// 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
// 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
//\r
Status = GetSelectionInputPopUp (MenuOption);\r
} else {\r
+ MaxLen = BufferSize / sizeof(CHAR16);\r
*OptionString = AllocateZeroPool (BufferSize);\r
ASSERT (*OptionString);\r
\r
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
break;\r
}\r
gUserInput->SelectedStatement = Question;\r
-\r
+ gMisMatch = TRUE;\r
FreePool (*OptionString);\r
*OptionString = NULL;\r
return EFI_NOT_FOUND;\r
}\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
// Perform inconsistent check\r
//\r
return EFI_SUCCESS;\r
- } else { \r
+ } else {\r
*OptionString = AllocateZeroPool (BufferSize);\r
ASSERT (*OptionString);\r
\r
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
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
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
FreePool (OutputString);\r
}\r
\r
- return TotalRowNum; \r
+ return TotalRowNum;\r
}\r