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