Merged in the following trackers from EDK:

EDK1145 Cursor mising in shell in some case 
EDK1099: Dell - [HII] HiiGetFontInfo() not retrieve the system font by FoFontInfoMask
EDK1127: [UEFI 2.10] Keyboard layout support 
EDK1129: [UEFI HII] GUID is represented wrongly in Config String
And some other fixes such as
*[UEFI HII] HiiGetAltCfg is generating "Name=" sub string in the wrong format 
*UEFI HII: GetUnicodeStringTextOrSize() doesn't handle NULL StringDest properly
*GetFontInfo() need be updated to avoid iteration 
*HIIStringProtocolTest failed on multiple platform
*[Uefi 2.1] Comply with latest Hii ECR 
* GetFontInfo() need be updated to avoid iteration


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5361 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qwang12 2008-06-23 09:41:33 +00:00
parent 54cf87805f
commit 813acf3a9a
18 changed files with 1425 additions and 693 deletions

View File

@ -62,11 +62,15 @@
gSimpleTextInExNotifyGuid # ALWAYS_CONSUMED
[Protocols]
gEfiUsbIoProtocolGuid # PROTOCOL ALWAYS_CONSUMED
gEfiDevicePathProtocolGuid # PROTOCOL ALWAYS_CONSUMED
gEfiSimpleTextInProtocolGuid # PROTOCOL ALWAYS_CONSUMED
gEfiSimpleTextInputExProtocolGuid # PROTOCOL ALWAYS_CONSUMED
gEfiUsbIoProtocolGuid # PROTOCOL TO_START
gEfiDevicePathProtocolGuid # PROTOCOL TO_START
gEfiSimpleTextInProtocolGuid # PROTOCOL BY_START
gEfiSimpleTextInputExProtocolGuid # PROTOCOL BY_START
gEfiHiiDatabaseProtocolGuid # PROTOCOL TO_START
[FeaturePcd.common]
gEfiMdeModulePkgTokenSpaceGuid.PcdDisableDefaultKeyboardLayoutInUsbKbDriver
[FixedPcd]
gEfiMdePkgTokenSpaceGuid.PcdStatusCodeValueKeyboardEnable
gEfiMdePkgTokenSpaceGuid.PcdStatusCodeValueKeyboardPresenceDetect

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2004 - 2007, Intel Corporation
Copyright (c) 2004 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@ -382,6 +382,11 @@ USBKeyboardDriverBindingStart (
goto ErrorExit;
}
Status = InitKeyboardLayout (UsbKeyboardDevice);
if (EFI_ERROR (Status)) {
goto ErrorExit;
}
Status = gBS->CreateEvent (
EVT_NOTIFY_WAIT,
TPL_NOTIFY,
@ -650,6 +655,9 @@ USBKeyboardDriverBindingStop (
gBS->CloseEvent (UsbKeyboardDevice->SimpleInputEx.WaitForKeyEx);
KbdFreeNotifyList (&UsbKeyboardDevice->NotifyList);
ReleaseKeyboardLayoutResources (UsbKeyboardDevice);
gBS->CloseEvent (UsbKeyboardDevice->KeyboardLayoutEvent);
if (UsbKeyboardDevice->ControllerNameTable != NULL) {
FreeUnicodeStringTable (UsbKeyboardDevice->ControllerNameTable);
}

View File

@ -1,5 +1,5 @@
/** @file
Copyright (c) 2004 - 2007, Intel Corporation
Copyright (c) 2004 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@ -27,9 +27,11 @@ Revision History
#include <Protocol/SimpleTextIn.h>
#include <Protocol/SimpleTextInEx.h>
#include <Guid/HotPlugDevice.h>
#include <Protocol/HiiDatabase.h>
#include <Protocol/UsbIo.h>
#include <Protocol/DevicePath.h>
#include <Guid/HiiKeyBoardLayout.h>
#include <Guid/HotPlugDevice.h>
#include <Library/DebugLib.h>
#include <Library/ReportStatusCodeLib.h>
@ -79,6 +81,27 @@ typedef struct _KEYBOARD_CONSOLE_IN_EX_NOTIFY {
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
LIST_ENTRY NotifyEntry;
} KEYBOARD_CONSOLE_IN_EX_NOTIFY;
#define USB_NS_KEY_SIGNATURE EFI_SIGNATURE_32 ('u', 'n', 's', 'k')
typedef struct {
UINTN Signature;
LIST_ENTRY Link;
//
// The number of EFI_NS_KEY_MODIFIER children definitions
//
UINTN KeyCount;
//
// NsKey[0] : Non-spacing key
// NsKey[1] ~ NsKey[KeyCount] : Physical keys
//
EFI_KEY_DESCRIPTOR *NsKey;
} USB_NS_KEY;
#define USB_NS_KEY_FORM_FROM_LINK(a) CR (a, USB_NS_KEY, Link, USB_NS_KEY_SIGNATURE)
typedef struct {
UINTN Signature;
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
@ -115,12 +138,21 @@ typedef struct {
UINT8 RightLogoOn;
UINT8 MenuKeyOn;
UINT8 SysReqOn;
UINT8 AltGrOn;
EFI_KEY_STATE KeyState;
//
// Notification function list
//
LIST_ENTRY NotifyList;
//
// Non-spacing key list
//
LIST_ENTRY NsKeyList;
USB_NS_KEY *CurrentNsKey;
EFI_KEY_DESCRIPTOR *KeyConvertionTable;
EFI_EVENT KeyboardLayoutEvent;
} USB_KB_DEV;
//
@ -159,7 +191,7 @@ typedef struct {
UINT8 Key;
} KB_MODIFIER;
#define USB_KEYCODE_MAX_MAKE 0x7E
#define USB_KEYCODE_MAX_MAKE 0x62
#define USBKBD_VALID_KEYCODE(key) ((UINT8) (key) > 3)

File diff suppressed because it is too large Load Diff

View File

@ -36,6 +36,16 @@ InitUSBKeyboard (
IN USB_KB_DEV *UsbKeyboardDevice
);
EFI_STATUS
InitKeyboardLayout (
IN USB_KB_DEV *UsbKeyboardDevice
);
VOID
ReleaseKeyboardLayoutResources (
USB_KB_DEV *UsbKeyboardDevice
);
EFI_STATUS
EFIAPI
KeyboardHandler (

View File

@ -132,6 +132,8 @@
gEfiMdeModulePkgTokenSpaceGuid.PcdSupportHardwareErrorRecord|FALSE|BOOLEAN|0x00010045
gEfiMdeModulePkgTokenSpaceGuid.PcdUgaConsumeSupport|TRUE|BOOLEAN|0x00010046
gEfiMdeModulePkgTokenSpaceGuid.PcdTurnOffUsbLegacySupport|FALSE|BOOLEAN|0x00010047
gEfiMdeModulePkgTokenSpaceGuid.PcdSupportHiiImageProtocol|TRUE|BOOLEAN|0x00010100
gEfiMdeModulePkgTokenSpaceGuid.PcdDisableDefaultKeyboardLayoutInUsbKbDriver|FALSE|BOOLEAN|0x00010200
[PcdsFixedAtBuild.common]
gEfiMdeModulePkgTokenSpaceGuid.PcdMaxPeiPcdCallBackNumberPerPcdEntry|0x08|UINT32|0x0001000f

View File

@ -931,6 +931,8 @@ Returns:
//
// Timeout or user press enter to continue
//
gST->ConOut->EnableCursor (gST->ConOut, TRUE);
gST->ConOut->ClearScreen (gST->ConOut);
goto Exit;
}
}

View File

@ -27,189 +27,6 @@ Revision History
#ifndef DISABLE_UNUSED_HII_PROTOCOLS
STATIC
CHAR16
NibbleToHexCharPrivate (
IN UINT8 Nibble
)
/*++
Routine Description:
Converts the low nibble of a byte to hex unicode character.
Arguments:
Nibble - lower nibble of a byte.
Returns:
Hex unicode character between L'0' to L'f'.
--*/
{
Nibble &= 0x0F;
if (Nibble <= 0x9) {
return (CHAR16)(Nibble + L'0');
}
return (CHAR16)(Nibble - 0xA + L'a');
}
/**
Converts Unicode string to binary buffer.
The conversion may be partial.
The first character in the string that is not hex digit stops the conversion.
At a minimum, any blob of data could be represented as a hex string.
@param Buf Pointer to buffer that receives the data.
@param Len Length in bytes of the buffer to hold converted
data. If routine return with EFI_SUCCESS,
containing length of converted data. If routine
return with EFI_BUFFER_TOO_SMALL, containg length
of buffer desired.
@param Str String to be converted from.
@param ConvertedStrLen Length of the Hex String consumed.
@retval EFI_SUCCESS Routine Success.
@retval EFI_BUFFER_TOO_SMALL The buffer is too small to hold converted data.
**/
STATIC
EFI_STATUS
HexStringToBufPrivate (
IN OUT UINT8 *Buf,
IN OUT UINTN *Len,
IN CHAR16 *Str,
OUT UINTN *ConvertedStrLen OPTIONAL
)
{
UINTN HexCnt;
UINTN Idx;
UINTN BufferLength;
UINT8 Digit;
UINT8 Byte;
//
// Find out how many hex characters the string has.
//
for (Idx = 0, HexCnt = 0; IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);
if (HexCnt == 0) {
*Len = 0;
return EFI_SUCCESS;
}
//
// Two Unicode characters make up 1 buffer byte. Round up.
//
BufferLength = (HexCnt + 1) / 2;
//
// Test if buffer is passed enough.
//
if (BufferLength > (*Len)) {
*Len = BufferLength;
return EFI_BUFFER_TOO_SMALL;
}
*Len = BufferLength;
for (Idx = 0; Idx < HexCnt; Idx++) {
IsHexDigit (&Digit, Str[Idx]);
//
// For odd charaters, write the lower nibble for each buffer byte,
// and for even characters, the upper nibble.
//
if ((Idx & 1) == 0) {
Byte = (UINT8) (Digit << 4);
} else {
Byte = Buf[Idx / 2];
Byte &= 0xF0;
Byte = (UINT8) (Byte | Digit);
}
Buf[Idx / 2] = Byte;
}
if (ConvertedStrLen != NULL) {
*ConvertedStrLen = HexCnt;
}
return EFI_SUCCESS;
}
/**
Converts binary buffer to Unicode string.
At a minimum, any blob of data could be represented as a hex string.
@param Str Pointer to the string.
@param HexStringBufferLength Length in bytes of buffer to hold the hex string.
Includes tailing '\0' character. If routine return
with EFI_SUCCESS, containing length of hex string
buffer. If routine return with
EFI_BUFFER_TOO_SMALL, containg length of hex
string buffer desired.
@param Buf Buffer to be converted from.
@param Len Length in bytes of the buffer to be converted.
@param Flag If TRUE, encode the data in the same order as the
it resides in the Buf. Else encode it in the
reverse direction.
@retval EFI_SUCCESS Routine success.
@retval EFI_BUFFER_TOO_SMALL The hex string buffer is too small.
**/
STATIC
EFI_STATUS
BufToHexStringPrivate (
IN OUT CHAR16 *Str,
IN OUT UINTN *HexStringBufferLength,
IN UINT8 *Buf,
IN UINTN Len,
IN BOOLEAN Flag
)
{
UINTN Idx;
UINT8 Byte;
UINTN StrLen;
//
// Make sure string is either passed or allocate enough.
// It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.
// Plus the Unicode termination character.
//
StrLen = Len * 2;
if ((*HexStringBufferLength) < (StrLen + 1) * sizeof (CHAR16)) {
*HexStringBufferLength = (StrLen + 1) * sizeof (CHAR16);
return EFI_BUFFER_TOO_SMALL;
}
*HexStringBufferLength = (StrLen + 1) * sizeof (CHAR16);
//
// Ends the string.
//
Str[StrLen] = 0;
for (Idx = 0; Idx < Len; Idx++) {
Byte = Buf[Idx];
if (Flag) {
Str[Idx * 2] = NibbleToHexCharPrivate ((UINT8)(Byte >> 4));
Str[Idx * 2 + 1] = NibbleToHexCharPrivate (Byte);
} else {
Str[StrLen - 1 - Idx * 2] = NibbleToHexCharPrivate (Byte);
Str[StrLen - 2 - Idx * 2] = NibbleToHexCharPrivate ((UINT8)(Byte >> 4));
}
}
return EFI_SUCCESS;
}
/**
Calculate the number of Unicode characters of the incoming Configuration string,
not including NULL terminator.
@ -306,7 +123,6 @@ GetDevicePath (
// The data in <PathHdr> is encoded as hex UNICODE %02x bytes in the same order
// as the device path resides in RAM memory.
// Translate the data into binary.
// Two Unicode characters make up 1 buffer byte.
//
Length /= 2;
*DevicePath = (UINT8 *) AllocateZeroPool (Length);
@ -315,7 +131,7 @@ GetDevicePath (
return EFI_OUT_OF_RESOURCES;
}
HexStringToBufPrivate (*DevicePath, &Length, DevicePathString, NULL);
HexStringToBuffer (*DevicePath, &Length, DevicePathString);
SafeFreePool (DevicePathString);
@ -503,12 +319,11 @@ ExportAllStorage (
@param String A constant string which is the prefix of the to be
generated string, e.g. GUID=
@param BufferLen The length of the Buffer in bytes.
@param Buffer Points to a buffer which will be converted to hex
string and to be the content of the generated
string.
@param Flag If TRUE, convert the buffer data in the same order
as the it resides in the Buffer. Else convert it
in the reverse direction.
@param Buffer Points to a buffer which will be converted to be the
content of the generated string.
@param Flag If 1, the buffer contains data for the value of GUID or PATH stored in
UINT8 *; if 2, the buffer contains unicode string for the value of NAME;
if 3, the buffer contains other data.
@param SubStr Points to the output string. It's caller's
responsibility to free this buffer.
@ -519,14 +334,15 @@ VOID
GenerateSubStr (
IN CONST EFI_STRING String,
IN UINTN BufferLen,
IN UINT8 *Buffer,
IN BOOLEAN Flag,
IN VOID *Buffer,
IN UINT8 Flag,
OUT EFI_STRING *SubStr
)
{
UINTN Length;
EFI_STRING Str;
EFI_STATUS Status;
EFI_STRING StringHeader;
ASSERT (String != NULL && SubStr != NULL);
@ -536,20 +352,33 @@ GenerateSubStr (
return ;
}
Length = BufferLen * 2 + 1 + StrLen (String) + 1;
Length = StrLen (String) + BufferLen * 2 + 1 + 1;
Str = AllocateZeroPool (Length * sizeof (CHAR16));
ASSERT (Str != NULL);
StrCpy (Str, String);
Length = (BufferLen * 2 + 1) * sizeof (CHAR16);
Status = BufToHexStringPrivate (
Str + StrLen (String),
&Length,
Buffer,
BufferLen,
Flag
);
Status = EFI_SUCCESS;
StringHeader = Str + StrLen (String);
switch (Flag) {
case 1:
Status = BufferToHexString (StringHeader, (UINT8 *) Buffer, BufferLen);
break;
case 2:
Status = UnicodeToConfigString (StringHeader, &Length, (CHAR16 *) Buffer);
break;
case 3:
Status = BufToHexString (StringHeader, &Length, (UINT8 *) Buffer, BufferLen);
//
// Convert the uppercase to lowercase since <HexAf> is defined in lowercase format.
//
ToLower (StringHeader);
break;
default:
break;
}
ASSERT_EFI_ERROR (Status);
StrCat (Str, L"&");
@ -1096,7 +925,7 @@ HiiConfigRoutingExportConfig (
if (PathHdr == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = BufToHexStringPrivate (PathHdr, &PathHdrSize, (UINT8 *) DevicePath, Length, TRUE);
Status = BufferToHexString (PathHdr, (UINT8 *) DevicePath, Length);
ASSERT_EFI_ERROR (Status);
//
@ -1104,7 +933,7 @@ HiiConfigRoutingExportConfig (
// It means extract all possible configurations from this specific driver.
//
TmpSize = StrLen (L"GUID=&NAME=&PATH=");
RequestSize = (TmpSize + sizeof (EFI_GUID) * 2 + StrLen (Storage->Name))
RequestSize = (TmpSize + 32 + StrLen (Storage->Name) * 4)
* sizeof (CHAR16) + PathHdrSize;
ConfigRequest = (EFI_STRING) AllocateZeroPool (RequestSize);
if (ConfigRequest == NULL) {
@ -1115,20 +944,16 @@ HiiConfigRoutingExportConfig (
//
// Add <GuidHdr>
// <GuidHdr> ::= 'GUID='<Guid>
// Convert <Guid> in the same order as it resides in RAM memory.
//
StringPtr = ConfigRequest;
StrnCpy (StringPtr, L"GUID=", StrLen (L"GUID="));
StringPtr += StrLen (L"GUID=");
Status = BufToHexStringPrivate (
StringPtr,
&RequestSize,
(UINT8 *) (&Storage->Guid),
sizeof (EFI_GUID),
FALSE
);
Status = BufferToHexString (StringPtr, (UINT8 *) (&Storage->Guid), sizeof (EFI_GUID));
ASSERT_EFI_ERROR (Status);
StringPtr += RequestSize / 2 - 1;
StringPtr += 32;
ASSERT (*StringPtr == 0);
*StringPtr = L'&';
StringPtr++;
@ -1139,8 +964,12 @@ HiiConfigRoutingExportConfig (
//
StrnCpy (StringPtr, L"NAME=", StrLen (L"NAME="));
StringPtr += StrLen (L"NAME=");
StrnCpy (StringPtr, Storage->Name, StrLen (Storage->Name));
StringPtr += StrLen (Storage->Name);
Length = (StrLen (Storage->Name) * 4 + 1) * sizeof (CHAR16);
Status = UnicodeToConfigString (StringPtr, &Length, Storage->Name);
ASSERT_EFI_ERROR (Status);
StringPtr += StrLen (Storage->Name) * 4;
*StringPtr = L'&';
StringPtr++;
@ -1250,7 +1079,7 @@ HiiConfigRoutingExportConfig (
**/
EFI_STATUS
EFIAPI
HiiConfigRoutingRoutConfig (
HiiConfigRoutingRouteConfig (
IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
IN CONST EFI_STRING Configuration,
OUT EFI_STRING *Progress
@ -1609,6 +1438,8 @@ HiiBlockToConfig (
Status = BufToHexString (ValueStr, &Length, Value, Width);
ASSERT_EFI_ERROR (Status);
ToLower (ValueStr);
SafeFreePool (Value);
Value = NULL;
@ -1955,30 +1786,21 @@ HiiGetAltCfg (
//
// Generate the sub string for later matching.
//
GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (UINT8 *) Guid, FALSE, &GuidStr);
GenerateSubStr (L"GUID=", sizeof (EFI_GUID), (VOID *) Guid, 1, &GuidStr);
GenerateSubStr (
L"PATH=",
GetDevicePathSize ((EFI_DEVICE_PATH_PROTOCOL *) DevicePath),
(UINT8 *) DevicePath,
TRUE,
(VOID *) DevicePath,
1,
&PathStr
);
if (AltCfgId != NULL) {
GenerateSubStr (L"ALTCFG=", sizeof (UINT16), (UINT8 *) AltCfgId, FALSE, &AltIdStr);
GenerateSubStr (L"ALTCFG=", sizeof (UINT16), (VOID *) AltCfgId, 3, &AltIdStr);
}
if (Name != NULL) {
Length = StrLen (Name);
Length += StrLen (L"NAME=&") + 1;
NameStr = AllocateZeroPool (Length * sizeof (CHAR16));
if (NameStr == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto Exit;
}
StrCpy (NameStr, L"NAME=");
StrCat (NameStr, Name);
StrCat (NameStr, L"&");
GenerateSubStr (L"NAME=", StrLen (Name) * sizeof (CHAR16), (VOID *) Name, 2, &NameStr);
} else {
GenerateSubStr (L"NAME=", 0, NULL, FALSE, &NameStr);
GenerateSubStr (L"NAME=", 0, NULL, 2, &NameStr);
}
while (*StringPtr != 0) {

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2007, Intel Corporation
Copyright (c) 2007 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@ -2771,8 +2771,7 @@ HiiNewPackageList (
@retval EFI_SUCCESS The data associated with the Handle was removed
from the HII database.
@retval EFI_NOT_FOUND The specified PackageList could not be found in
database.
@retval EFI_NOT_FOUND The specified andle is not in database.
@retval EFI_INVALID_PARAMETER The Handle was not valid.
**/
@ -2790,10 +2789,14 @@ HiiRemovePackageList (
HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList;
HII_HANDLE *HiiHandle;
if (This == NULL || !IsHiiHandleValid (Handle)) {
if (This == NULL) {
return EFI_INVALID_PARAMETER;
}
if (!IsHiiHandleValid (Handle)) {
return EFI_NOT_FOUND;
}
Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);
//
@ -2879,9 +2882,8 @@ HiiRemovePackageList (
@retval EFI_SUCCESS The HII database was successfully updated.
@retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
database.
@retval EFI_INVALID_PARAMETER Handle or PackageList was NULL.
@retval EFI_NOT_FOUND The Handle was not valid or could not be found in
database.
@retval EFI_INVALID_PARAMETER PackageList was NULL.
@retval EFI_NOT_FOUND The specified Handle is not in database.
**/
EFI_STATUS
@ -2900,7 +2902,7 @@ HiiUpdatePackageList (
HII_DATABASE_PACKAGE_LIST_INSTANCE *OldPackageList;
EFI_HII_PACKAGE_HEADER PackageHeader;
if (This == NULL || PackageList == NULL || Handle == NULL) {
if (This == NULL || PackageList == NULL) {
return EFI_INVALID_PARAMETER;
}
@ -2993,12 +2995,17 @@ HiiUpdatePackageList (
@param Handle An array of EFI_HII_HANDLE instances returned.
@retval EFI_SUCCESS The matching handles are outputed successfully.
HandleBufferLength is updated with the actual length.
@retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
Handle is too small to support the number of
handles. HandleBufferLength is updated with a
value that will enable the data to fit.
@retval EFI_NOT_FOUND No matching handle could not be found in database.
@retval EFI_INVALID_PARAMETER Handle or HandleBufferLength was NULL.
@retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
PackageGuid is not NULL, PackageType is a EFI_HII_
PACKAGE_TYPE_GUID but PackageGuid is NULL.
**/
EFI_STATUS
@ -3350,10 +3357,14 @@ HiiUnregisterPackageNotify (
LIST_ENTRY *Link;
EFI_STATUS Status;
if (This == NULL || NotificationHandle == NULL) {
if (This == NULL) {
return EFI_INVALID_PARAMETER;
}
if (NotificationHandle == NULL) {
return EFI_NOT_FOUND;
}
Status = gBS->OpenProtocol (
NotificationHandle,
&mHiiDatabaseNotifyGuid,
@ -3363,7 +3374,7 @@ HiiUnregisterPackageNotify (
EFI_OPEN_PROTOCOL_TEST_PROTOCOL
);
if (EFI_ERROR (Status)) {
return EFI_INVALID_PARAMETER;
return EFI_NOT_FOUND;
}
Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);
@ -3474,7 +3485,7 @@ HiiFindKeyboardLayouts (
for (Index = 0; Index < LayoutCount; Index++) {
ResultSize += sizeof (EFI_GUID);
if (ResultSize <= *KeyGuidBufferLength) {
CopyMem (KeyGuidBuffer + Index, Layout + sizeof (UINT16), sizeof (EFI_GUID));
CopyMem (KeyGuidBuffer + (ResultSize / sizeof (EFI_GUID) - 1), Layout + sizeof (UINT16), sizeof (EFI_GUID));
CopyMem (&LayoutLength, Layout, sizeof (UINT16));
Layout = Layout + LayoutLength;
}

View File

@ -905,15 +905,14 @@ GetSystemFont (
/**
Check whether EFI_FONT_DISPLAY_INFO points to system default font and color.
Check whether EFI_FONT_DISPLAY_INFO points to system default font and color or
returns the system default according to the optional inputs.
@param Private HII database driver private data.
@param StringInfo Points to the string output information,
including the color and font.
@param SystemInfo If not NULL, points to system default font and
color when incoming StringInfo does not match the
default. Points to NULL if matches. It's
caller's reponsibility to free this buffer.
@param SystemInfo If not NULL, points to system default font and color.
@param SystemInfoLen If not NULL, output the length of default system
info.
@ -933,6 +932,7 @@ IsSystemFontInfo (
EFI_STATUS Status;
EFI_FONT_DISPLAY_INFO *SystemDefault;
UINTN DefaultLen;
BOOLEAN Flag;
ASSERT (Private != NULL && Private->Signature == HII_DATABASE_PRIVATE_DATA_SIGNATURE);
@ -940,28 +940,69 @@ IsSystemFontInfo (
return TRUE;
}
//
// Check whether incoming string font and color matches system default.
//
Status = GetSystemFont (Private, &SystemDefault, &DefaultLen);
ASSERT_EFI_ERROR (Status);
//
// Record the system default info.
//
if (SystemInfo != NULL) {
*SystemInfo = SystemDefault;
} else {
SafeFreePool (SystemDefault);
}
if (SystemInfoLen != NULL) {
*SystemInfoLen = DefaultLen;
}
if (StringInfo == NULL ||
(StringInfo != NULL && CompareMem (SystemDefault, StringInfo, DefaultLen) == 0)) {
if (StringInfo == NULL) {
return TRUE;
}
return FALSE;
Flag = FALSE;
//
// Check the FontInfoMask to see whether it is retrieving system info.
//
if ((StringInfo->FontInfoMask & (EFI_FONT_INFO_SYS_FONT | EFI_FONT_INFO_ANY_FONT)) == 0) {
if (StrCmp (StringInfo->FontInfo.FontName, SystemDefault->FontInfo.FontName) != 0) {
goto Exit;
}
}
if ((StringInfo->FontInfoMask & (EFI_FONT_INFO_SYS_SIZE | EFI_FONT_INFO_ANY_SIZE)) == 0) {
if (StringInfo->FontInfo.FontSize != SystemDefault->FontInfo.FontSize) {
goto Exit;
}
}
if ((StringInfo->FontInfoMask & (EFI_FONT_INFO_SYS_STYLE | EFI_FONT_INFO_ANY_STYLE)) == 0) {
if (StringInfo->FontInfo.FontStyle != SystemDefault->FontInfo.FontStyle) {
goto Exit;
}
}
if ((StringInfo->FontInfoMask & EFI_FONT_INFO_SYS_FORE_COLOR) == 0) {
if (CompareMem (
&StringInfo->ForegroundColor,
&SystemDefault->ForegroundColor,
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
) != 0) {
goto Exit;
}
}
if ((StringInfo->FontInfoMask & EFI_FONT_INFO_SYS_BACK_COLOR) == 0) {
if (CompareMem (
&StringInfo->BackgroundColor,
&SystemDefault->BackgroundColor,
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL)
) != 0) {
goto Exit;
}
}
Flag = TRUE;
Exit:
if (SystemInfo == NULL) {
SafeFreePool (SystemDefault);
}
return Flag;
}
@ -1400,6 +1441,7 @@ IsLineBreak (
@retval EFI_OUT_OF_RESOURCES Unable to allocate an output buffer for
RowInfoArray or Blt.
@retval EFI_INVALID_PARAMETER The String or Blt was NULL.
@retval EFI_INVALID_PARAMETER Flags were invalid combination..
**/
EFI_STATUS
@ -1470,16 +1512,16 @@ HiiStringToImage (
//
// These two flags require that EFI_HII_OUT_FLAG_CLIP be also set.
//
if ((Flags & (EFI_HII_OUT_FLAG_CLIP | EFI_HII_OUT_FLAG_CLEAN_X)) == EFI_HII_OUT_FLAG_CLEAN_X) {
if ((Flags & (EFI_HII_OUT_FLAG_CLIP | EFI_HII_OUT_FLAG_CLIP_CLEAN_X)) == EFI_HII_OUT_FLAG_CLIP_CLEAN_X) {
return EFI_INVALID_PARAMETER;
}
if ((Flags & (EFI_HII_OUT_FLAG_CLIP | EFI_HII_OUT_FLAG_CLEAN_Y)) == EFI_HII_OUT_FLAG_CLEAN_Y) {
if ((Flags & (EFI_HII_OUT_FLAG_CLIP | EFI_HII_OUT_FLAG_CLIP_CLEAN_Y)) == EFI_HII_OUT_FLAG_CLIP_CLEAN_Y) {
return EFI_INVALID_PARAMETER;
}
//
// This flag cannot be used with EFI_HII_OUT_FLAG_CLEAN_X.
//
if ((Flags & (EFI_HII_OUT_FLAG_WRAP | EFI_HII_OUT_FLAG_CLEAN_X)) == (EFI_HII_OUT_FLAG_WRAP | EFI_HII_OUT_FLAG_CLEAN_X)) {
if ((Flags & (EFI_HII_OUT_FLAG_WRAP | EFI_HII_OUT_FLAG_CLIP_CLEAN_X)) == (EFI_HII_OUT_FLAG_WRAP | EFI_HII_OUT_FLAG_CLIP_CLEAN_X)) {
return EFI_INVALID_PARAMETER;
}
@ -1633,7 +1675,7 @@ HiiStringToImage (
//
Transparent = (BOOLEAN) ((Flags & EFI_HII_OUT_FLAG_TRANSPARENT) == EFI_HII_OUT_FLAG_TRANSPARENT ? TRUE : FALSE);
if ((Flags & EFI_HII_OUT_FLAG_CLEAN_Y) == EFI_HII_OUT_FLAG_CLEAN_Y) {
if ((Flags & EFI_HII_OUT_FLAG_CLIP_CLEAN_Y) == EFI_HII_OUT_FLAG_CLIP_CLEAN_Y) {
//
// Don't draw at all if there is only one row and
// the row's bottom-most on pixel cannot fit.
@ -1705,7 +1747,7 @@ HiiStringToImage (
//
if (!LineBreak) {
Flags &= (~ (EFI_HII_OUT_FLAGS) EFI_HII_OUT_FLAG_WRAP);
Flags |= EFI_HII_OUT_FLAG_CLEAN_X;
Flags |= EFI_HII_OUT_FLAG_CLIP_CLEAN_X;
}
}
@ -1713,7 +1755,7 @@ HiiStringToImage (
// Clip the right-most character if cannot fit when EFI_HII_OUT_FLAG_CLEAN_X is set.
//
if (LineWidth + BltX <= Image->Width ||
(LineWidth + BltX > Image->Width && (Flags & EFI_HII_OUT_FLAG_CLEAN_X) == 0)) {
(LineWidth + BltX > Image->Width && (Flags & EFI_HII_OUT_FLAG_CLIP_CLEAN_X) == 0)) {
//
// Record right-most character in RowInfo even if it is partially displayed.
//
@ -1749,7 +1791,7 @@ HiiStringToImage (
//
if (RowIndex == MaxRowNum - 1 && Image->Height < LineHeight) {
LineHeight = Image->Height;
if ((Flags & EFI_HII_OUT_FLAG_CLEAN_Y) == EFI_HII_OUT_FLAG_CLEAN_Y) {
if ((Flags & EFI_HII_OUT_FLAG_CLIP_CLEAN_Y) == EFI_HII_OUT_FLAG_CLIP_CLEAN_Y) {
//
// Don't draw at all if the row's bottom-most on pixel cannot fit.
//
@ -1968,7 +2010,10 @@ Exit:
@retval EFI_SUCCESS The string was successfully rendered.
@retval EFI_OUT_OF_RESOURCES Unable to allocate an output buffer for
RowInfoArray or Blt.
@retval EFI_INVALID_PARAMETER The PackageList was NULL.
@retval EFI_INVALID_PARAMETER The Blt or PackageList was NULL.
@retval EFI_INVALID_PARAMETER Flags were invalid combination.
@retval EFI_NOT_FOUND The specified PackageList is not in the Database or the stringid is not
in the specified PackageList.
**/
EFI_STATUS
@ -1992,6 +2037,10 @@ HiiStringIdToImage (
HII_DATABASE_PRIVATE_DATA *Private;
EFI_STRING String;
UINTN StringSize;
UINTN FontLen;
EFI_FONT_INFO *StringFontInfo;
EFI_FONT_DISPLAY_INFO *NewStringInfo;
CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE];
if (This == NULL || PackageList == NULL || Blt == NULL || PackageList == NULL) {
return EFI_INVALID_PARAMETER;
@ -2001,7 +2050,14 @@ HiiStringIdToImage (
return EFI_NOT_FOUND;
}
Private = HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS (This);
//
// When Language points to NULL, current system language is used.
//
if (Language != NULL) {
AsciiStrCpy (CurrentLang, (CHAR8 *) Language);
} else {
HiiLibGetCurrentLanguage (CurrentLang);
}
//
// Get the string to be displayed.
@ -2013,14 +2069,18 @@ HiiStringIdToImage (
return EFI_OUT_OF_RESOURCES;
}
Private = HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS (This);
StringFontInfo = NULL;
NewStringInfo = NULL;
Status = Private->HiiString.GetString (
&Private->HiiString,
Language,
CurrentLang,
PackageList,
StringId,
String,
&StringSize,
NULL
&StringFontInfo
);
if (Status == EFI_BUFFER_TOO_SMALL) {
SafeFreePool (String);
@ -2041,11 +2101,42 @@ HiiStringIdToImage (
}
if (EFI_ERROR (Status)) {
SafeFreePool (String);
return Status;
goto Exit;
}
//
// When StringInfo specifies that string will be output in the system default font and color,
// use particular stringfontinfo described in string package instead if exists.
// StringFontInfo equals NULL means system default font attaches with the string block.
//
if (StringFontInfo != NULL && IsSystemFontInfo (Private, (EFI_FONT_DISPLAY_INFO *) StringInfo, NULL, NULL)) {
FontLen = sizeof (EFI_FONT_DISPLAY_INFO) - sizeof (CHAR16) + StrSize (StringFontInfo->FontName);
NewStringInfo = AllocateZeroPool (FontLen);
if (NewStringInfo == NULL) {
Status = EFI_OUT_OF_RESOURCES;
goto Exit;
}
NewStringInfo->FontInfoMask = EFI_FONT_INFO_SYS_FORE_COLOR | EFI_FONT_INFO_SYS_BACK_COLOR;
NewStringInfo->FontInfo.FontStyle = StringFontInfo->FontStyle;
NewStringInfo->FontInfo.FontSize = StringFontInfo->FontSize;
StrCpy (NewStringInfo->FontInfo.FontName, StringFontInfo->FontName);
Status = HiiStringToImage (
This,
Flags,
String,
NewStringInfo,
Blt,
BltX,
BltY,
RowInfoArray,
RowInfoArraySize,
ColumnInfoArray
);
goto Exit;
}
return HiiStringToImage (
Status = HiiStringToImage (
This,
Flags,
String,
@ -2058,6 +2149,12 @@ HiiStringIdToImage (
ColumnInfoArray
);
Exit:
SafeFreePool (String);
SafeFreePool (StringFontInfo);
SafeFreePool (NewStringInfo);
return Status;
}
@ -2231,7 +2328,9 @@ Exit:
returned font handle or points to NULL if there
are no more matching fonts.
@param StringInfoIn Upon entry, points to the font to return
information about.
information about.
If NULL, then the information about the system default
font will be returned.
@param StringInfoOut Upon return, contains the matching font's
information. If NULL, then no information is
returned. It's caller's responsibility to free
@ -2242,7 +2341,7 @@ Exit:
@retval EFI_SUCCESS Matching font returned successfully.
@retval EFI_NOT_FOUND No matching font was found.
@retval EFI_INVALID_PARAMETER StringInfoIn is NULL.
@retval EFI_INVALID_PARAMETER StringInfoIn->FontInfoMask is an invalid combination.
@retval EFI_OUT_OF_RESOURCES There were insufficient resources to complete the
request.
@ -2252,7 +2351,7 @@ EFIAPI
HiiGetFontInfo (
IN CONST EFI_HII_FONT_PROTOCOL *This,
IN OUT EFI_FONT_HANDLE *FontHandle,
IN CONST EFI_FONT_DISPLAY_INFO *StringInfoIn,
IN CONST EFI_FONT_DISPLAY_INFO *StringInfoIn, OPTIONAL
OUT EFI_FONT_DISPLAY_INFO **StringInfoOut,
IN CONST EFI_STRING String OPTIONAL
)
@ -2267,51 +2366,71 @@ HiiGetFontInfo (
EFI_STRING StringIn;
EFI_FONT_HANDLE LocalFontHandle;
if (This == NULL || StringInfoIn == NULL) {
return EFI_INVALID_PARAMETER;
}
//
// Check the font information mask to make sure it is valid.
//
if (((StringInfoIn->FontInfoMask & (EFI_FONT_INFO_SYS_FONT | EFI_FONT_INFO_ANY_FONT)) ==
(EFI_FONT_INFO_SYS_FONT | EFI_FONT_INFO_ANY_FONT)) ||
((StringInfoIn->FontInfoMask & (EFI_FONT_INFO_SYS_SIZE | EFI_FONT_INFO_ANY_SIZE)) ==
(EFI_FONT_INFO_SYS_SIZE | EFI_FONT_INFO_ANY_SIZE)) ||
((StringInfoIn->FontInfoMask & (EFI_FONT_INFO_SYS_STYLE | EFI_FONT_INFO_ANY_STYLE)) ==
(EFI_FONT_INFO_SYS_STYLE | EFI_FONT_INFO_ANY_STYLE)) ||
((StringInfoIn->FontInfoMask & (EFI_FONT_INFO_RESIZE | EFI_FONT_INFO_ANY_SIZE)) ==
(EFI_FONT_INFO_RESIZE | EFI_FONT_INFO_ANY_SIZE)) ||
((StringInfoIn->FontInfoMask & (EFI_FONT_INFO_RESTYLE | EFI_FONT_INFO_ANY_STYLE)) ==
(EFI_FONT_INFO_RESTYLE | EFI_FONT_INFO_ANY_STYLE))) {
if (This == NULL) {
return EFI_INVALID_PARAMETER;
}
FontInfo = NULL;
SystemDefault = NULL;
LocalFontHandle = NULL;
if (FontHandle != NULL) {
LocalFontHandle = *FontHandle;
}
Private = HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS (This);
//
// Already searched to the end of the whole list, return directly.
//
if (LocalFontHandle == &Private->FontInfoList) {
LocalFontHandle = NULL;
Status = EFI_NOT_FOUND;
goto Exit;
}
//
// Get default system display info, if StringInfoIn points to
// system display info, return it directly.
//
Private = HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS (This);
if (IsSystemFontInfo (Private, (EFI_FONT_DISPLAY_INFO *) StringInfoIn, &SystemDefault, &StringInfoOutLen)) {
if (StringInfoOut != NULL) {
*StringInfoOut = AllocateCopyPool (StringInfoOutLen, (EFI_FONT_DISPLAY_INFO *) StringInfoIn);
if (*StringInfoOut == NULL) {
Status = EFI_OUT_OF_RESOURCES;
LocalFontHandle = NULL;
goto Exit;
//
// System font is the first node. When handle is not NULL, system font can not
// be found any more.
//
if (LocalFontHandle == NULL) {
if (StringInfoOut != NULL) {
*StringInfoOut = AllocateCopyPool (StringInfoOutLen, SystemDefault);
if (*StringInfoOut == NULL) {
Status = EFI_OUT_OF_RESOURCES;
LocalFontHandle = NULL;
goto Exit;
}
}
}
LocalFontHandle = Private->FontInfoList.ForwardLink;
Status = EFI_SUCCESS;
goto Exit;
LocalFontHandle = Private->FontInfoList.ForwardLink;
Status = EFI_SUCCESS;
goto Exit;
} else {
LocalFontHandle = NULL;
Status = EFI_NOT_FOUND;
goto Exit;
}
}
//
// Check the font information mask to make sure it is valid.
//
if (((StringInfoIn->FontInfoMask & (EFI_FONT_INFO_SYS_FONT | EFI_FONT_INFO_ANY_FONT)) ==
(EFI_FONT_INFO_SYS_FONT | EFI_FONT_INFO_ANY_FONT)) ||
((StringInfoIn->FontInfoMask & (EFI_FONT_INFO_SYS_SIZE | EFI_FONT_INFO_ANY_SIZE)) ==
(EFI_FONT_INFO_SYS_SIZE | EFI_FONT_INFO_ANY_SIZE)) ||
((StringInfoIn->FontInfoMask & (EFI_FONT_INFO_SYS_STYLE | EFI_FONT_INFO_ANY_STYLE)) ==
(EFI_FONT_INFO_SYS_STYLE | EFI_FONT_INFO_ANY_STYLE)) ||
((StringInfoIn->FontInfoMask & (EFI_FONT_INFO_RESIZE | EFI_FONT_INFO_ANY_SIZE)) ==
(EFI_FONT_INFO_RESIZE | EFI_FONT_INFO_ANY_SIZE)) ||
((StringInfoIn->FontInfoMask & (EFI_FONT_INFO_RESTYLE | EFI_FONT_INFO_ANY_STYLE)) ==
(EFI_FONT_INFO_RESTYLE | EFI_FONT_INFO_ANY_STYLE))) {
return EFI_INVALID_PARAMETER;
}
//
@ -2331,13 +2450,17 @@ HiiGetFontInfo (
if ((StringInfoIn->FontInfoMask & EFI_FONT_INFO_SYS_SIZE) == EFI_FONT_INFO_SYS_SIZE) {
InfoOut.FontInfo.FontSize = SystemDefault->FontInfo.FontSize;
} else if ((StringInfoIn->FontInfoMask & EFI_FONT_INFO_SYS_STYLE) == EFI_FONT_INFO_SYS_STYLE) {
}
if ((StringInfoIn->FontInfoMask & EFI_FONT_INFO_SYS_STYLE) == EFI_FONT_INFO_SYS_STYLE) {
InfoOut.FontInfo.FontStyle = SystemDefault->FontInfo.FontStyle;
} else if ((StringInfoIn->FontInfoMask & EFI_FONT_INFO_SYS_FORE_COLOR) == EFI_FONT_INFO_SYS_FORE_COLOR) {
}
if ((StringInfoIn->FontInfoMask & EFI_FONT_INFO_SYS_FORE_COLOR) == EFI_FONT_INFO_SYS_FORE_COLOR) {
InfoOut.ForegroundColor = SystemDefault->ForegroundColor;
} else if ((StringInfoIn->FontInfoMask & EFI_FONT_INFO_SYS_BACK_COLOR) == EFI_FONT_INFO_SYS_BACK_COLOR) {
}
if ((StringInfoIn->FontInfoMask & EFI_FONT_INFO_SYS_BACK_COLOR) == EFI_FONT_INFO_SYS_BACK_COLOR) {
InfoOut.BackgroundColor = SystemDefault->BackgroundColor;
}
FontInfo->FontSize = InfoOut.FontInfo.FontSize;
FontInfo->FontStyle = InfoOut.FontInfo.FontStyle;
@ -2393,3 +2516,4 @@ Exit:
return Status;
}

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2007, Intel Corporation
Copyright (c) 2007 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@ -47,6 +47,8 @@ Revision History
#include <Library/BaseLib.h>
#include <Library/DevicePathLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/IfrSupportLib.h>
#include <Library/HiiLib.h>
#define HII_DATABASE_NOTIFY_GUID \
{ \
@ -495,7 +497,8 @@ FindGlyphBlock (
@retval EFI_SUCCESS The string was successfully rendered.
@retval EFI_OUT_OF_RESOURCES Unable to allocate an output buffer for
RowInfoArray or Blt.
@retval EFI_INVALID_PARAMETER The String was NULL.
@retval EFI_INVALID_PARAMETER The String or Blt.
@retval EFI_INVALID_PARAMETER Flags were invalid combination..
**/
EFI_STATUS
@ -567,7 +570,10 @@ HiiStringToImage (
@retval EFI_SUCCESS The string was successfully rendered.
@retval EFI_OUT_OF_RESOURCES Unable to allocate an output buffer for
RowInfoArray or Blt.
@retval EFI_INVALID_PARAMETER The String was NULL.
@retval EFI_INVALID_PARAMETER The Blt or PackageList was NULL.
@retval EFI_INVALID_PARAMETER Flags were invalid combination.
@retval EFI_NOT_FOUND The specified PackageList is not in the Database or the stringid is not
in the specified PackageList.
**/
EFI_STATUS
@ -616,7 +622,7 @@ EFIAPI
HiiGetGlyph (
IN CONST EFI_HII_FONT_PROTOCOL *This,
IN CHAR16 Char,
IN CONST EFI_FONT_DISPLAY_INFO *StringInfo,
IN CONST EFI_FONT_DISPLAY_INFO *StringInfo, OPTIONAL
OUT EFI_IMAGE_OUTPUT **Blt,
OUT UINTN *Baseline OPTIONAL
)
@ -635,7 +641,8 @@ HiiGetGlyph (
returned font handle or points to NULL if there
are no more matching fonts.
@param StringInfoIn Upon entry, points to the font to return
information about.
information about. If NULL, then the information about the system default
font will be returned.
@param StringInfoOut Upon return, contains the matching font's
information. If NULL, then no information is
returned. It's caller's responsibility to free
@ -647,9 +654,9 @@ HiiGetGlyph (
@retval EFI_SUCCESS Matching font returned successfully.
@retval EFI_NOT_FOUND No matching font was found.
@retval EFI_INVALID_PARAMETER StringInfoIn is NULL.
@retval EFI_INVALID_PARAMETER StringInfoIn->FontInfoMask is an invalid combination.
@retval EFI_OUT_OF_RESOURCES There were insufficient resources to complete the
request.
**/
EFI_STATUS
EFIAPI
@ -706,15 +713,15 @@ HiiNewImage (
@param ImageId The image's id,, which is unique within
PackageList.
@param Image Points to the image.
@param ImageSize On entry, points to the size of the buffer
pointed to by Image, in bytes. On return, points
to the length of the image, in bytes.
@retval EFI_SUCCESS The new image was returned successfully.
@retval EFI_NOT_FOUND The image specified by ImageId is not available.
The specified PackageList is not in the database.
@retval EFI_BUFFER_TOO_SMALL The buffer specified by ImageSize is too small to
hold the image.
@retval EFI_INVALID_PARAMETER The Image or ImageSize was NULL.
@retval EFI_OUT_OF_RESOURCES The bitmap could not be retrieved because there was not
enough memory.
**/
EFI_STATUS
@ -723,8 +730,7 @@ HiiGetImage (
IN CONST EFI_HII_IMAGE_PROTOCOL *This,
IN EFI_HII_HANDLE PackageList,
IN EFI_IMAGE_ID ImageId,
OUT EFI_IMAGE_INPUT *Image,
OUT UINTN *ImageSize
OUT EFI_IMAGE_INPUT *Image
)
;
@ -741,7 +747,7 @@ HiiGetImage (
@retval EFI_SUCCESS The new image was updated successfully.
@retval EFI_NOT_FOUND The image specified by ImageId is not in the
database.
database. The specified PackageList is not in the database.
@retval EFI_INVALID_PARAMETER The Image was NULL.
**/
@ -821,9 +827,9 @@ HiiDrawImage (
@retval EFI_SUCCESS The image was successfully drawn.
@retval EFI_OUT_OF_RESOURCES Unable to allocate an output buffer for Blt.
@retval EFI_INVALID_PARAMETER The Image was NULL.
@retval EFI_NOT_FOUND The specified packagelist could not be found in
current database.
@retval EFI_INVALID_PARAMETER The Blt was NULL.
@retval EFI_NOT_FOUND The image specified by ImageId is not in the database.
The specified PackageList is not in the database.
**/
EFI_STATUS
@ -914,7 +920,9 @@ HiiNewString (
@retval EFI_NOT_FOUND The string specified by StringId is not
available.
@retval EFI_NOT_FOUND The string specified by StringId is available but
not in the specified language.
not in the specified language.
The specified PackageList is not in the database.
@retval EFI_INVALID_LANGUAGE - The string specified by StringId is available but
@retval EFI_BUFFER_TOO_SMALL The buffer specified by StringSize is too small
to hold the string.
@retval EFI_INVALID_PARAMETER The String or Language or StringSize was NULL.
@ -1029,8 +1037,9 @@ HiiGetLanguages (
too small to hold the returned information.
SecondLanguageSize is updated to hold the size of
the buffer required.
@retval EFI_NOT_FOUND The language specified by FirstLanguage is not
@retval EFI_INVALID_LANGUAGE The language specified by FirstLanguage is not
present in the specified package list.
@retval EFI_NOT_FOUND The specified PackageList is not in the Database.
**/
EFI_STATUS
@ -1091,9 +1100,7 @@ HiiNewPackageList (
@retval EFI_SUCCESS The data associated with the Handle was removed
from the HII database.
@retval EFI_NOT_FOUND The specified PackageList could not be found in
database.
@retval EFI_INVALID_PARAMETER The Handle was not valid.
@retval EFI_NOT_FOUND The specified Handle is not in database.
**/
EFI_STATUS
@ -1119,9 +1126,8 @@ HiiRemovePackageList (
@retval EFI_SUCCESS The HII database was successfully updated.
@retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
database.
@retval EFI_INVALID_PARAMETER Handle or PackageList was NULL.
@retval EFI_NOT_FOUND The Handle was not valid or could not be found in
database.
@retval EFI_INVALID_PARAMETER PackageList was NULL.
@retval EFI_NOT_FOUND The specified Handle is not in database.
**/
EFI_STATUS
@ -1154,6 +1160,7 @@ HiiUpdatePackageList (
@param Handle An array of EFI_HII_HANDLE instances returned.
@retval EFI_SUCCESS The matching handles are outputed successfully.
HandleBufferLength is updated with the actual length.
@retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
Handle is too small to support the number of
handles. HandleBufferLength is updated with a
@ -1161,6 +1168,10 @@ HiiUpdatePackageList (
@retval EFI_NOT_FOUND No matching handle could not be found in
database.
@retval EFI_INVALID_PARAMETER Handle or HandleBufferLength was NULL.
@retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
PackageGuid is not NULL, PackageType is a EFI_HII_
PACKAGE_TYPE_GUID but PackageGuid is NULL.
**/
EFI_STATUS
@ -1271,7 +1282,8 @@ HiiRegisterPackageNotify (
unregistered.
@retval EFI_SUCCESS Notification is unregistered successfully.
@retval EFI_INVALID_PARAMETER The Handle is invalid.
@retval EFI_NOT_FOUND The incoming notification handle does not exist
in current hii database.
**/
EFI_STATUS
@ -1511,7 +1523,7 @@ HiiConfigRoutingExportConfig (
**/
EFI_STATUS
EFIAPI
HiiConfigRoutingRoutConfig (
HiiConfigRoutingRouteConfig (
IN CONST EFI_HII_CONFIG_ROUTING_PROTOCOL *This,
IN CONST EFI_STRING Configuration,
OUT EFI_STRING *Progress

View File

@ -57,7 +57,8 @@
UefiDriverEntryPoint
BaseMemoryLib
DebugLib
IfrSupportLib
HiiLib
[Protocols]
gEfiConsoleControlProtocolGuid

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2007, Intel Corporation
Copyright (c) 2007 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@ -80,7 +80,7 @@ STATIC HII_DATABASE_PRIVATE_DATA mPrivate = {
{
HiiConfigRoutingExtractConfig,
HiiConfigRoutingExportConfig,
HiiConfigRoutingRoutConfig,
HiiConfigRoutingRouteConfig,
HiiBlockToConfig,
HiiConfigToBlock,
HiiGetAltCfg
@ -104,6 +104,17 @@ STATIC HII_DATABASE_PRIVATE_DATA mPrivate = {
NULL
};
STATIC
VOID
EFIAPI
KeyboardLayoutChangeNullEvent (
IN EFI_EVENT Event,
IN VOID *Context
)
{
return;
}
EFI_STATUS
EFIAPI
InitializeHiiDatabase (
@ -161,9 +172,9 @@ Returns:
// Create a event with EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group type.
//
Status = gBS->CreateEventEx (
0,
0,
NULL,
EFI_EVENT_NOTIFY_SIGNAL,
TPL_NOTIFY,
KeyboardLayoutChangeNullEvent,
NULL,
&gHiiSetKbdLayoutEventGuid,
&gHiiKeyboardLayoutChanged

View File

@ -1,6 +1,6 @@
/** @file
Copyright (c) 2007, Intel Corporation
Copyright (c) 2007 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@ -610,7 +610,7 @@ HiiNewImage (
UINTN NewBlockSize;
EFI_IMAGE_INPUT *ImageIn;
if (This == NULL || ImageId == NULL || Image == NULL || PackageList == NULL) {
if (This == NULL || ImageId == NULL || Image == NULL || Image->Bitmap == NULL) {
return EFI_INVALID_PARAMETER;
}
@ -798,10 +798,13 @@ HiiNewImage (
length of the image, in bytes.
@retval EFI_SUCCESS The new image was returned successfully.
@retval EFI_NOT_FOUND The image specified by ImageId is not available.
@retval EFI_NOT_FOUND The image specified by ImageId is not in the
database. The specified PackageList is not in the database.
@retval EFI_BUFFER_TOO_SMALL The buffer specified by ImageSize is too small to
hold the image.
@retval EFI_INVALID_PARAMETER The Image or ImageSize was NULL.
@retval EFI_OUT_OF_RESOURCES The bitmap could not be retrieved because there was not
enough memory.
**/
EFI_STATUS
@ -810,8 +813,7 @@ HiiGetImage (
IN CONST EFI_HII_IMAGE_PROTOCOL *This,
IN EFI_HII_HANDLE PackageList,
IN EFI_IMAGE_ID ImageId,
OUT EFI_IMAGE_INPUT *Image,
OUT UINTN *ImageSize
OUT EFI_IMAGE_INPUT *Image
)
{
HII_DATABASE_PRIVATE_DATA *Private;
@ -831,7 +833,7 @@ HiiGetImage (
UINT8 PaletteIndex;
UINT16 PaletteSize;
if (This == NULL || ImageSize == NULL || Image == NULL || ImageId < 1 || PackageList == NULL) {
if (This == NULL || Image == NULL || ImageId < 1) {
return EFI_INVALID_PARAMETER;
}
@ -897,13 +899,12 @@ HiiGetImage (
// Use the common block code since the definition of these structures is the same.
//
CopyMem (&Iibt1bit, ImageBlock, sizeof (EFI_HII_IIBT_IMAGE_1BIT_BLOCK));
ImageLength = sizeof (EFI_IMAGE_INPUT) + sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) *
(Iibt1bit.Bitmap.Width * Iibt1bit.Bitmap.Height - 1);
if (*ImageSize < ImageLength) {
*ImageSize = ImageLength;
return EFI_BUFFER_TOO_SMALL;
ImageLength = sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) *
(Iibt1bit.Bitmap.Width * Iibt1bit.Bitmap.Height);
Image->Bitmap = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) AllocateZeroPool (ImageLength);
if (Image->Bitmap == NULL) {
return EFI_OUT_OF_RESOURCES;
}
ZeroMem (Image, ImageLength);
if (Flag) {
Image->Flags = EFI_IMAGE_TRANSPARENT;
@ -956,13 +957,11 @@ HiiGetImage (
ImageBlock + sizeof (EFI_HII_IMAGE_BLOCK) + sizeof (UINT16),
sizeof (UINT16)
);
ImageLength = sizeof (EFI_IMAGE_INPUT) +
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * (Width * Height - 1);
if (*ImageSize < ImageLength) {
*ImageSize = ImageLength;
return EFI_BUFFER_TOO_SMALL;
ImageLength = sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL) * (Width * Height);
Image->Bitmap = (EFI_GRAPHICS_OUTPUT_BLT_PIXEL *) AllocateZeroPool (ImageLength);
if (Image->Bitmap == NULL) {
return EFI_OUT_OF_RESOURCES;
}
ZeroMem (Image, ImageLength);
if (Flag) {
Image->Flags = EFI_IMAGE_TRANSPARENT;
@ -999,7 +998,7 @@ HiiGetImage (
@retval EFI_SUCCESS The new image was updated successfully.
@retval EFI_NOT_FOUND The image specified by ImageId is not in the
database.
database. The specified PackageList is not in the database.
@retval EFI_INVALID_PARAMETER The Image was NULL.
**/
@ -1036,7 +1035,7 @@ HiiSetImage (
UINT32 Part1Size;
UINT32 Part2Size;
if (This == NULL || Image == NULL || ImageId < 1 || PackageList == NULL) {
if (This == NULL || Image == NULL || ImageId < 1 || Image->Bitmap == NULL) {
return EFI_INVALID_PARAMETER;
}
@ -1448,9 +1447,9 @@ HiiDrawImage (
@retval EFI_SUCCESS The image was successfully drawn.
@retval EFI_OUT_OF_RESOURCES Unable to allocate an output buffer for Blt.
@retval EFI_INVALID_PARAMETER The Image was NULL.
@retval EFI_NOT_FOUND The specified packagelist could not be found in
current database.
@retval EFI_INVALID_PARAMETER The Blt was NULL.
@retval EFI_NOT_FOUND The image specified by ImageId is not in the database.
The specified PackageList is not in the database.
**/
EFI_STATUS
@ -1466,14 +1465,12 @@ HiiDrawImageId (
)
{
EFI_STATUS Status;
EFI_IMAGE_INPUT ImageTemp;
EFI_IMAGE_INPUT *Image;
UINTN ImageSize;
EFI_IMAGE_INPUT Image;
//
// Check input parameter.
//
if (This == NULL || PackageList == NULL || Blt == NULL || PackageList == NULL) {
if (This == NULL || Blt == NULL) {
return EFI_INVALID_PARAMETER;
}
@ -1484,24 +1481,16 @@ HiiDrawImageId (
//
// Get the specified Image.
//
ImageSize = 0;
Status = HiiGetImage (This, PackageList, ImageId, &ImageTemp, &ImageSize);
if (Status != EFI_BUFFER_TOO_SMALL) {
Status = HiiGetImage (This, PackageList, ImageId, &Image);
if (EFI_ERROR (Status)) {
return Status;
}
Image = (EFI_IMAGE_INPUT *) AllocateZeroPool (ImageSize);
if (Image == NULL) {
return EFI_OUT_OF_RESOURCES;
}
Status = HiiGetImage (This, PackageList, ImageId, Image, &ImageSize);
ASSERT_EFI_ERROR (Status);
//
// Draw this image.
//
Status = HiiDrawImage (This, Flags, Image, Blt, BltX, BltY);
SafeFreePool (Image);
Status = HiiDrawImage (This, Flags, &Image, Blt, BltX, BltY);
SafeFreePool (Image.Bitmap);
return Status;
}

View File

@ -40,6 +40,7 @@ CHAR16 mLanguageWindow[16] = {
@param Private Hii database private structure.
@param StringPackage HII string package instance.
@param FontId Font identifer, which must be unique within the string package.
@param DuplicateEnable If true, duplicate HII_FONT_INFO which refers to
the same EFI_FONT_INFO is permitted. Otherwise it
is not allowed.
@ -57,6 +58,7 @@ BOOLEAN
ReferFontInfoLocally (
IN HII_DATABASE_PRIVATE_DATA *Private,
IN HII_STRING_PACKAGE_INSTANCE *StringPackage,
IN UINT8 FontId,
IN BOOLEAN DuplicateEnable,
IN HII_GLOBAL_FONT_INFO *GlobalFontInfo,
OUT HII_FONT_INFO **LocalFontInfo
@ -82,11 +84,6 @@ ReferFontInfoLocally (
}
}
}
//
// Since string package tool set FontId initially to 0 and increases it
// progressively by one, StringPackage->FondId always represents an unique
// and available FontId.
//
// FontId identifies EFI_FONT_INFO in local string package uniquely.
// GlobalEntry points to a HII_GLOBAL_FONT_INFO which identifies
// EFI_FONT_INFO uniquely in whole hii database.
@ -95,12 +92,10 @@ ReferFontInfoLocally (
ASSERT (LocalFont != NULL);
LocalFont->Signature = HII_FONT_INFO_SIGNATURE;
LocalFont->FontId = StringPackage->FontId;
LocalFont->FontId = FontId;
LocalFont->GlobalEntry = &GlobalFontInfo->Entry;
InsertTailList (&StringPackage->FontInfoList, &LocalFont->Entry);
StringPackage->FontId++;
*LocalFontInfo = LocalFont;
return FALSE;
}
@ -183,13 +178,12 @@ GetUnicodeStringTextOrSize (
StringPtr += sizeof (CHAR16);
}
if (*BufferSize < StringSize) {
*BufferSize = StringSize;
return EFI_BUFFER_TOO_SMALL;
}
if (StringDest != NULL) {
if (*BufferSize < StringSize) {
*BufferSize = StringSize;
return EFI_BUFFER_TOO_SMALL;
}
CopyMem (StringDest, StringSrc, StringSize);
return EFI_SUCCESS;
}
*BufferSize = StringSize;
@ -292,6 +286,7 @@ FindStringBlock (
UINT16 FontSize;
UINT8 Length8;
EFI_HII_SIBT_EXT2_BLOCK Ext2;
UINT8 FontId;
UINT32 Length32;
UINTN StringSize;
CHAR16 Zero;
@ -486,7 +481,9 @@ FindStringBlock (
// Find the relationship between global font info and the font info of
// this EFI_HII_SIBT_FONT block then backup its information in local package.
//
BlockHdr += sizeof (EFI_HII_SIBT_EXT2_BLOCK) + sizeof (UINT8);
BlockHdr += sizeof (EFI_HII_SIBT_EXT2_BLOCK);
CopyMem (&FontId, BlockHdr, sizeof (UINT8));
BlockHdr += sizeof (UINT8);
CopyMem (&FontSize, BlockHdr, sizeof (UINT16));
BlockHdr += sizeof (UINT16);
CopyMem (&FontStyle, BlockHdr, sizeof (EFI_HII_FONT_STYLE));
@ -502,16 +499,21 @@ FindStringBlock (
FontInfo->FontSize = FontSize;
CopyMem (FontInfo->FontName, BlockHdr, StringSize);
//
// If find the corresponding global font info, save the relationship.
// Otherwise ignore this EFI_HII_SIBT_FONT block.
//
if (IsFontInfoExisted (Private, FontInfo, NULL, NULL, &GlobalFont)) {
//
// If find the corresponding global font info, save the relationship.
//
ReferFontInfoLocally (Private, StringPackage, TRUE, GlobalFont, &LocalFont);
ReferFontInfoLocally (Private, StringPackage, FontId, TRUE, GlobalFont, &LocalFont);
}
//
// If can not find, ignore this EFI_HII_SIBT_FONT block.
//
// Since string package tool set FontId initially to 0 and increases it
// progressively by one, StringPackage->FondId always represents an unique
// and available FontId.
//
StringPackage->FontId++;
SafeFreePool (FontInfo);
}
@ -647,7 +649,8 @@ GetStringWorker (
}
//
// Get the string font.
// Get the string font. The FontId 0 is the default font for those string blocks which
// do not specify a font identifier. If default font is not specified, return NULL.
//
if (StringFontInfo != NULL) {
switch (BlockType) {
@ -656,10 +659,13 @@ GetStringWorker (
case EFI_HII_SIBT_STRING_UCS2_FONT:
case EFI_HII_SIBT_STRINGS_UCS2_FONT:
FontId = *(StringBlockAddr + sizeof (EFI_HII_STRING_BLOCK));
return GetStringFontInfo (StringPackage, FontId, StringFontInfo);
break;
default:
break;
FontId = 0;
}
Status = GetStringFontInfo (StringPackage, FontId, StringFontInfo);
if (Status == EFI_NOT_FOUND) {
*StringFontInfo = NULL;
}
}
@ -737,38 +743,48 @@ SetStringWorker (
Referred = FALSE;
//
// Set the string font according to input font information.
// The input StringFontInfo should exist in current database if specified.
//
if (StringFontInfo != NULL) {
//
// The input StringFontInfo should exist in current database
//
if (!IsFontInfoExisted (Private, StringFontInfo, NULL, NULL, &GlobalFont)) {
return EFI_INVALID_PARAMETER;
} else {
Referred = ReferFontInfoLocally (Private, StringPackage, FALSE, GlobalFont, &LocalFont);
Referred = ReferFontInfoLocally (
Private,
StringPackage,
StringPackage->FontId,
FALSE,
GlobalFont,
&LocalFont
);
if (!Referred) {
StringPackage->FontId++;
}
}
//
// Update the FontId of the specified string block
// Update the FontId of the specified string block to input font info.
//
switch (BlockType) {
case EFI_HII_SIBT_STRING_SCSU_FONT:
case EFI_HII_SIBT_STRING_SCSU_FONT:
case EFI_HII_SIBT_STRINGS_SCSU_FONT:
case EFI_HII_SIBT_STRING_UCS2_FONT:
case EFI_HII_SIBT_STRINGS_UCS2_FONT:
*(StringBlockAddr + sizeof (EFI_HII_STRING_BLOCK)) = LocalFont->FontId;
break;
default:
return EFI_NOT_FOUND;
//
// When modify the font info of these blocks, the block type should be updated
// to contain font info thus the whole structure should be revised.
// It is recommended to use tool to modify the block type not in the code.
//
return EFI_UNSUPPORTED;
}
}
OldBlockSize = StringPackage->StringPkgHdr->Header.Length - StringPackage->StringPkgHdr->HdrSize;
//
// Set the string text.
// Set the string text and font.
//
StringTextPtr = StringBlockAddr + StringTextOffset;
switch (BlockType) {
@ -1138,7 +1154,7 @@ HiiNewString (
//
Ucs2FontBlockSize = (UINT32) (StrSize (String) + sizeof (EFI_HII_SIBT_STRING_UCS2_FONT_BLOCK) -
sizeof (CHAR16));
if (ReferFontInfoLocally (Private, StringPackage, FALSE, GlobalFont, &LocalFont)) {
if (ReferFontInfoLocally (Private, StringPackage, StringPackage->FontId, FALSE, GlobalFont, &LocalFont)) {
//
// Create a EFI_HII_SIBT_STRING_UCS2_FONT block only.
//
@ -1229,6 +1245,12 @@ HiiNewString (
StringPackage->StringBlock = StringBlock;
StringPackage->StringPkgHdr->Header.Length += FontBlockSize + Ucs2FontBlockSize;
PackageListNode->PackageListHdr.PackageLength += FontBlockSize + Ucs2FontBlockSize;
//
// Increase the FontId to make it unique since we already add
// a EFI_HII_SIBT_FONT block to this string package.
//
StringPackage->FontId++;
}
}
@ -1258,7 +1280,9 @@ HiiNewString (
@retval EFI_SUCCESS The string was returned successfully.
@retval EFI_NOT_FOUND The string specified by StringId is not available.
@retval EFI_NOT_FOUND The string specified by StringId is available but
not in the specified language.
not in the specified language.
The specified PackageList is not in the database.
@retval EFI_INVALID_LANGUAGE - The string specified by StringId is available but
@retval EFI_BUFFER_TOO_SMALL The buffer specified by StringSize is too small to
hold the string.
@retval EFI_INVALID_PARAMETER The String or Language or StringSize was NULL.
@ -1309,18 +1333,34 @@ HiiGetString (
}
if (PackageListNode != NULL) {
//
// First search: to match the StringId in the specified language.
//
for (Link = PackageListNode->StringPkgHdr.ForwardLink;
Link != &PackageListNode->StringPkgHdr;
Link = Link->ForwardLink
) {
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
Status = GetStringWorker (Private, StringPackage, StringId, String, StringSize, StringFontInfo);
if (Status != EFI_NOT_FOUND) {
return Status;
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {
Status = GetStringWorker (Private, StringPackage, StringId, String, StringSize, StringFontInfo);
if (Status != EFI_NOT_FOUND) {
return Status;
}
}
}
}
//
// Second search: to match the StringId in other available languages if exist.
//
for (Link = PackageListNode->StringPkgHdr.ForwardLink;
Link != &PackageListNode->StringPkgHdr;
Link = Link->ForwardLink
) {
StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
Status = GetStringWorker (Private, StringPackage, StringId, String, StringSize, StringFontInfo);
if (!EFI_ERROR (Status)) {
return EFI_INVALID_LANGUAGE;
}
}
}
return EFI_NOT_FOUND;
@ -1528,8 +1568,9 @@ HiiGetLanguages (
too small to hold the returned information.
SecondLanguageSize is updated to hold the size of
the buffer required.
@retval EFI_NOT_FOUND The language specified by FirstLanguage is not
present in the specified package list.
@retval EFI_INVALID_LANGUAGE The language specified by FirstLanguage is not
present in the specified package list.
@retval EFI_NOT_FOUND The specified PackageList is not in the Database.
**/
EFI_STATUS
@ -1562,45 +1603,51 @@ HiiGetSecondaryLanguages (
}
Private = HII_STRING_DATABASE_PRIVATE_DATA_FROM_THIS (This);
Languages = NULL;
ResultSize = 0;
PackageListNode = NULL;
for (Link = Private->DatabaseList.ForwardLink; Link != &Private->DatabaseList; Link = Link->ForwardLink) {
DatabaseRecord = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);
if (DatabaseRecord->Handle == PackageList) {
PackageListNode = (HII_DATABASE_PACKAGE_LIST_INSTANCE *) (DatabaseRecord->PackageList);
for (Link1 = PackageListNode->StringPkgHdr.ForwardLink;
Link1 != &PackageListNode->StringPkgHdr;
Link1 = Link1->ForwardLink
) {
StringPackage = CR (Link1, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) {
Languages = StringPackage->StringPkgHdr->Language;
//
// Language is a series of ';' terminated strings, first one is primary
// language and following with other secondary languages or NULL if no
// secondary languages any more.
//
Languages = AsciiStrStr (Languages, ";");
if (Languages == NULL) {
break;
}
Languages++;
ResultSize = AsciiStrSize (Languages);
if (ResultSize <= *SecondLanguagesSize) {
AsciiStrCpy (SecondLanguages, Languages);
} else {
*SecondLanguagesSize = ResultSize;
return EFI_BUFFER_TOO_SMALL;
}
return EFI_SUCCESS;
}
break;
}
}
if (PackageListNode == NULL) {
return EFI_NOT_FOUND;
}
Languages = NULL;
ResultSize = 0;
for (Link1 = PackageListNode->StringPkgHdr.ForwardLink;
Link1 != &PackageListNode->StringPkgHdr;
Link1 = Link1->ForwardLink
) {
StringPackage = CR (Link1, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);
if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) {
Languages = StringPackage->StringPkgHdr->Language;
//
// Language is a series of ';' terminated strings, first one is primary
// language and following with other secondary languages or NULL if no
// secondary languages any more.
//
Languages = AsciiStrStr (Languages, ";");
if (Languages == NULL) {
break;
}
Languages++;
ResultSize = AsciiStrSize (Languages);
if (ResultSize <= *SecondLanguagesSize) {
AsciiStrCpy (SecondLanguages, Languages);
} else {
*SecondLanguagesSize = ResultSize;
return EFI_BUFFER_TOO_SMALL;
}
return EFI_SUCCESS;
}
}
return EFI_NOT_FOUND;
return EFI_INVALID_LANGUAGE;
}

View File

@ -1,5 +1,5 @@
/** @file
Copyright (c) 2007, Intel Corporation
Copyright (c) 2007 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@ -1233,11 +1233,11 @@ ParseOpCodes (
//
CurrentStatement->Minimum = ((EFI_IFR_STRING *) OpCodeData)->MinSize;
CurrentStatement->Maximum = ((EFI_IFR_STRING *) OpCodeData)->MaxSize;
CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));
CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (CHAR16));
CurrentStatement->Flags = ((EFI_IFR_STRING *) OpCodeData)->Flags;
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;
CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);
CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth + sizeof (CHAR16));
InitializeRequestElement (FormSet, CurrentStatement);
break;
@ -1252,10 +1252,10 @@ ParseOpCodes (
//
CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_PASSWORD *) OpCodeData)->MinSize, sizeof (UINT16));
CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_PASSWORD *) OpCodeData)->MaxSize, sizeof (UINT16));
CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));
CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (CHAR16));
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;
CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);
CurrentStatement->BufferValue = AllocateZeroPool ((CurrentStatement->StorageWidth + sizeof (CHAR16)));
InitializeRequestElement (FormSet, CurrentStatement);
break;

View File

@ -1,5 +1,5 @@
/** @file
Copyright (c) 2007, Intel Corporation
Copyright (c) 2007 - 2008, Intel Corporation
All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@ -1173,7 +1173,11 @@ GetQuestionValue (
}
if (IsString) {
StrCpy ((CHAR16 *) Dst, Value);
//
// Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"
//
Length = StorageWidth + sizeof (CHAR16);
Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value);
} else {
Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL);
}
@ -1239,7 +1243,11 @@ GetQuestionValue (
//
Value = Value + 1;
if (!IsBufferStorage && IsString) {
StrCpy ((CHAR16 *) Dst, Value);
//
// Convert Config String to Unicode String, e.g "0041004200430044" => "ABCD"
//
Length = StorageWidth + sizeof (CHAR16);
Status = ConfigStringToUnicode ((CHAR16 *) Dst, &Length, Value);
} else {
Status = HexStringToBuf (Dst, &StorageWidth, Value, NULL);
if (EFI_ERROR (Status)) {
@ -1408,13 +1416,21 @@ SetQuestionValue (
CopyMem (Storage->EditBuffer + Question->VarStoreInfo.VarOffset, Src, StorageWidth);
} else {
if (IsString) {
//
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
//
Value = NULL;
NewStringCpy (&Value, (CHAR16 *) Src);
} else {
BufferLen = (StorageWidth * 2 + 1) * sizeof (CHAR16);
BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);
Value = AllocateZeroPool (BufferLen);
ASSERT (Value != NULL);
Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src);
ASSERT_EFI_ERROR (Status);
} else {
BufferLen = StorageWidth * 2 + 1;
Value = AllocateZeroPool (BufferLen * sizeof (CHAR16));
ASSERT (Value != NULL);
BufToHexString (Value, &BufferLen, Src, StorageWidth);
ToLower (Value);
}
Status = SetValueByName (Storage, Question->VariableName, Value);
@ -1424,7 +1440,7 @@ SetQuestionValue (
if (!Cached) {
//
// <ConfigResp> ::= <ConfigHdr> + <BlockName> + "&VALUE=" + "<HexCh>StorageWidth * 2" ||
// <ConfigHdr> + "&" + <VariableName> + "=" + "<HexCh>StorageWidth * 2"
// <ConfigHdr> + "&" + <VariableName> + "=" + "<string>"
//
if (IsBufferStorage) {
Length = StrLen (Question->BlockName) + 7;
@ -1432,7 +1448,7 @@ SetQuestionValue (
Length = StrLen (Question->VariableName) + 2;
}
if (!IsBufferStorage && IsString) {
Length += StrLen ((CHAR16 *) Src);
Length += (StrLen ((CHAR16 *) Src) * 4);
} else {
Length += (StorageWidth * 2);
}
@ -1451,10 +1467,16 @@ SetQuestionValue (
Value = ConfigResp + StrLen (ConfigResp);
if (!IsBufferStorage && IsString) {
StrCpy (Value, (CHAR16 *) Src);
//
// Convert Unicode String to Config String, e.g. "ABCD" => "0041004200430044"
//
BufferLen = ((StrLen ((CHAR16 *) Src) * 4) + 1) * sizeof (CHAR16);
Status = UnicodeToConfigString (Value, &BufferLen, (CHAR16 *) Src);
ASSERT_EFI_ERROR (Status);
} else {
BufferLen = (StorageWidth * 2 + 1) * sizeof (CHAR16);
BufferLen = StorageWidth * 2 + 1;
BufToHexString (Value, &BufferLen, Src, StorageWidth);
ToLower (Value);
}
//

View File

@ -2299,7 +2299,7 @@ UiDisplayMenu (
Selection->Statement = NULL;
break;
}
BufferSize = StrLen (StringPtr) / 4;
BufferSize = StrLen (StringPtr) / 2;
DevicePath = AllocatePool (BufferSize);
HexStringToBuffer ((UINT8 *) DevicePath, &BufferSize, StringPtr);