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