]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/Language.c
IntelFrameworkModulePkg: Clean up source files
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / Language.c
CommitLineData
5c08e117 1/** @file\r
2 Language settings\r
3\r
0a6f4824 4Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
180a5a35 5This program and the accompanying materials\r
5c08e117 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "Language.h"\r
16#include "FrontPage.h"\r
17\r
9f6531d1 18EFI_GUID mFontPackageGuid = {\r
19 0x78941450, 0x90ab, 0x4fb1, {0xb7, 0x5f, 0x58, 0x92, 0x14, 0xe2, 0x4a, 0xc}\r
20};\r
21\r
5c08e117 22#define NARROW_GLYPH_NUMBER 8\r
23#define WIDE_GLYPH_NUMBER 75\r
24\r
5c08e117 25typedef struct {\r
26 ///\r
cb7d01c0 27 /// This 4-bytes total array length is required by HiiAddPackages()\r
5c08e117 28 ///\r
29 UINT32 Length;\r
30\r
31 //\r
32 // This is the Font package definition\r
33 //\r
34 EFI_HII_PACKAGE_HEADER Header;\r
35 UINT16 NumberOfNarrowGlyphs;\r
36 UINT16 NumberOfWideGlyphs;\r
37 EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER];\r
38 EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER];\r
39} FONT_PACK_BIN;\r
40\r
41FONT_PACK_BIN mFontBin = {\r
42 sizeof (FONT_PACK_BIN),\r
43 {\r
44 sizeof (FONT_PACK_BIN) - sizeof (UINT32),\r
45 EFI_HII_PACKAGE_SIMPLE_FONTS,\r
46 },\r
47 NARROW_GLYPH_NUMBER,\r
48 0,\r
49 { // Narrow Glyphs\r
50 {\r
51 0x05d0,\r
52 0x00,\r
53 {\r
54 0x00,\r
55 0x00,\r
56 0x00,\r
57 0x4E,\r
58 0x6E,\r
59 0x62,\r
60 0x32,\r
61 0x32,\r
62 0x3C,\r
63 0x68,\r
64 0x4C,\r
65 0x4C,\r
66 0x46,\r
67 0x76,\r
68 0x72,\r
69 0x00,\r
70 0x00,\r
71 0x00,\r
72 0x00\r
73 }\r
74 },\r
75 {\r
76 0x05d1,\r
77 0x00,\r
78 {\r
79 0x00,\r
80 0x00,\r
81 0x00,\r
82 0x78,\r
83 0x7C,\r
84 0x0C,\r
85 0x0C,\r
86 0x0C,\r
87 0x0C,\r
88 0x0C,\r
89 0x0C,\r
90 0x0C,\r
91 0x0C,\r
92 0x7E,\r
93 0x7E,\r
94 0x00,\r
95 0x00,\r
96 0x00,\r
97 0x00\r
98 }\r
99 },\r
100 {\r
101 0x05d2,\r
102 0x00,\r
103 {\r
104 0x00,\r
105 0x00,\r
106 0x00,\r
107 0x78,\r
108 0x7C,\r
109 0x0C,\r
110 0x0C,\r
111 0x0C,\r
112 0x0C,\r
113 0x0C,\r
114 0x0C,\r
115 0x1C,\r
116 0x3E,\r
117 0x66,\r
118 0x66,\r
119 0x00,\r
120 0x00,\r
121 0x00,\r
122 0x00\r
123 }\r
124 },\r
125 {\r
126 0x05d3,\r
127 0x00,\r
128 {\r
129 0x00,\r
130 0x00,\r
131 0x00,\r
132 0x7E,\r
133 0x7E,\r
134 0x0C,\r
135 0x0C,\r
136 0x0C,\r
137 0x0C,\r
138 0x0C,\r
139 0x0C,\r
140 0x0C,\r
141 0x0C,\r
142 0x0C,\r
143 0x0C,\r
144 0x00,\r
145 0x00,\r
146 0x00,\r
147 0x00\r
148 }\r
149 },\r
150 {\r
151 0x05d4,\r
152 0x00,\r
153 {\r
154 0x00,\r
155 0x00,\r
156 0x00,\r
157 0x7C,\r
158 0x7E,\r
159 0x06,\r
160 0x06,\r
161 0x06,\r
162 0x06,\r
163 0x66,\r
164 0x66,\r
165 0x66,\r
166 0x66,\r
167 0x66,\r
168 0x66,\r
169 0x00,\r
170 0x00,\r
171 0x00,\r
172 0x00\r
173 }\r
174 },\r
175 {\r
176 0x05d5,\r
177 0x00,\r
178 {\r
179 0x00,\r
180 0x00,\r
181 0x00,\r
182 0x3C,\r
183 0x3C,\r
184 0x0C,\r
185 0x0C,\r
186 0x0C,\r
187 0x0C,\r
188 0x0C,\r
189 0x0C,\r
190 0x0C,\r
191 0x0C,\r
192 0x0C,\r
193 0x0C,\r
194 0x00,\r
195 0x00,\r
196 0x00,\r
197 0x00\r
198 }\r
199 },\r
200 {\r
201 0x05d6,\r
202 0x00,\r
203 {\r
204 0x00,\r
205 0x00,\r
206 0x00,\r
207 0x38,\r
208 0x38,\r
209 0x1E,\r
210 0x1E,\r
211 0x18,\r
212 0x18,\r
213 0x18,\r
214 0x18,\r
215 0x18,\r
216 0x18,\r
217 0x18,\r
218 0x18,\r
219 0x00,\r
220 0x00,\r
221 0x00,\r
222 0x00\r
223 }\r
224 },\r
225 {\r
226 0x0000,\r
227 0x00,\r
228 {\r
229 0x00,\r
230 0x00,\r
231 0x00,\r
232 0x00,\r
233 0x00,\r
234 0x00,\r
235 0x00,\r
236 0x00,\r
237 0x00,\r
238 0x00,\r
239 0x00,\r
240 0x00,\r
241 0x00,\r
242 0x00,\r
243 0x00,\r
244 0x00,\r
245 0x00,\r
246 0x00,\r
247 0x00\r
248 }\r
249 }\r
250 }\r
251};\r
252\r
253/**\r
254 Routine to export glyphs to the HII database. This is in addition to whatever is defined in the Graphics Console driver.\r
255\r
256**/\r
257VOID\r
258ExportFonts (\r
259 VOID\r
260 )\r
261{\r
5c08e117 262 EFI_HII_HANDLE HiiHandle;\r
5c08e117 263\r
cb7d01c0 264 HiiHandle = HiiAddPackages (\r
265 &mFontPackageGuid,\r
fefefa4c 266 gImageHandle,\r
cb7d01c0 267 &mFontBin,\r
268 NULL\r
269 );\r
270 ASSERT (HiiHandle != NULL);\r
5c08e117 271}\r
272\r
0f268521 273/**\r
274 Get next language from language code list (with separator ';').\r
275\r
276 If LangCode is NULL, then ASSERT.\r
277 If Lang is NULL, then ASSERT.\r
278\r
279 @param LangCode On input: point to first language in the list. On\r
280 output: point to next language in the list, or\r
281 NULL if no more language in the list.\r
282 @param Lang The first language in the list.\r
283\r
284**/\r
285VOID\r
286EFIAPI\r
287GetNextLanguage (\r
288 IN OUT CHAR8 **LangCode,\r
289 OUT CHAR8 *Lang\r
290 )\r
291{\r
292 UINTN Index;\r
293 CHAR8 *StringPtr;\r
294\r
295 ASSERT (LangCode != NULL);\r
296 ASSERT (*LangCode != NULL);\r
297 ASSERT (Lang != NULL);\r
298\r
299 Index = 0;\r
300 StringPtr = *LangCode;\r
301 while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {\r
302 Index++;\r
303 }\r
304\r
305 CopyMem (Lang, StringPtr, Index);\r
306 Lang[Index] = 0;\r
307\r
308 if (StringPtr[Index] == ';') {\r
309 Index++;\r
310 }\r
311 *LangCode = StringPtr + Index;\r
312}\r
313\r
0c9dc213
SZ
314/**\r
315 Check if lang is in supported language codes according to language string.\r
316\r
317 This code is used to check if lang is in in supported language codes. It can handle\r
318 RFC4646 and ISO639 language tags.\r
319 In ISO639 language tags, take 3-characters as a delimitation to find matched string.\r
320 In RFC4646 language tags, take semicolon as a delimitation to find matched string.\r
321\r
322 For example:\r
323 SupportedLang = "engfraengfra"\r
324 Iso639Language = TRUE\r
325 Lang = "eng", the return value is "TRUE", or\r
326 Lang = "chs", the return value is "FALSE".\r
327 Another example:\r
328 SupportedLang = "en;fr;en-US;fr-FR"\r
329 Iso639Language = FALSE\r
330 Lang = "en", the return value is "TRUE", or\r
331 Lang = "zh", the return value is "FALSE".\r
332\r
333 @param SupportedLang Platform supported language codes.\r
334 @param Lang Configured language.\r
335 @param Iso639Language A bool value to signify if the handler is operated on ISO639 or RFC4646.\r
336\r
337 @retval TRUE lang is in supported language codes.\r
338 @retval FALSE lang is not in supported language codes.\r
339\r
340**/\r
341BOOLEAN\r
342IsLangInSupportedLangCodes(\r
343 IN CHAR8 *SupportedLang,\r
344 IN CHAR8 *Lang,\r
345 IN BOOLEAN Iso639Language\r
0a6f4824 346 )\r
0c9dc213
SZ
347{\r
348 UINTN Index;\r
349 UINTN CompareLength;\r
350 UINTN LanguageLength;\r
351\r
352 if (Iso639Language) {\r
353 CompareLength = ISO_639_2_ENTRY_SIZE;\r
354 for (Index = 0; Index < AsciiStrLen (SupportedLang); Index += CompareLength) {\r
355 if (AsciiStrnCmp (Lang, SupportedLang + Index, CompareLength) == 0) {\r
356 //\r
357 // Successfully find the Lang string in SupportedLang string.\r
358 //\r
359 return TRUE;\r
360 }\r
361 }\r
362 return FALSE;\r
363 } else {\r
364 //\r
365 // Compare RFC4646 language code\r
366 //\r
367 for (LanguageLength = 0; Lang[LanguageLength] != '\0'; LanguageLength++);\r
368\r
369 for (; *SupportedLang != '\0'; SupportedLang += CompareLength) {\r
370 //\r
371 // Skip ';' characters in SupportedLang\r
372 //\r
373 for (; *SupportedLang != '\0' && *SupportedLang == ';'; SupportedLang++);\r
374 //\r
375 // Determine the length of the next language code in SupportedLang\r
376 //\r
377 for (CompareLength = 0; SupportedLang[CompareLength] != '\0' && SupportedLang[CompareLength] != ';'; CompareLength++);\r
0a6f4824
LG
378\r
379 if ((CompareLength == LanguageLength) &&\r
0c9dc213
SZ
380 (AsciiStrnCmp (Lang, SupportedLang, CompareLength) == 0)) {\r
381 //\r
382 // Successfully find the Lang string in SupportedLang string.\r
383 //\r
384 return TRUE;\r
385 }\r
386 }\r
387 return FALSE;\r
388 }\r
389}\r
390\r
391/**\r
392 Initialize Lang or PlatformLang variable, if Lang or PlatformLang variable is not found,\r
393 or it has been set to an unsupported value(not one of platform supported language codes),\r
394 set the default language code to it.\r
395\r
396 @param LangName Language name, L"Lang" or L"PlatformLang".\r
397 @param SupportedLang Platform supported language codes.\r
398 @param DefaultLang Default language code.\r
399 @param Iso639Language A bool value to signify if the handler is operated on ISO639 or RFC4646,\r
400 TRUE for L"Lang" LangName or FALSE for L"PlatformLang" LangName.\r
401\r
402**/\r
0c9dc213
SZ
403VOID\r
404InitializeLangVariable (\r
405 IN CHAR16 *LangName,\r
406 IN CHAR8 *SupportedLang,\r
0a6f4824 407 IN CHAR8 *DefaultLang,\r
0c9dc213
SZ
408 IN BOOLEAN Iso639Language\r
409 )\r
410{\r
0c9dc213
SZ
411 CHAR8 *Lang;\r
412\r
413 //\r
414 // Find current Lang or PlatformLang from EFI Variable.\r
415 //\r
c4571f04 416 GetEfiGlobalVariable2 (LangName, (VOID **) &Lang, NULL);\r
0c9dc213
SZ
417 //\r
418 // If Lang or PlatformLang variable is not found,\r
419 // or it has been set to an unsupported value(not one of the supported language codes),\r
420 // set the default language code to it.\r
421 //\r
c4571f04 422 if ((Lang == NULL) || !IsLangInSupportedLangCodes (SupportedLang, Lang, Iso639Language)) {\r
0c9dc213
SZ
423 //\r
424 // The default language code should be one of the supported language codes.\r
425 //\r
426 ASSERT (IsLangInSupportedLangCodes (SupportedLang, DefaultLang, Iso639Language));\r
69fc8f08 427 BdsDxeSetVariableAndReportStatusCodeOnError (\r
0c9dc213
SZ
428 LangName,\r
429 &gEfiGlobalVariableGuid,\r
430 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
431 AsciiStrSize (DefaultLang),\r
432 DefaultLang\r
433 );\r
434 }\r
435\r
436 if (Lang != NULL) {\r
437 FreePool (Lang);\r
438 }\r
439}\r
440\r
5c08e117 441/**\r
442 Determine the current language that will be used\r
443 based on language related EFI Variables.\r
444\r
0c9dc213 445 @param LangCodesSettingRequired - If required to set LangCodes variable\r
5c08e117 446\r
447**/\r
448VOID\r
449InitializeLanguage (\r
450 BOOLEAN LangCodesSettingRequired\r
451 )\r
452{\r
453 EFI_STATUS Status;\r
5c08e117 454 CHAR8 *LangCodes;\r
5c08e117 455 CHAR8 *PlatformLangCodes;\r
5c08e117 456\r
457 ExportFonts ();\r
458\r
459 LangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLangCodes);\r
0c9dc213 460 PlatformLangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes);\r
5c08e117 461 if (LangCodesSettingRequired) {\r
462 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {\r
463 //\r
b2bd493e 464 // UEFI 2.0 depricated this variable so we support turning it off\r
5c08e117 465 //\r
466 Status = gRT->SetVariable (\r
467 L"LangCodes",\r
468 &gEfiGlobalVariableGuid,\r
469 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
d357145f 470 AsciiStrSize (LangCodes),\r
5c08e117 471 LangCodes\r
472 );\r
69fc8f08
RN
473 //\r
474 // Platform needs to make sure setting volatile variable before calling 3rd party code shouldn't fail.\r
475 //\r
476 ASSERT_EFI_ERROR (Status);\r
5c08e117 477 }\r
478\r
5c08e117 479 Status = gRT->SetVariable (\r
480 L"PlatformLangCodes",\r
481 &gEfiGlobalVariableGuid,\r
482 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
483 AsciiStrSize (PlatformLangCodes),\r
484 PlatformLangCodes\r
485 );\r
69fc8f08
RN
486 //\r
487 // Platform needs to make sure setting volatile variable before calling 3rd party code shouldn't fail.\r
488 //\r
489 ASSERT_EFI_ERROR (Status);\r
5c08e117 490 }\r
491\r
492 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {\r
493 //\r
b2bd493e 494 // UEFI 2.0 depricated this variable so we support turning it off\r
5c08e117 495 //\r
0c9dc213 496 InitializeLangVariable (L"Lang", LangCodes, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultLang), TRUE);\r
5c08e117 497 }\r
0c9dc213 498 InitializeLangVariable (L"PlatformLang", PlatformLangCodes, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang), FALSE);\r
5c08e117 499}\r