]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/BdsDxe/Language.c
Retire language conversion APIs from HII library class.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / Language.c
CommitLineData
5c08e117 1/** @file\r
2 Language settings\r
3\r
4Copyright (c) 2004 - 2008, Intel Corporation. <BR>\r
5All rights reserved. This program and the accompanying materials\r
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
ad5a96ab 18//\r
19// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes\r
20// Each entry is 5 CHAR8 values long. The first 3 CHAR8 values are the ISO 639-2 code.\r
21// The last 2 CHAR8 values are the ISO 639-1 code.\r
22//\r
23GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 Iso639ToRfc3066ConversionTable[] =\r
24"\\r
25aaraa\\r
26abkab\\r
27afraf\\r
28amham\\r
29araar\\r
30asmas\\r
31aymay\\r
32azeaz\\r
33bakba\\r
34belbe\\r
35benbn\\r
36bihbh\\r
37bisbi\\r
38bodbo\\r
39brebr\\r
40bulbg\\r
41catca\\r
42cescs\\r
43corkw\\r
44cosco\\r
45cymcy\\r
46danda\\r
47deude\\r
48dzodz\\r
49ellel\\r
50engen\\r
51epoeo\\r
52estet\\r
53euseu\\r
54faofo\\r
55fasfa\\r
56fijfj\\r
57finfi\\r
58frafr\\r
59fryfy\\r
60gaiga\\r
61gdhgd\\r
62glggl\\r
63grngn\\r
64gujgu\\r
65hauha\\r
66hebhe\\r
67hinhi\\r
68hrvhr\\r
69hunhu\\r
70hyehy\\r
71ikuiu\\r
72ileie\\r
73inaia\\r
74indid\\r
75ipkik\\r
76islis\\r
77itait\\r
78jawjw\\r
79jpnja\\r
80kalkl\\r
81kankn\\r
82kasks\\r
83katka\\r
84kazkk\\r
85khmkm\\r
86kinrw\\r
87kirky\\r
88korko\\r
89kurku\\r
90laolo\\r
91latla\\r
92lavlv\\r
93linln\\r
94litlt\\r
95ltzlb\\r
96malml\\r
97marmr\\r
98mkdmk\\r
99mlgmg\\r
100mltmt\\r
101molmo\\r
102monmn\\r
103mrimi\\r
104msams\\r
105myamy\\r
106nauna\\r
107nepne\\r
108nldnl\\r
109norno\\r
110ocioc\\r
111ormom\\r
112panpa\\r
113polpl\\r
114porpt\\r
115pusps\\r
116quequ\\r
117rohrm\\r
118ronro\\r
119runrn\\r
120rusru\\r
121sagsg\\r
122sansa\\r
123sinsi\\r
124slksk\\r
125slvsl\\r
126smise\\r
127smosm\\r
128snasn\\r
129sndsd\\r
130somso\\r
131sotst\\r
132spaes\\r
133sqisq\\r
134srpsr\\r
135sswss\\r
136sunsu\\r
137swasw\\r
138swesv\\r
139tamta\\r
140tattt\\r
141telte\\r
142tgktg\\r
143tgltl\\r
144thath\\r
145tsnts\\r
146tuktk\\r
147twitw\\r
148uigug\\r
149ukruk\\r
150urdur\\r
151uzbuz\\r
152vievi\\r
153volvo\\r
154wolwo\\r
155xhoxh\\r
156yidyi\\r
157zhaza\\r
158zhozh\\r
159zulzu\\r
160";\r
161\r
5c08e117 162#define NARROW_GLYPH_NUMBER 8\r
163#define WIDE_GLYPH_NUMBER 75\r
164\r
165EFI_GUID mFontPackageGuid = {\r
166 0x78941450, 0x90ab, 0x4fb1, {0xb7, 0x5f, 0x58, 0x92, 0x14, 0xe2, 0x4a, 0xc}\r
167};\r
168\r
169typedef struct {\r
170 ///\r
cb7d01c0 171 /// This 4-bytes total array length is required by HiiAddPackages()\r
5c08e117 172 ///\r
173 UINT32 Length;\r
174\r
175 //\r
176 // This is the Font package definition\r
177 //\r
178 EFI_HII_PACKAGE_HEADER Header;\r
179 UINT16 NumberOfNarrowGlyphs;\r
180 UINT16 NumberOfWideGlyphs;\r
181 EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER];\r
182 EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER];\r
183} FONT_PACK_BIN;\r
184\r
185FONT_PACK_BIN mFontBin = {\r
186 sizeof (FONT_PACK_BIN),\r
187 {\r
188 sizeof (FONT_PACK_BIN) - sizeof (UINT32),\r
189 EFI_HII_PACKAGE_SIMPLE_FONTS,\r
190 },\r
191 NARROW_GLYPH_NUMBER,\r
192 0,\r
193 { // Narrow Glyphs\r
194 {\r
195 0x05d0,\r
196 0x00,\r
197 {\r
198 0x00,\r
199 0x00,\r
200 0x00,\r
201 0x4E,\r
202 0x6E,\r
203 0x62,\r
204 0x32,\r
205 0x32,\r
206 0x3C,\r
207 0x68,\r
208 0x4C,\r
209 0x4C,\r
210 0x46,\r
211 0x76,\r
212 0x72,\r
213 0x00,\r
214 0x00,\r
215 0x00,\r
216 0x00\r
217 }\r
218 },\r
219 {\r
220 0x05d1,\r
221 0x00,\r
222 {\r
223 0x00,\r
224 0x00,\r
225 0x00,\r
226 0x78,\r
227 0x7C,\r
228 0x0C,\r
229 0x0C,\r
230 0x0C,\r
231 0x0C,\r
232 0x0C,\r
233 0x0C,\r
234 0x0C,\r
235 0x0C,\r
236 0x7E,\r
237 0x7E,\r
238 0x00,\r
239 0x00,\r
240 0x00,\r
241 0x00\r
242 }\r
243 },\r
244 {\r
245 0x05d2,\r
246 0x00,\r
247 {\r
248 0x00,\r
249 0x00,\r
250 0x00,\r
251 0x78,\r
252 0x7C,\r
253 0x0C,\r
254 0x0C,\r
255 0x0C,\r
256 0x0C,\r
257 0x0C,\r
258 0x0C,\r
259 0x1C,\r
260 0x3E,\r
261 0x66,\r
262 0x66,\r
263 0x00,\r
264 0x00,\r
265 0x00,\r
266 0x00\r
267 }\r
268 },\r
269 {\r
270 0x05d3,\r
271 0x00,\r
272 {\r
273 0x00,\r
274 0x00,\r
275 0x00,\r
276 0x7E,\r
277 0x7E,\r
278 0x0C,\r
279 0x0C,\r
280 0x0C,\r
281 0x0C,\r
282 0x0C,\r
283 0x0C,\r
284 0x0C,\r
285 0x0C,\r
286 0x0C,\r
287 0x0C,\r
288 0x00,\r
289 0x00,\r
290 0x00,\r
291 0x00\r
292 }\r
293 },\r
294 {\r
295 0x05d4,\r
296 0x00,\r
297 {\r
298 0x00,\r
299 0x00,\r
300 0x00,\r
301 0x7C,\r
302 0x7E,\r
303 0x06,\r
304 0x06,\r
305 0x06,\r
306 0x06,\r
307 0x66,\r
308 0x66,\r
309 0x66,\r
310 0x66,\r
311 0x66,\r
312 0x66,\r
313 0x00,\r
314 0x00,\r
315 0x00,\r
316 0x00\r
317 }\r
318 },\r
319 {\r
320 0x05d5,\r
321 0x00,\r
322 {\r
323 0x00,\r
324 0x00,\r
325 0x00,\r
326 0x3C,\r
327 0x3C,\r
328 0x0C,\r
329 0x0C,\r
330 0x0C,\r
331 0x0C,\r
332 0x0C,\r
333 0x0C,\r
334 0x0C,\r
335 0x0C,\r
336 0x0C,\r
337 0x0C,\r
338 0x00,\r
339 0x00,\r
340 0x00,\r
341 0x00\r
342 }\r
343 },\r
344 {\r
345 0x05d6,\r
346 0x00,\r
347 {\r
348 0x00,\r
349 0x00,\r
350 0x00,\r
351 0x38,\r
352 0x38,\r
353 0x1E,\r
354 0x1E,\r
355 0x18,\r
356 0x18,\r
357 0x18,\r
358 0x18,\r
359 0x18,\r
360 0x18,\r
361 0x18,\r
362 0x18,\r
363 0x00,\r
364 0x00,\r
365 0x00,\r
366 0x00\r
367 }\r
368 },\r
369 {\r
370 0x0000,\r
371 0x00,\r
372 {\r
373 0x00,\r
374 0x00,\r
375 0x00,\r
376 0x00,\r
377 0x00,\r
378 0x00,\r
379 0x00,\r
380 0x00,\r
381 0x00,\r
382 0x00,\r
383 0x00,\r
384 0x00,\r
385 0x00,\r
386 0x00,\r
387 0x00,\r
388 0x00,\r
389 0x00,\r
390 0x00,\r
391 0x00\r
392 }\r
393 }\r
394 }\r
395};\r
396\r
397/**\r
398 Routine to export glyphs to the HII database. This is in addition to whatever is defined in the Graphics Console driver.\r
399\r
400**/\r
401VOID\r
402ExportFonts (\r
403 VOID\r
404 )\r
405{\r
5c08e117 406 EFI_HII_HANDLE HiiHandle;\r
5c08e117 407\r
cb7d01c0 408 HiiHandle = HiiAddPackages (\r
409 &mFontPackageGuid,\r
410 mBdsImageHandle,\r
411 &mFontBin,\r
412 NULL\r
413 );\r
414 ASSERT (HiiHandle != NULL);\r
5c08e117 415}\r
416\r
ad5a96ab 417/**\r
418 Convert language code from RFC3066 to ISO639-2.\r
419\r
420 @param LanguageRfc3066 RFC3066 language code.\r
421 @param LanguageIso639 ISO639-2 language code.\r
422\r
423 @retval EFI_SUCCESS Language code converted.\r
424 @retval EFI_NOT_FOUND Language code not found.\r
425\r
426**/\r
427EFI_STATUS\r
428EFIAPI\r
429ConvertRfc3066LanguageToIso639Language (\r
430 IN CHAR8 *LanguageRfc3066,\r
431 OUT CHAR8 *LanguageIso639\r
432 )\r
433{\r
434 UINTN Index;\r
435\r
436 if ((LanguageRfc3066[2] != '-') && (LanguageRfc3066[2] != 0)) {\r
437 CopyMem (LanguageIso639, LanguageRfc3066, 3);\r
438 return EFI_SUCCESS;\r
439 }\r
440\r
441 for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {\r
442 if (CompareMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2) == 0) {\r
443 CopyMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3);\r
444 return EFI_SUCCESS;\r
445 }\r
446 }\r
447\r
448 return EFI_NOT_FOUND;\r
449}\r
450\r
5c08e117 451/**\r
452 Determine the current language that will be used\r
453 based on language related EFI Variables.\r
454\r
455 @param LangCodesSettingRequired - If required to set LangCode variable\r
456\r
457**/\r
458VOID\r
459InitializeLanguage (\r
460 BOOLEAN LangCodesSettingRequired\r
461 )\r
462{\r
463 EFI_STATUS Status;\r
464 UINTN Size;\r
465 CHAR8 *Lang;\r
466 CHAR8 LangCode[ISO_639_2_ENTRY_SIZE];\r
467 CHAR8 *LangCodes;\r
468 CHAR8 *PlatformLang;\r
469 CHAR8 *PlatformLangCodes;\r
470 UINTN Index;\r
471 BOOLEAN Invalid;\r
472\r
473 ExportFonts ();\r
474\r
475 LangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLangCodes);\r
476 if (LangCodesSettingRequired) {\r
477 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {\r
478 //\r
479 // UEFI 2.1 depricated this variable so we support turning it off\r
480 //\r
481 Status = gRT->SetVariable (\r
482 L"LangCodes",\r
483 &gEfiGlobalVariableGuid,\r
484 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
485 AsciiStrLen (LangCodes),\r
486 LangCodes\r
487 );\r
488 }\r
489\r
490\r
491 PlatformLangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes);\r
492 Status = gRT->SetVariable (\r
493 L"PlatformLangCodes",\r
494 &gEfiGlobalVariableGuid,\r
495 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
496 AsciiStrSize (PlatformLangCodes),\r
497 PlatformLangCodes\r
498 );\r
499 }\r
500\r
501 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {\r
502 //\r
503 // UEFI 2.1 depricated this variable so we support turning it off\r
504 //\r
505\r
506 //\r
507 // Find current LangCode from Lang NV Variable\r
508 //\r
509 Size = ISO_639_2_ENTRY_SIZE;\r
510 Status = gRT->GetVariable (\r
511 L"Lang",\r
512 &gEfiGlobalVariableGuid,\r
513 NULL,\r
514 &Size,\r
515 &LangCode\r
516 );\r
517 if (!EFI_ERROR (Status)) {\r
518 Status = EFI_NOT_FOUND;\r
519 for (Index = 0; LangCodes[Index] != 0; Index += ISO_639_2_ENTRY_SIZE) {\r
520 if (CompareMem (&LangCodes[Index], LangCode, ISO_639_2_ENTRY_SIZE) == 0) {\r
521 Status = EFI_SUCCESS;\r
522 break;\r
523 }\r
524 }\r
525 }\r
526\r
527 //\r
528 // If we cannot get language code from Lang variable,\r
529 // or LangCode cannot be found from language table,\r
530 // set the mDefaultLangCode to Lang variable.\r
531 //\r
532 if (EFI_ERROR (Status)) {\r
533 Lang = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLang);\r
534 Status = gRT->SetVariable (\r
535 L"Lang",\r
536 &gEfiGlobalVariableGuid,\r
537 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
538 ISO_639_2_ENTRY_SIZE,\r
539 Lang\r
540 );\r
541 }\r
542 }\r
543\r
544 Invalid = FALSE;\r
545 PlatformLang = BdsLibGetVariableAndSize (L"PlatformLang", &gEfiGlobalVariableGuid, &Size);\r
546 if (PlatformLang != NULL) {\r
547 //\r
548 // Check Current PlatformLang value against PlatformLangCode. Need a library that is TBD\r
549 // Set Invalid based on state of PlatformLang.\r
550 //\r
551\r
552 FreePool (PlatformLang);\r
553 } else {\r
554 // No valid variable is set\r
555 Invalid = TRUE;\r
556 }\r
557\r
558 if (Invalid) {\r
559 PlatformLang = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLang);\r
560 Status = gRT->SetVariable (\r
561 L"PlatformLang",\r
562 &gEfiGlobalVariableGuid,\r
563 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,\r
564 AsciiStrSize (PlatformLang),\r
565 PlatformLang\r
566 );\r
567 }\r
568}\r