https://bugzilla.tianocore.org/show_bug.cgi?id=1373 Replace BSD 2-Clause License with BSD+Patent License. This change is based on the following emails: https://lists.01.org/pipermail/edk2-devel/2019-February/036260.html https://lists.01.org/pipermail/edk2-devel/2018-October/030385.html RFCs with detailed process for the license change: V3: https://lists.01.org/pipermail/edk2-devel/2019-March/038116.html V2: https://lists.01.org/pipermail/edk2-devel/2019-March/037669.html V1: https://lists.01.org/pipermail/edk2-devel/2019-March/037500.html Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Michael D Kinney <michael.d.kinney@intel.com> Reviewed-by: Ray Ni <ray.ni@intel.com>
		
			
				
	
	
		
			276 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			276 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @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
 | |
|                                        );
 | |
| }
 |