2 Module produce UC on top of UC2.
4 UEFI 2.1 specification supersedes Inte's EFI Specification 1.10.
5 UNICODE_COLLATION_PROTOCOL defined in Inte's EFI Specification 1.10 is replaced by
6 EFI_UNICODE_COLLATION_PROTOCOL in UEFI 2.1.
7 This module produces UC on top of UC2. This module is used on platform when both of
8 these two conditions are true:
9 1) EFI 1.10 module consuming UC present
10 2) And the rest of modules on the platform produce UC2
12 Copyright (c) 2006 - 2010, Intel Corporation. <BR>
13 All rights reserved. This program and the accompanying materials
14 are licensed and made available under the terms and conditions of the BSD License
15 which accompanies this distribution. The full text of the license may be found at
16 http://opensource.org/licenses/bsd-license.php
18 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
19 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
25 #include <Protocol/UnicodeCollation.h>
26 #include <Library/BaseLib.h>
27 #include <Library/DebugLib.h>
28 #include <Library/UefiBootServicesTableLib.h>
29 #include <Library/UefiDriverEntryPoint.h>
30 #include <Library/UefiLib.h>
31 #include <Library/MemoryAllocationLib.h>
32 #include <Library/HiiLib.h>
33 #include <Library/BaseMemoryLib.h>
34 #include <Library/LanguageLib.h>
37 Performs a case-insensitive comparison of two Null-terminated Unicode
40 @param This Protocol instance pointer.
41 @param Str1 A pointer to a Null-terminated Unicode string.
42 @param Str2 A pointer to a Null-terminated Unicode string.
44 @retval 0 Str1 is equivalent to Str2
45 @retval > 0 Str1 is lexically greater than Str2
46 @retval < 0 Str1 is lexically less than Str2
52 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
58 Converts all the Unicode characters in a Null-terminated Unicode string to
59 lower case Unicode characters.
61 @param This Protocol instance pointer.
62 @param Str A pointer to a Null-terminated Unicode string.
68 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
73 Converts all the Unicode characters in a Null-terminated Unicode string to upper
74 case Unicode characters.
76 @param This Protocol instance pointer.
77 @param Str A pointer to a Null-terminated Unicode string.
83 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
88 Performs a case-insensitive comparison of a Null-terminated Unicode
89 pattern string and a Null-terminated Unicode string.
91 @param This Protocol instance pointer.
92 @param String A pointer to a Null-terminated Unicode string.
93 @param Pattern A pointer to a Null-terminated Unicode pattern string.
95 @retval TRUE Pattern was found in String.
96 @retval FALSE Pattern was not found in String.
102 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
108 Converts an 8.3 FAT file name in an OEM character set to a Null-terminated
111 @param This Protocol instance pointer.
112 @param FatSize The size of the string Fat in bytes.
113 @param Fat A pointer to a Null-terminated string that contains an 8.3 file
114 name using an OEM character set.
115 @param String A pointer to a Null-terminated Unicode string. The string must
116 be preallocated to hold FatSize Unicode characters.
122 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
129 Converts a Null-terminated Unicode string to legal characters in a FAT
130 filename using an OEM character set.
132 @param This Protocol instance pointer.
133 @param String A pointer to a Null-terminated Unicode string. The string must
134 be preallocated to hold FatSize Unicode characters.
135 @param FatSize The size of the string Fat in bytes.
136 @param Fat A pointer to a Null-terminated string that contains an 8.3 file
137 name using an OEM character set.
139 @retval TRUE Fat is a Long File Name
140 @retval FALSE Fat is an 8.3 file name
146 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
152 #define UC_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('_', 'U', 'C', '_')
156 EFI_UNICODE_COLLATION_PROTOCOL Uc
;
157 EFI_UNICODE_COLLATION_PROTOCOL
*Uc2
;
160 #define UC_PRIVATE_DATA_FROM_THIS(a) CR (a, UC_PRIVATE_DATA, Uc, UC_PRIVATE_DATA_SIGNATURE)
163 // Firmware Volume Protocol template
165 EFI_EVENT mUcRegistration
;
167 UC_PRIVATE_DATA gUCPrivateDataTemplate
= {
168 UC_PRIVATE_DATA_SIGNATURE
,
185 This notification function is invoked when an instance of the
186 EFI_UNICODE_COLLATION_PROTOCOL2 is produced. It installs another instance of the
187 EFI_UNICODE_COLLATION_PROTOCOL on the same handle.
189 @param Event The event that occured
190 @param Context Context of event. Not used in this nofication function.
195 Uc2NotificationEvent (
203 UC_PRIVATE_DATA
*Private
;
204 EFI_UNICODE_COLLATION_PROTOCOL
*Uc2
;
207 BufferSize
= sizeof (Handle
);
208 Status
= gBS
->LocateHandle (
210 &gEfiUnicodeCollation2ProtocolGuid
,
215 if (EFI_ERROR (Status
)) {
217 // Exit Path of While Loop....
223 // Skip this handle if the Firmware Volume Protocol is already installed
225 Status
= gBS
->HandleProtocol (
227 &gEfiUnicodeCollationProtocolGuid
,
230 if (!EFI_ERROR (Status
)) {
235 // Allocate private data structure
237 Private
= AllocateCopyPool (sizeof (UC_PRIVATE_DATA
), &gUCPrivateDataTemplate
);
238 if (Private
== NULL
) {
243 // Retrieve the UC Protocol
245 Status
= gBS
->HandleProtocol (
247 &gEfiUnicodeCollation2ProtocolGuid
,
248 (VOID
**)&Private
->Uc2
250 ASSERT_EFI_ERROR (Status
);
253 // Fill in rest of private data structure
255 Private
->Uc
.SupportedLanguages
= ConvertLanguagesRfc4646ToIso639 (Private
->Uc2
->SupportedLanguages
);
257 if (Private
->Uc
.SupportedLanguages
!= NULL
) {
260 // Install Firmware Volume Protocol onto same handle
262 Status
= gBS
->InstallMultipleProtocolInterfaces (
264 &gEfiUnicodeCollationProtocolGuid
,
268 ASSERT_EFI_ERROR (Status
);
275 The user Entry Point for DXE driver. The user code starts with this function
276 as the real entry point for the image goes into a library that calls this
279 @param[in] ImageHandle The firmware allocated handle for the EFI image.
280 @param[in] SystemTable A pointer to the EFI System Table.
282 @retval EFI_SUCCESS The entry point is executed successfully.
283 @retval other Some error occurs when executing this entry point.
289 IN EFI_HANDLE ImageHandle
,
290 IN EFI_SYSTEM_TABLE
*SystemTable
293 EfiCreateProtocolNotifyEvent (
294 &gEfiUnicodeCollation2ProtocolGuid
,
296 Uc2NotificationEvent
,
305 Performs a case-insensitive comparison of two Null-terminated Unicode
308 @param This Protocol instance pointer.
309 @param Str1 A pointer to a Null-terminated Unicode string.
310 @param Str2 A pointer to a Null-terminated Unicode string.
312 @retval 0 Str1 is equivalent to Str2
313 @retval > 0 Str1 is lexically greater than Str2
314 @retval < 0 Str1 is lexically less than Str2
320 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
325 UC_PRIVATE_DATA
*Private
;
327 Private
= UC_PRIVATE_DATA_FROM_THIS (This
);
329 return Private
->Uc2
->StriColl (Private
->Uc2
, Str1
, Str2
);
334 Converts all the Unicode characters in a Null-terminated Unicode string to
335 lower case Unicode characters.
337 @param This Protocol instance pointer.
338 @param Str A pointer to a Null-terminated Unicode string.
344 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
348 UC_PRIVATE_DATA
*Private
;
350 Private
= UC_PRIVATE_DATA_FROM_THIS (This
);
352 Private
->Uc2
->StrLwr (Private
->Uc2
, Str
);
357 Converts all the Unicode characters in a Null-terminated Unicode string to upper
358 case Unicode characters.
360 @param This Protocol instance pointer.
361 @param Str A pointer to a Null-terminated Unicode string.
367 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
371 UC_PRIVATE_DATA
*Private
;
373 Private
= UC_PRIVATE_DATA_FROM_THIS (This
);
375 Private
->Uc2
->StrUpr (Private
->Uc2
, Str
);
379 Performs a case-insensitive comparison of a Null-terminated Unicode
380 pattern string and a Null-terminated Unicode string.
382 @param This Protocol instance pointer.
383 @param String A pointer to a Null-terminated Unicode string.
384 @param Pattern A pointer to a Null-terminated Unicode pattern string.
386 @retval TRUE Pattern was found in String.
387 @retval FALSE Pattern was not found in String.
393 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
398 UC_PRIVATE_DATA
*Private
;
400 Private
= UC_PRIVATE_DATA_FROM_THIS (This
);
402 return Private
->Uc2
->MetaiMatch (Private
->Uc2
, String
, Pattern
);
407 Converts an 8.3 FAT file name in an OEM character set to a Null-terminated
410 @param This Protocol instance pointer.
411 @param FatSize The size of the string Fat in bytes.
412 @param Fat A pointer to a Null-terminated string that contains an 8.3 file
413 name using an OEM character set.
414 @param String A pointer to a Null-terminated Unicode string. The string must
415 be preallocated to hold FatSize Unicode characters.
421 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
427 UC_PRIVATE_DATA
*Private
;
429 Private
= UC_PRIVATE_DATA_FROM_THIS (This
);
431 Private
->Uc2
->FatToStr (Private
->Uc2
, FatSize
, Fat
, String
);
436 Converts a Null-terminated Unicode string to legal characters in a FAT
437 filename using an OEM character set.
439 @param This Protocol instance pointer.
440 @param String A pointer to a Null-terminated Unicode string. The string must
441 be preallocated to hold FatSize Unicode characters.
442 @param FatSize The size of the string Fat in bytes.
443 @param Fat A pointer to a Null-terminated string that contains an 8.3 file
444 name using an OEM character set.
446 @retval TRUE Fat is a Long File Name
447 @retval FALSE Fat is an 8.3 file name
453 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
459 UC_PRIVATE_DATA
*Private
;
461 Private
= UC_PRIVATE_DATA_FROM_THIS (This
);
463 return Private
->Uc2
->StrToFat (Private
->Uc2
, String
, FatSize
, Fat
);