EFI_HII_STRING_PROTOCOL *mHiiString;\r
EFI_HII_CONFIG_ROUTING_PROTOCOL *mHiiConfigRouting;\r
\r
-BANNER_DATA *BannerData;\r
-EFI_HII_HANDLE FrontPageHandle;\r
+BANNER_DATA *gBannerData;\r
+EFI_HII_HANDLE gFrontPageHandle;\r
UINTN gClassOfVfr;\r
UINTN gFunctionKeySetting;\r
BOOLEAN gResetRequired;\r
CHAR16 *gSaveChanges;\r
CHAR16 *gOptionMismatch;\r
\r
+CHAR16 *mUnknownString = L"!";\r
+\r
CHAR16 gPromptBlockWidth;\r
CHAR16 gOptionBlockWidth;\r
CHAR16 gHelpBlockWidth;\r
UI_MENU_SELECTION *Selection;\r
UINTN Index;\r
FORM_BROWSER_FORMSET *FormSet;\r
- EFI_CONSOLE_CONTROL_PROTOCOL *ConsoleControl;\r
\r
Status = EFI_SUCCESS;\r
ZeroMem (&gScreenDimensions, sizeof (EFI_SCREEN_DESCRIPTOR));\r
InitializeBrowserStrings ();\r
\r
gFunctionKeySetting = DEFAULT_FUNCTION_KEY_SETTING;\r
- gClassOfVfr = EFI_SETUP_APPLICATION_SUBCLASS;\r
+ gClassOfVfr = FORMSET_CLASS_PLATFORM_SETUP;\r
\r
//\r
// Ensure we are in Text mode\r
//\r
gST->ConOut->SetAttribute (gST->ConOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
\r
- Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID **) &ConsoleControl);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
- //\r
- // Set console control to text mode.\r
- //\r
- ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
-\r
for (Index = 0; Index < HandleCount; Index++) {\r
Selection = AllocateZeroPool (sizeof (UI_MENU_SELECTION));\r
ASSERT (Selection != NULL);\r
)\r
{\r
EFI_STATUS Status;\r
- EFI_HANDLE HiiDriverHandle;\r
- EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
\r
//\r
// Locate required Hii relative protocols\r
//\r
// Publish our HII data\r
//\r
- Status = HiiLibCreateHiiDriverHandle (&HiiDriverHandle);\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- PackageList = HiiLibPreparePackageList (1, &gSetupBrowserGuid, SetupBrowserStrings);\r
- ASSERT (PackageList != NULL);\r
- Status = mHiiDatabase->NewPackageList (\r
- mHiiDatabase,\r
- PackageList,\r
- HiiDriverHandle,\r
- &gHiiHandle\r
- );\r
- ASSERT_EFI_ERROR (Status);\r
+ gHiiHandle = HiiAddPackages (\r
+ &gSetupBrowserGuid,\r
+ ImageHandle,\r
+ SetupBrowserStrings,\r
+ NULL\r
+ );\r
+ ASSERT (gHiiHandle != NULL);\r
\r
//\r
// Initialize Driver private data\r
//\r
- BannerData = AllocateZeroPool (sizeof (BANNER_DATA));\r
- ASSERT (BannerData != NULL);\r
+ gBannerData = AllocateZeroPool (sizeof (BANNER_DATA));\r
+ ASSERT (gBannerData != NULL);\r
\r
//\r
// Install FormBrowser2 protocol\r
)\r
{\r
EFI_STRING_ID StringId;\r
- EFI_STATUS Status;\r
\r
- StringId = 0;\r
- Status = HiiLibNewString (HiiHandle, &StringId, String);\r
- ASSERT_EFI_ERROR (Status);\r
+ StringId = HiiSetString (HiiHandle, 0, String, NULL);\r
+ ASSERT (StringId != 0);\r
\r
return StringId;\r
}\r
CHAR16 NullChar;\r
\r
NullChar = CHAR_NULL;\r
- return HiiLibSetString (HiiHandle, StringId, &NullChar);\r
+ HiiSetString (HiiHandle, StringId, &NullChar, NULL);\r
+ return EFI_SUCCESS;\r
}\r
\r
\r
IN EFI_HII_HANDLE HiiHandle\r
)\r
{\r
- EFI_STATUS Status;\r
- CHAR16 *String;\r
- UINTN BufferLength;\r
-\r
- //\r
- // Set default string size assumption at no more than 256 bytes\r
- //\r
- BufferLength = 0x100;\r
- String = AllocateZeroPool (BufferLength);\r
- ASSERT (String != NULL);\r
-\r
- Status = HiiLibGetString (HiiHandle, Token, String, &BufferLength);\r
+ EFI_STRING String;\r
\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- FreePool (String);\r
- String = AllocateZeroPool (BufferLength);\r
+ String = HiiGetString (HiiHandle, Token, NULL);\r
+ if (String == NULL) {\r
+ String = AllocateCopyPool (sizeof (mUnknownString), mUnknownString);\r
ASSERT (String != NULL);\r
-\r
- Status = HiiLibGetString (HiiHandle, Token, String, &BufferLength);\r
}\r
- ASSERT_EFI_ERROR (Status);\r
-\r
- return String;\r
+ return (CHAR16 *) String;\r
}\r
\r
\r
CHAR16 *Value;\r
CHAR16 *StringPtr;\r
UINTN Length;\r
+ UINTN Index;\r
+ UINTN LengthStr;\r
BOOLEAN IsBufferStorage;\r
BOOLEAN IsString;\r
+ CHAR16 TemStr[5];\r
+ UINT8 DigitUint8;\r
\r
Status = EFI_SUCCESS;\r
\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
-\r
+ \r
+ LengthStr = StrLen (Value);\r
+ Status = EFI_SUCCESS;\r
if (IsString) {\r
//\r
// Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"\r
+ // Add string tail char L'\0' into Length\r
//\r
- Length = StorageWidth + sizeof (CHAR16);\r
- Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value);\r
+ Length = StorageWidth + sizeof (CHAR16);\r
+ if (Length < ((LengthStr / 4 + 1) * 2)) {\r
+ Status = EFI_BUFFER_TOO_SMALL;\r
+ } else {\r
+ StringPtr = (CHAR16 *) Dst;\r
+ ZeroMem (TemStr, sizeof (TemStr));\r
+ for (Index = 0; Index < LengthStr; Index += 4) {\r
+ StrnCpy (TemStr, Value + Index, 4);\r
+ StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);\r
+ }\r
+ //\r
+ // Add tailing L'\0' character\r
+ //\r
+ StringPtr[Index/4] = L'\0';\r
+ }\r
} else {\r
- Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL);\r
+ if (StorageWidth < ((LengthStr + 1) / 2)) {\r
+ Status = EFI_BUFFER_TOO_SMALL;\r
+ } else {\r
+ ZeroMem (TemStr, sizeof (TemStr));\r
+ for (Index = 0; Index < LengthStr; Index ++) {\r
+ TemStr[0] = Value[LengthStr - Index - 1];\r
+ DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+ if ((Index & 1) == 0) {\r
+ Dst [Index/2] = DigitUint8;\r
+ } else {\r
+ Dst [Index/2] = (UINT8) ((DigitUint8 << 4) + Dst [Index/2]);\r
+ }\r
+ }\r
+ }\r
}\r
\r
FreePool (Value);\r
}\r
*StringPtr = L'\0';\r
\r
+ LengthStr = StrLen (Value);\r
+ Status = EFI_SUCCESS;\r
if (!IsBufferStorage && IsString) {\r
//\r
// Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"\r
+ // Add string tail char L'\0' into Length\r
//\r
- Length = StorageWidth + sizeof (CHAR16);\r
- Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value);\r
+ Length = StorageWidth + sizeof (CHAR16);\r
+ if (Length < ((LengthStr / 4 + 1) * 2)) {\r
+ Status = EFI_BUFFER_TOO_SMALL;\r
+ } else {\r
+ StringPtr = (CHAR16 *) Dst;\r
+ ZeroMem (TemStr, sizeof (TemStr));\r
+ for (Index = 0; Index < LengthStr; Index += 4) {\r
+ StrnCpy (TemStr, Value + Index, 4);\r
+ StringPtr[Index/4] = (CHAR16) StrHexToUint64 (TemStr);\r
+ }\r
+ //\r
+ // Add tailing L'\0' character\r
+ //\r
+ StringPtr[Index/4] = L'\0';\r
+ }\r
} else {\r
- Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL);\r
- if (EFI_ERROR (Status)) {\r
- FreePool (Result);\r
- return Status;\r
+ if (StorageWidth < ((LengthStr + 1) / 2)) {\r
+ Status = EFI_BUFFER_TOO_SMALL;\r
+ } else {\r
+ ZeroMem (TemStr, sizeof (TemStr));\r
+ for (Index = 0; Index < LengthStr; Index ++) {\r
+ TemStr[0] = Value[LengthStr - Index - 1];\r
+ DigitUint8 = (UINT8) StrHexToUint64 (TemStr);\r
+ if ((Index & 1) == 0) {\r
+ Dst [Index/2] = DigitUint8;\r
+ } else {\r
+ Dst [Index/2] = (UINT8) ((DigitUint8 << 4) + Dst [Index/2]);\r
+ }\r
+ }\r
}\r
}\r
\r
+ if (EFI_ERROR (Status)) {\r
+ FreePool (Result);\r
+ return Status;\r
+ }\r
+\r
//\r
// Synchronize Edit Buffer\r
//\r
} else {\r
SetValueByName (Storage, Question->VariableName, Value);\r
}\r
+\r
FreePool (Result);\r
}\r
\r
UINTN Length;\r
BOOLEAN IsBufferStorage;\r
BOOLEAN IsString;\r
+ UINT8 *TemBuffer;\r
+ CHAR16 *TemName;\r
+ CHAR16 *TemString;\r
+ UINTN Index;\r
\r
Status = EFI_SUCCESS;\r
\r
} else {\r
if (IsString) {\r
//\r
- // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
+ // Allocate enough string buffer.\r
//\r
Value = NULL;\r
BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);\r
Value = AllocateZeroPool (BufferLen);\r
ASSERT (Value != NULL);\r
- Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src);\r
- ASSERT_EFI_ERROR (Status);\r
+ //\r
+ // Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
+ //\r
+ TemName = (CHAR16 *) Src;\r
+ TemString = Value;\r
+ for (; *TemName != L'\0'; TemName++) {\r
+ TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
+ }\r
} else {\r
BufferLen = StorageWidth * 2 + 1;\r
Value = AllocateZeroPool (BufferLen * sizeof (CHAR16));\r
ASSERT (Value != NULL);\r
- BufToHexString (Value, &BufferLen, Src, StorageWidth);\r
- ToLower (Value);\r
+ //\r
+ // Convert Buffer to Hex String\r
+ //\r
+ TemBuffer = Src + StorageWidth - 1;\r
+ TemString = Value;\r
+ for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {\r
+ TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+ }\r
}\r
\r
Status = SetValueByName (Storage, Question->VariableName, Value);\r
}\r
\r
Value = ConfigResp + StrLen (ConfigResp);\r
+\r
if (!IsBufferStorage && IsString) {\r
//\r
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"\r
//\r
- BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);\r
- Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src);\r
- ASSERT_EFI_ERROR (Status);\r
+ TemName = (CHAR16 *) Src;\r
+ TemString = Value;\r
+ for (; *TemName != L'\0'; TemName++) {\r
+ TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemName, 4);\r
+ }\r
} else {\r
- BufferLen = StorageWidth * 2 + 1;\r
- BufToHexString (Value, &BufferLen, Src, StorageWidth);\r
- ToLower (Value);\r
+ //\r
+ // Convert Buffer to Hex String\r
+ //\r
+ TemBuffer = Src + StorageWidth - 1;\r
+ TemString = Value;\r
+ for (Index = 0; Index < StorageWidth; Index ++, TemBuffer --) {\r
+ TemString += UnicodeValueToString (TemString, PREFIX_ZERO | RADIX_HEX, *TemBuffer, 2);\r
+ }\r
+ }\r
+ \r
+ //\r
+ // Convert to lower char.\r
+ //\r
+ for (TemString = Value; *Value != L'\0'; Value++) {\r
+ if (*Value >= L'A' && *Value <= L'Z') {\r
+ *Value = (CHAR16) (*Value - L'A' + L'a');\r
+ }\r
}\r
\r
//\r
QUESTION_OPTION *Option;\r
EFI_HII_VALUE *HiiValue;\r
UINT8 Index;\r
+ EFI_STRING StrValue;\r
\r
- Status = EFI_SUCCESS;\r
+ Status = EFI_SUCCESS;\r
+ StrValue = NULL;\r
\r
//\r
// Statement don't have storage, skip them\r
CopyMem (HiiValue, &Default->Value, sizeof (EFI_HII_VALUE));\r
}\r
\r
+ if (HiiValue->Type == EFI_IFR_TYPE_STRING) {\r
+ StrValue = HiiGetString (FormSet->HiiHandle, HiiValue->Value.string, NULL);\r
+ if (StrValue == NULL) {\r
+ return EFI_NOT_FOUND;\r
+ }\r
+ Question->BufferValue = AllocateCopyPool (StrSize (StrValue), StrValue);\r
+ }\r
+\r
return EFI_SUCCESS;\r
}\r
\r
// For Questions without default\r
//\r
switch (Question->Operand) {\r
- case EFI_IFR_NUMERIC_OP:\r
- //\r
- // Take minimal value as numeric's default value\r
- //\r
- HiiValue->Value.u64 = Question->Minimum;\r
- break;\r
-\r
case EFI_IFR_ONE_OF_OP:\r
//\r
// Take first oneof option as oneof's default value\r
//\r
- Link = GetFirstNode (&Question->OptionListHead);\r
- if (!IsNull (&Question->OptionListHead, Link)) {\r
- Option = QUESTION_OPTION_FROM_LINK (Link);\r
- CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));\r
+ if (ValueToOption (Question, HiiValue) == NULL) { \r
+ Link = GetFirstNode (&Question->OptionListHead);\r
+ if (!IsNull (&Question->OptionListHead, Link)) {\r
+ Option = QUESTION_OPTION_FROM_LINK (Link);\r
+ CopyMem (HiiValue, &Option->Value, sizeof (EFI_HII_VALUE));\r
+ }\r
}\r
break;\r
\r
Link = GetNextNode (&Form->StatementListHead, Link);\r
\r
//\r
- // If Question is suppressed, don't reset it to default\r
+ // If Question is disabled, don't reset it to default\r
//\r
- if (Question->SuppressExpression != NULL) {\r
- Status = EvaluateExpression (FormSet, Form, Question->SuppressExpression);\r
- if (!EFI_ERROR (Status) && Question->SuppressExpression->Result.Value.b) {\r
+ if (Question->DisableExpression != NULL) {\r
+ Status = EvaluateExpression (FormSet, Form, Question->DisableExpression);\r
+ if (!EFI_ERROR (Status) && Question->DisableExpression->Result.Value.b) {\r
continue;\r
}\r
}\r
BOOLEAN ReturnDefault;\r
UINT32 PackageListLength;\r
EFI_HII_PACKAGE_HEADER PackageHeader;\r
+ UINT8 Index;\r
+ UINT8 NumberOfClassGuid;\r
+ BOOLEAN IsSetupClassGuid;\r
+ EFI_GUID *ClassGuid;\r
\r
OpCodeData = NULL;\r
Package = NULL;\r
// Check whether return default FormSet\r
//\r
if (ReturnDefault) {\r
- break;\r
+ //\r
+ // Check ClassGuid of formset OpCode\r
+ //\r
+ IsSetupClassGuid = FALSE;\r
+ NumberOfClassGuid = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);\r
+ ClassGuid = (EFI_GUID *) (OpCodeData + sizeof (EFI_IFR_FORM_SET));\r
+ for (Index = 0; Index < NumberOfClassGuid; Index++) {\r
+ if (CompareGuid (ClassGuid + Index, &gEfiHiiPlatformSetupFormsetGuid)) {\r
+ IsSetupClassGuid = TRUE;\r
+ break;\r
+ }\r
+ }\r
+ if (IsSetupClassGuid) {\r
+ break;\r
+ }\r
}\r
\r
//\r
return Status;\r
}\r
\r
- gClassOfVfr = FormSet->SubClass;\r
- if (gClassOfVfr == EFI_FRONT_PAGE_SUBCLASS) {\r
- FrontPageHandle = FormSet->HiiHandle;\r
+ gClassOfVfr = FORMSET_CLASS_PLATFORM_SETUP;\r
+ if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
+ gClassOfVfr = FORMSET_CLASS_FRONT_PAGE;\r
+ gFrontPageHandle = FormSet->HiiHandle;\r
}\r
\r
//\r