mirror of https://github.com/acidanthera/audk.git
Add GetVariabe(), GetEfiGlobalVariable() and GetBestLanguage() to UefiLib.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7936 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
941199475d
commit
6d28c49754
|
@ -619,6 +619,104 @@ FreeUnicodeStringTable (
|
||||||
IN EFI_UNICODE_STRING_TABLE *UnicodeStringTable
|
IN EFI_UNICODE_STRING_TABLE *UnicodeStringTable
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns a pointer to an allocated buffer that contains the contents of a
|
||||||
|
variable retrieved through the UEFI Runtime Service GetVariable(). The
|
||||||
|
returned buffer is allocated using AllocatePool(). The caller is responsible
|
||||||
|
for freeing this buffer with FreePool().
|
||||||
|
|
||||||
|
If Name is NULL, then ASSERT().
|
||||||
|
If Guid is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@param[in] Name Pointer to a Null-terminated Unicode string.
|
||||||
|
@param[in] Guid Pointer to an EFI_GUID structure
|
||||||
|
|
||||||
|
@retval NULL The variable could not be retrieved.
|
||||||
|
@retval NULL There are not enough resources available for the variable contents.
|
||||||
|
@retval Other A pointer to allocated buffer containing the variable contents.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID *
|
||||||
|
EFIAPI
|
||||||
|
GetVariable (
|
||||||
|
IN CONST CHAR16 *Name,
|
||||||
|
IN CONST EFI_GUID *Guid
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns a pointer to an allocated buffer that contains the contents of a
|
||||||
|
variable retrieved through the UEFI Runtime Service GetVariable(). This
|
||||||
|
function always uses the EFI_GLOBAL_VARIABLE GUID to retrieve variables.
|
||||||
|
The returned buffer is allocated using AllocatePool(). The caller is
|
||||||
|
responsible for freeing this buffer with FreePool().
|
||||||
|
|
||||||
|
If Name is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@param[in] Name Pointer to a Null-terminated Unicode string.
|
||||||
|
|
||||||
|
@retval NULL The variable could not be retrieved.
|
||||||
|
@retval NULL There are not enough resources available for the variable contents.
|
||||||
|
@retval Other A pointer to allocated buffer containing the variable contents.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID *
|
||||||
|
EFIAPI
|
||||||
|
GetEfiGlobalVariable (
|
||||||
|
IN CONST CHAR16 *Name
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns a pointer to an allocated buffer that contains the best matching language
|
||||||
|
from a set of supported languages.
|
||||||
|
|
||||||
|
This function supports both ISO 639-2 and RFC 4646 language codes, but language
|
||||||
|
code types may not be mixed in a single call to this function. The language
|
||||||
|
code returned is allocated using AllocatePool(). The caller is responsible for
|
||||||
|
freeing the allocated buffer using FreePool(). This function supports a variable
|
||||||
|
argument list that allows the caller to pass in a prioritized list of language
|
||||||
|
codes to test against all the language codes in SupportedLanguages.
|
||||||
|
|
||||||
|
If SupportedLanguages is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@param[in] SupportedLanguages A pointer to a Null-terminated ASCII string that
|
||||||
|
contains a set of language codes in the format
|
||||||
|
specified by Iso639Language.
|
||||||
|
@param[in] Iso639Language If TRUE, then all language codes are assumed to be
|
||||||
|
in ISO 639-2 format. If FALSE, then all language
|
||||||
|
codes are assumed to be in RFC 4646 language format
|
||||||
|
@param[in] ... A variable argument list that contains pointers to
|
||||||
|
Null-terminated ASCII strings that contain one or more
|
||||||
|
language codes in the format specified by Iso639Language.
|
||||||
|
The first language code from each of these language
|
||||||
|
code lists is used to determine if it is an exact or
|
||||||
|
close match to any of the language codes in
|
||||||
|
SupportedLanguages. Close matches only apply to RFC 4646
|
||||||
|
language codes, and the matching algorithm from RFC 4647
|
||||||
|
is used to determine if a close match is present. If
|
||||||
|
an exact or close match is found, then the matching
|
||||||
|
language code from SupportedLanguages is returned. If
|
||||||
|
no matches are found, then the next variable argument
|
||||||
|
parameter is evaluated. The variable argument list
|
||||||
|
is terminated by a NULL.
|
||||||
|
|
||||||
|
@retval NULL The best matching language could not be found in SupportedLanguages.
|
||||||
|
@retval NULL There are not enough resources available to return the best matching
|
||||||
|
language.
|
||||||
|
@retval Other A pointer to a Null-terminated ASCII string that is the best matching
|
||||||
|
language in SupportedLanguages.
|
||||||
|
|
||||||
|
**/
|
||||||
|
CHAR8 *
|
||||||
|
EFIAPI
|
||||||
|
GetBestLanguage (
|
||||||
|
IN CONST CHAR8 *SupportedLanguages,
|
||||||
|
IN BOOLEAN Iso639Language,
|
||||||
|
...
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Retrieves the width of a Unicode character.
|
Retrieves the width of a Unicode character.
|
||||||
|
|
||||||
|
|
|
@ -145,7 +145,7 @@ EfiCreateProtocolNotifyEvent(
|
||||||
ASSERT_EFI_ERROR (Status);
|
ASSERT_EFI_ERROR (Status);
|
||||||
|
|
||||||
//
|
//
|
||||||
// Register for protocol notifactions on this event
|
// Register for protocol notifications on this event
|
||||||
//
|
//
|
||||||
|
|
||||||
Status = gBS->RegisterProtocolNotify (
|
Status = gBS->RegisterProtocolNotify (
|
||||||
|
@ -1189,3 +1189,228 @@ FreeUnicodeStringTable (
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns a pointer to an allocated buffer that contains the contents of a
|
||||||
|
variable retrieved through the UEFI Runtime Service GetVariable(). The
|
||||||
|
returned buffer is allocated using AllocatePool(). The caller is responsible
|
||||||
|
for freeing tis buffer with FreePool().
|
||||||
|
|
||||||
|
If Name is NULL, then ASSERT().
|
||||||
|
If Guid is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@param[in] Name Pointer to a Null-terminated Unicode string.
|
||||||
|
@param[in] Guid Pointer to an EFI_GUID structure
|
||||||
|
|
||||||
|
@retval NULL The variable could not be retrieved.
|
||||||
|
@retval Other A pointer to allocated buffer containing the variable contents
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID *
|
||||||
|
EFIAPI
|
||||||
|
GetVariable (
|
||||||
|
IN CONST CHAR16 *Name,
|
||||||
|
IN CONST EFI_GUID *Guid
|
||||||
|
)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
UINTN Size;
|
||||||
|
VOID *Value;
|
||||||
|
|
||||||
|
ASSERT (Name != NULL);
|
||||||
|
ASSERT (Guid != NULL);
|
||||||
|
|
||||||
|
//
|
||||||
|
// Try to get the variable size.
|
||||||
|
//
|
||||||
|
Value = NULL;
|
||||||
|
Size = 0;
|
||||||
|
Status = gRT->GetVariable ((CHAR16 *) Name, (EFI_GUID *) Guid, NULL, &Size, Value);
|
||||||
|
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Allocate buffer to get the variable.
|
||||||
|
//
|
||||||
|
Value = AllocatePool (Size);
|
||||||
|
if (Value == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Get the variable data.
|
||||||
|
//
|
||||||
|
Status = gRT->GetVariable ((CHAR16 *) Name, (EFI_GUID *) Guid, NULL, &Size, Value);
|
||||||
|
if (EFI_ERROR (Status)) {
|
||||||
|
FreePool(Value);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns a pointer to an allocated buffer that contains the contents of a
|
||||||
|
variable retrieved through the UEFI Runtime Service GetVariable(). This
|
||||||
|
function always uses the EFI_GLOBAL_VARIABLE GUID to retrieve variables.
|
||||||
|
The returned buffer is allocated using AllocatePool(). The caller is
|
||||||
|
responsible for freeing this buffer with FreePool().
|
||||||
|
|
||||||
|
If Name is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@param[in] Name Pointer to a Null-terminated Unicode string.
|
||||||
|
|
||||||
|
@retval NULL The variable could not be retrieved.
|
||||||
|
@retval NULL There are not enough resources available for the variable contents.
|
||||||
|
@retval Other A pointer to allocated buffer containing the variable contents.
|
||||||
|
|
||||||
|
**/
|
||||||
|
VOID *
|
||||||
|
EFIAPI
|
||||||
|
GetEfiGlobalVariable (
|
||||||
|
IN CONST CHAR16 *Name
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return GetVariable (Name, &gEfiGlobalVariableGuid);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
Returns a pointer to an allocated buffer that contains the best matching language
|
||||||
|
from a set of supported languages.
|
||||||
|
|
||||||
|
This function supports both ISO 639-2 and RFC 4646 language codes, but language
|
||||||
|
code types may not be mixed in a single call to this function. The language
|
||||||
|
code returned is allocated using AllocatePool(). The caller is responsible for
|
||||||
|
freeing the allocated buffer using FreePool(). This function supports a variable
|
||||||
|
argument list that allows the caller to pass in a prioritized list of language
|
||||||
|
codes to test against all the language codes in SupportedLanguages.
|
||||||
|
|
||||||
|
If SupportedLanguages is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@param[in] SupportedLanguages A pointer to a Null-terminated ASCII string that
|
||||||
|
contains a set of language codes in the format
|
||||||
|
specified by Iso639Language.
|
||||||
|
@param[in] Iso639Language If TRUE, then all language codes are assumed to be
|
||||||
|
in ISO 639-2 format. If FALSE, then all language
|
||||||
|
codes are assumed to be in RFC 4646 language format
|
||||||
|
@param[in] ... A variable argument list that contains pointers to
|
||||||
|
Null-terminated ASCII strings that contain one or more
|
||||||
|
language codes in the format specified by Iso639Language.
|
||||||
|
The first language code from each of these language
|
||||||
|
code lists is used to determine if it is an exact or
|
||||||
|
close match to any of the language codes in
|
||||||
|
SupportedLanguages. Close matches only apply to RFC 4646
|
||||||
|
language codes, and the matching algorithm from RFC 4647
|
||||||
|
is used to determine if a close match is present. If
|
||||||
|
an exact or close match is found, then the matching
|
||||||
|
language code from SupportedLanguages is returned. If
|
||||||
|
no matches are found, then the next variable argument
|
||||||
|
parameter is evaluated. The variable argument list
|
||||||
|
is terminated by a NULL.
|
||||||
|
|
||||||
|
@retval NULL The best matching language could not be found in SupportedLanguages.
|
||||||
|
@retval NULL There are not enough resources available to return the best matching
|
||||||
|
language.
|
||||||
|
@retval Other A pointer to a Null-terminated ASCII string that is the best matching
|
||||||
|
language in SupportedLanguages.
|
||||||
|
|
||||||
|
**/
|
||||||
|
CHAR8 *
|
||||||
|
EFIAPI
|
||||||
|
GetBestLanguage (
|
||||||
|
IN CONST CHAR8 *SupportedLanguages,
|
||||||
|
IN BOOLEAN Iso639Language,
|
||||||
|
...
|
||||||
|
)
|
||||||
|
{
|
||||||
|
VA_LIST Args;
|
||||||
|
CHAR8 *Language;
|
||||||
|
UINTN CompareLength;
|
||||||
|
UINTN LanguageLength;
|
||||||
|
CONST CHAR8 *Supported;
|
||||||
|
CHAR8 *BestLanguage;
|
||||||
|
|
||||||
|
ASSERT (SupportedLanguages != NULL);
|
||||||
|
|
||||||
|
VA_START (Args, Iso639Language);
|
||||||
|
while ((Language = VA_ARG (Args, CHAR8 *)) != NULL) {
|
||||||
|
//
|
||||||
|
// Default to ISO 639-2 mode
|
||||||
|
//
|
||||||
|
CompareLength = 3;
|
||||||
|
LanguageLength = MIN (3, AsciiStrLen (Language));
|
||||||
|
|
||||||
|
//
|
||||||
|
// If in RFC 4646 mode, then determine the length of the first RFC 4646 language code in Language
|
||||||
|
//
|
||||||
|
if (!Iso639Language) {
|
||||||
|
for (LanguageLength = 0; Language[LanguageLength] != 0 && Language[LanguageLength] != ';'; LanguageLength++);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Trim back the length of Language used until it is empty
|
||||||
|
//
|
||||||
|
while (LanguageLength > 0) {
|
||||||
|
//
|
||||||
|
// Loop through all language codes in SupportedLanguages
|
||||||
|
//
|
||||||
|
for (Supported = SupportedLanguages; *Supported != '\0'; Supported += CompareLength) {
|
||||||
|
//
|
||||||
|
// In RFC 4646 mode, then Loop through all language codes in SupportedLanguages
|
||||||
|
//
|
||||||
|
if (!Iso639Language) {
|
||||||
|
//
|
||||||
|
// Skip ';' characters in Supported
|
||||||
|
//
|
||||||
|
for (; *Supported != '\0' && *Supported == ';'; Supported++);
|
||||||
|
//
|
||||||
|
// Determine the length of the next language code in Supported
|
||||||
|
//
|
||||||
|
for (CompareLength = 0; Supported[CompareLength] != 0 && Supported[CompareLength] != ';'; CompareLength++);
|
||||||
|
//
|
||||||
|
// If Language is longer than the Supported, then skip to the next language
|
||||||
|
//
|
||||||
|
if (LanguageLength > CompareLength) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//
|
||||||
|
// See if the first LanguageLength characters in Supported match Language
|
||||||
|
//
|
||||||
|
if (AsciiStrnCmp (Supported, Language, LanguageLength) == 0) {
|
||||||
|
VA_END (Args);
|
||||||
|
//
|
||||||
|
// Allocate, copy, and return the best matching language code from SupportedLanguages
|
||||||
|
//
|
||||||
|
BestLanguage = AllocateZeroPool (CompareLength + 1);
|
||||||
|
if (BestLanguage == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return CopyMem (BestLanguage, Supported, CompareLength);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Iso639Language) {
|
||||||
|
//
|
||||||
|
// If ISO 639 mode, then each language can only be tested once
|
||||||
|
//
|
||||||
|
LanguageLength = 0;
|
||||||
|
} else {
|
||||||
|
//
|
||||||
|
// If RFC 4646 mode, then trim Language from the right to the next '-' character
|
||||||
|
//
|
||||||
|
for (LanguageLength--; LanguageLength > 0 && Language[LanguageLength] != '-'; LanguageLength--);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
VA_END (Args);
|
||||||
|
|
||||||
|
//
|
||||||
|
// No matches were found
|
||||||
|
//
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,11 +54,12 @@
|
||||||
BaseLib
|
BaseLib
|
||||||
UefiBootServicesTableLib
|
UefiBootServicesTableLib
|
||||||
DevicePathLib
|
DevicePathLib
|
||||||
|
UefiRuntimeServicesTableLib
|
||||||
|
|
||||||
[Guids]
|
[Guids]
|
||||||
gEfiEventReadyToBootGuid ## CONSUMES ## Event
|
gEfiEventReadyToBootGuid ## CONSUMES ## Event
|
||||||
gEfiEventLegacyBootGuid ## CONSUMES ## Event
|
gEfiEventLegacyBootGuid ## CONSUMES ## Event
|
||||||
|
gEfiGlobalVariableGuid ## CONSUMES ## Variable
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiDriverBindingProtocolGuid ## PRODUCES
|
gEfiDriverBindingProtocolGuid ## PRODUCES
|
||||||
|
|
|
@ -29,8 +29,10 @@
|
||||||
|
|
||||||
#include <Guid/EventGroup.h>
|
#include <Guid/EventGroup.h>
|
||||||
#include <Guid/EventLegacyBios.h>
|
#include <Guid/EventLegacyBios.h>
|
||||||
|
#include <Guid/GlobalVariable.h>
|
||||||
#include <Library/UefiLib.h>
|
#include <Library/UefiLib.h>
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/DebugLib.h>
|
#include <Library/DebugLib.h>
|
||||||
|
|
Loading…
Reference in New Issue