]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrString.c
1) Sync EdkCompatibilityPkg with EDK 1.04. The changes includes:
[mirror_edk2.git] / EdkCompatibilityPkg / Foundation / Library / Dxe / UefiEfiIfrSupportLib / UefiIfrString.c
diff --git a/EdkCompatibilityPkg/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrString.c b/EdkCompatibilityPkg/Foundation/Library/Dxe/UefiEfiIfrSupportLib/UefiIfrString.c
new file mode 100644 (file)
index 0000000..c2e57dd
--- /dev/null
@@ -0,0 +1,702 @@
+/*++\r
+\r
+Copyright (c) 2007, Intel Corporation\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
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+  UefiIfrString.c\r
+\r
+Abstract:\r
+\r
+  Common Library Routines to assist to handle String and Language.\r
+\r
+--*/\r
+\r
+#include "UefiIfrLibrary.h"\r
+\r
+//\r
+// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes\r
+// Each entry is 5 CHAR8 values long.  The first 3 CHAR8 values are the ISO 639-2 code.\r
+// The last 2 CHAR8 values are the ISO 639-1 code.\r
+//\r
+CHAR8 Iso639ToRfc3066ConversionTable[] =\r
+"\\r
+aaraa\\r
+abkab\\r
+afraf\\r
+amham\\r
+araar\\r
+asmas\\r
+aymay\\r
+azeaz\\r
+bakba\\r
+belbe\\r
+benbn\\r
+bihbh\\r
+bisbi\\r
+bodbo\\r
+brebr\\r
+bulbg\\r
+catca\\r
+cescs\\r
+corkw\\r
+cosco\\r
+cymcy\\r
+danda\\r
+deude\\r
+dzodz\\r
+ellel\\r
+engen\\r
+epoeo\\r
+estet\\r
+euseu\\r
+faofo\\r
+fasfa\\r
+fijfj\\r
+finfi\\r
+frafr\\r
+fryfy\\r
+gaiga\\r
+gdhgd\\r
+glggl\\r
+grngn\\r
+gujgu\\r
+hauha\\r
+hebhe\\r
+hinhi\\r
+hrvhr\\r
+hunhu\\r
+hyehy\\r
+ikuiu\\r
+ileie\\r
+inaia\\r
+indid\\r
+ipkik\\r
+islis\\r
+itait\\r
+jawjw\\r
+jpnja\\r
+kalkl\\r
+kankn\\r
+kasks\\r
+katka\\r
+kazkk\\r
+khmkm\\r
+kinrw\\r
+kirky\\r
+korko\\r
+kurku\\r
+laolo\\r
+latla\\r
+lavlv\\r
+linln\\r
+litlt\\r
+ltzlb\\r
+malml\\r
+marmr\\r
+mkdmk\\r
+mlgmg\\r
+mltmt\\r
+molmo\\r
+monmn\\r
+mrimi\\r
+msams\\r
+myamy\\r
+nauna\\r
+nepne\\r
+nldnl\\r
+norno\\r
+ocioc\\r
+ormom\\r
+panpa\\r
+polpl\\r
+porpt\\r
+pusps\\r
+quequ\\r
+rohrm\\r
+ronro\\r
+runrn\\r
+rusru\\r
+sagsg\\r
+sansa\\r
+sinsi\\r
+slksk\\r
+slvsl\\r
+smise\\r
+smosm\\r
+snasn\\r
+sndsd\\r
+somso\\r
+sotst\\r
+spaes\\r
+sqisq\\r
+srpsr\\r
+sswss\\r
+sunsu\\r
+swasw\\r
+swesv\\r
+tamta\\r
+tattt\\r
+telte\\r
+tgktg\\r
+tgltl\\r
+thath\\r
+tsnts\\r
+tuktk\\r
+twitw\\r
+uigug\\r
+ukruk\\r
+urdur\\r
+uzbuz\\r
+vievi\\r
+volvo\\r
+wolwo\\r
+xhoxh\\r
+yidyi\\r
+zhaza\\r
+zhozh\\r
+zulzu\\r
+";\r
+\r
+EFI_STATUS\r
+ConvertRfc3066LanguageToIso639Language (\r
+  CHAR8   *LanguageRfc3066,\r
+  CHAR8   *LanguageIso639\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Convert language code from RFC3066 to ISO639-2.\r
+\r
+Arguments:\r
+  LanguageRfc3066 - RFC3066 language code.\r
+  LanguageIso639  - ISO639-2 language code.\r
+\r
+Returns:\r
+  EFI_SUCCESS   - Language code converted.\r
+  EFI_NOT_FOUND - Language code not found.\r
+\r
+--*/\r
+{\r
+  UINTN  Index;\r
+\r
+  if ((LanguageRfc3066[2] != '-') && (LanguageRfc3066[2] != 0)) {\r
+    EfiCopyMem (LanguageIso639, LanguageRfc3066, 3);\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {\r
+    if (EfiCompareMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2) == 0) {\r
+      EfiCopyMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3);\r
+      return EFI_SUCCESS;\r
+    }\r
+  }\r
+\r
+  return EFI_NOT_FOUND;\r
+}\r
+\r
+CHAR8 *\r
+Rfc3066ToIso639 (\r
+  CHAR8  *SupportedLanguages\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Convert language code list from RFC3066 to ISO639-2, e.g. "en-US;fr-FR" will\r
+  be converted to "engfra".\r
+\r
+Arguments:\r
+  SupportedLanguages - The RFC3066 language list.\r
+\r
+Returns:\r
+  The ISO639-2 language list.\r
+\r
+--*/\r
+{\r
+  CHAR8       *Languages;\r
+  CHAR8       *ReturnValue;\r
+  CHAR8       *LangCodes;\r
+  CHAR8       LangRfc3066[RFC_3066_ENTRY_SIZE];\r
+  CHAR8       LangIso639[ISO_639_2_ENTRY_SIZE];\r
+  EFI_STATUS  Status;\r
+\r
+  ReturnValue = EfiLibAllocateZeroPool (EfiAsciiStrSize (SupportedLanguages));\r
+  if (ReturnValue == NULL) {\r
+    return ReturnValue;\r
+  }\r
+\r
+  Languages = ReturnValue;\r
+  LangCodes = SupportedLanguages;\r
+  while (*LangCodes != 0) {\r
+    GetNextLanguage (&LangCodes, LangRfc3066);\r
+\r
+    Status = ConvertRfc3066LanguageToIso639Language (LangRfc3066, LangIso639);\r
+    if (!EFI_ERROR (Status)) {\r
+      EfiCopyMem (Languages, LangIso639, 3);\r
+      Languages = Languages + 3;\r
+    }\r
+  }\r
+\r
+  return ReturnValue;\r
+}\r
+\r
+EFI_STATUS\r
+GetCurrentLanguage (\r
+  OUT     CHAR8               *Lang\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Determine what is the current language setting\r
+\r
+Arguments:\r
+  Lang      - Pointer of system language\r
+\r
+Returns:\r
+  Status code\r
+\r
+--*/\r
+{\r
+  EFI_STATUS  Status;\r
+  UINTN       Size;\r
+\r
+  //\r
+  // Get current language setting\r
+  //\r
+  Size = RFC_3066_ENTRY_SIZE;\r
+  Status = gRT->GetVariable (\r
+                  L"PlatformLang",\r
+                  &gEfiGlobalVariableGuid,\r
+                  NULL,\r
+                  &Size,\r
+                  Lang\r
+                  );\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    EfiAsciiStrCpy (Lang, "en-US");\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+VOID\r
+GetNextLanguage (\r
+  IN OUT CHAR8      **LangCode,\r
+  OUT CHAR8         *Lang\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Get next language from language code list (with separator ';').\r
+\r
+Arguments:\r
+  LangCode - On input: point to first language in the list. On output: point to\r
+             next language in the list, or NULL if no more language in the list.\r
+  Lang     - The first language in the list.\r
+\r
+Returns:\r
+  None.\r
+\r
+--*/\r
+{\r
+  UINTN  Index;\r
+  CHAR8  *StringPtr;\r
+\r
+  if (LangCode == NULL || *LangCode == NULL) {\r
+    *Lang = 0;\r
+    return;\r
+  }\r
+\r
+  Index = 0;\r
+  StringPtr = *LangCode;\r
+  while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
+    Index++;\r
+  }\r
+\r
+  EfiCopyMem (Lang, StringPtr, Index);\r
+  Lang[Index] = 0;\r
+\r
+  if (StringPtr[Index] == ';') {\r
+    Index++;\r
+  }\r
+  *LangCode = StringPtr + Index;\r
+}\r
+\r
+CHAR8 *\r
+GetSupportedLanguages (\r
+  IN EFI_HII_HANDLE           HiiHandle\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  This function returns the list of supported languages, in the format specified\r
+  in UEFI specification Appendix M.\r
+\r
+Arguments:\r
+  HiiHandle  - The HII package list handle.\r
+\r
+Returns:\r
+  The supported languages.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS  Status;\r
+  UINTN       BufferSize;\r
+  CHAR8       *LanguageString;\r
+\r
+  LocateHiiProtocols ();\r
+\r
+  //\r
+  // Collect current supported Languages for given HII handle\r
+  //\r
+  BufferSize = 0x1000;\r
+  LanguageString = EfiLibAllocatePool (BufferSize);\r
+  Status = gIfrLibHiiString->GetLanguages (gIfrLibHiiString, HiiHandle, LanguageString, &BufferSize);\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    gBS->FreePool (LanguageString);\r
+    LanguageString = EfiLibAllocatePool (BufferSize);\r
+    Status = gIfrLibHiiString->GetLanguages (gIfrLibHiiString, HiiHandle, LanguageString, &BufferSize);\r
+  }\r
+\r
+  if (EFI_ERROR (Status)) {\r
+    LanguageString = NULL;\r
+  }\r
+\r
+  return LanguageString;\r
+}\r
+\r
+UINT16\r
+GetSupportedLanguageNumber (\r
+  IN EFI_HII_HANDLE           HiiHandle\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  This function returns the number of supported languages\r
+\r
+Arguments:\r
+  HiiHandle  - The HII package list handle.\r
+\r
+Returns:\r
+  The  number of supported languages.\r
+\r
+--*/\r
+{\r
+  CHAR8   *Languages;\r
+  CHAR8   *LanguageString;\r
+  UINT16  LangNumber;\r
+  CHAR8   Lang[RFC_3066_ENTRY_SIZE];\r
+\r
+  Languages = GetSupportedLanguages (HiiHandle);\r
+  if (Languages == NULL) {\r
+    return 0;\r
+  }\r
+\r
+  LangNumber = 0;\r
+  LanguageString = Languages;\r
+  while (*LanguageString != 0) {\r
+    GetNextLanguage (&LanguageString, Lang);\r
+    LangNumber++;\r
+  }\r
+  gBS->FreePool (Languages);\r
+\r
+  return LangNumber;\r
+}\r
+\r
+EFI_STATUS\r
+GetStringFromHandle (\r
+  IN  EFI_HII_HANDLE                  HiiHandle,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  OUT EFI_STRING                      *String\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Get string specified by StringId form the HiiHandle.\r
+\r
+Arguments:\r
+  HiiHandle     - The HII handle of package list.\r
+  StringId      - The String ID.\r
+  String        - The output string.\r
+\r
+Returns:\r
+  EFI_NOT_FOUND         - String is not found.\r
+  EFI_SUCCESS           - Operation is successful.\r
+  EFI_OUT_OF_RESOURCES  - There is not enought memory in the system.\r
+  EFI_INVALID_PARAMETER - The String is NULL.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS                          Status;\r
+  UINTN                               StringSize;\r
+\r
+  if (String == NULL) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  StringSize = IFR_LIB_DEFAULT_STRING_SIZE;\r
+  *String    = EfiLibAllocateZeroPool (StringSize);\r
+  if (*String == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Status = IfrLibGetString (HiiHandle, StringId, *String, &StringSize);\r
+  if (Status == EFI_BUFFER_TOO_SMALL) {\r
+    gBS->FreePool (*String);\r
+    *String = EfiLibAllocateZeroPool (StringSize);\r
+    if (*String == NULL) {\r
+      return EFI_OUT_OF_RESOURCES;\r
+    }\r
+    Status = IfrLibGetString (HiiHandle, StringId, *String, &StringSize);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+GetStringFromToken (\r
+  IN  EFI_GUID                        *ProducerGuid,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  OUT EFI_STRING                      *String\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+  Get the string given the StringId and String package Producer's Guid.\r
+\r
+Arguments:\r
+  ProducerGuid  - The Guid of String package list.\r
+  StringId      - The String ID.\r
+  String        - The output string.\r
+\r
+Returns:\r
+  EFI_NOT_FOUND         - String is not found.\r
+  EFI_SUCCESS           - Operation is successful.\r
+  EFI_OUT_OF_RESOURCES  - There is not enought memory in the system.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS      Status;\r
+  UINTN           Index;\r
+  UINTN           HandleBufferLen;\r
+  EFI_HII_HANDLE  *HiiHandleBuffer;\r
+  EFI_GUID        Guid;\r
+\r
+  Status = GetHiiHandles (&HandleBufferLen, &HiiHandleBuffer);\r
+  if (EFI_ERROR(Status)) {\r
+    return Status;\r
+  }\r
+  for (Index = 0; Index < (HandleBufferLen / sizeof (EFI_HII_HANDLE)); Index++) {\r
+    Status = ExtractGuidFromHiiHandle (HiiHandleBuffer[Index], &Guid);\r
+    if (EFI_ERROR(Status)) {\r
+      return Status;\r
+    }\r
+    if (EfiCompareGuid (&Guid, ProducerGuid) == TRUE) {\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (Index >= (HandleBufferLen / sizeof (EFI_HII_HANDLE))) {\r
+    Status = EFI_NOT_FOUND;\r
+    goto Out;\r
+  }\r
+\r
+  Status = GetStringFromHandle (HiiHandleBuffer[Index], StringId, String);\r
+\r
+Out:\r
+  if (HiiHandleBuffer != NULL) {\r
+    gBS->FreePool (HiiHandleBuffer);\r
+  }\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+IfrLibNewString (\r
+  IN  EFI_HII_HANDLE                  PackageList,\r
+  OUT EFI_STRING_ID                   *StringId,\r
+  IN  CONST EFI_STRING                String\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    This function adds the string into String Package of each language.\r
+\r
+  Arguments:\r
+    PackageList       - Handle of the package list where this string will be added.\r
+    StringId          - On return, contains the new strings id, which is unique within PackageList.\r
+    String            - Points to the new null-terminated string.\r
+\r
+  Returns:\r
+    EFI_SUCCESS            - The new string was added successfully.\r
+    EFI_NOT_FOUND          - The specified PackageList could not be found in database.\r
+    EFI_OUT_OF_RESOURCES   - Could not add the string due to lack of resources.\r
+    EFI_INVALID_PARAMETER  - String is NULL or StringId is NULL is NULL.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS  Status;\r
+  CHAR8       *Languages;\r
+  CHAR8       *LangStrings;\r
+  CHAR8       Lang[RFC_3066_ENTRY_SIZE];\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  LocateHiiProtocols ();\r
+\r
+  Languages = GetSupportedLanguages (PackageList);\r
+\r
+  LangStrings = Languages;\r
+  while (*LangStrings != 0) {\r
+    GetNextLanguage (&LangStrings, Lang);\r
+\r
+    Status = gIfrLibHiiString->NewString (\r
+                                 gIfrLibHiiString,\r
+                                 PackageList,\r
+                                 StringId,\r
+                                 Lang,\r
+                                 NULL,\r
+                                 String,\r
+                                 NULL\r
+                                 );\r
+    if (EFI_ERROR (Status)) {\r
+      break;\r
+    }\r
+  }\r
+\r
+  gBS->FreePool (Languages);\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+IfrLibGetString (\r
+  IN  EFI_HII_HANDLE                  PackageList,\r
+  IN  EFI_STRING_ID                   StringId,\r
+  OUT EFI_STRING                      String,\r
+  IN  OUT UINTN                       *StringSize\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    This function try to retrieve string from String package of current language.\r
+    If fail, it try to retrieve string from String package of first language it support.\r
+\r
+  Arguments:\r
+    PackageList       - The package list in the HII database to search for the specified string.\r
+    StringId          - The string's id, which is unique within PackageList.\r
+    String            - Points to the new null-terminated string.\r
+    StringSize        - On entry, points to the size of the buffer pointed to by String, in bytes. On return,\r
+                        points to the length of the string, in bytes.\r
+\r
+  Returns:\r
+    EFI_SUCCESS            - The string was returned successfully.\r
+    EFI_NOT_FOUND          - The string specified by StringId is not available.\r
+    EFI_BUFFER_TOO_SMALL   - The buffer specified by StringLength is too small to hold the string.\r
+    EFI_INVALID_PARAMETER  - The String or StringSize was NULL.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS  Status;\r
+  CHAR8       *Languages;\r
+  CHAR8       *LangStrings;\r
+  CHAR8       Lang[RFC_3066_ENTRY_SIZE];\r
+  CHAR8       CurrentLang[RFC_3066_ENTRY_SIZE];\r
+\r
+  LocateHiiProtocols ();\r
+\r
+  GetCurrentLanguage (CurrentLang);\r
+\r
+  Status = gIfrLibHiiString->GetString (\r
+                               gIfrLibHiiString,\r
+                               CurrentLang,\r
+                               PackageList,\r
+                               StringId,\r
+                               String,\r
+                               StringSize,\r
+                               NULL\r
+                               );\r
+\r
+  if (EFI_ERROR (Status) && (Status != EFI_BUFFER_TOO_SMALL)) {\r
+    Languages = GetSupportedLanguages (PackageList);\r
+    LangStrings = Languages;\r
+    GetNextLanguage (&LangStrings, Lang);\r
+    gBS->FreePool (Languages);\r
+\r
+    Status = gIfrLibHiiString->GetString (\r
+                                 gIfrLibHiiString,\r
+                                 Lang,\r
+                                 PackageList,\r
+                                 StringId,\r
+                                 String,\r
+                                 StringSize,\r
+                                 NULL\r
+                                 );\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+IfrLibSetString (\r
+  IN EFI_HII_HANDLE                   PackageList,\r
+  IN EFI_STRING_ID                    StringId,\r
+  IN CONST EFI_STRING                 String\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    This function updates the string in String package of each language.\r
+\r
+  Arguments:\r
+    PackageList       - The package list containing the strings.\r
+    StringId          - The string's id, which is unique within PackageList.\r
+    String            - Points to the new null-terminated string.\r
+\r
+  Returns:\r
+    EFI_SUCCESS            - The string was updated successfully.\r
+    EFI_NOT_FOUND          - The string specified by StringId is not in the database.\r
+    EFI_INVALID_PARAMETER  - The String was NULL.\r
+    EFI_OUT_OF_RESOURCES   - The system is out of resources to accomplish the task.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS  Status;\r
+  CHAR8       *Languages;\r
+  CHAR8       *LangStrings;\r
+  CHAR8       Lang[RFC_3066_ENTRY_SIZE];\r
+\r
+  Status = EFI_SUCCESS;\r
+\r
+  LocateHiiProtocols ();\r
+\r
+  Languages = GetSupportedLanguages (PackageList);\r
+\r
+  LangStrings = Languages;\r
+  while (*LangStrings != 0) {\r
+    GetNextLanguage (&LangStrings, Lang);\r
+\r
+    Status = gIfrLibHiiString->SetString (\r
+                                 gIfrLibHiiString,\r
+                                 PackageList,\r
+                                 StringId,\r
+                                 Lang,\r
+                                 String,\r
+                                 NULL\r
+                                 );\r
+    if (EFI_ERROR (Status)) {\r
+      break;\r
+    }\r
+  }\r
+\r
+  gBS->FreePool (Languages);\r
+\r
+  return Status;\r
+}\r
+\r