]> git.proxmox.com Git - mirror_edk2.git/commitdiff
Apply GetBestLanguage() API in UEFI
authorqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 27 Mar 2009 03:21:37 +0000 (03:21 +0000)
committerqhuang8 <qhuang8@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 27 Mar 2009 03:21:37 +0000 (03:21 +0000)
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7963 6f19259b-4bc3-4df7-8a09-765794883524

IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c

index fb605d57d9e15f6272a690ab98d5ed4bcc3157d7..29974769bb8768e76c2dedd8a49df694836ac5fb 100644 (file)
@@ -129,10 +129,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 +160,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 +178,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 +277,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
@@ -329,10 +360,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 +377,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 +443,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 +454,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