]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/HiiDatabaseDxe/String.c
Roll back changes to apply GetBestLanguage() in HiiDataBase. Exact language match...
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / String.c
index f6a4cdf02d028b2dd05c894487d645ac88f0c732..00ff6ce78614ed3815a5ba46ae92c597865aa4fc 100644 (file)
@@ -1,4 +1,6 @@
 /** @file\r
+Implementation for EFI_HII_STRING_PROTOCOL.\r
+\r
 \r
 Copyright (c) 2007, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
@@ -9,17 +11,6 @@ http://opensource.org/licenses/bsd-license.php
 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
-    String.c\r
-\r
-Abstract:\r
-\r
-    Implementation for EFI_HII_STRING_PROTOCOL.\r
-\r
-Revision History\r
-\r
-\r
 **/\r
 \r
 \r
@@ -38,6 +29,9 @@ CHAR16 mLanguageWindow[16] = {
   font info list or not. (i.e. HII_FONT_INFO is generated.) If not, create\r
   a HII_FONT_INFO to refer it locally.\r
 \r
+  This is a internal function.\r
+\r
+\r
   @param  Private                Hii database private structure.\r
   @param  StringPackage          HII string package instance.\r
   @param  FontId                Font identifer, which must be unique within the string package.\r
@@ -53,7 +47,6 @@ CHAR16 mLanguageWindow[16] = {
   @retval FALSE                  Not referred before calling this function.\r
 \r
 **/\r
-STATIC\r
 BOOLEAN\r
 ReferFontInfoLocally (\r
   IN  HII_DATABASE_PRIVATE_DATA   *Private,\r
@@ -104,8 +97,12 @@ ReferFontInfoLocally (
 /**\r
   Convert Ascii string text to unicode string test.\r
 \r
-  @param  StringSrc              Points to current null-terminated Ascii string.\r
-  @param  StringDest             Buffer to store the converted string text.\r
+  This is a internal function.\r
+\r
+\r
+  @param  StringDest             Buffer to store the string text. If it is NULL,\r
+                                 only the size will be returned.\r
+  @param  StringSrc              Points to current null-terminated string.\r
   @param  BufferSize             Length of the buffer.\r
 \r
   @retval EFI_SUCCESS            The string text was outputed successfully.\r
@@ -114,7 +111,6 @@ ReferFontInfoLocally (
                                  size.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 ConvertToUnicodeText (\r
   OUT EFI_STRING       StringDest,\r
@@ -128,7 +124,7 @@ ConvertToUnicodeText (
   ASSERT (StringSrc != NULL && BufferSize != NULL);\r
 \r
   StringSize = AsciiStrSize (StringSrc) * 2;\r
-  if (*BufferSize < StringSize) {\r
+  if (*BufferSize < StringSize || StringDest == NULL) {\r
     *BufferSize = StringSize;\r
     return EFI_BUFFER_TOO_SMALL;\r
   }\r
@@ -146,8 +142,11 @@ ConvertToUnicodeText (
   Calculate the size of StringSrc and output it. If StringDest is not NULL,\r
   copy string text from src to dest.\r
 \r
+  This is a internal function.\r
+\r
+  @param  StringDest             Buffer to store the string text. If it is NULL,\r
+                                 only the size will be returned.\r
   @param  StringSrc              Points to current null-terminated string.\r
-  @param  StringDest             Buffer to store the string text.\r
   @param  BufferSize             Length of the buffer.\r
 \r
   @retval EFI_SUCCESS            The string text was outputed successfully.\r
@@ -156,7 +155,6 @@ ConvertToUnicodeText (
                                  size.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 GetUnicodeStringTextOrSize (\r
   OUT EFI_STRING       StringDest, OPTIONAL\r
@@ -165,15 +163,13 @@ GetUnicodeStringTextOrSize (
   )\r
 {\r
   UINTN  StringSize;\r
-  CHAR16 Zero;\r
   UINT8  *StringPtr;\r
 \r
   ASSERT (StringSrc != NULL && BufferSize != NULL);\r
 \r
-  ZeroMem (&Zero, sizeof (CHAR16));\r
   StringSize = sizeof (CHAR16);\r
   StringPtr  = StringSrc;\r
-  while (CompareMem (StringPtr, &Zero, sizeof (CHAR16)) != 0) {\r
+  while (ReadUnaligned16 ((UINT16 *) StringPtr) != 0) {\r
     StringSize += sizeof (CHAR16);\r
     StringPtr += sizeof (CHAR16);\r
   }\r
@@ -194,6 +190,8 @@ GetUnicodeStringTextOrSize (
 /**\r
   Copy string font info to a buffer.\r
 \r
+  This is a internal function.\r
+\r
   @param  StringPackage          Hii string package instance.\r
   @param  FontId                 Font identifier which is unique in a string\r
                                  package.\r
@@ -204,7 +202,6 @@ GetUnicodeStringTextOrSize (
   @retval EFI_NOT_FOUND          The specified font id does not exist.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 GetStringFontInfo (\r
   IN  HII_STRING_PACKAGE_INSTANCE     *StringPackage,\r
@@ -514,7 +511,7 @@ FindStringBlock (
         //        \r
         StringPackage->FontId++;\r
 \r
-        SafeFreePool (FontInfo);\r
+        FreePool (FontInfo);\r
       }\r
 \r
       BlockSize += Ext2.Length;\r
@@ -567,6 +564,8 @@ FindStringBlock (
 /**\r
   Parse all string blocks to get a string specified by StringId.\r
 \r
+  This is a internal function.\r
+\r
   @param  Private                Hii database private structure.\r
   @param  StringPackage          Hii string package instance.\r
   @param  StringId               The string's id, which is unique within\r
@@ -587,7 +586,6 @@ FindStringBlock (
                                  hold the string.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 GetStringWorker (\r
   IN HII_DATABASE_PRIVATE_DATA        *Private,\r
@@ -676,6 +674,8 @@ GetStringWorker (
 /**\r
   Parse all string blocks to set a String specified by StringId.\r
 \r
+  This is a internal function.\r
+\r
   @param  Private                HII database driver private structure.\r
   @param  StringPackage          HII string package instance.\r
   @param  StringId               The string's id, which is unique within\r
@@ -693,7 +693,6 @@ GetStringWorker (
                                  task.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 SetStringWorker (\r
   IN  HII_DATABASE_PRIVATE_DATA       *Private,\r
@@ -815,7 +814,7 @@ SetStringWorker (
       TmpSize\r
       );\r
 \r
-    SafeFreePool (StringPackage->StringBlock);\r
+    FreePool (StringPackage->StringBlock);\r
     StringPackage->StringBlock = Block;\r
     StringPackage->StringPkgHdr->Header.Length += (UINT32) (BlockSize - OldBlockSize);\r
     break;\r
@@ -848,7 +847,7 @@ SetStringWorker (
       OldBlockSize - (StringTextPtr - StringPackage->StringBlock) - StringSize\r
       );\r
 \r
-    SafeFreePool (StringPackage->StringBlock);\r
+    FreePool (StringPackage->StringBlock);\r
     StringPackage->StringBlock = Block;\r
     StringPackage->StringPkgHdr->Header.Length += (UINT32) (BlockSize - OldBlockSize);\r
     break;\r
@@ -899,7 +898,7 @@ SetStringWorker (
 \r
   CopyMem (BlockPtr, StringPackage->StringBlock, OldBlockSize);\r
 \r
-  SafeFreePool (StringPackage->StringBlock);\r
+  FreePool (StringPackage->StringBlock);\r
   StringPackage->StringBlock = Block;\r
   StringPackage->StringPkgHdr->Header.Length += Ext2.Length;\r
 \r
@@ -1015,7 +1014,7 @@ HiiNewString (
        Link = Link->ForwardLink\r
       ) {\r
     StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
-    if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
+    if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
       Matched = TRUE;\r
       break;\r
     }\r
@@ -1044,7 +1043,7 @@ HiiNewString (
     HeaderSize = (UINT32) (AsciiStrSize ((CHAR8 *) Language) - 1 + sizeof (EFI_HII_STRING_PACKAGE_HDR));\r
     StringPackage->StringPkgHdr = AllocateZeroPool (HeaderSize);\r
     if (StringPackage->StringPkgHdr == NULL) {\r
-      SafeFreePool (StringPackage);\r
+      FreePool (StringPackage);\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
     StringPackage->StringPkgHdr->Header.Type      = EFI_HII_PACKAGE_STRINGS;\r
@@ -1064,8 +1063,8 @@ HiiNewString (
     BlockSize     = Ucs2BlockSize + sizeof (EFI_HII_SIBT_END_BLOCK);\r
     StringPackage->StringBlock = (UINT8 *) AllocateZeroPool (BlockSize);\r
     if (StringPackage->StringBlock == NULL) {\r
-      SafeFreePool (StringPackage->StringPkgHdr);\r
-      SafeFreePool (StringPackage);\r
+      FreePool (StringPackage->StringPkgHdr);\r
+      FreePool (StringPackage);\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
 \r
@@ -1140,7 +1139,7 @@ HiiNewString (
     // Append a EFI_HII_SIBT_END block to the end.\r
     //\r
     *BlockPtr = EFI_HII_SIBT_END;\r
-    SafeFreePool (StringPackage->StringBlock);\r
+    FreePool (StringPackage->StringBlock);\r
     StringPackage->StringBlock = StringBlock;\r
     StringPackage->StringPkgHdr->Header.Length += Ucs2BlockSize;\r
     PackageListNode->PackageListHdr.PackageLength += Ucs2BlockSize;\r
@@ -1181,7 +1180,7 @@ HiiNewString (
       // Append a EFI_HII_SIBT_END block to the end.\r
       //\r
       *BlockPtr = EFI_HII_SIBT_END;\r
-      SafeFreePool (StringPackage->StringBlock);\r
+      FreePool (StringPackage->StringBlock);\r
       StringPackage->StringBlock = StringBlock;\r
       StringPackage->StringPkgHdr->Header.Length += Ucs2FontBlockSize;\r
       PackageListNode->PackageListHdr.PackageLength += Ucs2FontBlockSize;\r
@@ -1241,7 +1240,7 @@ HiiNewString (
       // Append a EFI_HII_SIBT_END block to the end.\r
       //\r
       *BlockPtr = EFI_HII_SIBT_END;\r
-      SafeFreePool (StringPackage->StringBlock);\r
+      FreePool (StringPackage->StringBlock);\r
       StringPackage->StringBlock = StringBlock;\r
       StringPackage->StringPkgHdr->Header.Length += FontBlockSize + Ucs2FontBlockSize;\r
       PackageListNode->PackageListHdr.PackageLength += FontBlockSize + Ucs2FontBlockSize;\r
@@ -1254,6 +1253,19 @@ HiiNewString (
     }\r
   }\r
 \r
+  //\r
+  // Trigger any registered notification function\r
+  //\r
+  if (!Matched) {  \r
+    return InvokeRegisteredFunction (\r
+             Private,\r
+             EFI_HII_DATABASE_NOTIFY_NEW_PACK,\r
+             (VOID *) StringPackage,\r
+             EFI_HII_PACKAGE_STRINGS,\r
+             PackageList\r
+             );\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1341,7 +1353,7 @@ HiiGetString (
          Link =  Link->ForwardLink\r
         ) {\r
         StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
-        if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
+        if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
           Status = GetStringWorker (Private, StringPackage, StringId, String, StringSize, StringFontInfo);\r
           if (Status != EFI_NOT_FOUND) {\r
             return Status;\r
@@ -1434,7 +1446,7 @@ HiiSetString (
          Link =  Link->ForwardLink\r
         ) {\r
       StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
-      if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
+      if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) {\r
         OldPackageLen = StringPackage->StringPkgHdr->Header.Length;\r
         Status = SetStringWorker (\r
                    Private,\r
@@ -1524,7 +1536,7 @@ HiiGetLanguages (
       ) {\r
     StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
     ResultSize += AsciiStrSize (StringPackage->StringPkgHdr->Language);\r
-    if (ResultSize < *LanguagesSize) {\r
+    if (ResultSize <= *LanguagesSize) {\r
       AsciiStrCpy (Languages, StringPackage->StringPkgHdr->Language);\r
       Languages += AsciiStrSize (StringPackage->StringPkgHdr->Language);\r
       *(Languages - 1) = L';';\r
@@ -1557,14 +1569,14 @@ HiiGetLanguages (
                                  FirstLanguage. If there are no secondary\r
                                  languages, the function  returns successfully, but\r
                                  this is set to NULL.\r
-  @param  SecondaryLanguageSize  On entry, points to the size of the buffer pointed\r
-                                 to  by SecondLanguages, in bytes. On return,\r
-                                 points to the length of SecondLanguages in bytes.\r
+  @param  SecondaryLanguagesSize On entry, points to the size of the buffer pointed\r
+                                 to  by SecondaryLanguages, in bytes. On return,\r
+                                 points to the length of SecondaryLanguages in bytes.\r
 \r
   @retval EFI_SUCCESS            Secondary languages were correctly returned.\r
-  @retval EFI_INVALID_PARAMETER  FirstLanguage or SecondLanguages or\r
-                                 SecondLanguagesSize was NULL.\r
-  @retval EFI_BUFFER_TOO_SMALL   The buffer specified by SecondLanguagesSize is\r
+  @retval EFI_INVALID_PARAMETER  FirstLanguage or SecondaryLanguages or\r
+                                 SecondaryLanguagesSize was NULL.\r
+  @retval EFI_BUFFER_TOO_SMALL   The buffer specified by SecondaryLanguagesSize is\r
                                  too small to hold the returned information.\r
                                  SecondLanguageSize is updated to hold the size of\r
                                  the buffer required.\r
@@ -1579,8 +1591,8 @@ HiiGetSecondaryLanguages (
   IN CONST EFI_HII_STRING_PROTOCOL   *This,\r
   IN EFI_HII_HANDLE                  PackageList,\r
   IN CONST CHAR8                     *FirstLanguage,\r
-  IN OUT CHAR8                       *SecondLanguages,\r
-  IN OUT UINTN                       *SecondLanguagesSize\r
+  IN OUT CHAR8                       *SecondaryLanguages,\r
+  IN OUT UINTN                       *SecondaryLanguagesSize\r
   )\r
 {\r
   LIST_ENTRY                          *Link;\r
@@ -1595,7 +1607,7 @@ HiiGetSecondaryLanguages (
   if (This == NULL || PackageList == NULL || FirstLanguage == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
-  if (SecondLanguages == NULL || SecondLanguagesSize == NULL) {\r
+  if (SecondaryLanguages == NULL || SecondaryLanguagesSize == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
   if (!IsHiiHandleValid (PackageList)) {\r
@@ -1623,7 +1635,7 @@ HiiGetSecondaryLanguages (
          Link1 = Link1->ForwardLink\r
         ) {\r
     StringPackage = CR (Link1, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
-    if (R8_EfiLibCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) {\r
+    if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) {\r
       Languages = StringPackage->StringPkgHdr->Language;\r
       //\r
       // Language is a series of ';' terminated strings, first one is primary\r
@@ -1637,10 +1649,10 @@ HiiGetSecondaryLanguages (
       Languages++;\r
 \r
       ResultSize = AsciiStrSize (Languages);\r
-      if (ResultSize <= *SecondLanguagesSize) {\r
-        AsciiStrCpy (SecondLanguages, Languages);\r
+      if (ResultSize <= *SecondaryLanguagesSize) {\r
+        AsciiStrCpy (SecondaryLanguages, Languages);\r
       } else {\r
-        *SecondLanguagesSize = ResultSize;\r
+        *SecondaryLanguagesSize = ResultSize;\r
         return EFI_BUFFER_TOO_SMALL;\r
       }\r
 \r
@@ -1651,3 +1663,41 @@ HiiGetSecondaryLanguages (
   return EFI_INVALID_LANGUAGE;\r
 }\r
 \r
+/**\r
+  Compare whether two names of languages are identical.\r
+\r
+  @param  Language1              Name of language 1\r
+  @param  Language2              Name of language 2\r
+\r
+  @retval TRUE                   same\r
+  @retval FALSE                  not same\r
+\r
+**/\r
+BOOLEAN\r
+HiiCompareLanguage (\r
+  IN  CHAR8  *Language1,\r
+  IN  CHAR8  *Language2\r
+  )\r
+{\r
+  //\r
+  // Porting Guide:\r
+  // This library interface is simply obsolete.\r
+  // Include the source code to user code.\r
+  //\r
+  UINTN Index;\r
+\r
+  for (Index = 0; (Language1[Index] != 0) && (Language2[Index] != 0); Index++) {\r
+    if (Language1[Index] != Language2[Index]) {\r
+      return FALSE;\r
+    }\r
+  }\r
+\r
+  if (((Language1[Index] == 0) && (Language2[Index] == 0))   || \r
+         ((Language1[Index] == 0) && (Language2[Index] != ';')) ||\r
+         ((Language1[Index] == ';') && (Language2[Index] != 0)) ||\r
+         ((Language1[Index] == ';') && (Language2[Index] != ';'))) {\r
+    return TRUE;\r
+  }\r
+\r
+  return FALSE;\r
+}\r