]> git.proxmox.com Git - mirror_edk2.git/blob - EdkCompatibilityPkg/Compatibility/Uc2OnUcThunk/Uc2OnUcThunk.c
Program SD Cards into 4-bit mode (support for this is required in the spec). This...
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / Uc2OnUcThunk / Uc2OnUcThunk.c
1 /** @file
2 Module produce UC2 on top of UC.
3
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
11
12 Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
13 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
17
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.
20 Module Name:
21
22 **/
23
24 #include <PiDxe.h>
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>
35
36 /**
37 Performs a case-insensitive comparison of two Null-terminated Unicode
38 strings.
39
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.
43
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
47
48 **/
49 INTN
50 EFIAPI
51 StriColl (
52 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
53 IN CHAR16 *Str1,
54 IN CHAR16 *Str2
55 );
56
57 /**
58 Converts all the Unicode characters in a Null-terminated Unicode string to
59 lower case Unicode characters.
60
61 @param This Protocol instance pointer.
62 @param Str A pointer to a Null-terminated Unicode string.
63
64 **/
65 VOID
66 EFIAPI
67 StrLwr (
68 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
69 IN OUT CHAR16 *Str
70 );
71
72 /**
73 Converts all the Unicode characters in a Null-terminated Unicode string to upper
74 case Unicode characters.
75
76 @param This Protocol instance pointer.
77 @param Str A pointer to a Null-terminated Unicode string.
78
79 **/
80 VOID
81 EFIAPI
82 StrUpr (
83 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
84 IN OUT CHAR16 *Str
85 );
86
87 /**
88 Performs a case-insensitive comparison of a Null-terminated Unicode
89 pattern string and a Null-terminated Unicode string.
90
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.
94
95 @retval TRUE Pattern was found in String.
96 @retval FALSE Pattern was not found in String.
97
98 **/
99 BOOLEAN
100 EFIAPI
101 MetaiMatch (
102 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
103 IN CHAR16 *String,
104 IN CHAR16 *Pattern
105 );
106
107 /**
108 Converts an 8.3 FAT file name in an OEM character set to a Null-terminated
109 Unicode string.
110
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.
117
118 **/
119 VOID
120 EFIAPI
121 FatToStr (
122 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
123 IN UINTN FatSize,
124 IN CHAR8 *Fat,
125 OUT CHAR16 *String
126 );
127
128 /**
129 Converts a Null-terminated Unicode string to legal characters in a FAT
130 filename using an OEM character set.
131
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.
138
139 @retval TRUE Fat is a Long File Name
140 @retval FALSE Fat is an 8.3 file name
141
142 **/
143 BOOLEAN
144 EFIAPI
145 StrToFat (
146 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
147 IN CHAR16 *String,
148 IN UINTN FatSize,
149 OUT CHAR8 *Fat
150 );
151
152 #define UC2_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('_', 'U', 'C', '2')
153
154 typedef struct {
155 UINT32 Signature;
156 EFI_UNICODE_COLLATION_PROTOCOL Uc2;
157 EFI_UNICODE_COLLATION_PROTOCOL *Uc;
158 } UC2_PRIVATE_DATA;
159
160 #define UC2_PRIVATE_DATA_FROM_THIS(a) CR (a, UC2_PRIVATE_DATA, Uc2, UC2_PRIVATE_DATA_SIGNATURE)
161
162 //
163 // Firmware Volume Protocol template
164 //
165 EFI_EVENT mUc2Registration;
166
167 UC2_PRIVATE_DATA gUC2PrivateDataTemplate = {
168 UC2_PRIVATE_DATA_SIGNATURE,
169 {
170 StriColl,
171 MetaiMatch,
172 StrLwr,
173 StrUpr,
174 FatToStr,
175 StrToFat,
176 NULL
177 },
178 NULL
179 };
180
181 //
182 // Module globals
183 //
184 /**
185 This notification function is invoked when an instance of the
186 EFI_UNICODE_COLLATION_PROTOCOL is produced. It installs another instance of the
187 EFI_UNICODE_COLLATION_PROTOCOL2 on the same handle.
188
189 @param Event The event that occured
190 @param Context Context of event. Not used in this nofication function.
191
192 **/
193 VOID
194 EFIAPI
195 UcNotificationEvent (
196 IN EFI_EVENT Event,
197 IN VOID *Context
198 )
199 {
200 EFI_STATUS Status;
201 UINTN BufferSize;
202 EFI_HANDLE Handle;
203 UC2_PRIVATE_DATA *Private;
204 EFI_UNICODE_COLLATION_PROTOCOL *Uc2;
205
206 while (TRUE) {
207 BufferSize = sizeof (Handle);
208 Status = gBS->LocateHandle (
209 ByRegisterNotify,
210 &gEfiUnicodeCollationProtocolGuid,
211 mUc2Registration,
212 &BufferSize,
213 &Handle
214 );
215 if (EFI_ERROR (Status)) {
216 //
217 // Exit Path of While Loop....
218 //
219 break;
220 }
221
222 //
223 // Skip this handle if the Firmware Volume Protocol is already installed
224 //
225 Status = gBS->HandleProtocol (
226 Handle,
227 &gEfiUnicodeCollation2ProtocolGuid,
228 (VOID **)&Uc2
229 );
230 if (!EFI_ERROR (Status)) {
231 continue;
232 }
233
234 //
235 // Allocate private data structure
236 //
237 Private = AllocateCopyPool (sizeof (UC2_PRIVATE_DATA), &gUC2PrivateDataTemplate);
238 if (Private == NULL) {
239 continue;
240 }
241
242 //
243 // Retrieve the UC Protocol
244 //
245 Status = gBS->HandleProtocol (
246 Handle,
247 &gEfiUnicodeCollationProtocolGuid,
248 (VOID **)&Private->Uc
249 );
250 ASSERT_EFI_ERROR (Status);
251
252 //
253 // Fill in rest of private data structure
254 //
255 Private->Uc2.SupportedLanguages = ConvertLanguagesIso639ToRfc4646 (Private->Uc->SupportedLanguages);
256 if (Private->Uc2.SupportedLanguages != NULL) {
257
258 //
259 // Install UC2 Protocol onto same handle
260 //
261 Status = gBS->InstallMultipleProtocolInterfaces (
262 &Handle,
263 &gEfiUnicodeCollation2ProtocolGuid,
264 &Private->Uc2,
265 NULL
266 );
267 ASSERT_EFI_ERROR (Status);
268 }
269 }
270 }
271
272
273 /**
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
276 function.
277
278 @param[in] ImageHandle The firmware allocated handle for the EFI image.
279 @param[in] SystemTable A pointer to the EFI System Table.
280
281 @retval EFI_SUCCESS The entry point is executed successfully.
282 @retval other Some error occurs when executing this entry point.
283
284 **/
285 EFI_STATUS
286 EFIAPI
287 InitializeUC2 (
288 IN EFI_HANDLE ImageHandle,
289 IN EFI_SYSTEM_TABLE *SystemTable
290 )
291 {
292 EfiCreateProtocolNotifyEvent (
293 &gEfiUnicodeCollationProtocolGuid,
294 TPL_CALLBACK,
295 UcNotificationEvent,
296 NULL,
297 &mUc2Registration
298 );
299 return EFI_SUCCESS;
300 }
301
302
303 /**
304 Performs a case-insensitive comparison of two Null-terminated Unicode
305 strings.
306
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.
310
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
314
315 **/
316 INTN
317 EFIAPI
318 StriColl (
319 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
320 IN CHAR16 *Str1,
321 IN CHAR16 *Str2
322 )
323 {
324 UC2_PRIVATE_DATA *Private;
325
326 Private = UC2_PRIVATE_DATA_FROM_THIS (This);
327
328 return Private->Uc->StriColl (Private->Uc, Str1, Str2);
329 }
330
331
332 /**
333 Converts all the Unicode characters in a Null-terminated Unicode string to
334 lower case Unicode characters.
335
336 @param This Protocol instance pointer.
337 @param Str A pointer to a Null-terminated Unicode string.
338
339 **/
340 VOID
341 EFIAPI
342 StrLwr (
343 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
344 IN OUT CHAR16 *Str
345 )
346 {
347 UC2_PRIVATE_DATA *Private;
348
349 Private = UC2_PRIVATE_DATA_FROM_THIS (This);
350
351 Private->Uc->StrLwr (Private->Uc, Str);
352 }
353
354
355 /**
356 Converts all the Unicode characters in a Null-terminated Unicode string to upper
357 case Unicode characters.
358
359 @param This Protocol instance pointer.
360 @param Str A pointer to a Null-terminated Unicode string.
361
362 **/
363 VOID
364 EFIAPI
365 StrUpr (
366 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
367 IN OUT CHAR16 *Str
368 )
369 {
370 UC2_PRIVATE_DATA *Private;
371
372 Private = UC2_PRIVATE_DATA_FROM_THIS (This);
373
374 Private->Uc->StrUpr (Private->Uc, Str);
375 }
376
377 /**
378 Performs a case-insensitive comparison of a Null-terminated Unicode
379 pattern string and a Null-terminated Unicode string.
380
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.
384
385 @retval TRUE Pattern was found in String.
386 @retval FALSE Pattern was not found in String.
387
388 **/
389 BOOLEAN
390 EFIAPI
391 MetaiMatch (
392 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
393 IN CHAR16 *String,
394 IN CHAR16 *Pattern
395 )
396 {
397 UC2_PRIVATE_DATA *Private;
398
399 Private = UC2_PRIVATE_DATA_FROM_THIS (This);
400
401 return Private->Uc->MetaiMatch (Private->Uc, String, Pattern);
402 }
403
404
405 /**
406 Converts an 8.3 FAT file name in an OEM character set to a Null-terminated
407 Unicode string.
408
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.
415
416 **/
417 VOID
418 EFIAPI
419 FatToStr (
420 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
421 IN UINTN FatSize,
422 IN CHAR8 *Fat,
423 OUT CHAR16 *String
424 )
425 {
426 UC2_PRIVATE_DATA *Private;
427
428 Private = UC2_PRIVATE_DATA_FROM_THIS (This);
429
430 Private->Uc->FatToStr (Private->Uc, FatSize, Fat, String);
431 }
432
433
434 /**
435 Converts a Null-terminated Unicode string to legal characters in a FAT
436 filename using an OEM character set.
437
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.
444
445 @retval TRUE Fat is a Long File Name
446 @retval FALSE Fat is an 8.3 file name
447
448 **/
449 BOOLEAN
450 EFIAPI
451 StrToFat (
452 IN EFI_UNICODE_COLLATION_PROTOCOL *This,
453 IN CHAR16 *String,
454 IN UINTN FatSize,
455 OUT CHAR8 *Fat
456 )
457 {
458 UC2_PRIVATE_DATA *Private;
459
460 Private = UC2_PRIVATE_DATA_FROM_THIS (This);
461
462 return Private->Uc->StrToFat (Private->Uc, String, FatSize, Fat);
463 }
464