]> git.proxmox.com Git - mirror_edk2.git/blame - Nt32Pkg/MiscSubClassPlatformDxe/MiscNumberOfInstallableLanguagesFunction.c
1. PI SMBIOS Checkin. Major change include:
[mirror_edk2.git] / Nt32Pkg / MiscSubClassPlatformDxe / MiscNumberOfInstallableLanguagesFunction.c
CommitLineData
1fdd39d3 1/*++\r
2 \r
3Copyright (c) 2009, Intel Corporation. All rights reserved. <BR> \r
4This software and associated documentation (if any) is furnished\r
5under a license and may only be used or copied in accordance\r
6with the terms of the license. Except as permitted by such\r
7license, no part of this software or documentation may be\r
8reproduced, stored in a retrieval system, or transmitted in any\r
9form or by any means without the express written consent of\r
10Intel Corporation.\r
11\r
12\r
13Module Name:\r
14\r
15 MiscNumberOfInstallableLanguagesFunction.c\r
16 \r
17Abstract: \r
18\r
19 This driver parses the mSmbiosMiscDataTable structure and reports\r
20 any generated data.\r
21\r
22--*/\r
23\r
24#include "MiscSubclassDriver.h"\r
25/*++\r
26 Check whether the language is supported for given HII handle\r
27\r
28 @param HiiHandle The HII package list handle.\r
29 @param Offset The offest of current lanague in the supported languages.\r
30 @param CurrentLang The language code.\r
31\r
32 @retval TRUE Supported.\r
33 @retval FALSE Not Supported.\r
34\r
35--*/\r
36VOID\r
37EFIAPI\r
38CurrentLanguageMatch (\r
39 IN EFI_HII_HANDLE HiiHandle,\r
40 OUT UINT16 *Offset,\r
41 OUT CHAR8 *CurrentLang\r
42 )\r
43{\r
44 CHAR8 *DefaultLang;\r
45 CHAR8 *BestLanguage;\r
46 CHAR8 *Languages;\r
47 CHAR8 *MatchLang;\r
48 CHAR8 *EndMatchLang;\r
49 UINTN CompareLength;\r
50 \r
51 Languages = HiiGetSupportedLanguages (HiiHandle);\r
52 if (Languages == NULL) {\r
53 return;\r
54 }\r
55\r
56 CurrentLang = GetEfiGlobalVariable (L"PlatformLang");\r
57 DefaultLang = (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang);\r
58 BestLanguage = GetBestLanguage (\r
59 Languages,\r
60 FALSE,\r
61 (CurrentLang != NULL) ? CurrentLang : "",\r
62 DefaultLang,\r
63 NULL\r
64 );\r
65 if (BestLanguage != NULL) {\r
66 //\r
67 // Find the best matching RFC 4646 language, compute the offset.\r
68 //\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 ;\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 EFI_STATUS Status;\r
194 EFI_SMBIOS_HANDLE SmbiosHandle;\r
195 SMBIOS_TABLE_TYPE13 *SmbiosRecord;\r
196 EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES *ForType13InputData;\r
197 \r
198 ForType13InputData = (EFI_MISC_NUMBER_OF_INSTALLABLE_LANGUAGES *)RecordData;\r
199\r
200 //\r
201 // First check for invalid parameters.\r
202 //\r
203 if (RecordData == NULL) {\r
204 return EFI_INVALID_PARAMETER;\r
205 }\r
206 \r
207 ForType13InputData->NumberOfInstallableLanguages = GetSupportedLanguageNumber (mHiiHandle);\r
208\r
209 //\r
210 // Try to check if current langcode matches with the langcodes in installed languages\r
211 //\r
212 ZeroMem(CurrentLang, SMBIOS_STRING_MAX_LENGTH + 1);\r
213 CurrentLanguageMatch (mHiiHandle, &Offset, CurrentLang);\r
214 LangStrLen = AsciiStrLen(CurrentLang);\r
215\r
216 //\r
217 // Two zeros following the last string.\r
218 //\r
219 SmbiosRecord = AllocatePool(sizeof (SMBIOS_TABLE_TYPE13) + LangStrLen + 1 + 1);\r
220 ZeroMem(SmbiosRecord, sizeof (SMBIOS_TABLE_TYPE13) + LangStrLen + 1 + 1);\r
221\r
222 SmbiosRecord->Hdr.Type = EFI_SMBIOS_TYPE_BIOS_LANGUAGE_INFORMATION;\r
223 SmbiosRecord->Hdr.Length = sizeof (SMBIOS_TABLE_TYPE13);\r
224 //\r
225 // Make handle chosen by smbios protocol.add automatically.\r
226 //\r
227 SmbiosRecord->Hdr.Handle = 0; \r
228\r
229 SmbiosRecord->InstallableLanguages = (UINT8)ForType13InputData->NumberOfInstallableLanguages;\r
230 SmbiosRecord->Flags = (UINT8)ForType13InputData->LanguageFlags.AbbreviatedLanguageFormat;\r
231 SmbiosRecord->CurrentLanguages = 1;\r
232 OptionalStrStart = (CHAR8 *)(SmbiosRecord + 1);\r
233 AsciiStrCpy(OptionalStrStart, CurrentLang);\r
234 //\r
235 // Now we have got the full smbios record, call smbios protocol to add this record.\r
236 //\r
237 SmbiosHandle = 0;\r
238 Status = Smbios-> Add(\r
239 Smbios, \r
240 NULL,\r
241 &SmbiosHandle, \r
242 (EFI_SMBIOS_TABLE_HEADER *) SmbiosRecord\r
243 );\r
244 FreePool(SmbiosRecord);\r
245 return Status;\r
246}\r