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 - 2015, 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
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
UINT8 ValueType;\r
EFI_IFR_ORDERED_LIST *OrderList;\r
BOOLEAN ValueInvalid;\r
+ UINTN MaxLen;\r
\r
Status = EFI_SUCCESS;\r
\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
}\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
//\r
Status = GetSelectionInputPopUp (MenuOption);\r
} else {\r
+ MaxLen = BufferSize / sizeof(CHAR16);\r
*OptionString = AllocateZeroPool (BufferSize);\r
ASSERT (*OptionString);\r
\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
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