summaryrefslogtreecommitdiffstats
path: root/EdkCompatibilityPkg
diff options
context:
space:
mode:
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2008-05-20 01:41:25 +0000
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>2008-05-20 01:41:25 +0000
commita432c703fe9e172108f8d8d550e5fd49ce8679b6 (patch)
tree33801ecbc0f1a0239425519c9b467782299f79d3 /EdkCompatibilityPkg
parent29ec49a58a61db348e103111089b4b77802e3add (diff)
downloadedk2-a432c703fe9e172108f8d8d550e5fd49ce8679b6.tar.gz
edk2-a432c703fe9e172108f8d8d550e5fd49ce8679b6.tar.bz2
edk2-a432c703fe9e172108f8d8d550e5fd49ce8679b6.zip
Add UcToUc2Thunk
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5225 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'EdkCompatibilityPkg')
-rw-r--r--EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.c464
-rw-r--r--EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.inf61
2 files changed, 525 insertions, 0 deletions
diff --git a/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.c b/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.c
new file mode 100644
index 0000000000..d3685d05c7
--- /dev/null
+++ b/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.c
@@ -0,0 +1,464 @@
+/** @file
+Module produce UC on top of UC2.
+
+UEFI 2.1 specification supersedes Inte's EFI Specification 1.10.
+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 UC on top of UC2. This module is used on platform when both of
+these two conditions are true:
+1) EFI 1.10 module consuming UC present
+2) And the rest of modules on the platform produce 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 UC_PRIVATE_DATA_SIGNATURE EFI_SIGNATURE_32 ('_', 'U', 'C', '_')
+
+typedef struct {
+ UINT32 Signature;
+ EFI_UNICODE_COLLATION_PROTOCOL UC;
+ EFI_UNICODE_COLLATION_PROTOCOL *UC2;
+} UC_PRIVATE_DATA;
+
+#define UC_PRIVATE_DATA_FROM_THIS(a) CR (a, UC_PRIVATE_DATA, UC, UC_PRIVATE_DATA_SIGNATURE)
+
+//
+// Firmware Volume Protocol template
+//
+EFI_EVENT mUcRegistration;
+
+UC_PRIVATE_DATA gUCPrivateDataTemplate = {
+ UC_PRIVATE_DATA_SIGNATURE,
+ {
+ StriColl,
+ MetaiMatch,
+ StrLwr,
+ StrUpr,
+ FatToStr,
+ StrToFat,
+ NULL
+ },
+ NULL
+};
+
+//
+// Module globals
+//
+
+VOID
+EFIAPI
+Uc2NotificationEvent (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ EFI_STATUS Status;
+ UINTN BufferSize;
+ EFI_HANDLE Handle;
+ UC_PRIVATE_DATA *Private;
+ EFI_UNICODE_COLLATION_PROTOCOL *Uc2;
+
+ while (TRUE) {
+ BufferSize = sizeof (Handle);
+ Status = gBS->LocateHandle (
+ ByRegisterNotify,
+ &gEfiUnicodeCollation2ProtocolGuid,
+ mUcRegistration,
+ &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,
+ &gEfiUnicodeCollationProtocolGuid,
+ (VOID **)&Uc2
+ );
+ if (!EFI_ERROR (Status)) {
+ continue;
+ }
+
+ //
+ // Allocate private data structure
+ //
+ Private = AllocateCopyPool (sizeof (UC_PRIVATE_DATA), &gUCPrivateDataTemplate);
+ if (Private == NULL) {
+ continue;
+ }
+
+ //
+ // Retrieve the UC Protocol
+ //
+ Status = gBS->HandleProtocol (
+ Handle,
+ &gEfiUnicodeCollation2ProtocolGuid,
+ (VOID **)&Private->UC2
+ );
+ ASSERT_EFI_ERROR (Status);
+
+ //
+ // Fill in rest of private data structure
+ //
+ Private->UC.SupportedLanguages = AllocateZeroPool (ISO_639_2_ENTRY_SIZE + 1);
+ Status = ConvertRfc3066LanguageToIso639Language (Private->UC2->SupportedLanguages, Private->UC.SupportedLanguages);
+
+ if (!EFI_ERROR (Status)) {
+
+ //
+ // Install Firmware Volume Protocol onto same handle
+ //
+ Status = gBS->InstallMultipleProtocolInterfaces (
+ &Handle,
+ &gEfiUnicodeCollationProtocolGuid,
+ &Private->UC,
+ 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
+InitializeUC (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ EfiCreateProtocolNotifyEvent (
+ &gEfiUnicodeCollationProtocolGuid,
+ TPL_CALLBACK,
+ Uc2NotificationEvent,
+ NULL,
+ &mUcRegistration
+ );
+ 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
+ )
+{
+ UC_PRIVATE_DATA *Private;
+
+ Private = UC_PRIVATE_DATA_FROM_THIS (This);
+
+ return Private->UC2->StriColl (Private->UC2, 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
+ )
+{
+ UC_PRIVATE_DATA *Private;
+
+ Private = UC_PRIVATE_DATA_FROM_THIS (This);
+
+ Private->UC2->StrLwr (Private->UC2, 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
+ )
+{
+ UC_PRIVATE_DATA *Private;
+
+ Private = UC_PRIVATE_DATA_FROM_THIS (This);
+
+ Private->UC2->StrUpr (Private->UC2, 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
+ )
+{
+ UC_PRIVATE_DATA *Private;
+
+ Private = UC_PRIVATE_DATA_FROM_THIS (This);
+
+ return Private->UC2->MetaiMatch (Private->UC2, 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
+ )
+{
+ UC_PRIVATE_DATA *Private;
+
+ Private = UC_PRIVATE_DATA_FROM_THIS (This);
+
+ Private->UC2->FatToStr (Private->UC2, 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
+ )
+{
+ UC_PRIVATE_DATA *Private;
+
+ Private = UC_PRIVATE_DATA_FROM_THIS (This);
+
+ return Private->UC2->StrToFat (Private->UC2, String, FatSize, Fat);
+}
+
diff --git a/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.inf b/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.inf
new file mode 100644
index 0000000000..62c0b252e6
--- /dev/null
+++ b/EdkCompatibilityPkg/Compatibility/UcToUc2Thunk/UcToUc2Thunk.inf
@@ -0,0 +1,61 @@
+#/** @file
+# Module produce UC on top of UC2.
+#
+# UEFI 2.1 specification supersedes Inte's EFI Specification 1.10.
+# 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 UC on top of UC2. This module is used on platform when both of
+# these two conditions are true:
+# 1) EFI 1.10 module consuming UC present
+# 2) And the rest of modules on the platform produce UC2
+#
+# Copyright (c) 2006 - 2008, Intel Corporation
+#
+# 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.
+#
+#
+#**/
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = UcToUc2Thunk
+ FILE_GUID = FD76FF8E-665F-4afc-AF75-724EF5A569E5
+ MODULE_TYPE = DXE_DRIVER
+ VERSION_STRING = 1.0
+ EDK_RELEASE_VERSION = 0x00020000
+ EFI_SPECIFICATION_VERSION = 0x00020000
+ ENTRY_POINT = InitializeUC
+
+#
+# The following information is for reference only and not required by the build tools.
+#
+# VALID_ARCHITECTURES = IA32 X64 IPF EBC
+#
+
+[Sources.common]
+ UcToUc2Thunk.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ IntelFrameworkPkg/IntelFrameworkPkg.dec
+
+[LibraryClasses]
+ UefiDriverEntryPoint
+ UefiBootServicesTableLib
+ BaseLib
+ DebugLib
+ UefiLib
+ MemoryAllocationLib
+ HiiLib
+
+[Protocols]
+ gEfiUnicodeCollation2ProtocolGuid
+ gEfiUnicodeCollationProtocolGuid
+
+[Depex]
+ TRUE