123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- /** @file
- Unicode Collation Support component that hides the trivial difference of Unicode Collation
- and Unicode collation 2 Protocol.
- Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include "Fat.h"
- EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollationInterface = NULL;
- /**
- Worker function to initialize Unicode Collation support.
- It tries to locate Unicode Collation (2) protocol and matches it with current
- platform language code.
- @param AgentHandle The handle used to open Unicode Collation (2) protocol.
- @param ProtocolGuid The pointer to Unicode Collation (2) protocol GUID.
- @param VariableName The name of the RFC 4646 or ISO 639-2 language variable.
- @param DefaultLanguage The default language in case the RFC 4646 or ISO 639-2 language is absent.
- @retval EFI_SUCCESS The Unicode Collation (2) protocol has been successfully located.
- @retval Others The Unicode Collation (2) protocol has not been located.
- **/
- EFI_STATUS
- InitializeUnicodeCollationSupportWorker (
- IN EFI_HANDLE AgentHandle,
- IN EFI_GUID *ProtocolGuid,
- IN CONST CHAR16 *VariableName,
- IN CONST CHAR8 *DefaultLanguage
- )
- {
- EFI_STATUS ReturnStatus;
- EFI_STATUS Status;
- UINTN NumHandles;
- UINTN Index;
- EFI_HANDLE *Handles;
- EFI_UNICODE_COLLATION_PROTOCOL *Uci;
- BOOLEAN Iso639Language;
- CHAR8 *Language;
- CHAR8 *BestLanguage;
- Status = gBS->LocateHandleBuffer (
- ByProtocol,
- ProtocolGuid,
- NULL,
- &NumHandles,
- &Handles
- );
- if (EFI_ERROR (Status)) {
- return Status;
- }
- Iso639Language = (BOOLEAN) (ProtocolGuid == &gEfiUnicodeCollationProtocolGuid);
- GetEfiGlobalVariable2 (VariableName, (VOID**) &Language, NULL);
- ReturnStatus = EFI_UNSUPPORTED;
- for (Index = 0; Index < NumHandles; Index++) {
- //
- // Open Unicode Collation Protocol
- //
- Status = gBS->OpenProtocol (
- Handles[Index],
- ProtocolGuid,
- (VOID **) &Uci,
- AgentHandle,
- NULL,
- EFI_OPEN_PROTOCOL_GET_PROTOCOL
- );
- if (EFI_ERROR (Status)) {
- continue;
- }
- //
- // Find the best matching matching language from the supported languages
- // of Unicode Collation (2) protocol.
- //
- BestLanguage = GetBestLanguage (
- Uci->SupportedLanguages,
- Iso639Language,
- (Language == NULL) ? "" : Language,
- DefaultLanguage,
- NULL
- );
- if (BestLanguage != NULL) {
- FreePool (BestLanguage);
- mUnicodeCollationInterface = Uci;
- ReturnStatus = EFI_SUCCESS;
- break;
- }
- }
- if (Language != NULL) {
- FreePool (Language);
- }
- FreePool (Handles);
- return ReturnStatus;
- }
- /**
- Initialize Unicode Collation support.
- It tries to locate Unicode Collation 2 protocol and matches it with current
- platform language code. If for any reason the first attempt fails, it then tries to
- use Unicode Collation Protocol.
- @param AgentHandle The handle used to open Unicode Collation (2) protocol.
- @retval EFI_SUCCESS The Unicode Collation (2) protocol has been successfully located.
- @retval Others The Unicode Collation (2) protocol has not been located.
- **/
- EFI_STATUS
- InitializeUnicodeCollationSupport (
- IN EFI_HANDLE AgentHandle
- )
- {
- EFI_STATUS Status;
- Status = EFI_UNSUPPORTED;
- //
- // First try to use RFC 4646 Unicode Collation 2 Protocol.
- //
- Status = InitializeUnicodeCollationSupportWorker (
- AgentHandle,
- &gEfiUnicodeCollation2ProtocolGuid,
- L"PlatformLang",
- (CONST CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang)
- );
- //
- // If the attempt to use Unicode Collation 2 Protocol fails, then we fall back
- // on the ISO 639-2 Unicode Collation Protocol.
- //
- if (EFI_ERROR (Status)) {
- Status = InitializeUnicodeCollationSupportWorker (
- AgentHandle,
- &gEfiUnicodeCollationProtocolGuid,
- L"Lang",
- (CONST CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultLang)
- );
- }
- return Status;
- }
- /**
- Performs a case-insensitive comparison of two Null-terminated Unicode strings.
- @param S1 A pointer to a Null-terminated Unicode string.
- @param S2 A pointer to a Null-terminated Unicode string.
- @retval 0 S1 is equivalent to S2.
- @retval >0 S1 is lexically greater than S2.
- @retval <0 S1 is lexically less than S2.
- **/
- INTN
- FatStriCmp (
- IN CHAR16 *S1,
- IN CHAR16 *S2
- )
- {
- ASSERT (StrSize (S1) != 0);
- ASSERT (StrSize (S2) != 0);
- ASSERT (mUnicodeCollationInterface != NULL);
- return mUnicodeCollationInterface->StriColl (
- mUnicodeCollationInterface,
- S1,
- S2
- );
- }
- /**
- Uppercase a string.
- @param String The string which will be upper-cased.
- **/
- VOID
- FatStrUpr (
- IN OUT CHAR16 *String
- )
- {
- ASSERT (StrSize (String) != 0);
- ASSERT (mUnicodeCollationInterface != NULL);
- mUnicodeCollationInterface->StrUpr (mUnicodeCollationInterface, String);
- }
- /**
- Lowercase a string
- @param String The string which will be lower-cased.
- **/
- VOID
- FatStrLwr (
- IN OUT CHAR16 *String
- )
- {
- ASSERT (StrSize (String) != 0);
- ASSERT (mUnicodeCollationInterface != NULL);
- mUnicodeCollationInterface->StrLwr (mUnicodeCollationInterface, String);
- }
- /**
- Convert FAT string to unicode string.
- @param FatSize The size of FAT string.
- @param Fat The FAT string.
- @param String The unicode string.
- @return None.
- **/
- VOID
- FatFatToStr (
- IN UINTN FatSize,
- IN CHAR8 *Fat,
- OUT CHAR16 *String
- )
- {
- ASSERT (Fat != NULL);
- ASSERT (String != NULL);
- ASSERT (((UINTN) String & 0x01) == 0);
- ASSERT (mUnicodeCollationInterface != NULL);
- mUnicodeCollationInterface->FatToStr (mUnicodeCollationInterface, FatSize, Fat, String);
- }
- /**
- Convert unicode string to Fat string.
- @param String The unicode string.
- @param FatSize The size of the FAT string.
- @param Fat The FAT string.
- @retval TRUE Convert successfully.
- @retval FALSE Convert error.
- **/
- BOOLEAN
- FatStrToFat (
- IN CHAR16 *String,
- IN UINTN FatSize,
- OUT CHAR8 *Fat
- )
- {
- ASSERT (Fat != NULL);
- ASSERT (StrSize (String) != 0);
- ASSERT (mUnicodeCollationInterface != NULL);
- return mUnicodeCollationInterface->StrToFat (
- mUnicodeCollationInterface,
- String,
- FatSize,
- Fat
- );
- }
|