]> 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 44a1e0868932ac6b7d0d830cbf5c0142b255ff76..99abf1460af827181ac4ca5b09926a3b974e1df0 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   FrontPage routines to handle the callbacks and browser calls\r
 \r
-Copyright (c) 2004 - 2008, Intel Corporation. <BR>\r
+Copyright (c) 2004 - 2009, 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
@@ -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
@@ -856,7 +927,6 @@ PlatformBdsEnterFrontPage (
   )\r
 {\r
   EFI_STATUS                    Status;\r
-  EFI_CONSOLE_CONTROL_PROTOCOL  *ConsoleControl;\r
 \r
   PERF_START (0, "BdsTimeOut", "BDS", 0);\r
   //\r
@@ -970,7 +1040,4 @@ Exit:
   // takes affect\r
   //\r
   PERF_END (0, "BdsTimeOut", "BDS", 0);\r
-  Status = gBS->LocateProtocol (&gEfiConsoleControlProtocolGuid, NULL, (VOID **) &ConsoleControl);\r
-  ConsoleControl->SetMode (ConsoleControl, EfiConsoleControlScreenText);\r
-\r
 }\r