]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
Refine get default language logic for command "drivers".
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
index 400b24046c52bacbd047f13e1547b6e9fd4b3162..e9e3d8204d651b2b46870c50d5f1618d41cce4a2 100644 (file)
@@ -779,6 +779,44 @@ GetGuidFromStringName(
   return (EFI_NOT_FOUND);\r
 }\r
 \r
+/**\r
+  Get best support language for this driver.\r
+  \r
+  First base on the current platform used language to search,Second base on the \r
+  default language to search. The caller need to free the buffer of the best \r
+  language.\r
+\r
+  @param[in] SupportedLanguages      The support languages for this driver.\r
+  @param[in] Iso639Language          Whether get language for ISO639.\r
+\r
+  @return                            The best support language for this driver.\r
+**/\r
+CHAR8 *\r
+GetBestLanguageForDriver (\r
+  IN CONST CHAR8  *SupportedLanguages, \r
+  IN BOOLEAN      Iso639Language\r
+  )\r
+{\r
+  CHAR8                         *LanguageVariable;\r
+  CHAR8                         *BestLanguage;\r
+\r
+  LanguageVariable = GetVariable (Iso639Language ? L"Lang" : L"PlatformLang", &gEfiGlobalVariableGuid);\r
+\r
+  BestLanguage = GetBestLanguage(\r
+                   SupportedLanguages,\r
+                   Iso639Language,\r
+                   (LanguageVariable != NULL) ? LanguageVariable : "",\r
+                   Iso639Language ? "en" : "en-US",\r
+                   NULL\r
+                   );\r
+\r
+  if (LanguageVariable != NULL) {\r
+    FreePool (LanguageVariable);\r
+  }\r
+\r
+  return BestLanguage;\r
+}\r
+\r
 /**\r
   Function to retrieve the driver name (if possible) from the ComponentName or\r
   ComponentName2 protocol\r
@@ -799,6 +837,9 @@ GetStringNameFromHandle(
   EFI_COMPONENT_NAME2_PROTOCOL  *CompNameStruct;\r
   EFI_STATUS                    Status;\r
   CHAR16                        *RetVal;\r
+  CHAR8                         *BestLang;\r
+\r
+  BestLang = NULL;\r
 \r
   Status = gBS->OpenProtocol(\r
     TheHandle,\r
@@ -808,7 +849,16 @@ GetStringNameFromHandle(
     NULL,\r
     EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
   if (!EFI_ERROR(Status)) {\r
+    if (Language == NULL) {\r
+      BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, FALSE);\r
+      Language = BestLang;\r
+    }\r
     Status = CompNameStruct->GetDriverName(CompNameStruct, (CHAR8*)Language, &RetVal);\r
+\r
+    if (BestLang != NULL) {\r
+      FreePool (BestLang);\r
+      BestLang = NULL;\r
+    }\r
     if (!EFI_ERROR(Status)) {\r
       return (RetVal);\r
     }\r
@@ -821,7 +871,15 @@ GetStringNameFromHandle(
     NULL,\r
     EFI_OPEN_PROTOCOL_GET_PROTOCOL);\r
   if (!EFI_ERROR(Status)) {\r
+    if (Language == NULL) {\r
+      BestLang = GetBestLanguageForDriver (CompNameStruct->SupportedLanguages, FALSE);\r
+      Language = BestLang;\r
+    }\r
     Status = CompNameStruct->GetDriverName(CompNameStruct, (CHAR8*)Language, &RetVal);\r
+    \r
+    if (BestLang != NULL) {\r
+      FreePool (BestLang);\r
+    }\r
     if (!EFI_ERROR(Status)) {\r
       return (RetVal);\r
     }\r