]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/Uc2OnUcThunk/Uc2OnUcThunk.c
GenFds add support for PCD specified file GUID.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / Uc2OnUcThunk / Uc2OnUcThunk.c
CommitLineData
03e6b4b2 1/** @file\r
2Module produce UC2 on top of UC.\r
3\r
4UEFI 2.1 specification supersedes Inte's EFI Specification 1.10.\r
5EFI_UNICODE_COLLATION_PROTOCOL defined in Inte's EFI Specification 1.10 is replaced by\r
6EFI_UNICODE_COLLATION_PROTOCOL in UEFI 2.1.\r
7This module produces UC2 on top of UC. This module is used on platform when both of\r
8these two conditions are true:\r
91) EFI 1.10 module producing UC present\r
102) And the rest of modules on the platform consume UC2\r
11\r
12Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
13All rights reserved. This program and the accompanying materials\r
14are licensed and made available under the terms and conditions of the BSD License\r
15which accompanies this distribution. The full text of the license may be found at\r
16http://opensource.org/licenses/bsd-license.php\r
17\r
18THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
19WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
20Module Name:\r
21\r
22**/\r
23\r
24#include <PiDxe.h>\r
25#include <Protocol/UnicodeCollation.h>\r
26#include <Library/BaseLib.h>\r
27#include <Library/DebugLib.h>\r
28#include <Library/UefiBootServicesTableLib.h>\r
29#include <Library/UefiDriverEntryPoint.h>\r
30#include <Library/UefiLib.h>\r
31#include <Library/MemoryAllocationLib.h>\r
32#include <Library/HiiLib.h>\r
33\r
34\r
35\r
36/**\r
37 Performs a case-insensitive comparison of two Null-terminated Unicode \r
38 strings.\r
39\r
40 @param This Protocol instance pointer.\r
41 @param Str1 A pointer to a Null-terminated Unicode string.\r
42 @param Str2 A pointer to a Null-terminated Unicode string.\r
43\r
44 @retval 0 Str1 is equivalent to Str2\r
45 @retval > 0 Str1 is lexically greater than Str2\r
46 @retval < 0 Str1 is lexically less than Str2\r
47\r
48**/\r
49INTN\r
50EFIAPI\r
51StriColl (\r
52 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
53 IN CHAR16 *Str1,\r
54 IN CHAR16 *Str2\r
e00e1d46 55 );\r
03e6b4b2 56\r
57/**\r
58 Converts all the Unicode characters in a Null-terminated Unicode string to \r
59 lower case Unicode characters.\r
60\r
61 @param This Protocol instance pointer.\r
62 @param Str A pointer to a Null-terminated Unicode string.\r
63\r
64**/\r
65VOID\r
66EFIAPI\r
67StrLwr (\r
68 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
69 IN OUT CHAR16 *Str\r
e00e1d46 70 );\r
03e6b4b2 71\r
72/**\r
73 Converts all the Unicode characters in a Null-terminated Unicode string to upper\r
74 case Unicode characters.\r
75\r
76 @param This Protocol instance pointer.\r
77 @param Str A pointer to a Null-terminated Unicode string.\r
78\r
79**/\r
80VOID\r
81EFIAPI\r
82StrUpr (\r
83 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
84 IN OUT CHAR16 *Str\r
e00e1d46 85 );\r
03e6b4b2 86\r
87/**\r
88 Performs a case-insensitive comparison of a Null-terminated Unicode \r
89 pattern string and a Null-terminated Unicode string.\r
90\r
91 @param This Protocol instance pointer.\r
92 @param String A pointer to a Null-terminated Unicode string.\r
93 @param Pattern A pointer to a Null-terminated Unicode pattern string.\r
94\r
95 @retval TRUE Pattern was found in String.\r
96 @retval FALSE Pattern was not found in String.\r
97\r
98**/\r
99BOOLEAN\r
100EFIAPI\r
101MetaiMatch (\r
102 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
103 IN CHAR16 *String,\r
104 IN CHAR16 *Pattern\r
e00e1d46 105 );\r
03e6b4b2 106\r
107/**\r
108 Converts an 8.3 FAT file name in an OEM character set to a Null-terminated \r
109 Unicode string.\r
110\r
111 @param This Protocol instance pointer.\r
112 @param FatSize The size of the string Fat in bytes.\r
113 @param Fat A pointer to a Null-terminated string that contains an 8.3 file\r
114 name using an OEM character set.\r
115 @param String A pointer to a Null-terminated Unicode string. The string must\r
116 be preallocated to hold FatSize Unicode characters.\r
117\r
118**/\r
119VOID\r
120EFIAPI\r
121FatToStr (\r
122 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
123 IN UINTN FatSize,\r
124 IN CHAR8 *Fat,\r
125 OUT CHAR16 *String\r
e00e1d46 126 );\r
03e6b4b2 127\r
128/**\r
129 Converts a Null-terminated Unicode string to legal characters in a FAT \r
130 filename using an OEM character set. \r
131\r
132 @param This Protocol instance pointer.\r
133 @param String A pointer to a Null-terminated Unicode string. The string must\r
134 be preallocated to hold FatSize Unicode characters.\r
135 @param FatSize The size of the string Fat in bytes.\r
136 @param Fat A pointer to a Null-terminated string that contains an 8.3 file\r
137 name using an OEM character set.\r
138\r
139 @retval TRUE Fat is a Long File Name\r
140 @retval FALSE Fat is an 8.3 file name\r
141\r
142**/\r
143BOOLEAN\r
144EFIAPI\r
145StrToFat (\r
146 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
147 IN CHAR16 *String,\r
148 IN UINTN FatSize,\r
149 OUT CHAR8 *Fat\r
e00e1d46 150 );\r
03e6b4b2 151\r
a3a83173 152#define UC2_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('_', 'U', 'C', '2')\r
03e6b4b2 153\r
154typedef struct {\r
155 UINT32 Signature;\r
156 EFI_UNICODE_COLLATION_PROTOCOL UC2;\r
157 EFI_UNICODE_COLLATION_PROTOCOL *UC;\r
158} UC2_PRIVATE_DATA;\r
159\r
29ec49a5 160#define UC2_PRIVATE_DATA_FROM_THIS(a) CR (a, UC2_PRIVATE_DATA, UC2, UC2_PRIVATE_DATA_SIGNATURE)\r
03e6b4b2 161\r
162//\r
163// Firmware Volume Protocol template\r
164//\r
165EFI_EVENT mUc2Registration;\r
166\r
167UC2_PRIVATE_DATA gUC2PrivateDataTemplate = {\r
168 UC2_PRIVATE_DATA_SIGNATURE,\r
169 {\r
170 StriColl,\r
171 MetaiMatch,\r
172 StrLwr,\r
173 StrUpr,\r
174 FatToStr,\r
175 StrToFat,\r
176 NULL\r
177 },\r
178 NULL\r
179};\r
180\r
181//\r
182// Module globals\r
183//\r
184\r
185VOID\r
186EFIAPI\r
cd289975 187UcNotificationEvent (\r
03e6b4b2 188 IN EFI_EVENT Event,\r
189 IN VOID *Context\r
190 )\r
191{\r
192 EFI_STATUS Status;\r
193 UINTN BufferSize;\r
194 EFI_HANDLE Handle;\r
195 UC2_PRIVATE_DATA *Private;\r
196 EFI_UNICODE_COLLATION_PROTOCOL *Uc2;\r
197\r
198 while (TRUE) {\r
199 BufferSize = sizeof (Handle);\r
200 Status = gBS->LocateHandle (\r
201 ByRegisterNotify,\r
202 &gEfiUnicodeCollationProtocolGuid,\r
203 mUc2Registration,\r
204 &BufferSize,\r
205 &Handle\r
206 );\r
207 if (EFI_ERROR (Status)) {\r
208 //\r
209 // Exit Path of While Loop....\r
210 //\r
211 break;\r
212 }\r
213\r
214 //\r
215 // Skip this handle if the Firmware Volume Protocol is already installed\r
216 //\r
217 Status = gBS->HandleProtocol (\r
218 Handle,\r
219 &gEfiUnicodeCollation2ProtocolGuid,\r
220 (VOID **)&Uc2\r
221 );\r
222 if (!EFI_ERROR (Status)) {\r
223 continue;\r
224 }\r
225\r
226 //\r
227 // Allocate private data structure\r
228 //\r
229 Private = AllocateCopyPool (sizeof (UC2_PRIVATE_DATA), &gUC2PrivateDataTemplate);\r
230 if (Private == NULL) {\r
231 continue;\r
232 }\r
233\r
234 //\r
235 // Retrieve the UC Protocol\r
236 //\r
237 Status = gBS->HandleProtocol (\r
238 Handle,\r
239 &gEfiUnicodeCollationProtocolGuid,\r
240 (VOID **)&Private->UC\r
241 );\r
242 ASSERT_EFI_ERROR (Status);\r
243\r
244 //\r
245 // Fill in rest of private data structure\r
246 //\r
247 Private->UC2.SupportedLanguages = AllocateZeroPool (RFC_3066_ENTRY_SIZE);\r
29ec49a5 248 Status = ConvertIso639LanguageToRfc3066Language (Private->UC->SupportedLanguages, Private->UC2.SupportedLanguages);\r
03e6b4b2 249\r
250 if (!EFI_ERROR (Status)) {\r
251\r
252 //\r
253 // Install Firmware Volume Protocol onto same handle\r
254 //\r
255 Status = gBS->InstallMultipleProtocolInterfaces (\r
256 &Handle,\r
257 &gEfiUnicodeCollation2ProtocolGuid,\r
258 &Private->UC2,\r
259 NULL\r
260 );\r
261 ASSERT_EFI_ERROR (Status);\r
262 }\r
263 }\r
264}\r
265\r
266\r
267/**\r
268 The user Entry Point for DXE driver. The user code starts with this function\r
269 as the real entry point for the image goes into a library that calls this \r
270 function.\r
271\r
272 @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
273 @param[in] SystemTable A pointer to the EFI System Table.\r
274 \r
275 @retval EFI_SUCCESS The entry point is executed successfully.\r
276 @retval other Some error occurs when executing this entry point.\r
277\r
278**/\r
279EFI_STATUS\r
280EFIAPI\r
281InitializeUC2 (\r
282 IN EFI_HANDLE ImageHandle,\r
283 IN EFI_SYSTEM_TABLE *SystemTable\r
284 )\r
285{\r
286 EfiCreateProtocolNotifyEvent (\r
287 &gEfiUnicodeCollationProtocolGuid,\r
288 TPL_CALLBACK,\r
cd289975 289 UcNotificationEvent,\r
03e6b4b2 290 NULL,\r
291 &mUc2Registration\r
292 );\r
293 return EFI_SUCCESS;\r
294}\r
295\r
296\r
297/**\r
298 Performs a case-insensitive comparison of two Null-terminated Unicode \r
299 strings.\r
300\r
301 @param This Protocol instance pointer.\r
302 @param Str1 A pointer to a Null-terminated Unicode string.\r
303 @param Str2 A pointer to a Null-terminated Unicode string.\r
304\r
305 @retval 0 Str1 is equivalent to Str2\r
306 @retval > 0 Str1 is lexically greater than Str2\r
307 @retval < 0 Str1 is lexically less than Str2\r
308\r
309**/\r
310INTN\r
311EFIAPI\r
312StriColl (\r
313 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
314 IN CHAR16 *Str1,\r
315 IN CHAR16 *Str2\r
316 )\r
317{\r
318 UC2_PRIVATE_DATA *Private;\r
319 \r
320 Private = UC2_PRIVATE_DATA_FROM_THIS (This);\r
321 \r
322 return Private->UC->StriColl (Private->UC, Str1, Str2);\r
323}\r
324\r
325\r
326/**\r
327 Converts all the Unicode characters in a Null-terminated Unicode string to \r
328 lower case Unicode characters.\r
329\r
330 @param This Protocol instance pointer.\r
331 @param Str A pointer to a Null-terminated Unicode string.\r
332\r
333**/\r
334VOID\r
335EFIAPI\r
336StrLwr (\r
337 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
338 IN OUT CHAR16 *Str\r
339 )\r
340{\r
341 UC2_PRIVATE_DATA *Private;\r
342 \r
343 Private = UC2_PRIVATE_DATA_FROM_THIS (This);\r
344 \r
345 Private->UC->StrLwr (Private->UC, Str);\r
346}\r
347\r
348\r
349/**\r
350 Converts all the Unicode characters in a Null-terminated Unicode string to upper\r
351 case Unicode characters.\r
352\r
353 @param This Protocol instance pointer.\r
354 @param Str A pointer to a Null-terminated Unicode string.\r
355\r
356**/\r
357VOID\r
358EFIAPI\r
359StrUpr (\r
360 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
361 IN OUT CHAR16 *Str\r
362 )\r
363{\r
364 UC2_PRIVATE_DATA *Private;\r
365 \r
366 Private = UC2_PRIVATE_DATA_FROM_THIS (This);\r
367 \r
368 Private->UC->StrUpr (Private->UC, Str);\r
369}\r
370\r
371/**\r
372 Performs a case-insensitive comparison of a Null-terminated Unicode \r
373 pattern string and a Null-terminated Unicode string.\r
374\r
375 @param This Protocol instance pointer.\r
376 @param String A pointer to a Null-terminated Unicode string.\r
377 @param Pattern A pointer to a Null-terminated Unicode pattern string.\r
378\r
379 @retval TRUE Pattern was found in String.\r
380 @retval FALSE Pattern was not found in String.\r
381\r
382**/\r
383BOOLEAN\r
384EFIAPI\r
385MetaiMatch (\r
386 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
387 IN CHAR16 *String,\r
388 IN CHAR16 *Pattern\r
389 )\r
390{\r
391 UC2_PRIVATE_DATA *Private;\r
392 \r
393 Private = UC2_PRIVATE_DATA_FROM_THIS (This);\r
394 \r
395 return Private->UC->MetaiMatch (Private->UC, String, Pattern);\r
396}\r
397\r
398\r
399/**\r
400 Converts an 8.3 FAT file name in an OEM character set to a Null-terminated \r
401 Unicode string.\r
402\r
403 @param This Protocol instance pointer.\r
404 @param FatSize The size of the string Fat in bytes.\r
405 @param Fat A pointer to a Null-terminated string that contains an 8.3 file\r
406 name using an OEM character set.\r
407 @param String A pointer to a Null-terminated Unicode string. The string must\r
408 be preallocated to hold FatSize Unicode characters.\r
409\r
410**/\r
411VOID\r
412EFIAPI\r
413FatToStr (\r
414 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
415 IN UINTN FatSize,\r
416 IN CHAR8 *Fat,\r
417 OUT CHAR16 *String\r
418 )\r
419{\r
420 UC2_PRIVATE_DATA *Private;\r
421 \r
422 Private = UC2_PRIVATE_DATA_FROM_THIS (This);\r
423 \r
424 Private->UC->FatToStr (Private->UC, FatSize, Fat, String);\r
425}\r
426\r
427\r
428/**\r
429 Converts a Null-terminated Unicode string to legal characters in a FAT \r
430 filename using an OEM character set. \r
431\r
432 @param This Protocol instance pointer.\r
433 @param String A pointer to a Null-terminated Unicode string. The string must\r
434 be preallocated to hold FatSize Unicode characters.\r
435 @param FatSize The size of the string Fat in bytes.\r
436 @param Fat A pointer to a Null-terminated string that contains an 8.3 file\r
437 name using an OEM character set.\r
438\r
439 @retval TRUE Fat is a Long File Name\r
440 @retval FALSE Fat is an 8.3 file name\r
441\r
442**/\r
443BOOLEAN\r
444EFIAPI\r
445StrToFat (\r
446 IN EFI_UNICODE_COLLATION_PROTOCOL *This,\r
447 IN CHAR16 *String,\r
448 IN UINTN FatSize,\r
449 OUT CHAR8 *Fat\r
450 )\r
451{\r
452 UC2_PRIVATE_DATA *Private;\r
453 \r
454 Private = UC2_PRIVATE_DATA_FROM_THIS (This);\r
455 \r
456 return Private->UC->StrToFat (Private->UC, String, FatSize, Fat);\r
457}\r
458\r