]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add in FrameworkHiiToUefiHiiThunk module.
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 3 Apr 2008 09:59:39 +0000 (09:59 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Thu, 3 Apr 2008 09:59:39 +0000 (09:59 +0000)
For now, it support these Framework HII protocol interfaces, more will be added:
1) NewPack
2) RemovePack
3) NewString
4) GetString

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4991 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Fonts.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Forms.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf [new file with mode: 0644]
EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/HiiDatabase.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/HiiDatabase.h [new file with mode: 0644]
EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Keyboard.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Package.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Strings.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Utility.c [new file with mode: 0644]
EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Utility.h [new file with mode: 0644]

diff --git a/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Fonts.c b/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Fonts.c
new file mode 100644 (file)
index 0000000..eadc5b3
--- /dev/null
@@ -0,0 +1,68 @@
+/**@file\r
+\r
+  This file contains the Glyph related function.\r
+\r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+\r
+#include "HiiDatabase.h"\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetGlyph (\r
+  IN     EFI_HII_PROTOCOL   *This,\r
+  IN     CHAR16             *Source,\r
+  IN OUT UINT16             *Index,\r
+  OUT    UINT8              **GlyphBuffer,\r
+  OUT    UINT16             *BitWidth,\r
+  IN OUT UINT32             *InternalStatus\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Translates a Unicode character into the corresponding font glyph.\r
+  If the Source was pointing to a non-spacing character, the next Source[*Index]\r
+  character will be parsed and OR'd to the GlyphBuffer until a spacing character\r
+  is found in the Source.  Since non-spacing characters are considered to be the\r
+  same pixel width as a regular character their BitWidth will be reflected correctly\r
+  however due to their special attribute, they are considered to be zero advancing width.\r
+  This basically means that the cursor would not advance, thus the character that follows\r
+  it would overlay the non-spacing character.  The Index is modified to reflect both the\r
+  incoming array entry into the Source string but also the outgoing array entry after having\r
+  parsed the equivalent of a single Glyph's worth of data.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGlyphToBlt (\r
+  IN     EFI_HII_PROTOCOL              *This,\r
+  IN     UINT8                         *GlyphBuffer,\r
+  IN     EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground,\r
+  IN     EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background,\r
+  IN     UINTN                         Count,\r
+  IN     UINTN                         Width,\r
+  IN     UINTN                         Height,\r
+  IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer\r
+  )\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_SUCCESS;\r
+}\r
diff --git a/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Forms.c b/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Forms.c
new file mode 100644 (file)
index 0000000..0e49e20
--- /dev/null
@@ -0,0 +1,154 @@
+/**@file\r
+  This file contains the form processing code to the HII database.\r
+\r
+Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+\r
+#include "HiiDatabase.h"\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiExportDatabase (\r
+  IN     EFI_HII_PROTOCOL *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE    Handle,\r
+  IN OUT UINTN            *BufferSize,\r
+  OUT    VOID             *Buffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function allows a program to extract a form or form package that has\r
+  previously been registered with the EFI HII database.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_UNSUPPORTED;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetForms (\r
+  IN     EFI_HII_PROTOCOL   *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE      Handle,\r
+  IN     EFI_FORM_ID        FormId,\r
+  IN OUT UINTN              *BufferLengthTemp,\r
+  OUT    UINT8              *Buffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function allows a program to extract a form or form package that has\r
+  previously been registered with the EFI HII database.\r
+\r
+Arguments:\r
+  This         - A pointer to the EFI_HII_PROTOCOL instance.\r
+\r
+  Handle       - Handle on which the form resides. Type FRAMEWORK_EFI_HII_HANDLE  is defined in\r
+                 EFI_HII_PROTOCOL.NewPack() in the Packages section.\r
+\r
+  FormId       - The ID of the form to return. If the ID is zero, the entire form package is returned.\r
+                 Type EFI_FORM_ID is defined in "Related Definitions" below.\r
+\r
+  BufferLength - On input, the length of the Buffer. On output, the length of the returned buffer, if\r
+                 the length was sufficient and, if it was not, the length that is required to fit the\r
+                 requested form(s).\r
+\r
+  Buffer       - The buffer designed to receive the form(s).\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           -  Buffer filled with the requested forms. BufferLength\r
+                           was updated.\r
+\r
+  EFI_INVALID_PARAMETER -  The handle is unknown.\r
+\r
+  EFI_NOT_FOUND         -  A form on the requested handle cannot be found with the\r
+                           requested FormId.\r
+\r
+  EFI_BUFFER_TOO_SMALL  - The buffer provided was not large enough to allow the form to be stored.\r
+\r
+--*/\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_UNSUPPORTED;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetDefaultImage (\r
+  IN     EFI_HII_PROTOCOL            *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE    Handle,\r
+  IN     UINTN                       DefaultMask,\r
+  OUT    EFI_HII_VARIABLE_PACK_LIST  **VariablePackList\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+\r
+  This function allows a program to extract the NV Image\r
+  that represents the default storage image\r
+\r
+  Arguments:\r
+    This             - A pointer to the EFI_HII_PROTOCOL instance.\r
+    Handle           - The HII handle from which will have default data retrieved.\r
+    UINTN            - Mask used to retrieve the default image.\r
+    VariablePackList - Callee allocated, tightly-packed, link list data\r
+                         structure that contain all default varaible packs\r
+                         from the Hii Database.\r
+\r
+  Returns:\r
+    EFI_NOT_FOUND         - If Hii database does not contain any default images.\r
+    EFI_INVALID_PARAMETER - Invalid input parameter.\r
+    EFI_SUCCESS           - Operation successful.\r
+\r
+--*/\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiUpdateForm (\r
+  IN EFI_HII_PROTOCOL       *This,\r
+  IN FRAMEWORK_EFI_HII_HANDLE          Handle,\r
+  IN EFI_FORM_LABEL         Label,\r
+  IN BOOLEAN                AddData,\r
+  IN EFI_HII_UPDATE_DATA    *Data\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  This function allows the caller to update a form that has\r
+  previously been registered with the EFI HII database.\r
+\r
+Arguments:\r
+  Handle     - Hii Handle associated with the Formset to modify\r
+  Label      - Update information starting immediately after this label in the IFR\r
+  AddData    - If TRUE, add data.  If FALSE, remove data\r
+  Data       - If adding data, this is the pointer to the data to add\r
+\r
+Returns:\r
+  EFI_SUCCESS - Update success.\r
+  Other       - Update fail.\r
+\r
+--*/\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
diff --git a/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf b/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/FrameworkHiiToUefiHiiThunk.inf
new file mode 100644 (file)
index 0000000..38f7a9b
--- /dev/null
@@ -0,0 +1,75 @@
+#/** @file\r
+# Component description file for HiiDatabase module which produce a Framework HII instance\r
+#  based on the avaliable UEFI HII protocol found in the platform.\r
+#\r
+# This module inits HII database and installs HII protocol based on the avaliable UEFI HII protocol found in the platform..\r
+# Copyright (c) 2006 - 2008, Intel Corporation\r
+#\r
+#  All rights reserved. This program and the accompanying materials\r
+#  are licensed and made available under the terms and conditions of the BSD License\r
+#  which accompanies this distribution. The full text of the license may be found at\r
+#  http://opensource.org/licenses/bsd-license.php\r
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+#\r
+#\r
+#**/\r
+\r
+[Defines]\r
+  INF_VERSION                    = 0x00010005\r
+  BASE_NAME                      = FrameworkHiiToUefiHiiThunk\r
+  FILE_GUID                      = AC3435BB-B1D3-4EF8-957C-8048606FF671\r
+  MODULE_TYPE                    = DXE_DRIVER\r
+  VERSION_STRING                 = 1.0\r
+  EDK_RELEASE_VERSION            = 0x00020000\r
+  EFI_SPECIFICATION_VERSION      = 0x00020000\r
+\r
+  ENTRY_POINT                    = InitializeHiiDatabase\r
+\r
+#\r
+# The following information is for reference only and not required by the build tools.\r
+#\r
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC\r
+#\r
+\r
+[Sources.common]\r
+  Keyboard.c\r
+  Fonts.c\r
+  Package.c\r
+  Strings.c\r
+  Forms.c\r
+  HiiDatabase.h\r
+  HiiDatabase.c\r
+  Utility.c\r
+  Utility.h\r
+\r
+\r
+[Packages]\r
+  MdePkg/MdePkg.dec\r
+  IntelFrameworkPkg/IntelFrameworkPkg.dec\r
+\r
+[LibraryClasses]\r
+  UefiRuntimeServicesTableLib\r
+  UefiBootServicesTableLib\r
+  BaseMemoryLib\r
+  MemoryAllocationLib\r
+  UefiDriverEntryPoint\r
+  DebugLib\r
+  BaseLib\r
+  HiiLib\r
+\r
+\r
+\r
+[Protocols]\r
+  gEfiHiiProtocolGuid\r
+  gEfiHiiImageProtocolGuid\r
+  gEfiHiiDatabaseProtocolGuid\r
+  gEfiHiiStringProtocolGuid\r
+  gEfiHiiFontProtocolGuid\r
+\r
+[Depex]\r
+  gEfiHiiImageProtocolGuid AND\r
+  gEfiHiiDatabaseProtocolGuid AND\r
+  gEfiHiiStringProtocolGuid AND\r
+  gEfiHiiFontProtocolGuid\r
+\r
diff --git a/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/HiiDatabase.c b/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
new file mode 100644 (file)
index 0000000..c7d339e
--- /dev/null
@@ -0,0 +1,207 @@
+/**@file\r
+\r
+Framework to UEFI 2.1 HII Thunk\r
+\r
+Copyright (c) 2003, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#include "HiiDatabase.h"\r
+\r
+\r
+EFI_HII_THUNK_PRIVATE_DATA HiiThunkPrivateDataTempate = {\r
+  {//Signature\r
+    EFI_HII_THUNK_DRIVER_DATA_SIGNATURE \r
+  },\r
+  {//Handle\r
+    (EFI_HANDLE) NULL\r
+  },\r
+  { //Hii\r
+    HiiNewPack,\r
+    HiiRemovePack,\r
+    HiiFindHandles,\r
+    HiiExportDatabase,\r
+    \r
+    HiiTestString,\r
+    HiiGetGlyph,\r
+    HiiGlyphToBlt,\r
+    \r
+    HiiNewString,\r
+    HiiGetPrimaryLanguages,\r
+    HiiGetSecondaryLanguages,\r
+    HiiGetString,\r
+    HiiResetStrings,\r
+    HiiGetLine,\r
+    HiiGetForms,\r
+    HiiGetDefaultImage,\r
+    HiiUpdateForm,\r
+    \r
+    HiiGetKeyboardLayout\r
+  },\r
+  { //StaticHiiHandle\r
+    //The FRAMEWORK_EFI_HII_HANDLE starts from 1 \r
+    // and increase upwords untill reach 2^(sizeof (FRAMEWORK_EFI_HII_HANDLE)) - 1. \r
+    // The code will assert to prevent overflow.\r
+    (FRAMEWORK_EFI_HII_HANDLE) 1 \r
+  },\r
+  {\r
+    NULL, NULL                  //HiiHandleLinkList\r
+  },\r
+};\r
+\r
+EFI_HII_DATABASE_PROTOCOL *mUefiHiiDatabaseProtocol;\r
+EFI_HII_FONT_PROTOCOL     *mUefiHiiFontProtocol;\r
+EFI_HII_IMAGE_PROTOCOL    *mUefiHiiImageProtocol;\r
+EFI_HII_STRING_PROTOCOL   *mUefiStringProtocol;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+InitializeHiiDatabase (\r
+  IN EFI_HANDLE           ImageHandle,\r
+  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Initialize HII Database\r
+\r
+Arguments:\r
+  (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
+\r
+Returns:\r
+  EFI_SUCCESS - Setup loaded.\r
+  other       - Setup Error\r
+\r
+--*/\r
+{\r
+  EFI_HII_THUNK_PRIVATE_DATA *HiiData;\r
+  EFI_HANDLE                 Handle;\r
+  EFI_STATUS                 Status;\r
+\r
+  ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
+\r
+  HiiData = AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA), &HiiThunkPrivateDataTempate);\r
+  ASSERT (HiiData != NULL);\r
+  InitializeListHead (&HiiData->HiiThunkHandleMappingDBListHead);\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiDatabaseProtocolGuid,\r
+                  NULL,\r
+                  (VOID **) &mUefiHiiDatabaseProtocol\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiFontProtocolGuid,\r
+                  NULL,\r
+                  (VOID **) &mUefiHiiFontProtocol\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiImageProtocolGuid,\r
+                  NULL,\r
+                  (VOID **) &mUefiHiiImageProtocol\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = gBS->LocateProtocol (\r
+                  &gEfiHiiStringProtocolGuid,\r
+                  NULL,\r
+                  (VOID **) &mUefiStringProtocol\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  //\r
+  // Install protocol interface\r
+  //\r
+  Handle = NULL;\r
+  Status = gBS->InstallProtocolInterface (\r
+                  &HiiData->Handle,\r
+                  &gEfiHiiProtocolGuid,\r
+                  EFI_NATIVE_INTERFACE,\r
+                  (VOID *) &HiiData->Hii\r
+                  );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiFindHandles (\r
+  IN     EFI_HII_PROTOCOL *This,\r
+  IN OUT UINT16           *HandleBufferLength,\r
+  OUT    FRAMEWORK_EFI_HII_HANDLE    Handle[1]\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Determines the handles that are currently active in the database.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetPrimaryLanguages (\r
+  IN  EFI_HII_PROTOCOL      *This,\r
+  IN  FRAMEWORK_EFI_HII_HANDLE         Handle,\r
+  OUT EFI_STRING            *LanguageString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function allows a program to determine what the primary languages that are supported on a given handle.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetSecondaryLanguages (\r
+  IN  EFI_HII_PROTOCOL      *This,\r
+  IN  FRAMEWORK_EFI_HII_HANDLE         Handle,\r
+  IN  CHAR16                *PrimaryLanguage,\r
+  OUT EFI_STRING            *LanguageString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function allows a program to determine which secondary languages are supported\r
+  on a given handle for a given primary language.\r
+\r
+  Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
diff --git a/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/HiiDatabase.h b/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/HiiDatabase.h
new file mode 100644 (file)
index 0000000..f0ef02e
--- /dev/null
@@ -0,0 +1,322 @@
+/**@file\r
+\r
+  This file contains global defines and prototype definitions\r
+  for the HII database.\r
+  \r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _HIIDATABASE_H\r
+#define _HIIDATABASE_H\r
+\r
+\r
+#include <FrameworkDxe.h>\r
+\r
+#include <Guid/GlobalVariable.h>\r
+#include <Protocol/FrameworkFormCallback.h>\r
+#include <Protocol/FrameworkHii.h>\r
+\r
+//\r
+// UEFI HII Protocols\r
+//\r
+#include <Protocol/HiiFont.h>\r
+#include <Protocol/HiiImage.h>\r
+#include <Protocol/HiiString.h>\r
+#include <Protocol/HiiDatabase.h>\r
+#include <Protocol/HiiConfigRouting.h>\r
+#include <Protocol/HiiConfigAccess.h>\r
+\r
+\r
+#include <Library/BaseLib.h>\r
+#include <Library/DebugLib.h>\r
+#include <Library/UefiDriverEntryPoint.h>\r
+#include <Library/MemoryAllocationLib.h>\r
+#include <Library/BaseMemoryLib.h>\r
+#include <Library/UefiBootServicesTableLib.h>\r
+#include <Library/UefiRuntimeServicesTableLib.h>\r
+#include <Library/FrameworkIfrSupportLib.h>\r
+#include <Library/HiiLib.h>\r
+#include "Utility.h"\r
+\r
+//\r
+// Macros\r
+//\r
+\r
+\r
+//\r
+// Typedef\r
+//\r
+\r
+typedef struct {\r
+  UINT32                  BinaryLength;\r
+  EFI_HII_PACKAGE_HEADER  PackageHeader;\r
+} TIANO_AUTOGEN_PACKAGES_HEADER;\r
+\r
+#define EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(Record)   CR(Record, EFI_HII_THUNK_PRIVATE_DATA, Hii, EFI_HII_THUNK_DRIVER_DATA_SIGNATURE)\r
+#define EFI_HII_THUNK_DRIVER_DATA_SIGNATURE            EFI_SIGNATURE_32 ('H', 'i', 'I', 'T')\r
+typedef struct {\r
+  UINTN                    Signature;\r
+  EFI_HANDLE               Handle;\r
+  EFI_HII_PROTOCOL         Hii;\r
+  FRAMEWORK_EFI_HII_HANDLE StaticHiiHandle;\r
+\r
+  //\r
+  // This LIST_ENTRY is the list head which has HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY type \r
+  // as list entry.\r
+  //\r
+  LIST_ENTRY               HiiThunkHandleMappingDBListHead;\r
+  \r
+} EFI_HII_THUNK_PRIVATE_DATA;\r
+\r
+\r
+#define HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY(Record) CR(Record, HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY, List, HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE)\r
+#define HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE            EFI_SIGNATURE_32 ('H', 'T', 'H', 'M')\r
+typedef struct {\r
+  LIST_ENTRY                List;\r
+  UINT32                    Signature;\r
+  FRAMEWORK_EFI_HII_HANDLE  FrameworkHiiHandle;\r
+  EFI_HII_HANDLE            UefiHiiHandle;\r
+\r
+  BOOLEAN                   IsPackageListWithOnlyStringPackages;\r
+  //\r
+  // The field below is only valid if IsPackageListWithOnlyStringPack is TRUE.\r
+  // The HII 0.92 version of HII data implementation in EDK 1.03 and 1.04 make an the following assumption\r
+  // in both HII Database implementation and all modules that registering packages:\r
+  // If a Package List has only IFR package and no String Package, the String Package containing the strings \r
+  // referenced by this IFR package is in another Package List\r
+  // registered with the HII database with the same EFI_HII_PACKAGES.GuidId.\r
+  //\r
+  //\r
+  // Only valid if IsPackageListWithSingleStringPack is TRUE.\r
+  // UEFI Package List Head Pointer, pointing to a allocated buffer containing the package\r
+  //\r
+  EFI_HII_PACKAGE_LIST_HEADER *UefiStringPackageListHeader; //Only valid if IsStringPack is TRUE.\r
+                                                            //This UEFI Package list only consists of a list of string packages.\r
+\r
+  EFI_GUID                   TagGuid;\r
+  //\r
+  // TRUE if the package list identified by UefiHiiHandle imports String Packages from \r
+  // other package list with IsPackageListWithOnlyStringPackages is TRUE.\r
+  //\r
+  BOOLEAN                    DoesPackageListImportStringPackages;\r
+  EFI_HII_PACKAGE_LIST_HEADER *ImportedUefiStringPackageListHeader; //Only valid if DoesPackageListImportStringPackages is true.\r
+\r
+} HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY;\r
+\r
+//\r
+// Extern Variables\r
+//\r
+extern EFI_HII_DATABASE_PROTOCOL *mUefiHiiDatabaseProtocol;\r
+extern EFI_HII_FONT_PROTOCOL     *mUefiHiiFontProtocol;\r
+extern EFI_HII_IMAGE_PROTOCOL    *mUefiHiiImageProtocol;\r
+extern EFI_HII_STRING_PROTOCOL   *mUefiStringProtocol;\r
+\r
+//\r
+// Prototypes\r
+//\r
+\r
+//\r
+// Public Interface Prototypes\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+InitializeHiiDatabase (\r
+  IN EFI_HANDLE             ImageHandle,\r
+  IN EFI_SYSTEM_TABLE       *SystemTable\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiNewPack (\r
+  IN  EFI_HII_PROTOCOL      *This,\r
+  IN  EFI_HII_PACKAGES      *PackageList,\r
+  OUT FRAMEWORK_EFI_HII_HANDLE         *Handle\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiRemovePack (\r
+  IN EFI_HII_PROTOCOL    *This,\r
+  IN FRAMEWORK_EFI_HII_HANDLE       Handle\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiFindHandles (\r
+  IN     EFI_HII_PROTOCOL    *This,\r
+  IN OUT UINT16              *HandleBufferLength,\r
+  OUT    FRAMEWORK_EFI_HII_HANDLE       *Handle\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiExportDatabase (\r
+  IN     EFI_HII_PROTOCOL *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE    Handle,\r
+  IN OUT UINTN            *BufferSize,\r
+  OUT    VOID             *Buffer\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetGlyph (\r
+  IN     EFI_HII_PROTOCOL    *This,\r
+  IN     CHAR16              *Source,\r
+  IN OUT UINT16              *Index,\r
+  OUT    UINT8               **GlyphBuffer,\r
+  OUT    UINT16              *BitWidth,\r
+  IN OUT UINT32              *InternalStatus\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGlyphToBlt (\r
+  IN     EFI_HII_PROTOCOL              *This,\r
+  IN     UINT8                         *GlyphBuffer,\r
+  IN     EFI_GRAPHICS_OUTPUT_BLT_PIXEL Foreground,\r
+  IN     EFI_GRAPHICS_OUTPUT_BLT_PIXEL Background,\r
+  IN     UINTN                         Count,\r
+  IN     UINTN                         Width,\r
+  IN     UINTN                         Height,\r
+  IN OUT EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiNewString (\r
+  IN     EFI_HII_PROTOCOL        *This,\r
+  IN     CHAR16                  *Language,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE Handle,\r
+  IN OUT STRING_REF              *Reference,\r
+  IN     CHAR16                  *NewString\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetString (\r
+  IN     EFI_HII_PROTOCOL    *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE       Handle,\r
+  IN     STRING_REF          Token,\r
+  IN     BOOLEAN             Raw,\r
+  IN     CHAR16              *LanguageString,\r
+  IN OUT UINTN               *BufferLength,\r
+  OUT    EFI_STRING          StringBuffer\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiResetStrings (\r
+  IN     EFI_HII_PROTOCOL    *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE       Handle\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiTestString (\r
+  IN     EFI_HII_PROTOCOL    *This,\r
+  IN     CHAR16              *StringToTest,\r
+  IN OUT UINT32              *FirstMissing,\r
+  OUT    UINT32              *GlyphBufferSize\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetPrimaryLanguages (\r
+  IN  EFI_HII_PROTOCOL      *This,\r
+  IN  FRAMEWORK_EFI_HII_HANDLE         Handle,\r
+  OUT EFI_STRING            *LanguageString\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetSecondaryLanguages (\r
+  IN  EFI_HII_PROTOCOL      *This,\r
+  IN  FRAMEWORK_EFI_HII_HANDLE         Handle,\r
+  IN  CHAR16                *PrimaryLanguage,\r
+  OUT EFI_STRING            *LanguageString\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetLine (\r
+  IN     EFI_HII_PROTOCOL    *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE       Handle,\r
+  IN     STRING_REF          Token,\r
+  IN OUT UINT16              *Index,\r
+  IN     UINT16              LineWidth,\r
+  IN     CHAR16              *LanguageString,\r
+  IN OUT UINT16              *BufferLength,\r
+  OUT    EFI_STRING          StringBuffer\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetForms (\r
+  IN     EFI_HII_PROTOCOL    *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE       Handle,\r
+  IN     EFI_FORM_ID         FormId,\r
+  IN OUT UINTN               *BufferLength,\r
+  OUT    UINT8               *Buffer\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetDefaultImage (\r
+  IN     EFI_HII_PROTOCOL           *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE   Handle,\r
+  IN     UINTN                      DefaultMask,\r
+  OUT    EFI_HII_VARIABLE_PACK_LIST **VariablePackList\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiUpdateForm (\r
+  IN EFI_HII_PROTOCOL       *This,\r
+  IN FRAMEWORK_EFI_HII_HANDLE          Handle,\r
+  IN EFI_FORM_LABEL         Label,\r
+  IN BOOLEAN                AddData,\r
+  IN EFI_HII_UPDATE_DATA    *Data\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetKeyboardLayout (\r
+  IN     EFI_HII_PROTOCOL    *This,\r
+  OUT    UINT16              *DescriptorCount,\r
+  OUT    FRAMEWORK_EFI_KEY_DESCRIPTOR  *Descriptor\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+HiiCompareLanguage (\r
+  IN  CHAR16                *LanguageStringLocation,\r
+  IN  CHAR16                *Language\r
+  )\r
+;\r
+\r
+#endif\r
diff --git a/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Keyboard.c b/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Keyboard.c
new file mode 100644 (file)
index 0000000..d54c9b9
--- /dev/null
@@ -0,0 +1,37 @@
+/**@file\r
+\r
+  This file contains the keyboard processing code to the HII database.\r
+\r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+\r
+#include "HiiDatabase.h"\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetKeyboardLayout (\r
+  IN     EFI_HII_PROTOCOL   *This,\r
+  OUT    UINT16             *DescriptorCount,\r
+  OUT    FRAMEWORK_EFI_KEY_DESCRIPTOR *Descriptor\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
diff --git a/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Package.c b/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Package.c
new file mode 100644 (file)
index 0000000..2a1407c
--- /dev/null
@@ -0,0 +1,518 @@
+/**@file\r
+\r
+  This file contains the keyboard processing code to the HII database.\r
+\r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+\r
+#include "HiiDatabase.h"\r
+\r
+\r
+EFI_STATUS\r
+GetIfrAndStringPackNum (\r
+  IN CONST EFI_HII_PACKAGES               *Packages,\r
+  UINTN                                   *IfrPackNum,\r
+  UINTN                                   *StringPackNum\r
+  )\r
+{\r
+  UINTN                         Index;\r
+  TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
+\r
+  ASSERT (Packages != NULL);\r
+  ASSERT (IfrPackNum != NULL);\r
+  ASSERT (StringPackNum != NULL);\r
+\r
+  *IfrPackNum = 0;\r
+  *StringPackNum = 0;\r
+\r
+  TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) (((UINT8 *) &Packages->GuidId) + sizeof (Packages->GuidId));\r
+  for (Index = 0; Index < Packages->NumberOfPackages; Index++) {\r
+    //\r
+    // BugBug: The current UEFI HII build tool generate a binary in the format defined in: \r
+    // TIANO_AUTOGEN_PACKAGES_HEADER. We assume that all packages generated in\r
+    // this binary is with same package type. So the returned IfrPackNum and StringPackNum\r
+    // may not be the exact number of valid package number in the binary generated \r
+    // by HII Build tool.\r
+    //\r
+    switch (TianoAutogenPackageHdrArray[Index]->PackageHeader.Type) {\r
+      case EFI_HII_PACKAGE_FORM:\r
+        *IfrPackNum += 1;\r
+        break;\r
+      case EFI_HII_PACKAGE_STRINGS:\r
+        *StringPackNum += 1;\r
+        break;\r
+\r
+      case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
+        break;\r
+\r
+      //\r
+      // The following fonts are invalid for a module that using Framework to UEFI thunk layer.\r
+      //\r
+      case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
+      case EFI_HII_PACKAGE_FONTS:\r
+      case EFI_HII_PACKAGE_IMAGES:\r
+      default:\r
+        ASSERT (FALSE);\r
+        return EFI_INVALID_PARAMETER;\r
+        break;\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS \r
+LibExportPackageLists (\r
+  IN EFI_HII_HANDLE                    UefiHiiHandle,\r
+  OUT EFI_HII_PACKAGE_LIST_HEADER      **PackageListHeader,\r
+  OUT UINTN                            *PackageListSize\r
+  )\r
+{\r
+  EFI_STATUS                       Status;\r
+  UINTN                            Size;\r
+  EFI_HII_PACKAGE_LIST_HEADER      *PackageListHdr;\r
+\r
+  ASSERT (PackageListSize != NULL);\r
+  ASSERT (PackageListHeader != NULL);\r
+\r
+  Size = 0;\r
+  PackageListHdr = NULL;\r
+  Status = mUefiHiiDatabaseProtocol->ExportPackageLists (\r
+                                      mUefiHiiDatabaseProtocol,\r
+                                      UefiHiiHandle,\r
+                                      &Size,\r
+                                      PackageListHdr\r
+                                      );\r
+  ASSERT_EFI_ERROR (Status == EFI_BUFFER_TOO_SMALL);\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    PackageListHdr = AllocateZeroPool (Size);\r
+    ASSERT (PackageListHdr != NULL);\r
+    \r
+    if (PackageListHeader == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    } else {\r
+      Status = mUefiHiiDatabaseProtocol->ExportPackageLists (\r
+                                          mUefiHiiDatabaseProtocol,\r
+                                          UefiHiiHandle,\r
+                                          &Size,\r
+                                          PackageListHdr\r
+                                           );\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
+  }\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    *PackageListHeader = PackageListHdr;\r
+    *PackageListSize   = Size;\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+BOOLEAN\r
+IsOnlyStringPackagesInPackageList (\r
+  IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader\r
+  )\r
+{\r
+  EFI_HII_PACKAGE_HEADER *PackageHeader;\r
+\r
+  PackageHeader = (EFI_HII_PACKAGE_HEADER *) (StringPackageListHeader + 1);\r
+\r
+  while (PackageHeader->Type != EFI_HII_PACKAGE_END) {\r
+    PackageHeader = (EFI_HII_PACKAGE_HEADER *) (PackageHeader );\r
+  }\r
+}\r
+  \r
+\r
+EFI_STATUS\r
+InsertStringPackagesToIfrPackageList (\r
+  IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader,\r
+  IN EFI_HII_HANDLE                    UefiHiiHandle  \r
+ )\r
+{\r
+  EFI_STATUS                  Status;\r
+  Status = mUefiHiiDatabaseProtocol->UpdatePackageList (\r
+                                        mUefiHiiDatabaseProtocol,\r
+                                        UefiHiiHandle,\r
+                                        StringPackageListHeader\r
+                                        );\r
+\r
+  return Status;\r
+}\r
+\r
+\r
+/**\r
+  Removes a node from a doubly linked list, and returns the node that follows\r
+  the removed node.\r
+\r
+  Removes the node Entry from a doubly linked list. It is up to the caller of\r
+  this function to release the memory used by this node if that is required. On\r
+  exit, the node following Entry in the doubly linked list is returned. If\r
+  Entry is the only node in the linked list, then the head node of the linked\r
+  list is returned.\r
+\r
+  If Entry is NULL, then ASSERT().\r
+  If Entry is the head node of an empty list, then ASSERT().\r
+  If PcdMaximumLinkedListLength is not zero, and the number of nodes in the\r
+  linked list containing Entry, including the Entry node, is greater than\r
+  or equal to PcdMaximumLinkedListLength, then ASSERT().\r
+\r
+  @param  Entry A pointer to a node in a linked list\r
+\r
+  @return Entry\r
+\r
+**/\r
+EFI_STATUS\r
+AddStringPackagesToMatchingIfrPackageList (\r
+  IN       EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
+  IN CONST EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader\r
+  )\r
+{\r
+  EFI_STATUS                 Status;\r
+  LIST_ENTRY                 *ListEntry;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+\r
+  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
+       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
+       ListEntry = ListEntry->ForwardLink\r
+       ) {\r
+    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+    if (CompareGuid (&StringPackageListHeader->PackageListGuid, &HandleMapEntry->TagGuid)) {\r
+      Status = InsertStringPackagesToIfrPackageList (StringPackageListHeader, HandleMapEntry->UefiHiiHandle);\r
+    }\r
+  }\r
+  \r
+  return EFI_NOT_FOUND;\r
+}\r
+EFI_HII_PACKAGE_LIST_HEADER *\r
+PrepareUefiPackageListFromFrameworkHiiPackages (\r
+  IN CONST EFI_HII_PACKAGES            *Packages,\r
+  IN CONST EFI_GUID                    *GuidId  OPTIONAL\r
+  )\r
+{\r
+  UINTN                       NumberOfPackages;\r
+  EFI_HII_PACKAGE_LIST_HEADER *PackageListHeader;\r
+  UINT8                       *PackageListData;\r
+  UINT32                      PackageListLength;\r
+  UINT32                      PackageLength;\r
+  EFI_HII_PACKAGE_HEADER      PackageHeader;\r
+  UINTN                       Index;\r
+  TIANO_AUTOGEN_PACKAGES_HEADER **TianoAutogenPackageHdrArray;\r
+\r
+  TianoAutogenPackageHdrArray = (TIANO_AUTOGEN_PACKAGES_HEADER **) ((UINT8 *) &Packages->GuidId + sizeof (Packages->GuidId));\r
+  NumberOfPackages = Packages->NumberOfPackages;\r
+\r
+  PackageListLength = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
+\r
+  for (Index = 0; Index < NumberOfPackages; Index++) {\r
+    CopyMem (&PackageLength, &TianoAutogenPackageHdrArray[Index]->BinaryLength, sizeof (UINT32));\r
+    PackageListLength += PackageLength;\r
+  }\r
+\r
+  //\r
+  // Include the lenght of EFI_HII_PACKAGE_END\r
+  //\r
+  PackageListLength += sizeof (EFI_HII_PACKAGE_HEADER);\r
+  PackageListHeader = AllocateZeroPool (PackageListLength);\r
+  ASSERT (PackageListHeader != NULL);\r
+  if (GuidId == NULL) {\r
+    CopyMem (&PackageListHeader->PackageListGuid, Packages->GuidId, sizeof (EFI_GUID));\r
+  } else {\r
+    CopyMem (&PackageListHeader->PackageListGuid, GuidId, sizeof (EFI_GUID));\r
+  }\r
+  PackageListHeader->PackageLength = PackageListLength;\r
+\r
+  PackageListData = ((UINT8 *) PackageListHeader) + sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
+\r
+  for (Index = 0; Index < NumberOfPackages; Index++) {\r
+    CopyMem (&PackageLength, &(TianoAutogenPackageHdrArray[Index]->BinaryLength), sizeof (UINT32));\r
+    PackageLength  -= sizeof (UINT32);\r
+    CopyMem (PackageListData, &(TianoAutogenPackageHdrArray[Index]->PackageHeader), PackageLength);\r
+    PackageListData += PackageLength;\r
+  }\r
+\r
+  //\r
+  // Append EFI_HII_PACKAGE_END\r
+  //\r
+  PackageHeader.Type = EFI_HII_PACKAGE_END;\r
+  PackageHeader.Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
+  CopyMem (PackageListData, &PackageHeader, PackageHeader.Length);\r
+\r
+  return PackageListHeader;  \r
+}\r
+\r
+EFI_GUID *\r
+UefiGeneratePackageListGuidId (\r
+  IN CONST EFI_HII_PACKAGES * Packages\r
+  )\r
+{\r
+  EFI_GUID                 *Guid;\r
+  UINT64                   MonotonicCount;\r
+\r
+  Guid = AllocateCopyPool (sizeof (EFI_GUID), Packages->GuidId);\r
+  \r
+  gBS->GetNextMonotonicCount (&MonotonicCount);\r
+  //\r
+  // Use Monotonic Count as a psedo random number generator.\r
+  //\r
+  *((UINT64 *) Guid) = *((UINT64 *) Guid) + MonotonicCount;\r
+  \r
+  return Guid;\r
+}\r
+\r
+EFI_STATUS\r
+FindAndAddStringPackageToIfrPackageList(\r
+  EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
+  EFI_GUID                    *GuidId,\r
+  EFI_HII_HANDLE              UefiIfrHiiHandle\r
+  )\r
+{\r
+  EFI_STATUS                 Status;\r
+  LIST_ENTRY                 *ListEntry;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+  EFI_HII_PACKAGE_LIST_HEADER *StringPackageListHeader;\r
+  UINTN                      Size;\r
+\r
+  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
+       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
+       ListEntry = ListEntry->ForwardLink\r
+       ) {\r
+    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+    if (CompareGuid (GuidId, &HandleMapEntry->TagGuid) && (!HandleMapEntry->DoesPackageListImportStringPackages)) {\r
+      Status = LibExportPackageLists (HandleMapEntry->UefiHiiHandle, &StringPackageListHeader, &Size);\r
+      ASSERT_EFI_ERROR (Status);\r
+\r
+      //\r
+      // Add Function to only get only String Packages from the Package List\r
+      //\r
+\r
+      Status = InsertStringPackagesToIfrPackageList (StringPackageListHeader, UefiIfrHiiHandle);\r
+      ASSERT_EFI_ERROR (Status);\r
+      \r
+      FreePool (StringPackageListHeader);\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+\r
+}\r
+\r
+EFI_STATUS\r
+InstallDefaultUefiConfigAccessProtocol (\r
+  IN  EFI_HII_PACKAGES            *Packages,\r
+  OUT EFI_HANDLE                  *Handle\r
+  )\r
+{\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+UefiRegisterPackageList(\r
+  EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
+  EFI_HII_PACKAGES            *Packages,\r
+  FRAMEWORK_EFI_HII_HANDLE    *Handle\r
+  )\r
+{\r
+  EFI_STATUS                  Status;\r
+  UINTN                       StringPackNum;\r
+  UINTN                       IfrPackNum;\r
+  EFI_HII_PACKAGE_LIST_HEADER *UefiPackageListHeader;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMappingEntry;\r
+  EFI_GUID                    *GuidId;\r
+  EFI_HANDLE                  UefiHiiDriverHandle;\r
+\r
+  GuidId = NULL;\r
+  UefiHiiDriverHandle = NULL;\r
+\r
+  Status = GetIfrAndStringPackNum (Packages, &IfrPackNum, &StringPackNum);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  HandleMappingEntry = AllocateZeroPool (sizeof (*HandleMappingEntry));\r
+  ASSERT (HandleMappingEntry != NULL);\r
+  \r
+  HandleMappingEntry->Signature = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE;\r
+  HandleMappingEntry->FrameworkHiiHandle = Private->StaticHiiHandle++;\r
+  CopyGuid (&HandleMappingEntry->TagGuid, Packages->GuidId);\r
+\r
+  if ((StringPackNum == 0) && (IfrPackNum != 0)) {\r
+    //\r
+    // UEFI HII database does not allow two package list with the same GUID.\r
+    // In Framework HII implementation, Packages->GuidId is used as an identifier to associate \r
+    // a PackageList with only IFR to a Package list the with String package.\r
+    //\r
+    GuidId = UefiGeneratePackageListGuidId (Packages);\r
+  }\r
+\r
+  //\r
+  // UEFI HII require EFI_HII_CONFIG_ACCESS_PROTOCOL to be installed on a EFI_HANDLE, so\r
+  // that Setup Utility will load the Buffer Storage\r
+  //\r
+  if (IfrPackNum != 0) {\r
+    InstallDefaultUefiConfigAccessProtocol (Packages, &UefiHiiDriverHandle);\r
+  }\r
+  UefiPackageListHeader = PrepareUefiPackageListFromFrameworkHiiPackages (Packages, GuidId);\r
+  Status = mUefiHiiDatabaseProtocol->NewPackageList (\r
+              mUefiHiiDatabaseProtocol,\r
+              UefiPackageListHeader,  \r
+              UefiHiiDriverHandle,\r
+              &HandleMappingEntry->UefiHiiHandle\r
+              );\r
+  ASSERT_EFI_ERROR (Status);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
+  \r
+  if (IfrPackNum == 0) {\r
+    if (StringPackNum != 0) {\r
+      //\r
+      // Look for a package list with IFR Pack which has already registed with HII Database\r
+      //\r
+      HandleMappingEntry->IsPackageListWithOnlyStringPackages = TRUE;\r
+      Status = AddStringPackagesToMatchingIfrPackageList (\r
+                  Private,\r
+                  UefiPackageListHeader\r
+                );\r
+\r
+      if (!EFI_ERROR (Status) || Status == EFI_NOT_FOUND) {\r
+\r
+        if (Status == EFI_NOT_FOUND) {\r
+          Status = EFI_SUCCESS;\r
+        }\r
+      }\r
+    }\r
+  } else {\r
+    if (StringPackNum == 0) {\r
+      //\r
+      // Register the Package List to UEFI HII first.\r
+      //\r
+      Status = FindAndAddStringPackageToIfrPackageList (\r
+                  Private,\r
+                  Packages->GuidId,\r
+                  HandleMappingEntry->UefiHiiHandle\r
+                  );\r
+      ASSERT_EFI_ERROR (Status);\r
+      if (!EFI_ERROR (Status)) {\r
+        HandleMappingEntry->DoesPackageListImportStringPackages = TRUE;\r
+      }\r
+    }\r
+  }\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    InsertTailList (&Private->HiiThunkHandleMappingDBListHead, &HandleMappingEntry->List);\r
+  }\r
+\r
+Done:\r
+  if (EFI_ERROR (Status)) {\r
+    FreePool (HandleMappingEntry);\r
+  } else {\r
+    *Handle = HandleMappingEntry->FrameworkHiiHandle;\r
+  }\r
+\r
+  FreePool (UefiPackageListHeader);\r
+  SafeFreePool (GuidId);\r
+  \r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiNewPack (\r
+  IN  EFI_HII_PROTOCOL               *This,\r
+  IN  EFI_HII_PACKAGES               *Packages,\r
+  OUT FRAMEWORK_EFI_HII_HANDLE       *Handle\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Extracts the various packs from a package list.\r
+\r
+Arguments:\r
+\r
+  This      - Pointer of HII protocol.\r
+  Packages  - Pointer of HII packages.\r
+  Handle    - Handle value to be returned.\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS           - Pacakges has added to HII database successfully.\r
+  EFI_INVALID_PARAMETER - Invalid parameter.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                 Status;\r
+  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+\r
+  if (Handle == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if (Packages == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+\r
+  Status = UefiRegisterPackageList (\r
+              Private,\r
+              Packages,\r
+              Handle\r
+            );\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiRemovePack (\r
+  IN EFI_HII_PROTOCOL    *This,\r
+  IN FRAMEWORK_EFI_HII_HANDLE       Handle\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Removes the various packs from a Handle\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                 Status;\r
+  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+  LIST_ENTRY                 *ListEntry;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+\r
+  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+\r
+  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
+       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
+       ListEntry = ListEntry->ForwardLink\r
+       ) {\r
+    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+\r
+    if (Handle == HandleMapEntry->FrameworkHiiHandle) {\r
+      Status = mUefiHiiDatabaseProtocol->RemovePackageList (\r
+                                            mUefiHiiDatabaseProtocol,\r
+                                            HandleMapEntry->UefiHiiHandle\r
+                                            );\r
+      ASSERT_EFI_ERROR (Status);\r
+\r
+      RemoveEntryList (ListEntry);\r
+      return Status;\r
+    }\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+}\r
diff --git a/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Strings.c b/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Strings.c
new file mode 100644 (file)
index 0000000..0054ee4
--- /dev/null
@@ -0,0 +1,315 @@
+/**@file\r
+\r
+  This file contains the keyboard processing code to the HII database.\r
+\r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+\r
+#include "HiiDatabase.h"\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiTestString (\r
+  IN     EFI_HII_PROTOCOL   *This,\r
+  IN     CHAR16             *StringToTest,\r
+  IN OUT UINT32             *FirstMissing,\r
+  OUT    UINT32             *GlyphBufferSize\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Test if all of the characters in a string have corresponding font characters.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+GetTagGuidByFrameworkHiiHandle (\r
+  IN  CONST EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
+  IN        FRAMEWORK_EFI_HII_HANDLE    FrameworkHiiHandle,\r
+  OUT       EFI_GUID                    *TagGuid\r
+  )\r
+{\r
+  LIST_ENTRY                                *ListEntry;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
+\r
+  ASSERT (TagGuid != NULL);\r
+\r
+  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
+       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
+       ListEntry = ListEntry->ForwardLink\r
+       ) {\r
+\r
+    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+\r
+    if (FrameworkHiiHandle == HandleMapEntry->FrameworkHiiHandle) {\r
+      CopyGuid (TagGuid, &HandleMapEntry->TagGuid);\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+  \r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
+EFI_STATUS\r
+HiiThunkNewStringForAllStringPackages (\r
+  IN  CONST EFI_HII_THUNK_PRIVATE_DATA  *Private,\r
+  OUT CONST EFI_GUID                    *TagGuid,\r
+  IN        CHAR16                     *Language,\r
+  IN OUT    STRING_REF                 *Reference,\r
+  IN        CHAR16                     *NewString\r
+  )\r
+{\r
+  EFI_STATUS                                Status;\r
+  LIST_ENTRY                                *ListEntry;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
+  EFI_STRING_ID                             StringId1;\r
+  EFI_STRING_ID                             StringId2;\r
+  CHAR8                                     *UefiStringProtocolLanguage;\r
+  BOOLEAN                                   Found;\r
+\r
+  ASSERT (TagGuid != NULL);\r
+\r
+  StringId1 = (EFI_STRING_ID) 0;\r
+  StringId2 = (EFI_STRING_ID) 0;\r
+  Found = FALSE;\r
+\r
+  //\r
+  // BugBug: We will handle the case that Language is not NULL later.\r
+  //\r
+  ASSERT (Language == NULL);\r
+  \r
+  //if (Language == NULL) {\r
+    UefiStringProtocolLanguage = NULL;\r
+  //}\r
+\r
+  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
+       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
+       ListEntry = ListEntry->ForwardLink\r
+       ) {\r
+\r
+    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+\r
+    if (CompareGuid (TagGuid, &HandleMapEntry->TagGuid)) {\r
+      Found = TRUE;\r
+      if (*Reference == 0) {\r
+        Status = HiiLibNewString (HandleMapEntry->UefiHiiHandle, &StringId2, NewString);\r
+      } else {\r
+        Status = HiiLibSetString (HandleMapEntry->UefiHiiHandle, *Reference, NewString);\r
+      }\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
+      }\r
+      if (*Reference == 0) {\r
+        if (StringId1 == (EFI_STRING_ID) 0) {\r
+          StringId1 = StringId2;\r
+        } else {\r
+          if (StringId1 != StringId2) {\r
+            ASSERT(FALSE);\r
+            return EFI_INVALID_PARAMETER;\r
+          }\r
+        }\r
+      }\r
+    }\r
+  }\r
+\r
+  if (Found) {\r
+    *Reference = StringId1;\r
+    Status = EFI_SUCCESS;\r
+  } else {\r
+    Status = EFI_NOT_FOUND;\r
+  }\r
+  \r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiNewString (\r
+  IN     EFI_HII_PROTOCOL           *This,\r
+  IN     CHAR16                     *Language,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE   Handle,\r
+  IN OUT STRING_REF                 *Reference,\r
+  IN     CHAR16                     *NewString\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  This function allows a new String to be added to an already existing String Package.\r
+  We will make a buffer the size of the package + StrSize of the new string.  We will\r
+  copy the string package that first gets changed and the following language packages until\r
+  we encounter the NULL string package.  All this time we will ensure that the offsets have\r
+  been adjusted.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                 Status;\r
+  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+  EFI_GUID                   TagGuid;\r
+\r
+  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+\r
+  Status = GetTagGuidByFrameworkHiiHandle (Private, Handle, &TagGuid);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = HiiThunkNewStringForAllStringPackages (Private, &TagGuid, Language, Reference, NewString);\r
+  ASSERT_EFI_ERROR (Status);  \r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiResetStrings (\r
+  IN     EFI_HII_PROTOCOL   *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE      Handle\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+    This function removes any new strings that were added after the initial string export for this handle.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_UNSUPPORTED;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetString (\r
+  IN     EFI_HII_PROTOCOL    *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE       Handle,\r
+  IN     STRING_REF          Token,\r
+  IN     BOOLEAN             Raw,\r
+  IN     CHAR16              *LanguageString,\r
+  IN OUT UINTN               *BufferLengthTemp,\r
+  OUT    EFI_STRING          StringBuffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function extracts a string from a package already registered with the EFI HII database.\r
+\r
+Arguments:\r
+  This            - A pointer to the EFI_HII_PROTOCOL instance.\r
+  Handle          - The HII handle on which the string resides.\r
+  Token           - The string token assigned to the string.\r
+  Raw             - If TRUE, the string is returned unedited in the internal storage format described\r
+                    above. If false, the string returned is edited by replacing <cr> with <space>\r
+                    and by removing special characters such as the <wide> prefix.\r
+  LanguageString  - Pointer to a NULL-terminated string containing a single ISO 639-2 language\r
+                    identifier, indicating the language to print. If the LanguageString is empty (starts\r
+                    with a NULL), the default system language will be used to determine the language.\r
+  BufferLength    - Length of the StringBuffer. If the status reports that the buffer width is too\r
+                    small, this parameter is filled with the length of the buffer needed.\r
+  StringBuffer    - The buffer designed to receive the characters in the string. Type EFI_STRING is\r
+                    defined in String.\r
+\r
+Returns:\r
+  EFI_INVALID_PARAMETER - If input parameter is invalid.\r
+  EFI_BUFFER_TOO_SMALL  - If the *BufferLength is too small.\r
+  EFI_SUCCESS           - Operation is successful.\r
+\r
+--*/\r
+{\r
+  LIST_ENTRY                                *ListEntry;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
+  CHAR8                                     *AsciiLanguage;\r
+  EFI_HII_THUNK_PRIVATE_DATA                *Private;\r
+\r
+  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+\r
+  if (LanguageString == NULL) {\r
+    AsciiLanguage = NULL;\r
+  } else {\r
+    AsciiLanguage = AllocateZeroPool (StrLen (LanguageString) + 1);\r
+    if (AsciiLanguage == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    UnicodeStrToAsciiStr  (LanguageString, AsciiLanguage);\r
+  }\r
+\r
+  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
+       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
+       ListEntry = ListEntry->ForwardLink\r
+       ) {\r
+\r
+    HandleMapEntry = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_FROM_LISTENTRY (ListEntry);\r
+\r
+    if (Handle == HandleMapEntry->FrameworkHiiHandle) {\r
+      if (AsciiLanguage == NULL) {\r
+        return HiiLibGetString (HandleMapEntry->UefiHiiHandle, Token, StringBuffer, BufferLengthTemp);\r
+      } else {\r
+        return mUefiStringProtocol->GetString (\r
+                                     mUefiStringProtocol,\r
+                                     AsciiLanguage,\r
+                                     HandleMapEntry->UefiHiiHandle,\r
+                                     Token,\r
+                                     StringBuffer,\r
+                                     BufferLengthTemp,\r
+                                     NULL\r
+                                     );\r
+      }\r
+    }\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+HiiGetLine (\r
+  IN     EFI_HII_PROTOCOL   *This,\r
+  IN     FRAMEWORK_EFI_HII_HANDLE      Handle,\r
+  IN     STRING_REF         Token,\r
+  IN OUT UINT16             *Index,\r
+  IN     UINT16             LineWidth,\r
+  IN     CHAR16             *LanguageString,\r
+  IN OUT UINT16             *BufferLength,\r
+  OUT    EFI_STRING         StringBuffer\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  This function allows a program to extract a part of a string of not more than a given width.\r
+  With repeated calls, this allows a calling program to extract "lines" of text that fit inside\r
+  columns.  The effort of measuring the fit of strings inside columns is localized to this call.\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+--*/\r
+{\r
+  ASSERT (FALSE);\r
+  return EFI_UNSUPPORTED;\r
+}\r
+\r
diff --git a/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Utility.c b/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Utility.c
new file mode 100644 (file)
index 0000000..30b743e
--- /dev/null
@@ -0,0 +1,41 @@
+/**@file\r
+\r
+  This file contains the keyboard processing code to the HII database.\r
+\r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+\r
+#include "HiiDatabase.h"\r
+\r
+EFI_GUID *\r
+GetGuidOfFirstFormset (\r
+  CONST EFI_HII_FORM_PACKAGE * FormPackage\r
+) \r
+{\r
+  UINT8             *StartOfNextPackage;\r
+  EFI_IFR_OP_HEADER *OpCodeData;\r
+\r
+  StartOfNextPackage = (UINT8 *) FormPackage + FormPackage->Header.Length;\r
+  OpCodeData = (EFI_IFR_OP_HEADER *) (FormPackage + 1);\r
+\r
+  while ((UINT8 *) OpCodeData < StartOfNextPackage) {\r
+    if (OpCodeData->OpCode == EFI_IFR_FORM_SET_OP) {\r
+      return &(((EFI_IFR_FORM_SET *) OpCodeData)->Guid);\r
+    }\r
+    OpCodeData = (EFI_IFR_OP_HEADER *) ((UINT8 *) OpCodeData + OpCodeData->Length);\r
+  }\r
+\r
+  ASSERT (FALSE);\r
+\r
+  return NULL;\r
+}\r
+\r
diff --git a/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Utility.h b/EdkCompatibilityPkg/Compatiblity/FrameworkHiiToUefiHiiThunk/Utility.h
new file mode 100644 (file)
index 0000000..5edde94
--- /dev/null
@@ -0,0 +1,24 @@
+/**@file\r
+\r
+  This file contains utility functions by HII Thunk Modules.\r
+  \r
+Copyright (c) 2006 - 2008, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+**/\r
+\r
+#ifndef _HII_THUNK_UTILITY_H\r
+#define _HII_THUNK_UTILITY_H\r
+\r
+EFI_GUID *\r
+GetGuidOfFirstFormset (\r
+  CONST EFI_HII_FORM_PACKAGE * FormPackage\r
+);\r
+\r
+#endif\r