| /** @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 | |
| ); | |
| } |