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