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