+++ /dev/null
-/** @file\r
- \r
-Copyright (c) 2009 - 2012, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include "MiscSubclassDriver.h"\r
-/*++\r
- Check whether the language is supported for given HII handle\r
-\r
- @param HiiHandle The HII package list handle.\r
- @param Offset The offest of current lanague in the supported languages.\r
- @param CurrentLang The language code.\r
-\r
- @retval TRUE Supported.\r
- @retval FALSE Not Supported.\r
-\r
---*/\r
-VOID\r
-EFIAPI\r
-CurrentLanguageMatch (\r
- IN EFI_HII_HANDLE HiiHandle,\r
- OUT UINT16 *Offset,\r
- OUT CHAR8 *CurrentLang\r
- )\r
-{\r
- CHAR8 *DefaultLang;\r
- CHAR8 *BestLanguage;\r
- CHAR8 *Languages;\r
- CHAR8 *MatchLang;\r
- CHAR8 *EndMatchLang;\r
- UINTN CompareLength;\r
- \r
- Languages = HiiGetSupportedLanguages (HiiHandle);\r
- if (Languages == NULL) {\r
- return;\r
- }\r
-\r
- GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&CurrentLang, NULL);\r
- DefaultLang = (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang);\r
- BestLanguage = GetBestLanguage (\r
- Languages,\r
- FALSE,\r
- (CurrentLang != NULL) ? CurrentLang : "",\r
- DefaultLang,\r
- NULL\r
- );\r
- if (BestLanguage != NULL) {\r
- //\r
- // Find the best matching RFC 4646 language, compute the offset.\r
- //\r
- CompareLength = AsciiStrLen (BestLanguage);\r
- for (MatchLang = Languages, (*Offset) = 0; MatchLang != '\0'; (*Offset)++) {\r
- //\r
- // Seek to the end of current match language. \r
- //\r
- for (EndMatchLang = MatchLang; *EndMatchLang != '\0' && *EndMatchLang != ';'; EndMatchLang++);\r
- \r
- if ((EndMatchLang == MatchLang + CompareLength) && AsciiStrnCmp(MatchLang, BestLanguage, CompareLength) == 0) {\r
- //\r
- // Find the current best Language in the supported languages\r
- //\r
- break;\r
- }\r
- //\r
- // best language match be in the supported language.\r
- //\r
- ASSERT (*EndMatchLang == ';');\r
- MatchLang = EndMatchLang + 1;\r
- }\r
- FreePool (BestLanguage);\r
- }\r
-\r
- FreePool (Languages);\r
- if (CurrentLang != NULL) {\r
- FreePool (CurrentLang);\r
- }\r
- return ;\r
-}\r
-\r
-\r
-/**\r
- Get next language from language code list (with separator ';').\r
-\r
- @param LangCode Input: point to first language in the list. On\r
- Otput: point to next language in the list, or\r
- NULL if no more language in the list.\r
- @param Lang The first language in the list.\r
-\r
-**/\r
-VOID\r
-EFIAPI\r
-GetNextLanguage (\r
- IN OUT CHAR8 **LangCode,\r
- OUT CHAR8 *Lang\r
- )\r
-{\r
- UINTN Index;\r
- CHAR8 *StringPtr;\r
-\r
- ASSERT (LangCode != NULL);\r
- ASSERT (*LangCode != NULL);\r
- ASSERT (Lang != NULL);\r
-\r
- Index = 0;\r
- StringPtr = *LangCode;\r
- while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
- Index++;\r
- }\r
-\r
- CopyMem (Lang, StringPtr, Index);\r
- Lang[Index] = 0;\r
-\r
- if (StringPtr[Index] == ';') {\r
- Index++;\r
- }\r
- *LangCode = StringPtr + Index;\r
-}\r
-\r
-/**\r
- This function returns the number of supported languages on HiiHandle.\r
-\r
- @param HiiHandle The HII package list handle.\r
-\r
- @retval The number of supported languages.\r
-\r
-**/\r
-UINT16\r
-EFIAPI\r
-GetSupportedLanguageNumber (\r
- IN EFI_HII_HANDLE HiiHandle\r
- )\r
-{\r
- CHAR8 *Lang;\r
- CHAR8 *Languages;\r
- CHAR8 *LanguageString;\r
- UINT16 LangNumber;\r
- \r
- Languages = HiiGetSupportedLanguages (HiiHandle);\r
- if (Languages == NULL) {\r
- return 0;\r
- }\r
-\r
- LangNumber = 0;\r
- Lang = AllocatePool (AsciiStrSize (Languages));\r
- if (Lang != NULL) {\r
- LanguageString = Languages;\r
- while (*LanguageString != 0) {\r
- GetNextLanguage (&LanguageString, Lang);\r
- LangNumber++;\r
- }\r
- FreePool (Lang);\r
- }\r
- FreePool (Languages);\r
- return LangNumber;\r
-}\r
-\r
-\r
-/**\r
- This function makes boot time changes to the contents of the\r
- MiscNumberOfInstallableLanguages (Type 13).\r
-\r
- @param RecordData Pointer to copy of RecordData from the Data Table.\r
-\r
- @retval EFI_SUCCESS All parameters were valid.\r
- @retval EFI_UNSUPPORTED Unexpected RecordType value.\r
- @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
-\r
-**/\r
-MISC_SMBIOS_TABLE_FUNCTION(NumberOfInstallableLanguages)\r
-{\r
- UINTN LangStrLen;\r
- CHAR8 CurrentLang[SMBIOS_STRING_MAX_LENGTH + 1];\r
- CHAR8 *OptionalStrStart;\r
- UINT16 Offset;\r
- EFI_STATUS Status;\r
- EFI_SMBIOS_HANDLE SmbiosHandle;\r
- SMBIOS_TABLE_TYPE13 *SmbiosRecord;\r
- EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES *ForType13InputData;\r
- \r
- ForType13InputData = (EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES *)RecordData;\r
-\r
- //\r
- // First check for invalid parameters.\r
- //\r
- if (RecordData == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- \r
- ForType13InputData->NumberOfInstallableLanguages = GetSupportedLanguageNumber (mHiiHandle);\r
-\r
- //\r
- // Try to check if current langcode matches with the langcodes in installed languages\r
- //\r
- ZeroMem(CurrentLang, SMBIOS_STRING_MAX_LENGTH + 1);\r
- CurrentLanguageMatch (mHiiHandle, &Offset, CurrentLang);\r
- LangStrLen = AsciiStrLen(CurrentLang);\r
-\r
- //\r
- // Two zeros following the last string.\r
- //\r
- SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE13) + LangStrLen + 1 + 1);\r
- ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE13) + LangStrLen + 1 + 1);\r
-\r
- SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION;\r
- SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE13);\r
- //\r
- // Make handle chosen by smbios protocol.add automatically.\r
- //\r
- SmbiosRecord->Hdr.Handle = 0; \r
-\r
- SmbiosRecord->InstallableLanguages = (UINT8)ForType13InputData->NumberOfInstallableLanguages;\r
- SmbiosRecord->Flags = (UINT8)ForType13InputData->LanguageFlags.AbbreviatedLanguageFormat;\r
- SmbiosRecord->CurrentLanguages = 1;\r
- OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
- AsciiStrCpy(OptionalStrStart, CurrentLang);\r
- //\r
- // Now we have got the full smbios record, call smbios protocol to add this record.\r
- //\r
- Status = AddSmbiosRecord (Smbios, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord);\r
-\r
- FreePool(SmbiosRecord);\r
- return Status;\r
-}\r