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