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