summaryrefslogtreecommitdiff
path: root/EdkCompatibilityPkg/Compatibility/Uc2OnUcThunk/Uc2ToUcThunk.c
diff options
context:
space:
mode:
Diffstat (limited to 'EdkCompatibilityPkg/Compatibility/Uc2OnUcThunk/Uc2ToUcThunk.c')
-rw-r--r--EdkCompatibilityPkg/Compatibility/Uc2OnUcThunk/Uc2ToUcThunk.c458
1 files changed, 458 insertions, 0 deletions
diff --git a/EdkCompatibilityPkg/Compatibility/Uc2OnUcThunk/Uc2ToUcThunk.c b/EdkCompatibilityPkg/Compatibility/Uc2OnUcThunk/Uc2ToUcThunk.c
new file mode 100644
index 0000000000..7bc94018b8
--- /dev/null
+++ b/EdkCompatibilityPkg/Compatibility/Uc2OnUcThunk/Uc2ToUcThunk.c
@@ -0,0 +1,458 @@
+/** @file
+Module produce UC2 on top of UC.
+
+UEFI 2.1 specification supersedes Inte's EFI Specification 1.10.
+EFI_UNICODE_COLLATION_PROTOCOL defined in Inte's EFI Specification 1.10 is replaced by
+EFI_UNICODE_COLLATION_PROTOCOL in UEFI 2.1.
+This module produces UC2 on top of UC. This module is used on platform when both of
+these two conditions are true:
+1) EFI 1.10 module producing UC present
+2) And the rest of modules on the platform consume UC2
+
+Copyright (c) 2006 - 2008 Intel Corporation. <BR>
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution. The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+Module Name:
+
+**/
+
+#include <PiDxe.h>
+#include <Protocol/UnicodeCollation.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiDriverEntryPoint.h>
+#include <Library/UefiLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/HiiLib.h>
+
+
+
+/**
+ Performs a case-insensitive comparison of two Null-terminated Unicode
+ strings.
+
+ @param This Protocol instance pointer.
+ @param Str1 A pointer to a Null-terminated Unicode string.
+ @param Str2 A pointer to a Null-terminated Unicode string.
+
+ @retval 0 Str1 is equivalent to Str2
+ @retval > 0 Str1 is lexically greater than Str2
+ @retval < 0 Str1 is lexically less than Str2
+
+**/
+INTN
+EFIAPI
+StriColl (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN CHAR16 *Str1,
+ IN CHAR16 *Str2
+ );
+
+/**
+ Converts all the Unicode characters in a Null-terminated Unicode string to
+ lower case Unicode characters.
+
+ @param This Protocol instance pointer.
+ @param Str A pointer to a Null-terminated Unicode string.
+
+**/
+VOID
+EFIAPI
+StrLwr (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN OUT CHAR16 *Str
+ );
+
+/**
+ Converts all the Unicode characters in a Null-terminated Unicode string to upper
+ case Unicode characters.
+
+ @param This Protocol instance pointer.
+ @param Str A pointer to a Null-terminated Unicode string.
+
+**/
+VOID
+EFIAPI
+StrUpr (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN OUT CHAR16 *Str
+ );
+
+/**
+ Performs a case-insensitive comparison of a Null-terminated Unicode
+ pattern string and a Null-terminated Unicode string.
+
+ @param This Protocol instance pointer.
+ @param String A pointer to a Null-terminated Unicode string.
+ @param Pattern A pointer to a Null-terminated Unicode pattern string.
+
+ @retval TRUE Pattern was found in String.
+ @retval FALSE Pattern was not found in String.
+
+**/
+BOOLEAN
+EFIAPI
+MetaiMatch (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN CHAR16 *String,
+ IN CHAR16 *Pattern
+ );
+
+/**
+ Converts an 8.3 FAT file name in an OEM character set to a Null-terminated
+ Unicode string.
+
+ @param This Protocol instance pointer.
+ @param FatSize The size of the string Fat in bytes.
+ @param Fat A pointer to a Null-terminated string that contains an 8.3 file
+ name using an OEM character set.
+ @param String A pointer to a Null-terminated Unicode string. The string must
+ be preallocated to hold FatSize Unicode characters.
+
+**/
+VOID
+EFIAPI
+FatToStr (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN UINTN FatSize,
+ IN CHAR8 *Fat,
+ OUT CHAR16 *String
+ );
+
+/**
+ Converts a Null-terminated Unicode string to legal characters in a FAT
+ filename using an OEM character set.
+
+ @param This Protocol instance pointer.
+ @param String A pointer to a Null-terminated Unicode string. The string must
+ be preallocated to hold FatSize Unicode characters.
+ @param FatSize The size of the string Fat in bytes.
+ @param Fat A pointer to a Null-terminated string that contains an 8.3 file
+ name using an OEM character set.
+
+ @retval TRUE Fat is a Long File Name
+ @retval FALSE Fat is an 8.3 file name
+
+**/
+BOOLEAN
+EFIAPI
+StrToFat (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN CHAR16 *String,
+ IN UINTN FatSize,
+ OUT CHAR8 *Fat
+ );
+
+#define UC2_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('_', 'U', 'C', '2')
+
+typedef struct {
+ UINT32 Signature;
+ EFI_UNICODE_COLLATION_PROTOCOL UC2;
+ EFI_UNICODE_COLLATION_PROTOCOL *UC;
+} UC2_PRIVATE_DATA;
+
+#define UC2_PRIVATE_DATA_FROM_THIS(a) CR (a, UC2_PRIVATE_DATA, UC2, UC2_PRIVATE_DATA_SIGNATURE)
+
+//
+// Firmware Volume Protocol template
+//
+EFI_EVENT mUc2Registration;
+
+UC2_PRIVATE_DATA gUC2PrivateDataTemplate = {
+ UC2_PRIVATE_DATA_SIGNATURE,
+ {
+ StriColl,
+ MetaiMatch,
+ StrLwr,
+ StrUpr,
+ FatToStr,
+ StrToFat,
+ NULL
+ },
+ NULL
+};
+
+//
+// Module globals
+//
+
+VOID
+EFIAPI
+UcNotificationEvent (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+ UINTN BufferSize;
+ EFI_HANDLE Handle;
+ UC2_PRIVATE_DATA *Private;
+ EFI_UNICODE_COLLATION_PROTOCOL *Uc2;
+
+ while (TRUE) {
+ BufferSize = sizeof (Handle);
+ Status = gBS->LocateHandle (
+ ByRegisterNotify,
+ &gEfiUnicodeCollationProtocolGuid,
+ mUc2Registration,
+ &BufferSize,
+ &Handle
+ );
+ if (EFI_ERROR (Status)) {
+ //
+ // Exit Path of While Loop....
+ //
+ break;
+ }
+
+ //
+ // Skip this handle if the Firmware Volume Protocol is already installed
+ //
+ Status = gBS->HandleProtocol (
+ Handle,
+ &gEfiUnicodeCollation2ProtocolGuid,
+ (VOID **)&Uc2
+ );
+ if (!EFI_ERROR (Status)) {
+ continue;
+ }
+
+ //
+ // Allocate private data structure
+ //
+ Private = AllocateCopyPool (sizeof (UC2_PRIVATE_DATA), &gUC2PrivateDataTemplate);
+ if (Private == NULL) {
+ continue;
+ }
+
+ //
+ // Retrieve the UC Protocol
+ //
+ Status = gBS->HandleProtocol (
+ Handle,
+ &gEfiUnicodeCollationProtocolGuid,
+ (VOID **)&Private->UC
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Fill in rest of private data structure
+ //
+ Private->UC2.SupportedLanguages = AllocateZeroPool (RFC_3066_ENTRY_SIZE);
+ Status = ConvertIso639LanguageToRfc3066Language (Private->UC->SupportedLanguages, Private->UC2.SupportedLanguages);
+
+ if (!EFI_ERROR (Status)) {
+
+ //
+ // Install Firmware Volume Protocol onto same handle
+ //
+ Status = gBS->InstallMultipleProtocolInterfaces (
+ &Handle,
+ &gEfiUnicodeCollation2ProtocolGuid,
+ &Private->UC2,
+ NULL
+ );
+ ASSERT_EFI_ERROR (Status);
+ }
+ }
+}
+
+
+/**
+ The user Entry Point for DXE driver. The user code starts with this function
+ as the real entry point for the image goes into a library that calls this
+ function.
+
+ @param[in] ImageHandle The firmware allocated handle for the EFI image.
+ @param[in] SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The entry point is executed successfully.
+ @retval other Some error occurs when executing this entry point.
+
+**/
+EFI_STATUS
+EFIAPI
+InitializeUC2 (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EfiCreateProtocolNotifyEvent (
+ &gEfiUnicodeCollationProtocolGuid,
+ TPL_CALLBACK,
+ UcNotificationEvent,
+ NULL,
+ &mUc2Registration
+ );
+ return EFI_SUCCESS;
+}
+
+
+/**
+ Performs a case-insensitive comparison of two Null-terminated Unicode
+ strings.
+
+ @param This Protocol instance pointer.
+ @param Str1 A pointer to a Null-terminated Unicode string.
+ @param Str2 A pointer to a Null-terminated Unicode string.
+
+ @retval 0 Str1 is equivalent to Str2
+ @retval > 0 Str1 is lexically greater than Str2
+ @retval < 0 Str1 is lexically less than Str2
+
+**/
+INTN
+EFIAPI
+StriColl (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN CHAR16 *Str1,
+ IN CHAR16 *Str2
+ )
+{
+ UC2_PRIVATE_DATA *Private;
+
+ Private = UC2_PRIVATE_DATA_FROM_THIS (This);
+
+ return Private->UC->StriColl (Private->UC, Str1, Str2);
+}
+
+
+/**
+ Converts all the Unicode characters in a Null-terminated Unicode string to
+ lower case Unicode characters.
+
+ @param This Protocol instance pointer.
+ @param Str A pointer to a Null-terminated Unicode string.
+
+**/
+VOID
+EFIAPI
+StrLwr (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN OUT CHAR16 *Str
+ )
+{
+ UC2_PRIVATE_DATA *Private;
+
+ Private = UC2_PRIVATE_DATA_FROM_THIS (This);
+
+ Private->UC->StrLwr (Private->UC, Str);
+}
+
+
+/**
+ Converts all the Unicode characters in a Null-terminated Unicode string to upper
+ case Unicode characters.
+
+ @param This Protocol instance pointer.
+ @param Str A pointer to a Null-terminated Unicode string.
+
+**/
+VOID
+EFIAPI
+StrUpr (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN OUT CHAR16 *Str
+ )
+{
+ UC2_PRIVATE_DATA *Private;
+
+ Private = UC2_PRIVATE_DATA_FROM_THIS (This);
+
+ Private->UC->StrUpr (Private->UC, Str);
+}
+
+/**
+ Performs a case-insensitive comparison of a Null-terminated Unicode
+ pattern string and a Null-terminated Unicode string.
+
+ @param This Protocol instance pointer.
+ @param String A pointer to a Null-terminated Unicode string.
+ @param Pattern A pointer to a Null-terminated Unicode pattern string.
+
+ @retval TRUE Pattern was found in String.
+ @retval FALSE Pattern was not found in String.
+
+**/
+BOOLEAN
+EFIAPI
+MetaiMatch (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN CHAR16 *String,
+ IN CHAR16 *Pattern
+ )
+{
+ UC2_PRIVATE_DATA *Private;
+
+ Private = UC2_PRIVATE_DATA_FROM_THIS (This);
+
+ return Private->UC->MetaiMatch (Private->UC, String, Pattern);
+}
+
+
+/**
+ Converts an 8.3 FAT file name in an OEM character set to a Null-terminated
+ Unicode string.
+
+ @param This Protocol instance pointer.
+ @param FatSize The size of the string Fat in bytes.
+ @param Fat A pointer to a Null-terminated string that contains an 8.3 file
+ name using an OEM character set.
+ @param String A pointer to a Null-terminated Unicode string. The string must
+ be preallocated to hold FatSize Unicode characters.
+
+**/
+VOID
+EFIAPI
+FatToStr (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN UINTN FatSize,
+ IN CHAR8 *Fat,
+ OUT CHAR16 *String
+ )
+{
+ UC2_PRIVATE_DATA *Private;
+
+ Private = UC2_PRIVATE_DATA_FROM_THIS (This);
+
+ Private->UC->FatToStr (Private->UC, FatSize, Fat, String);
+}
+
+
+/**
+ Converts a Null-terminated Unicode string to legal characters in a FAT
+ filename using an OEM character set.
+
+ @param This Protocol instance pointer.
+ @param String A pointer to a Null-terminated Unicode string. The string must
+ be preallocated to hold FatSize Unicode characters.
+ @param FatSize The size of the string Fat in bytes.
+ @param Fat A pointer to a Null-terminated string that contains an 8.3 file
+ name using an OEM character set.
+
+ @retval TRUE Fat is a Long File Name
+ @retval FALSE Fat is an 8.3 file name
+
+**/
+BOOLEAN
+EFIAPI
+StrToFat (
+ IN EFI_UNICODE_COLLATION_PROTOCOL *This,
+ IN CHAR16 *String,
+ IN UINTN FatSize,
+ OUT CHAR8 *Fat
+ )
+{
+ UC2_PRIVATE_DATA *Private;
+
+ Private = UC2_PRIVATE_DATA_FROM_THIS (This);
+
+ return Private->UC->StrToFat (Private->UC, String, FatSize, Fat);
+}
+