]> git.proxmox.com Git - mirror_edk2.git/blobdiff - IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c
Use default UNDI information if NII protocol not exists.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / FrontPage.c
index fb605d57d9e15f6272a690ab98d5ed4bcc3157d7..fbfac0817801455d74aad8f519e3547d1da5dbf1 100644 (file)
@@ -37,6 +37,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 +154,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
@@ -158,7 +185,12 @@ FrontPageCallback (
     //\r
     LanguageString = HiiLibGetSupportedLanguages (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 +203,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
@@ -247,8 +302,9 @@ InitializeFrontPage (
   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,21 +349,15 @@ InitializeFrontPage (
     }\r
 \r
     //\r
-    // Create driver handle used by HII database\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
+    // Install Device Path Protocol and 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
@@ -329,10 +379,6 @@ InitializeFrontPage (
     }\r
   }\r
 \r
-  //\r
-  // Get current language setting\r
-  //\r
-  GetCurrentLanguage (CurrentLang);\r
 \r
   //\r
   // Allocate space for creation of UpdateData Buffer\r
@@ -350,6 +396,28 @@ InitializeFrontPage (
   HiiHandle = gFrontPagePrivate.HiiHandle;\r
   LanguageString = HiiLibGetSupportedLanguages (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
@@ -394,7 +462,7 @@ InitializeFrontPage (
       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 +473,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