2 Module produce UC2 on top of UC.
4 UEFI 2.1 specification supersedes Inte's EFI Specification 1.10.
5 EFI_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 UC2 on top of UC. This module is used on platform when both of
8 these two conditions are true:
9 1) EFI 1.10 module producing UC present
10 2) And the rest of modules on the platform consume UC2
12 Copyright (c) 2006 - 2008 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>
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
,
59 Converts all the Unicode characters in a Null-terminated Unicode string to
60 lower case Unicode characters.
62 @param This Protocol instance pointer.
63 @param Str A pointer to a Null-terminated Unicode string.
69 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
75 Converts all the Unicode characters in a Null-terminated Unicode string to upper
76 case Unicode characters.
78 @param This Protocol instance pointer.
79 @param Str A pointer to a Null-terminated Unicode string.
85 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
91 Performs a case-insensitive comparison of a Null-terminated Unicode
92 pattern string and a Null-terminated Unicode string.
94 @param This Protocol instance pointer.
95 @param String A pointer to a Null-terminated Unicode string.
96 @param Pattern A pointer to a Null-terminated Unicode pattern string.
98 @retval TRUE Pattern was found in String.
99 @retval FALSE Pattern was not found in String.
105 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
112 Converts an 8.3 FAT file name in an OEM character set to a Null-terminated
115 @param This Protocol instance pointer.
116 @param FatSize The size of the string Fat in bytes.
117 @param Fat A pointer to a Null-terminated string that contains an 8.3 file
118 name using an OEM character set.
119 @param String A pointer to a Null-terminated Unicode string. The string must
120 be preallocated to hold FatSize Unicode characters.
126 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
134 Converts a Null-terminated Unicode string to legal characters in a FAT
135 filename using an OEM character set.
137 @param This Protocol instance pointer.
138 @param String A pointer to a Null-terminated Unicode string. The string must
139 be preallocated to hold FatSize Unicode characters.
140 @param FatSize The size of the string Fat in bytes.
141 @param Fat A pointer to a Null-terminated string that contains an 8.3 file
142 name using an OEM character set.
144 @retval TRUE Fat is a Long File Name
145 @retval FALSE Fat is an 8.3 file name
151 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
158 #define UC2_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('_', 'U', 'C', '2')
162 EFI_UNICODE_COLLATION_PROTOCOL UC2
;
163 EFI_UNICODE_COLLATION_PROTOCOL
*UC
;
166 #define UC2_PRIVATE_DATA_FROM_THIS(a) CR (a, UC2_PRIVATE_DATA, UC2, UC2_PRIVATE_DATA_SIGNATURE)
169 // Firmware Volume Protocol template
171 EFI_EVENT mUc2Registration
;
173 UC2_PRIVATE_DATA gUC2PrivateDataTemplate
= {
174 UC2_PRIVATE_DATA_SIGNATURE
,
193 Uc2NotificationEvent (
201 UC2_PRIVATE_DATA
*Private
;
202 EFI_UNICODE_COLLATION_PROTOCOL
*Uc2
;
205 BufferSize
= sizeof (Handle
);
206 Status
= gBS
->LocateHandle (
208 &gEfiUnicodeCollationProtocolGuid
,
213 if (EFI_ERROR (Status
)) {
215 // Exit Path of While Loop....
221 // Skip this handle if the Firmware Volume Protocol is already installed
223 Status
= gBS
->HandleProtocol (
225 &gEfiUnicodeCollation2ProtocolGuid
,
228 if (!EFI_ERROR (Status
)) {
233 // Allocate private data structure
235 Private
= AllocateCopyPool (sizeof (UC2_PRIVATE_DATA
), &gUC2PrivateDataTemplate
);
236 if (Private
== NULL
) {
241 // Retrieve the UC Protocol
243 Status
= gBS
->HandleProtocol (
245 &gEfiUnicodeCollationProtocolGuid
,
246 (VOID
**)&Private
->UC
248 ASSERT_EFI_ERROR (Status
);
251 // Fill in rest of private data structure
253 Private
->UC2
.SupportedLanguages
= AllocateZeroPool (RFC_3066_ENTRY_SIZE
);
254 Status
= ConvertIso639LanguageToRfc3066Language (Private
->UC
->SupportedLanguages
, Private
->UC2
.SupportedLanguages
);
256 if (!EFI_ERROR (Status
)) {
259 // Install Firmware Volume Protocol onto same handle
261 Status
= gBS
->InstallMultipleProtocolInterfaces (
263 &gEfiUnicodeCollation2ProtocolGuid
,
267 ASSERT_EFI_ERROR (Status
);
274 The user Entry Point for DXE driver. The user code starts with this function
275 as the real entry point for the image goes into a library that calls this
278 @param[in] ImageHandle The firmware allocated handle for the EFI image.
279 @param[in] SystemTable A pointer to the EFI System Table.
281 @retval EFI_SUCCESS The entry point is executed successfully.
282 @retval other Some error occurs when executing this entry point.
288 IN EFI_HANDLE ImageHandle
,
289 IN EFI_SYSTEM_TABLE
*SystemTable
292 EfiCreateProtocolNotifyEvent (
293 &gEfiUnicodeCollationProtocolGuid
,
295 Uc2NotificationEvent
,
304 Performs a case-insensitive comparison of two Null-terminated Unicode
307 @param This Protocol instance pointer.
308 @param Str1 A pointer to a Null-terminated Unicode string.
309 @param Str2 A pointer to a Null-terminated Unicode string.
311 @retval 0 Str1 is equivalent to Str2
312 @retval > 0 Str1 is lexically greater than Str2
313 @retval < 0 Str1 is lexically less than Str2
319 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
324 UC2_PRIVATE_DATA
*Private
;
326 Private
= UC2_PRIVATE_DATA_FROM_THIS (This
);
328 return Private
->UC
->StriColl (Private
->UC
, Str1
, Str2
);
333 Converts all the Unicode characters in a Null-terminated Unicode string to
334 lower case Unicode characters.
336 @param This Protocol instance pointer.
337 @param Str A pointer to a Null-terminated Unicode string.
343 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
347 UC2_PRIVATE_DATA
*Private
;
349 Private
= UC2_PRIVATE_DATA_FROM_THIS (This
);
351 Private
->UC
->StrLwr (Private
->UC
, Str
);
356 Converts all the Unicode characters in a Null-terminated Unicode string to upper
357 case Unicode characters.
359 @param This Protocol instance pointer.
360 @param Str A pointer to a Null-terminated Unicode string.
366 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
370 UC2_PRIVATE_DATA
*Private
;
372 Private
= UC2_PRIVATE_DATA_FROM_THIS (This
);
374 Private
->UC
->StrUpr (Private
->UC
, Str
);
378 Performs a case-insensitive comparison of a Null-terminated Unicode
379 pattern string and a Null-terminated Unicode string.
381 @param This Protocol instance pointer.
382 @param String A pointer to a Null-terminated Unicode string.
383 @param Pattern A pointer to a Null-terminated Unicode pattern string.
385 @retval TRUE Pattern was found in String.
386 @retval FALSE Pattern was not found in String.
392 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
397 UC2_PRIVATE_DATA
*Private
;
399 Private
= UC2_PRIVATE_DATA_FROM_THIS (This
);
401 return Private
->UC
->MetaiMatch (Private
->UC
, String
, Pattern
);
406 Converts an 8.3 FAT file name in an OEM character set to a Null-terminated
409 @param This Protocol instance pointer.
410 @param FatSize The size of the string Fat in bytes.
411 @param Fat A pointer to a Null-terminated string that contains an 8.3 file
412 name using an OEM character set.
413 @param String A pointer to a Null-terminated Unicode string. The string must
414 be preallocated to hold FatSize Unicode characters.
420 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
426 UC2_PRIVATE_DATA
*Private
;
428 Private
= UC2_PRIVATE_DATA_FROM_THIS (This
);
430 Private
->UC
->FatToStr (Private
->UC
, FatSize
, Fat
, String
);
435 Converts a Null-terminated Unicode string to legal characters in a FAT
436 filename using an OEM character set.
438 @param This Protocol instance pointer.
439 @param String A pointer to a Null-terminated Unicode string. The string must
440 be preallocated to hold FatSize Unicode characters.
441 @param FatSize The size of the string Fat in bytes.
442 @param Fat A pointer to a Null-terminated string that contains an 8.3 file
443 name using an OEM character set.
445 @retval TRUE Fat is a Long File Name
446 @retval FALSE Fat is an 8.3 file name
452 IN EFI_UNICODE_COLLATION_PROTOCOL
*This
,
458 UC2_PRIVATE_DATA
*Private
;
460 Private
= UC2_PRIVATE_DATA_FROM_THIS (This
);
462 return Private
->UC
->StrToFat (Private
->UC
, String
, FatSize
, Fat
);