]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c
Retire language conversion APIs from HII library class.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / FrontPage.c
index fb605d57d9e15f6272a690ab98d5ed4bcc3157d7..99abf1460af827181ac4ca5b09926a3b974e1df0 100644 (file)
@@ -14,6 +14,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 #include "Bds.h"\r
 #include "FrontPage.h"\r
+#include "Language.h"\r
 \r
 EFI_GUID  mFrontPageGuid      = FRONT_PAGE_FORMSET_GUID;\r
 \r
@@ -37,6 +38,31 @@ FRONT_PAGE_CALLBACK_DATA  gFrontPagePrivate = {
   }\r
 };\r
 \r
+HII_VENDOR_DEVICE_PATH  mFrontPageHiiVendorDevicePath = {\r
+  {\r
+    {\r
+      HARDWARE_DEVICE_PATH,\r
+      HW_VENDOR_DP,\r
+      {\r
+        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),\r
+        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)\r
+      }\r
+    },\r
+    //\r
+    // {8E6D99EE-7531-48f8-8745-7F6144468FF2}\r
+    //\r
+    { 0x8e6d99ee, 0x7531, 0x48f8, { 0x87, 0x45, 0x7f, 0x61, 0x44, 0x46, 0x8f, 0xf2 } }\r
+  },\r
+  {\r
+    END_DEVICE_PATH_TYPE,\r
+    END_ENTIRE_DEVICE_PATH_SUBTYPE,\r
+    { \r
+      (UINT8) (END_DEVICE_PATH_LENGTH),\r
+      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)\r
+    }\r
+  }\r
+};\r
+\r
 /**\r
   This function allows a caller to extract the current configuration for one\r
   or more named elements from the target driver.\r
@@ -129,10 +155,12 @@ FrontPageCallback (
 {\r
   CHAR8                         *LanguageString;\r
   CHAR8                         *LangCode;\r
-  CHAR8                         Lang[RFC_3066_ENTRY_SIZE];\r
+  CHAR8                         *Lang;\r
   CHAR8                         OldLang[ISO_639_2_ENTRY_SIZE];\r
   UINTN                         Index;\r
   EFI_STATUS                    Status;\r
+  CHAR8                         *PlatformSupportedLanguages;\r
+  CHAR8                         *BestLanguage;\r
 \r
   if ((Value == NULL) || (ActionRequest == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -156,9 +184,14 @@ FrontPageCallback (
     //\r
     // Collect the languages from what our current Language support is based on our VFR\r
     //\r
-    LanguageString = HiiLibGetSupportedLanguages (gFrontPagePrivate.HiiHandle);\r
+    LanguageString = HiiGetSupportedLanguages (gFrontPagePrivate.HiiHandle);\r
     ASSERT (LanguageString != NULL);\r
-\r
+    //\r
+    // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
+    //\r
+    Lang = AllocatePool (AsciiStrSize (LanguageString));\r
+    ASSERT (Lang != NULL);\r
+    \r
     Index = 0;\r
     LangCode = LanguageString;\r
     while (*LangCode != 0) {\r
@@ -171,30 +204,53 @@ FrontPageCallback (
       Index++;\r
     }\r
 \r
-    Status = gRT->SetVariable (\r
-                    L"PlatformLang",\r
-                    &gEfiGlobalVariableGuid,\r
-                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                    AsciiStrSize (Lang),\r
-                    Lang\r
-                    );\r
-\r
-    if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {\r
-      //\r
-      // Set UEFI deprecated variable "Lang" for backwards compatibility\r
-      //\r
-      Status = ConvertRfc3066LanguageToIso639Language (Lang, OldLang);\r
-      if (!EFI_ERROR (Status)) {\r
-        Status = gRT->SetVariable (\r
-                        L"Lang",\r
-                        &gEfiGlobalVariableGuid,\r
-                        EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
-                        ISO_639_2_ENTRY_SIZE,\r
-                        OldLang\r
-                        );\r
+    PlatformSupportedLanguages = GetEfiGlobalVariable (L"PlatformLangCodes");\r
+    if (PlatformSupportedLanguages == NULL) {\r
+      PlatformSupportedLanguages = AllocateCopyPool (\r
+                                     AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),\r
+                                     (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)\r
+                                     );\r
+      ASSERT (PlatformSupportedLanguages != NULL);\r
+    }\r
+    \r
+    //\r
+    // Select the best language in platform supported Language.\r
+    //\r
+    BestLanguage = GetBestLanguage (\r
+                     PlatformSupportedLanguages,\r
+                     FALSE,\r
+                     Lang,\r
+                     NULL\r
+                     );\r
+    if (BestLanguage != NULL) {\r
+      Status = gRT->SetVariable (\r
+                      L"PlatformLang",\r
+                      &gEfiGlobalVariableGuid,\r
+                      EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+                      AsciiStrSize (BestLanguage),\r
+                      Lang\r
+                      );\r
+\r
+      if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {\r
+        //\r
+        // Set UEFI deprecated variable "Lang" for backwards compatibility\r
+        //\r
+        Status = ConvertRfc3066LanguageToIso639Language (BestLanguage, OldLang);\r
+        if (!EFI_ERROR (Status)) {\r
+          Status = gRT->SetVariable (\r
+                          L"Lang",\r
+                          &gEfiGlobalVariableGuid,\r
+                          EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
+                          ISO_639_2_ENTRY_SIZE,\r
+                          OldLang\r
+                          );\r
+        }\r
       }\r
+      FreePool (BestLanguage);\r
     }\r
-\r
+  \r
+    FreePool (PlatformSupportedLanguages);\r
+    FreePool (Lang);\r
     FreePool (LanguageString);\r
     break;\r
 \r
@@ -242,13 +298,13 @@ InitializeFrontPage (
   )\r
 {\r
   EFI_STATUS                  Status;\r
-  EFI_HII_PACKAGE_LIST_HEADER *PackageList;\r
   EFI_HII_UPDATE_DATA         UpdateData;\r
   IFR_OPTION                  *OptionList;\r
   CHAR8                       *LanguageString;\r
   CHAR8                       *LangCode;\r
-  CHAR8                       Lang[RFC_3066_ENTRY_SIZE];\r
-  CHAR8                       CurrentLang[RFC_3066_ENTRY_SIZE];\r
+  CHAR8                       *Lang;\r
+  CHAR8                       *CurrentLang;\r
+  CHAR8                       *BestLanguage;\r
   UINTN                       OptionCount;\r
   EFI_STRING_ID               Token;\r
   CHAR16                      *StringBuffer;\r
@@ -293,46 +349,33 @@ InitializeFrontPage (
     }\r
 \r
     //\r
-    // Create driver handle used by HII database\r
+    // Install Device Path Protocol and Config Access protocol to driver handle\r
     //\r
-    Status = HiiLibCreateHiiDriverHandle (&gFrontPagePrivate.DriverHandle);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
-    }\r
-\r
-    //\r
-    // Install Config Access protocol to driver handle\r
-    //\r
-    Status = gBS->InstallProtocolInterface (\r
+    Status = gBS->InstallMultipleProtocolInterfaces (\r
                     &gFrontPagePrivate.DriverHandle,\r
+                    &gEfiDevicePathProtocolGuid,\r
+                    &mFrontPageHiiVendorDevicePath,\r
                     &gEfiHiiConfigAccessProtocolGuid,\r
-                    EFI_NATIVE_INTERFACE,\r
-                    &gFrontPagePrivate.ConfigAccess\r
+                    &gFrontPagePrivate.ConfigAccess,\r
+                    NULL\r
                     );\r
     ASSERT_EFI_ERROR (Status);\r
 \r
     //\r
     // Publish our HII data\r
     //\r
-    PackageList = HiiLibPreparePackageList (2, &mFrontPageGuid, FrontPageVfrBin, BdsDxeStrings);\r
-    ASSERT (PackageList != NULL);\r
-\r
-    Status = gHiiDatabase->NewPackageList (\r
-                             gHiiDatabase,\r
-                             PackageList,\r
-                             gFrontPagePrivate.DriverHandle,\r
-                             &gFrontPagePrivate.HiiHandle\r
-                             );\r
-    FreePool (PackageList);\r
-    if (EFI_ERROR (Status)) {\r
-      return Status;\r
+    gFrontPagePrivate.HiiHandle = HiiAddPackages (\r
+                                    &mFrontPageGuid,\r
+                                    gFrontPagePrivate.DriverHandle,\r
+                                    FrontPageVfrBin,\r
+                                    BdsDxeStrings,\r
+                                    NULL\r
+                                    );\r
+    if (gFrontPagePrivate.HiiHandle == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
     }\r
   }\r
 \r
-  //\r
-  // Get current language setting\r
-  //\r
-  GetCurrentLanguage (CurrentLang);\r
 \r
   //\r
   // Allocate space for creation of UpdateData Buffer\r
@@ -348,8 +391,30 @@ InitializeFrontPage (
   // Collect the languages from what our current Language support is based on our VFR\r
   //\r
   HiiHandle = gFrontPagePrivate.HiiHandle;\r
-  LanguageString = HiiLibGetSupportedLanguages (HiiHandle);\r
+  LanguageString = HiiGetSupportedLanguages (HiiHandle);\r
   ASSERT (LanguageString != NULL);\r
+  //\r
+  // Allocate working buffer for RFC 4646 language in supported LanguageString.\r
+  //\r
+  Lang = AllocatePool (AsciiStrSize (LanguageString));\r
+  ASSERT (Lang != NULL);\r
+\r
+  CurrentLang = GetEfiGlobalVariable (L"PlatformLang");\r
+  //\r
+  // Select the best language in LanguageString as the default one.\r
+  //\r
+  BestLanguage = GetBestLanguage (\r
+                   LanguageString,\r
+                   FALSE,\r
+                   (CurrentLang != NULL) ? CurrentLang : "",\r
+                   (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang),\r
+                   LanguageString,\r
+                   NULL\r
+                   );\r
+  //\r
+  // BestLanguage must be selected as it is the first language in LanguageString by default\r
+  //\r
+  ASSERT (BestLanguage != NULL);\r
 \r
   OptionCount = 0;\r
   LangCode = LanguageString;\r
@@ -387,14 +452,13 @@ InitializeFrontPage (
       }\r
       ASSERT_EFI_ERROR (Status);\r
 \r
-      Token = 0;\r
-      Status = HiiLibNewString (HiiHandle, &Token, StringBuffer);\r
+      Token = HiiSetString (HiiHandle, 0, StringBuffer, NULL);\r
       FreePool (StringBuffer);\r
     } else {\r
       Token = gFrontPagePrivate.LanguageToken[OptionCount];\r
     }\r
 \r
-    if (AsciiStrCmp (Lang, CurrentLang) == 0) {\r
+    if (AsciiStrCmp (Lang, BestLanguage) == 0) {\r
       OptionList[OptionCount].Flags = EFI_IFR_OPTION_DEFAULT;\r
     } else {\r
       OptionList[OptionCount].Flags = 0;\r
@@ -405,6 +469,11 @@ InitializeFrontPage (
     OptionCount++;\r
   }\r
 \r
+  if (CurrentLang != NULL) {\r
+    FreePool (CurrentLang);\r
+  }\r
+  FreePool (BestLanguage);\r
+  FreePool (Lang);\r
   FreePool (LanguageString);\r
 \r
   UpdateData.Offset = 0;\r
@@ -505,11 +574,13 @@ GetProducerString (
   OUT     CHAR16                    **String\r
   )\r
 {\r
-  EFI_STATUS      Status;\r
+  EFI_STRING      TmpString;\r
 \r
-  Status = HiiLibGetStringFromToken (ProducerGuid, Token, String);\r
-  if (EFI_ERROR (Status)) {\r
+  TmpString = HiiGetPackageString (ProducerGuid, Token, NULL);\r
+  if (TmpString == NULL) {\r
     *String = GetStringById (STRING_TOKEN (STR_MISSING_STRING));\r
+  } else {\r
+    *String = TmpString;\r
   }\r
 \r
   return EFI_SUCCESS;\r
@@ -625,7 +696,7 @@ UpdateFrontPageStrings (
         BiosVendor = (EFI_MISC_BIOS_VENDOR_DATA *) (DataHeader + 1);\r
         GetProducerString (&Record->ProducerName, BiosVendor->BiosVersion, &NewString);\r
         TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION);\r
-        HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
         FreePool (NewString);\r
         Find[0] = TRUE;\r
       }\r
@@ -636,7 +707,7 @@ UpdateFrontPageStrings (
         SystemManufacturer = (EFI_MISC_SYSTEM_MANUFACTURER_DATA *) (DataHeader + 1);\r
         GetProducerString (&Record->ProducerName, SystemManufacturer->SystemProductName, &NewString);\r
         TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL);\r
-        HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
         FreePool (NewString);\r
         Find[1] = TRUE;\r
       }\r
@@ -647,7 +718,7 @@ UpdateFrontPageStrings (
         ProcessorVersion = (EFI_PROCESSOR_VERSION_DATA *) (DataHeader + 1);\r
         GetProducerString (&Record->ProducerName, *ProcessorVersion, &NewString);\r
         TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL);\r
-        HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
         FreePool (NewString);\r
         Find[2] = TRUE;\r
       }\r
@@ -658,7 +729,7 @@ UpdateFrontPageStrings (
         ProcessorFrequency = (EFI_PROCESSOR_CORE_FREQUENCY_DATA *) (DataHeader + 1);\r
         ConvertProcessorToString (ProcessorFrequency, &NewString);\r
         TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED);\r
-        HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
         FreePool (NewString);\r
         Find[3] = TRUE;\r
       }\r
@@ -672,7 +743,7 @@ UpdateFrontPageStrings (
           &NewString\r
           );\r
         TokenToUpdate = STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE);\r
-        HiiLibSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString);\r
+        HiiSetString (gFrontPagePrivate.HiiHandle, TokenToUpdate, NewString, NULL);\r
         FreePool (NewString);\r
         Find[4] = TRUE;\r
       }\r