From f324bf4dbeda4d64b769bd005331e8f9404b692d Mon Sep 17 00:00:00 2001 From: rsun3 Date: Tue, 26 May 2009 03:48:50 +0000 Subject: [PATCH] Roll back changes to apply GetBestLanguage() in HiiDataBase. Exact language match should be used in HiiDatabase. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8384 6f19259b-4bc3-4df7-8a09-765794883524 --- .../FrameworkHiiOnUefiHiiThunk/Strings.c | 99 +++++++++---------- .../Universal/HiiDatabaseDxe/Database.c | 5 +- .../Universal/HiiDatabaseDxe/HiiDatabase.h | 18 ++++ .../Universal/HiiDatabaseDxe/String.c | 58 ++++++++--- 4 files changed, 105 insertions(+), 75 deletions(-) diff --git a/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/Strings.c b/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/Strings.c index d0b356be51..d83750bc9b 100644 --- a/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/Strings.c +++ b/EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/Strings.c @@ -307,7 +307,6 @@ HiiThunkGetString ( Private = HII_THUNK_PRIVATE_DATA_FROM_THIS(This); - Iso639AsciiLanguage = NULL; Rfc4646AsciiLanguage = NULL; if (LanguageString != NULL) { @@ -322,6 +321,7 @@ HiiThunkGetString ( // in Iso639. So map it to the Language Identifier defined in RFC4646. // Rfc4646AsciiLanguage = ConvertLanguagesIso639ToRfc4646 (Iso639AsciiLanguage); + FreePool (Iso639AsciiLanguage); // // If Rfc4646AsciiLanguage is NULL, more language mapping must be added to @@ -337,67 +337,56 @@ HiiThunkGetString ( goto Done; } - if (Rfc4646AsciiLanguage == NULL) { - // - // Get the languages that the package specified by HiiHandle supports - // - SupportedLanguages = HiiGetSupportedLanguages (UefiHiiHandle); - if (SupportedLanguages == NULL) { - goto Error2; - } + // + // Get the languages that the package specified by HiiHandle supports + // + SupportedLanguages = HiiGetSupportedLanguages (UefiHiiHandle); + if (SupportedLanguages == NULL) { + goto Error2; + } - // - // Get the current platform language setting - // - PlatformLanguage = GetEfiGlobalVariable (L"PlatformLang"); - if (PlatformLanguage == NULL) { - goto Error1; - } + // + // Get the current platform language setting + // + PlatformLanguage = GetEfiGlobalVariable (L"PlatformLang"); + if (PlatformLanguage == NULL) { + goto Error1; + } - // - // Get the best matching language from SupportedLanguages - // - BestLanguage = GetBestLanguage ( - SupportedLanguages, - FALSE, // RFC 4646 mode - PlatformLanguage, // Next highest priority - SupportedLanguages, // Lowest priority - NULL - ); - if (BestLanguage == NULL) { - FreePool (PlatformLanguage); + // + // Get the best matching language from SupportedLanguages + // + BestLanguage = GetBestLanguage ( + SupportedLanguages, + FALSE, // RFC 4646 mode + (Rfc4646AsciiLanguage != NULL) ? Rfc4646AsciiLanguage : "", + PlatformLanguage, // Next highest priority + SupportedLanguages, // Lowest priority + NULL + ); + if (BestLanguage == NULL) { + FreePool (PlatformLanguage); Error1: - FreePool (SupportedLanguages); + FreePool (SupportedLanguages); Error2: - Status = EFI_INVALID_PARAMETER; - goto Done; - } - - Status = mHiiStringProtocol->GetString ( - mHiiStringProtocol, - BestLanguage, - UefiHiiHandle, - Token, - StringBuffer, - BufferLengthTemp, - NULL - ); - FreePool (BestLanguage); - } else { - Status = mHiiStringProtocol->GetString ( - mHiiStringProtocol, - Rfc4646AsciiLanguage, - UefiHiiHandle, - Token, - StringBuffer, - BufferLengthTemp, - NULL - ); + Status = EFI_INVALID_PARAMETER; + goto Done; } + Status = mHiiStringProtocol->GetString ( + mHiiStringProtocol, + BestLanguage, + UefiHiiHandle, + Token, + StringBuffer, + BufferLengthTemp, + NULL + ); + FreePool (BestLanguage); + Done: - if (Iso639AsciiLanguage != NULL) { - FreePool (Iso639AsciiLanguage); + if (Rfc4646AsciiLanguage != NULL) { + FreePool (Rfc4646AsciiLanguage); } return Status; diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c index 9081e7c5cb..918559e544 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/Database.c @@ -784,7 +784,6 @@ InsertStringPackage ( EFI_STATUS Status; EFI_HII_PACKAGE_HEADER PackageHeader; CHAR8 *Language; - CHAR8 *MatchedLanguage; UINT32 LanguageSize; LIST_ENTRY *Link; @@ -810,10 +809,8 @@ InsertStringPackage ( AsciiStrCpy (Language, (CHAR8 *) PackageHdr + HeaderSize - LanguageSize); for (Link = PackageList->StringPkgHdr.ForwardLink; Link != &PackageList->StringPkgHdr; Link = Link->ForwardLink) { StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - MatchedLanguage = GetBestLanguage (StringPackage->StringPkgHdr->Language, FALSE, (CHAR8 *) Language, NULL); - if (MatchedLanguage != NULL) { + if (HiiCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) { FreePool (Language); - FreePool (MatchedLanguage); return EFI_UNSUPPORTED; } } diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h index af6ef9aaf9..81f42c5bf2 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/HiiDatabase.h @@ -1745,6 +1745,24 @@ HiiGetAltCfg ( OUT EFI_STRING *AltCfgResp ); + +/** + Compare whether two names of languages are identical. + + @param Language1 Name of language 1 + @param Language2 Name of language 2 + + @retval TRUE same + @retval FALSE not same + +**/ +BOOLEAN +HiiCompareLanguage ( + IN CHAR8 *Language1, + IN CHAR8 *Language2 + ) +; + // // Global variables // diff --git a/MdeModulePkg/Universal/HiiDatabaseDxe/String.c b/MdeModulePkg/Universal/HiiDatabaseDxe/String.c index 052abca689..00ff6ce786 100644 --- a/MdeModulePkg/Universal/HiiDatabaseDxe/String.c +++ b/MdeModulePkg/Universal/HiiDatabaseDxe/String.c @@ -968,7 +968,6 @@ HiiNewString ( EFI_HII_SIBT_EXT2_BLOCK Ext2; HII_FONT_INFO *LocalFont; HII_GLOBAL_FONT_INFO *GlobalFont; - CHAR8 *MatchedLanguage; if (This == NULL || String == NULL || StringId == NULL || Language == NULL || PackageList == NULL) { return EFI_INVALID_PARAMETER; @@ -1015,9 +1014,7 @@ HiiNewString ( Link = Link->ForwardLink ) { StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - MatchedLanguage = GetBestLanguage (StringPackage->StringPkgHdr->Language, FALSE, (CHAR8 *) Language, NULL); - if (MatchedLanguage != NULL) { - FreePool (MatchedLanguage); + if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) { Matched = TRUE; break; } @@ -1323,7 +1320,6 @@ HiiGetString ( HII_DATABASE_RECORD *DatabaseRecord; HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageListNode; HII_STRING_PACKAGE_INSTANCE *StringPackage; - CHAR8 *MatchedLanguage; if (This == NULL || Language == NULL || StringId < 1 || StringSize == NULL || PackageList == NULL) { return EFI_INVALID_PARAMETER; @@ -1357,9 +1353,7 @@ HiiGetString ( Link = Link->ForwardLink ) { StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - MatchedLanguage = GetBestLanguage (StringPackage->StringPkgHdr->Language, FALSE, (CHAR8 *) Language, NULL); - if (MatchedLanguage != NULL) { - FreePool (MatchedLanguage); + if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) { Status = GetStringWorker (Private, StringPackage, StringId, String, StringSize, StringFontInfo); if (Status != EFI_NOT_FOUND) { return Status; @@ -1427,7 +1421,6 @@ HiiSetString ( HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageListNode; HII_STRING_PACKAGE_INSTANCE *StringPackage; UINT32 OldPackageLen; - CHAR8 *MatchedLanguage; if (This == NULL || Language == NULL || StringId < 1 || String == NULL || PackageList == NULL) { return EFI_INVALID_PARAMETER; @@ -1453,9 +1446,7 @@ HiiSetString ( Link = Link->ForwardLink ) { StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - MatchedLanguage = GetBestLanguage (StringPackage->StringPkgHdr->Language, FALSE, (CHAR8 *) Language, NULL); - if (MatchedLanguage != NULL) { - FreePool (MatchedLanguage); + if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) Language)) { OldPackageLen = StringPackage->StringPkgHdr->Header.Length; Status = SetStringWorker ( Private, @@ -1612,7 +1603,6 @@ HiiGetSecondaryLanguages ( HII_STRING_PACKAGE_INSTANCE *StringPackage; CHAR8 *Languages; UINTN ResultSize; - CHAR8 *MatchedLanguage; if (This == NULL || PackageList == NULL || FirstLanguage == NULL) { return EFI_INVALID_PARAMETER; @@ -1645,9 +1635,7 @@ HiiGetSecondaryLanguages ( Link1 = Link1->ForwardLink ) { StringPackage = CR (Link1, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE); - MatchedLanguage = GetBestLanguage (StringPackage->StringPkgHdr->Language, FALSE, (CHAR8 *) FirstLanguage, NULL); - if (MatchedLanguage != NULL) { - FreePool (MatchedLanguage); + if (HiiCompareLanguage (StringPackage->StringPkgHdr->Language, (CHAR8 *) FirstLanguage)) { Languages = StringPackage->StringPkgHdr->Language; // // Language is a series of ';' terminated strings, first one is primary @@ -1675,3 +1663,41 @@ HiiGetSecondaryLanguages ( return EFI_INVALID_LANGUAGE; } +/** + Compare whether two names of languages are identical. + + @param Language1 Name of language 1 + @param Language2 Name of language 2 + + @retval TRUE same + @retval FALSE not same + +**/ +BOOLEAN +HiiCompareLanguage ( + IN CHAR8 *Language1, + IN CHAR8 *Language2 + ) +{ + // + // Porting Guide: + // This library interface is simply obsolete. + // Include the source code to user code. + // + UINTN Index; + + for (Index = 0; (Language1[Index] != 0) && (Language2[Index] != 0); Index++) { + if (Language1[Index] != Language2[Index]) { + return FALSE; + } + } + + if (((Language1[Index] == 0) && (Language2[Index] == 0)) || + ((Language1[Index] == 0) && (Language2[Index] != ';')) || + ((Language1[Index] == ';') && (Language2[Index] != 0)) || + ((Language1[Index] == ';') && (Language2[Index] != ';'))) { + return TRUE; + } + + return FALSE; +} -- 2.39.2