]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Add in supports for platform Setup module which is programmed using Framework HII...
authorqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 7 May 2008 08:49:04 +0000 (08:49 +0000)
committerqwang12 <qwang12@6f19259b-4bc3-4df7-8a09-765794883524>
Wed, 7 May 2008 08:49:04 +0000 (08:49 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5175 6f19259b-4bc3-4df7-8a09-765794883524

EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/HiiDatabase.h
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Package.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Strings.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.c
EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Utility.h

index 205eea604b037db25a2041aa09bfba6cbcf0d1b0..17f12a75ebf5bb50bf4bb7ff3bd1fac87fb932f8 100644 (file)
@@ -42,6 +42,39 @@ Returns:
   return EFI_UNSUPPORTED;\r
 }\r
 \r
+#pragma pack(push, 1)\r
+typedef struct {\r
+  EFI_HII_PACK_HEADER            PackageHeader;\r
+  FRAMEWORK_EFI_IFR_FORM_SET     FormSet;\r
+  FRAMEWORK_EFI_IFR_END_FORM_SET EndFormSet;\r
+} FRAMEWORK_HII_FORMSET_TEMPLATE;\r
+#pragma pack(pop)\r
+\r
+FRAMEWORK_HII_FORMSET_TEMPLATE FormSetTemplate = {\r
+  {\r
+    sizeof (FRAMEWORK_HII_FORMSET_TEMPLATE),\r
+    EFI_HII_IFR\r
+  },\r
+  {\r
+    {\r
+      FRAMEWORK_EFI_IFR_FORM_SET_OP,\r
+      sizeof (FRAMEWORK_EFI_IFR_FORM_SET)\r
+    },\r
+    //Guid\r
+    {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},\r
+    0,\r
+    0,\r
+    0,\r
+    0,\r
+    0,\r
+    0\r
+  },\r
+  {\r
+    FRAMEWORK_EFI_IFR_END_FORM_SET_OP,\r
+    sizeof (FRAMEWORK_EFI_IFR_END_FORM_SET)\r
+  }\r
+};\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 HiiGetForms (\r
@@ -87,8 +120,29 @@ Returns:
 \r
 --*/\r
 {\r
-  ASSERT (FALSE);\r
-  return EFI_UNSUPPORTED;\r
+  EFI_HII_THUNK_PRIVATE_DATA                *Private;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *MapEntry;\r
+  FRAMEWORK_HII_FORMSET_TEMPLATE            *OutputFormSet;\r
+\r
+  if (*BufferLengthTemp < sizeof(FRAMEWORK_HII_FORMSET_TEMPLATE)) {\r
+    *BufferLengthTemp = sizeof(FRAMEWORK_HII_FORMSET_TEMPLATE);\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
+  \r
+  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
+\r
+  MapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
+\r
+  if (MapEntry == NULL) {\r
+    return EFI_NOT_FOUND;\r
+  }\r
+\r
+  OutputFormSet = (FRAMEWORK_HII_FORMSET_TEMPLATE *) Buffer;\r
+  \r
+  CopyMem (OutputFormSet, &FormSetTemplate, sizeof (FRAMEWORK_HII_FORMSET_TEMPLATE));\r
+  CopyMem (&OutputFormSet->FormSet.Guid, &MapEntry->TagGuid, sizeof (EFI_GUID)); \r
+  \r
+  return EFI_SUCCESS;\r
 }\r
 \r
 \r
index 09c571dfaab26631d6fd5fb67127c3af704341d4..53863d81143526af6a605fb1845858b6f1eaae3d 100644 (file)
@@ -15,8 +15,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "HiiDatabase.h"\r
 \r
+EFI_HII_THUNK_PRIVATE_DATA *mHiiThunkPrivateData;\r
 \r
-EFI_HII_THUNK_PRIVATE_DATA HiiThunkPrivateDataTempate = {\r
+EFI_HII_THUNK_PRIVATE_DATA mHiiThunkPrivateDataTempate = {\r
   {//Signature\r
     EFI_HII_THUNK_DRIVER_DATA_SIGNATURE \r
   },\r
@@ -47,10 +48,16 @@ EFI_HII_THUNK_PRIVATE_DATA HiiThunkPrivateDataTempate = {
   },\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
+    // and increase upwords untill reach the value of StaticPureUefiHiiHandle\r
     // The code will assert to prevent overflow.\r
     (FRAMEWORK_EFI_HII_HANDLE) 1 \r
   },\r
+  { //StaticPureUefiHiiHandle\r
+    //The Static FRAMEWORK_EFI_HII_HANDLE starts from 0xFFFF \r
+    // and decrease downwords untill reach the value of StaticHiiHandle. \r
+    // The code will assert to prevent overflow.\r
+    (FRAMEWORK_EFI_HII_HANDLE) 0xFFFF \r
+  },\r
   {\r
     NULL, NULL                  //HiiHandleLinkList\r
   },\r
@@ -62,6 +69,255 @@ CONST EFI_HII_IMAGE_PROTOCOL               *mHiiImageProtocol;
 CONST EFI_HII_STRING_PROTOCOL              *mHiiStringProtocol;\r
 CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mHiiConfigRoutingProtocol;\r
 \r
+EFI_STATUS\r
+RegisterUefiHiiHandle (\r
+  EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+  EFI_HII_HANDLE             UefiHiiHandle\r
+ )\r
+{\r
+  EFI_STATUS     Status;\r
+  EFI_GUID       PackageGuid;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMappingEntry;\r
+\r
+  HandleMappingEntry = AllocateZeroPool (sizeof (*HandleMappingEntry));\r
+  HandleMappingEntry->Signature = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE;\r
+\r
+  Status = AssignPureUefiHiiHandle (Private, &HandleMappingEntry->FrameworkHiiHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  \r
+  HandleMappingEntry->UefiHiiHandle = UefiHiiHandle;\r
+  Status = HiiLibExtractGuidFromHiiHandle (UefiHiiHandle, &PackageGuid);\r
+  ASSERT_EFI_ERROR (Status);\r
+  \r
+  CopyGuid(&HandleMappingEntry->TagGuid, &PackageGuid);\r
+  \r
+  InsertTailList (&Private->HiiThunkHandleMappingDBListHead, &HandleMappingEntry->List);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+\r
+EFI_STATUS\r
+UnRegisterUefiHiiHandle (\r
+  EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+  EFI_HII_HANDLE UefiHiiHandle\r
+ )\r
+{\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY     *MapEntry;\r
+\r
+  MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, UefiHiiHandle);\r
+  ASSERT (MapEntry != NULL);\r
+  \r
+  RemoveEntryList (&MapEntry->List);\r
+\r
+  FreePool (MapEntry);\r
+    \r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+AddPackNotify (\r
+  IN UINT8                              PackageType,\r
+  IN CONST EFI_GUID                     *PackageGuid,\r
+  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
+  )\r
+{\r
+  EFI_STATUS   Status;\r
+  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+\r
+  ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
+  ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK);\r
+\r
+  Status  = EFI_SUCCESS;\r
+  Private = mHiiThunkPrivateData;\r
+\r
+  //\r
+  // We only create a MapEntry if the Uefi Hii Handle is only already registered\r
+  // by the HII Thunk Layer.\r
+  //\r
+  if (UefiHiiHandleToMapDatabaseEntry (Private, Handle) == NULL) {\r
+    Status = RegisterUefiHiiHandle (Private, Handle);\r
+  } \r
+\r
+  return Status;  \r
+}\r
+EFI_STATUS\r
+EFIAPI\r
+NewPackNotify (\r
+  IN UINT8                              PackageType,\r
+  IN CONST EFI_GUID                     *PackageGuid,\r
+  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
+  )\r
+{\r
+  EFI_STATUS   Status;\r
+  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+\r
+  ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
+  ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_NEW_PACK);\r
+\r
+  if (mInFrameworkHiiNewPack) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  Status  = EFI_SUCCESS;\r
+  Private = mHiiThunkPrivateData;\r
+\r
+  //\r
+  // We only\r
+  //\r
+  if (UefiHiiHandleToMapDatabaseEntry (Private, Handle) == NULL) {\r
+    Status = RegisterUefiHiiHandle (Private, Handle);\r
+  } \r
+\r
+  return Status;\r
+}\r
+\r
+BOOLEAN\r
+IsLastStringPack (\r
+  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
+  IN EFI_HII_HANDLE                     Handle\r
+  )\r
+{\r
+  EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
+  UINTN                        BufferSize;\r
+  EFI_STATUS                   Status;\r
+  EFI_HII_PACKAGE_HEADER       *PackageHdrPtr;\r
+  EFI_HII_PACKAGE_HEADER       PackageHeader;\r
+  BOOLEAN                      Match;\r
+\r
+  Match = FALSE;\r
+  HiiPackageList = NULL;\r
+  BufferSize = 0;\r
+  Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+  ASSERT (Status != EFI_NOT_FOUND);\r
+  \r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    HiiPackageList = AllocateZeroPool (BufferSize);\r
+    ASSERT (HiiPackageList != NULL);\r
+\r
+    Status = mHiiDatabase->ExportPackageLists (mHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
+  }\r
+\r
+  \r
+  PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) HiiPackageList + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
+  CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  while (PackageHeader.Type != EFI_HII_PACKAGE_END) {\r
+    switch (PackageHeader.Type) {\r
+      case EFI_HII_PACKAGE_STRINGS:\r
+        if (CompareMem (Package, PackageHdrPtr, Package->Length) != 0) {\r
+          FreePool (HiiPackageList);\r
+          return FALSE;\r
+        }\r
+      break;      \r
+      default:\r
+        break;\r
+    }\r
+    //\r
+    // goto header of next package\r
+    //\r
+    PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHdrPtr + PackageHeader.Length);\r
+    CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
+  }\r
+\r
+  FreePool (HiiPackageList);\r
+  return TRUE;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+RemovePackNotify (\r
+  IN UINT8                              PackageType,\r
+  IN CONST EFI_GUID                     *PackageGuid,\r
+  IN CONST EFI_HII_PACKAGE_HEADER       *Package,\r
+  IN EFI_HII_HANDLE                     Handle,\r
+  IN EFI_HII_DATABASE_NOTIFY_TYPE       NotifyType\r
+  )\r
+{\r
+  EFI_STATUS   Status;\r
+  EFI_HII_THUNK_PRIVATE_DATA *Private;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY * MapEntry;\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  ASSERT (PackageType == EFI_HII_PACKAGE_STRINGS);\r
+  ASSERT (NotifyType == EFI_HII_DATABASE_NOTIFY_REMOVE_PACK);\r
+\r
+  Private = mHiiThunkPrivateData;\r
+\r
+  MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, Handle);\r
+\r
+  if (MapEntry->FrameworkHiiHandle > Private->StaticHiiHandle) {\r
+    //\r
+    // This is a PackageList registered using UEFI HII Protocol Instance.\r
+    // The MapEntry->TagGuid for this type of PackageList is a auto generated GUID\r
+    // to link StringPack with IfrPack.\r
+    // RemovePackNotify is only used to remove PackageList when it is removed by\r
+    // calling mHiiDatabase->RemovePackageList interface.\r
+    if (IsLastStringPack (Package, Handle)) {\r
+      Status = UnRegisterUefiHiiHandle (Private, Handle);\r
+    }\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+MapUefiHiiHandles (\r
+  EFI_HII_THUNK_PRIVATE_DATA *Private\r
+  )\r
+{\r
+  UINTN          HandleBufferLength;\r
+  EFI_HII_HANDLE *HandleBuffer;\r
+  EFI_STATUS     Status;\r
+  UINTN          Index;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY * MapEntry;\r
+\r
+  HandleBufferLength = 0;\r
+  HandleBuffer       = NULL;\r
+  Status = mHiiDatabase->ListPackageLists (\r
+                            mHiiDatabase,\r
+                            EFI_HII_PACKAGE_TYPE_ALL,\r
+                            NULL,\r
+                            &HandleBufferLength,\r
+                            HandleBuffer\r
+                            );\r
+  if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
+    return Status;\r
+  }\r
+\r
+  HandleBuffer = AllocateZeroPool (HandleBufferLength);\r
+  Status = mHiiDatabase->ListPackageLists (\r
+                            mHiiDatabase,\r
+                            EFI_HII_PACKAGE_TYPE_ALL,\r
+                            NULL,\r
+                            &HandleBufferLength,\r
+                            HandleBuffer\r
+                            );\r
+\r
+  for (Index = 0; Index < HandleBufferLength / sizeof (EFI_HII_HANDLE); Index++) {\r
+    MapEntry = UefiHiiHandleToMapDatabaseEntry (Private, HandleBuffer[Index]);\r
+    //\r
+    // Only register those UEFI HII Handles that are registered using the UEFI HII database interface.\r
+    //\r
+    if (MapEntry == NULL) {\r
+      Status = RegisterUefiHiiHandle (Private, HandleBuffer[Index]);\r
+      ASSERT_EFI_ERROR (Status);\r
+    }\r
+  }\r
+\r
+  return EFI_SUCCESS;                  \r
+}\r
 \r
 EFI_STATUS\r
 EFIAPI\r
@@ -89,10 +345,12 @@ Returns:
 \r
   ASSERT_PROTOCOL_ALREADY_INSTALLED (NULL, &gEfiHiiProtocolGuid);\r
 \r
-  HiiData = AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA), &HiiThunkPrivateDataTempate);\r
+  HiiData = AllocateCopyPool (sizeof (EFI_HII_THUNK_PRIVATE_DATA), &mHiiThunkPrivateDataTempate);\r
   ASSERT (HiiData != NULL);\r
   InitializeListHead (&HiiData->HiiThunkHandleMappingDBListHead);\r
 \r
+  mHiiThunkPrivateData = HiiData;\r
+\r
   Status = gBS->LocateProtocol (\r
                   &gEfiHiiDatabaseProtocolGuid,\r
                   NULL,\r
@@ -140,6 +398,39 @@ Returns:
                   );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
+  Status = MapUefiHiiHandles (HiiData);\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_STRINGS,\r
+                           NULL,\r
+                           NewPackNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
+                           &HiiData->NewPackNotifyHandle\r
+                           );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_STRINGS,\r
+                           NULL,\r
+                           AddPackNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_ADD_PACK,\r
+                           &HiiData->AddPackNotifyHandle\r
+                           );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
+  Status = mHiiDatabase->RegisterPackageNotify (\r
+                           mHiiDatabase,\r
+                           EFI_HII_PACKAGE_STRINGS,\r
+                           NULL,\r
+                           RemovePackNotify,\r
+                           EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
+                           &HiiData->RemovePackNotifyHandle\r
+                           );\r
+  ASSERT_EFI_ERROR (Status);\r
+\r
   return Status;\r
 }\r
 \r
@@ -161,7 +452,43 @@ Returns:
 \r
 --*/\r
 {\r
-  ASSERT (FALSE);\r
+  UINT16                                     Count;\r
+  LIST_ENTRY                                *ListEntry;\r
+  HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
+  EFI_HII_THUNK_PRIVATE_DATA               *Private;\r
+\r
+  if (HandleBufferLength == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);  \r
+\r
+  Count = 0;\r
+  for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
+       ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
+       ListEntry = ListEntry->ForwardLink\r
+       ) {\r
+    Count++;\r
+  }\r
+\r
+  if (Count > *HandleBufferLength) {\r
+    *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
+\r
+  Count = 0;\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
+    Handle[Count] = HandleMapEntry->FrameworkHiiHandle;\r
+  \r
+    Count++;\r
+  }  \r
+\r
+  *HandleBufferLength = (Count * sizeof (FRAMEWORK_EFI_HII_HANDLE));\r
   return EFI_SUCCESS;\r
 }\r
 \r
index 4ad98561411d8935e9c32b44f598ef0de90b2b3a..64a8aeacaa0154baaf46aee342950917c09ef44e 100644 (file)
@@ -74,13 +74,17 @@ typedef struct {
   EFI_HANDLE               Handle;\r
   EFI_HII_PROTOCOL         Hii;\r
   FRAMEWORK_EFI_HII_HANDLE StaticHiiHandle;\r
+  FRAMEWORK_EFI_HII_HANDLE StaticPureUefiHiiHandle;\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
+\r
+  EFI_HANDLE               NewPackNotifyHandle;\r
+  EFI_HANDLE               RemovePackNotifyHandle;\r
+  EFI_HANDLE               AddPackNotifyHandle;\r
 } EFI_HII_THUNK_PRIVATE_DATA;\r
 \r
 \r
@@ -146,6 +150,9 @@ extern CONST EFI_HII_IMAGE_PROTOCOL               *mHiiImageProtocol;
 extern CONST EFI_HII_STRING_PROTOCOL              *mHiiStringProtocol;\r
 extern CONST EFI_HII_CONFIG_ROUTING_PROTOCOL      *mHiiConfigRoutingProtocol;\r
 \r
+extern BOOLEAN                                    mInFrameworkHiiNewPack;\r
+\r
+\r
 //\r
 // Prototypes\r
 //\r
index a1370eae35e5a7365932930d20d6fbecfd9ab104..9624e377f47608fb3f95f1506cfc888a51807c81 100644 (file)
@@ -327,6 +327,7 @@ UefiRegisterPackageList(
   EFI_HANDLE                  UefiHiiDriverHandle;\r
 \r
   UefiHiiDriverHandle = NULL;\r
+  UefiPackageListHeader = NULL;\r
 \r
   Status = GetIfrAndStringPackNum (Packages, &IfrPackNum, &StringPackNum);\r
   ASSERT_EFI_ERROR (Status);\r
@@ -342,7 +343,10 @@ UefiRegisterPackageList(
   ASSERT (HandleMappingEntry != NULL);\r
   \r
   HandleMappingEntry->Signature = HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY_SIGNATURE;\r
-  HandleMappingEntry->FrameworkHiiHandle = Private->StaticHiiHandle++;\r
+  Status = AssignHiiHandle (Private, &HandleMappingEntry->FrameworkHiiHandle);\r
+  if (EFI_ERROR (Status)) {\r
+    goto Done;\r
+  }\r
 \r
   //\r
   // Packages->GuidId may be NULL. In such case, caller of FramworkHii->NewPack is registering\r
@@ -429,11 +433,13 @@ Done:
     *Handle = HandleMappingEntry->FrameworkHiiHandle;\r
   }\r
 \r
-  FreePool (UefiPackageListHeader);\r
+  SafeFreePool (UefiPackageListHeader);\r
   \r
   return Status;\r
 }\r
 \r
+BOOLEAN mInFrameworkHiiNewPack = FALSE;\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 HiiNewPack (\r
@@ -471,6 +477,14 @@ Returns:
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
+  //\r
+  // We use a simple Global variable to inform NewPackNotify\r
+  // that the package list registered here is already registered\r
+  // in the HII Thunk Layer. So NewPackNotify does not need to\r
+  // call RegisterUefiHiiHandle () to registered it.\r
+  //\r
+  mInFrameworkHiiNewPack = TRUE;\r
+\r
   Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
   Status = UefiRegisterPackageList (\r
@@ -479,6 +493,8 @@ Returns:
               Handle\r
             );\r
 \r
+  mInFrameworkHiiNewPack = FALSE;\r
+\r
   return Status;\r
 }\r
 \r
index 6907718b33c9768a190ad2b8b3140ca63a2106cf..06f3f1c30909365547207b1905302711f660e2ab 100644 (file)
@@ -81,7 +81,7 @@ HiiThunkNewStringForAllStringPackages (
   HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
   EFI_STRING_ID                             StringId1;\r
   EFI_STRING_ID                             StringId2;\r
-  CHAR8                                     *UefiStringProtocolLanguage;\r
+  CHAR8                                     *AsciiLanguage;\r
   BOOLEAN                                   Found;\r
 \r
   ASSERT (TagGuid != NULL);\r
@@ -90,14 +90,12 @@ HiiThunkNewStringForAllStringPackages (
   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
+  if (Language == NULL) {\r
+    AsciiLanguage = NULL;\r
+  } else {\r
+    AsciiLanguage = AllocateZeroPool (StrLen (Language) + 1);\r
+    UnicodeStrToAsciiStr (Language, AsciiLanguage);\r
+  }\r
 \r
   for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
        ListEntry != &Private->HiiThunkHandleMappingDBListHead;\r
@@ -109,9 +107,32 @@ HiiThunkNewStringForAllStringPackages (
     if (CompareGuid (TagGuid, &HandleMapEntry->TagGuid)) {\r
       Found = TRUE;\r
       if (*Reference == 0) {\r
-        Status = HiiLibNewString (HandleMapEntry->UefiHiiHandle, &StringId2, NewString);\r
+        if (AsciiLanguage == NULL) {\r
+          Status = HiiLibNewString (HandleMapEntry->UefiHiiHandle, &StringId2, NewString);\r
+        } else {\r
+          Status = mHiiStringProtocol->NewString (\r
+                                         mHiiStringProtocol,\r
+                                         HandleMapEntry->UefiHiiHandle,\r
+                                         &StringId2,\r
+                                         AsciiLanguage,\r
+                                         NULL,\r
+                                         NewString,\r
+                                         NULL\r
+                                         );\r
+        }\r
       } else {\r
-        Status = HiiLibSetString (HandleMapEntry->UefiHiiHandle, *Reference, NewString);\r
+        if (AsciiLanguage == NULL) {\r
+          Status = HiiLibSetString (HandleMapEntry->UefiHiiHandle, *Reference, NewString);\r
+        } else {\r
+          Status = mHiiStringProtocol->SetString (\r
+                                       mHiiStringProtocol,\r
+                                       HandleMapEntry->UefiHiiHandle,\r
+                                       *Reference,\r
+                                       AsciiLanguage,\r
+                                       NewString,\r
+                                       NULL\r
+                                       );\r
+        }\r
       }\r
       if (EFI_ERROR (Status)) {\r
         return Status;\r
@@ -177,7 +198,8 @@ Returns:
   //\r
   // For UNI file, some String may not be defined for a language. This has been true for a lot of platform code.\r
   // For this case, EFI_NOT_FOUND will be returned. To allow the old code to be run without porting, we don't assert \r
-  // on EFI_NOT_FOUND. The missing String will be declared if user select differnt languages for the platform.\r
+  // on EFI_NOT_FOUND. The missing Strings will be shown if user select a differnt languages other than the default\r
+  // English language for the platform.\r
   //\r
   ASSERT_EFI_ERROR (EFI_ERROR (Status) && Status != EFI_NOT_FOUND);  \r
 \r
@@ -206,6 +228,32 @@ Returns:
   return EFI_UNSUPPORTED;\r
 }\r
 \r
+typedef struct {\r
+  CHAR8 *Iso639;\r
+  CHAR8 *Rfc3066;\r
+} ISO639TORFC3066MAP;\r
+\r
+ISO639TORFC3066MAP Iso639ToRfc3066Map [] = {\r
+    {"eng", "en-US"},\r
+    {"fra", "fr-FR"},\r
+};\r
+\r
+CHAR8 *\r
+Iso639ToRfc3066 (\r
+  CHAR8 *Iso638Lang\r
+  )\r
+{\r
+  UINTN Index;\r
+\r
+  for (Index = 0; Index < sizeof (Iso639ToRfc3066Map) / sizeof (Iso639ToRfc3066Map[0]); Index++) {\r
+    if (AsciiStrnCmp (Iso638Lang, Iso639ToRfc3066Map[Index].Iso639, AsciiStrSize (Iso638Lang)) == 0) {\r
+      return Iso639ToRfc3066Map[Index].Rfc3066;\r
+    }\r
+  }\r
+\r
+  return (CHAR8 *) NULL;\r
+}\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 HiiGetString (\r
@@ -249,6 +297,7 @@ Returns:
   HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY  *HandleMapEntry;\r
   CHAR8                                     *AsciiLanguage;\r
   EFI_HII_THUNK_PRIVATE_DATA                *Private;\r
+  CHAR8                                     *Rfc3066AsciiLanguage;\r
 \r
   Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
 \r
@@ -260,6 +309,17 @@ Returns:
       return EFI_OUT_OF_RESOURCES;\r
     }\r
     UnicodeStrToAsciiStr  (LanguageString, AsciiLanguage);\r
+\r
+    Rfc3066AsciiLanguage = Iso639ToRfc3066 (AsciiLanguage);\r
+    //\r
+    // Caller of Framework HII Interface uses the Language Identification String defined \r
+    // in Iso639. So map it to the Language Identifier defined in RFC3066.\r
+    //\r
+    if (Rfc3066AsciiLanguage != NULL) {\r
+      FreePool (AsciiLanguage);\r
+      AsciiLanguage = AllocateCopyPool (AsciiStrSize (Rfc3066AsciiLanguage), Rfc3066AsciiLanguage);\r
+    }\r
+    \r
   }\r
 \r
   for (ListEntry = Private->HiiThunkHandleMappingDBListHead.ForwardLink;\r
index bc5e1ce12615c9d6fa1f6fcc68c2e2bab3c92c19..03da20eb0dbf8d8301472f18270dcf919a84492f 100644 (file)
@@ -83,6 +83,28 @@ FrameworkHiiHandleToMapDatabaseEntry (
   return (HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *) NULL;\r
 }\r
 \r
+HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
+UefiHiiHandleToMapDatabaseEntry (\r
+  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+  IN EFI_HII_HANDLE                   UefiHiiHandle\r
+  )\r
+{\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
+\r
+    if (UefiHiiHandle == HandleMapEntry->UefiHiiHandle) {\r
+      return HandleMapEntry;\r
+    }\r
+  }\r
+\r
+  return (HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *) NULL;\r
+}\r
 \r
 EFI_HII_HANDLE *\r
 TagGuidToUefiIfrHiiHandle (\r
@@ -108,7 +130,48 @@ TagGuidToUefiIfrHiiHandle (
   \r
 }\r
 \r
+BOOLEAN\r
+IsFrameworkHiiDatabaseHandleDepleted (\r
+  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private\r
+  )\r
+{\r
+  return (BOOLEAN) (Private->StaticHiiHandle == (UINTN) Private->StaticPureUefiHiiHandle);\r
+}\r
+\r
+EFI_STATUS\r
+\r
+AssignHiiHandle (\r
+  IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+  OUT    FRAMEWORK_EFI_HII_HANDLE   *Handle\r
+  )\r
+{\r
+  ASSERT (Handle != NULL);\r
+\r
+  *Handle = Private->StaticHiiHandle;\r
+  Private->StaticHiiHandle += 1;\r
+\r
+  if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+AssignPureUefiHiiHandle (\r
+  IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+    OUT    FRAMEWORK_EFI_HII_HANDLE   *Handle\r
+  )\r
+{\r
+  ASSERT (Handle != NULL);\r
 \r
+  *Handle = Private->StaticPureUefiHiiHandle;\r
+  Private->StaticPureUefiHiiHandle -= 1;\r
 \r
+  if (IsFrameworkHiiDatabaseHandleDepleted (Private)) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
 \r
+  return EFI_SUCCESS;\r
+}\r
 \r
index 7426edfb9d6add503808d8ce01e5f45deed6a6b3..5504cc526710afeb4580d3f598996b17affe7f50 100644 (file)
@@ -46,6 +46,12 @@ FrameworkHiiHandleToMapDatabaseEntry (
   )\r
 ;\r
 \r
+HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *\r
+UefiHiiHandleToMapDatabaseEntry (\r
+  IN CONST EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+  IN EFI_HII_HANDLE                   UefiHiiHandle\r
+  )\r
+;\r
 \r
 EFI_HII_HANDLE *\r
 TagGuidToUefiIfrHiiHandle (\r
@@ -54,4 +60,17 @@ TagGuidToUefiIfrHiiHandle (
   )\r
 ;\r
 \r
+EFI_STATUS\r
+AssignHiiHandle (\r
+  IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+  OUT    FRAMEWORK_EFI_HII_HANDLE   *Handle\r
+  )\r
+;\r
+\r
+EFI_STATUS\r
+AssignPureUefiHiiHandle (\r
+  IN OUT EFI_HII_THUNK_PRIVATE_DATA *Private,\r
+  OUT    FRAMEWORK_EFI_HII_HANDLE   *Handle\r
+  )\r
+;\r
 #endif\r