]> git.proxmox.com Git - mirror_edk2.git/blame - EmulatorPkg/MiscSubClassPlatformDxe/MiscNumberOfInstallableLanguagesFunction.c
EmulatorPkg: Replace BSD License with BSD+Patent License
[mirror_edk2.git] / EmulatorPkg / MiscSubClassPlatformDxe / MiscNumberOfInstallableLanguagesFunction.c
CommitLineData
949f388f 1/** @file\r
2 This driver parses the mSmbiosMiscDataTable structure and reports\r
3 any generated data.\r
4\r
2bfd90f9 5 Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>\r
e3ba31da 6 SPDX-License-Identifier: BSD-2-Clause-Patent\r
949f388f 7\r
8**/\r
9\r
10#include "MiscSubClassDriver.h"\r
11/*++\r
12 Check whether the language is supported for given HII handle\r
13\r
14 @param HiiHandle The HII package list handle.\r
15 @param Offset The offest of current lanague in the supported languages.\r
16 @param CurrentLang The language code.\r
17\r
18 @retval TRUE Supported.\r
19 @retval FALSE Not Supported.\r
20\r
21**/\r
22VOID\r
23EFIAPI\r
24CurrentLanguageMatch (\r
25 IN EFI_HII_HANDLE HiiHandle,\r
26 OUT UINT16 *Offset,\r
27 OUT CHAR8 *CurrentLang\r
28 )\r
29{\r
30 CHAR8 *DefaultLang;\r
31 CHAR8 *BestLanguage;\r
32 CHAR8 *Languages;\r
33 CHAR8 *MatchLang;\r
34 CHAR8 *EndMatchLang;\r
35 UINTN CompareLength;\r
d18d8a1d 36\r
949f388f 37 Languages = HiiGetSupportedLanguages (HiiHandle);\r
38 if (Languages == NULL) {\r
39 return;\r
40 }\r
41\r
42 CurrentLang = GetEfiGlobalVariable (L"PlatformLang");\r
43 DefaultLang = (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang);\r
44 BestLanguage = GetBestLanguage (\r
45 Languages,\r
46 FALSE,\r
47 (CurrentLang != NULL) ? CurrentLang : "",\r
48 DefaultLang,\r
49 NULL\r
50 );\r
51 if (BestLanguage != NULL) {\r
52 //\r
53 // Find the best matching RFC 4646 language, compute the offset.\r
54 //\r
55 CompareLength = AsciiStrLen (BestLanguage);\r
56 for (MatchLang = Languages, (*Offset) = 0; MatchLang != '\0'; (*Offset)++) {\r
57 //\r
d18d8a1d 58 // Seek to the end of current match language.\r
949f388f 59 //\r
60 for (EndMatchLang = MatchLang; *EndMatchLang != '\0' && *EndMatchLang != ';'; EndMatchLang++);\r
d18d8a1d 61\r
949f388f 62 if ((EndMatchLang == MatchLang + CompareLength) && AsciiStrnCmp(MatchLang, BestLanguage, CompareLength) == 0) {\r
63 //\r
64 // Find the current best Language in the supported languages\r
65 //\r
66 break;\r
67 }\r
68 //\r
69 // best language match be in the supported language.\r
70 //\r
71 ASSERT (*EndMatchLang == ';');\r
72 MatchLang = EndMatchLang + 1;\r
73 }\r
74 FreePool (BestLanguage);\r
75 }\r
76\r
77 FreePool (Languages);\r
78 if (CurrentLang != NULL) {\r
79 FreePool (CurrentLang);\r
80 }\r
81 return ;\r
82}\r
83\r
84\r
85/**\r
86 Get next language from language code list (with separator ';').\r
87\r
88 @param LangCode Input: point to first language in the list. On\r
89 Otput: point to next language in the list, or\r
90 NULL if no more language in the list.\r
91 @param Lang The first language in the list.\r
92\r
93**/\r
94VOID\r
95EFIAPI\r
96GetNextLanguage (\r
97 IN OUT CHAR8 **LangCode,\r
98 OUT CHAR8 *Lang\r
99 )\r
100{\r
101 UINTN Index;\r
102 CHAR8 *StringPtr;\r
103\r
104 ASSERT (LangCode != NULL);\r
105 ASSERT (*LangCode != NULL);\r
106 ASSERT (Lang != NULL);\r
107\r
108 Index = 0;\r
109 StringPtr = *LangCode;\r
110 while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
111 Index++;\r
112 }\r
113\r
114 CopyMem (Lang, StringPtr, Index);\r
115 Lang[Index] = 0;\r
116\r
117 if (StringPtr[Index] == ';') {\r
118 Index++;\r
119 }\r
120 *LangCode = StringPtr + Index;\r
121}\r
122\r
123/**\r
124 This function returns the number of supported languages on HiiHandle.\r
125\r
126 @param HiiHandle The HII package list handle.\r
127\r
128 @retval The number of supported languages.\r
129\r
130**/\r
131UINT16\r
132EFIAPI\r
133GetSupportedLanguageNumber (\r
134 IN EFI_HII_HANDLE HiiHandle\r
135 )\r
136{\r
137 CHAR8 *Lang;\r
138 CHAR8 *Languages;\r
139 CHAR8 *LanguageString;\r
140 UINT16 LangNumber;\r
d18d8a1d 141\r
949f388f 142 Languages = HiiGetSupportedLanguages (HiiHandle);\r
143 if (Languages == NULL) {\r
144 return 0;\r
145 }\r
146\r
147 LangNumber = 0;\r
148 Lang = AllocatePool (AsciiStrSize (Languages));\r
149 if (Lang != NULL) {\r
150 LanguageString = Languages;\r
151 while (*LanguageString != 0) {\r
152 GetNextLanguage (&LanguageString, Lang);\r
153 LangNumber++;\r
154 }\r
155 FreePool (Lang);\r
156 }\r
157 FreePool (Languages);\r
158 return LangNumber;\r
159}\r
160\r
161\r
162/**\r
163 This function makes boot time changes to the contents of the\r
164 MiscNumberOfInstallableLanguages (Type 13).\r
165\r
166 @param RecordData Pointer to copy of RecordData from the Data Table.\r
167\r
168 @retval EFI_SUCCESS All parameters were valid.\r
169 @retval EFI_UNSUPPORTED Unexpected RecordType value.\r
170 @retval EFI_INVALID_PARAMETER Invalid parameter was found.\r
171\r
172**/\r
173MISC_SMBIOS_TABLE_FUNCTION(NumberOfInstallableLanguages)\r
174{\r
175 UINTN LangStrLen;\r
176 CHAR8 CurrentLang[SMBIOS_STRING_MAX_LENGTH + 1];\r
177 CHAR8 *OptionalStrStart;\r
178 UINT16 Offset;\r
179 EFI_STATUS Status;\r
180 EFI_SMBIOS_HANDLE SmbiosHandle;\r
181 SMBIOS_TABLE_TYPE13 *SmbiosRecord;\r
182 EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES *ForType13InputData;\r
d18d8a1d 183\r
949f388f 184 ForType13InputData = (EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES *)RecordData;\r
185\r
186 //\r
187 // First check for invalid parameters.\r
188 //\r
189 if (RecordData == NULL) {\r
190 return EFI_INVALID_PARAMETER;\r
191 }\r
d18d8a1d 192\r
949f388f 193 ForType13InputData->NumberOfInstallableLanguages = GetSupportedLanguageNumber (mHiiHandle);\r
194\r
195 //\r
196 // Try to check if current langcode matches with the langcodes in installed languages\r
197 //\r
198 ZeroMem(CurrentLang, SMBIOS_STRING_MAX_LENGTH + 1);\r
199 CurrentLanguageMatch (mHiiHandle, &Offset, CurrentLang);\r
200 LangStrLen = AsciiStrLen(CurrentLang);\r
201\r
202 //\r
203 // Two zeros following the last string.\r
204 //\r
205 SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE13) + LangStrLen + 1 + 1);\r
206 ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE13) + LangStrLen + 1 + 1);\r
207\r
208 SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION;\r
209 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE13);\r
210 //\r
211 // Make handle chosen by smbios protocol.add automatically.\r
212 //\r
d18d8a1d 213 SmbiosRecord->Hdr.Handle = 0;\r
949f388f 214\r
215 SmbiosRecord->InstallableLanguages = (UINT8)ForType13InputData->NumberOfInstallableLanguages;\r
216 SmbiosRecord->Flags = (UINT8)ForType13InputData->LanguageFlags.AbbreviatedLanguageFormat;\r
217 SmbiosRecord->CurrentLanguages = 1;\r
218 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
219 AsciiStrCpy(OptionalStrStart, CurrentLang);\r
220 //\r
221 // Now we have got the full smbios record, call smbios protocol to add this record.\r
222 //\r
2bfd90f9
SZ
223 Status = AddSmbiosRecord (Smbios, &SmbiosHandle, (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord);\r
224\r
949f388f 225 FreePool(SmbiosRecord);\r
226 return Status;\r
227}\r