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