2 Unicode Collation Support component that hides the trivial difference of Unicode Collation
3 and Unicode collation 2 Protocol.
5 Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
12 EFI_UNICODE_COLLATION_PROTOCOL
*mUnicodeCollationInterface
= NULL
;
15 Worker function to initialize Unicode Collation support.
17 It tries to locate Unicode Collation (2) protocol and matches it with current
18 platform language code.
20 @param AgentHandle The handle used to open Unicode Collation (2) protocol.
21 @param ProtocolGuid The pointer to Unicode Collation (2) protocol GUID.
22 @param VariableName The name of the RFC 4646 or ISO 639-2 language variable.
23 @param DefaultLanguage The default language in case the RFC 4646 or ISO 639-2 language is absent.
25 @retval EFI_SUCCESS The Unicode Collation (2) protocol has been successfully located.
26 @retval Others The Unicode Collation (2) protocol has not been located.
30 InitializeUnicodeCollationSupportWorker (
31 IN EFI_HANDLE AgentHandle
,
32 IN EFI_GUID
*ProtocolGuid
,
33 IN CONST CHAR16
*VariableName
,
34 IN CONST CHAR8
*DefaultLanguage
37 EFI_STATUS ReturnStatus
;
42 EFI_UNICODE_COLLATION_PROTOCOL
*Uci
;
43 BOOLEAN Iso639Language
;
47 Status
= gBS
->LocateHandleBuffer (
54 if (EFI_ERROR (Status
)) {
58 Iso639Language
= (BOOLEAN
)(ProtocolGuid
== &gEfiUnicodeCollationProtocolGuid
);
59 GetEfiGlobalVariable2 (VariableName
, (VOID
**)&Language
, NULL
);
61 ReturnStatus
= EFI_UNSUPPORTED
;
62 for (Index
= 0; Index
< NumHandles
; Index
++) {
64 // Open Unicode Collation Protocol
66 Status
= gBS
->OpenProtocol (
72 EFI_OPEN_PROTOCOL_GET_PROTOCOL
74 if (EFI_ERROR (Status
)) {
79 // Find the best matching matching language from the supported languages
80 // of Unicode Collation (2) protocol.
82 BestLanguage
= GetBestLanguage (
83 Uci
->SupportedLanguages
,
85 (Language
== NULL
) ? "" : Language
,
89 if (BestLanguage
!= NULL
) {
90 FreePool (BestLanguage
);
91 mUnicodeCollationInterface
= Uci
;
92 ReturnStatus
= EFI_SUCCESS
;
97 if (Language
!= NULL
) {
107 Initialize Unicode Collation support.
109 It tries to locate Unicode Collation 2 protocol and matches it with current
110 platform language code. If for any reason the first attempt fails, it then tries to
111 use Unicode Collation Protocol.
113 @param AgentHandle The handle used to open Unicode Collation (2) protocol.
115 @retval EFI_SUCCESS The Unicode Collation (2) protocol has been successfully located.
116 @retval Others The Unicode Collation (2) protocol has not been located.
120 InitializeUnicodeCollationSupport (
121 IN EFI_HANDLE AgentHandle
126 Status
= EFI_UNSUPPORTED
;
129 // First try to use RFC 4646 Unicode Collation 2 Protocol.
131 Status
= InitializeUnicodeCollationSupportWorker (
133 &gEfiUnicodeCollation2ProtocolGuid
,
135 (CONST CHAR8
*)PcdGetPtr (PcdUefiVariableDefaultPlatformLang
)
138 // If the attempt to use Unicode Collation 2 Protocol fails, then we fall back
139 // on the ISO 639-2 Unicode Collation Protocol.
141 if (EFI_ERROR (Status
)) {
142 Status
= InitializeUnicodeCollationSupportWorker (
144 &gEfiUnicodeCollationProtocolGuid
,
146 (CONST CHAR8
*)PcdGetPtr (PcdUefiVariableDefaultLang
)
154 Performs a case-insensitive comparison of two Null-terminated Unicode strings.
156 @param S1 A pointer to a Null-terminated Unicode string.
157 @param S2 A pointer to a Null-terminated Unicode string.
159 @retval 0 S1 is equivalent to S2.
160 @retval >0 S1 is lexically greater than S2.
161 @retval <0 S1 is lexically less than S2.
169 ASSERT (StrSize (S1
) != 0);
170 ASSERT (StrSize (S2
) != 0);
171 ASSERT (mUnicodeCollationInterface
!= NULL
);
173 return mUnicodeCollationInterface
->StriColl (
174 mUnicodeCollationInterface
,
183 @param String The string which will be upper-cased.
189 IN OUT CHAR16
*String
192 ASSERT (StrSize (String
) != 0);
193 ASSERT (mUnicodeCollationInterface
!= NULL
);
195 mUnicodeCollationInterface
->StrUpr (mUnicodeCollationInterface
, String
);
201 @param String The string which will be lower-cased.
207 IN OUT CHAR16
*String
210 ASSERT (StrSize (String
) != 0);
211 ASSERT (mUnicodeCollationInterface
!= NULL
);
213 mUnicodeCollationInterface
->StrLwr (mUnicodeCollationInterface
, String
);
217 Convert FAT string to unicode string.
219 @param FatSize The size of FAT string.
220 @param Fat The FAT string.
221 @param String The unicode string.
233 ASSERT (Fat
!= NULL
);
234 ASSERT (String
!= NULL
);
235 ASSERT (((UINTN
)String
& 0x01) == 0);
236 ASSERT (mUnicodeCollationInterface
!= NULL
);
238 mUnicodeCollationInterface
->FatToStr (mUnicodeCollationInterface
, FatSize
, Fat
, String
);
242 Convert unicode string to Fat string.
244 @param String The unicode string.
245 @param FatSize The size of the FAT string.
246 @param Fat The FAT string.
248 @retval TRUE Convert successfully.
249 @retval FALSE Convert error.
259 ASSERT (Fat
!= NULL
);
260 ASSERT (StrSize (String
) != 0);
261 ASSERT (mUnicodeCollationInterface
!= NULL
);
263 return mUnicodeCollationInterface
->StrToFat (
264 mUnicodeCollationInterface
,