]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/BdsDxe/Language.c
UEFI HII: Merge UEFI HII support changes from branch.
[mirror_edk2.git] / MdeModulePkg / Universal / BdsDxe / Language.c
1 /*++
2
3 Copyright (c) 2004 - 2008, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11
12 Module Name:
13
14 Language.c
15
16 Abstract:
17
18 Language settings
19
20 Revision History
21
22 --*/
23
24 #include "Language.h"
25 #include "FrontPage.h"
26
27 #define NARROW_GLYPH_NUMBER 8
28 #define WIDE_GLYPH_NUMBER 75
29
30 EFI_GUID mFontPackageGuid = {
31 0x78941450, 0x90ab, 0x4fb1, {0xb7, 0x5f, 0x58, 0x92, 0x14, 0xe2, 0x4a, 0xc}
32 };
33
34 typedef struct {
35 //
36 // This 4-bytes total array length is required by PreparePackageList()
37 //
38 UINT32 Length;
39
40 //
41 // This is the Font package definition
42 //
43 EFI_HII_PACKAGE_HEADER Header;
44 UINT16 NumberOfNarrowGlyphs;
45 UINT16 NumberOfWideGlyphs;
46 EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER];
47 EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER];
48 } FONT_PACK_BIN;
49
50 FONT_PACK_BIN mFontBin = {
51 sizeof (FONT_PACK_BIN),
52 {
53 sizeof (FONT_PACK_BIN) - sizeof (UINT32),
54 EFI_HII_PACKAGE_SIMPLE_FONTS,
55 },
56 NARROW_GLYPH_NUMBER,
57 0,
58 { // Narrow Glyphs
59 {
60 0x05d0,
61 0x00,
62 {
63 0x00,
64 0x00,
65 0x00,
66 0x4E,
67 0x6E,
68 0x62,
69 0x32,
70 0x32,
71 0x3C,
72 0x68,
73 0x4C,
74 0x4C,
75 0x46,
76 0x76,
77 0x72,
78 0x00,
79 0x00,
80 0x00,
81 0x00
82 }
83 },
84 {
85 0x05d1,
86 0x00,
87 {
88 0x00,
89 0x00,
90 0x00,
91 0x78,
92 0x7C,
93 0x0C,
94 0x0C,
95 0x0C,
96 0x0C,
97 0x0C,
98 0x0C,
99 0x0C,
100 0x0C,
101 0x7E,
102 0x7E,
103 0x00,
104 0x00,
105 0x00,
106 0x00
107 }
108 },
109 {
110 0x05d2,
111 0x00,
112 {
113 0x00,
114 0x00,
115 0x00,
116 0x78,
117 0x7C,
118 0x0C,
119 0x0C,
120 0x0C,
121 0x0C,
122 0x0C,
123 0x0C,
124 0x1C,
125 0x3E,
126 0x66,
127 0x66,
128 0x00,
129 0x00,
130 0x00,
131 0x00
132 }
133 },
134 {
135 0x05d3,
136 0x00,
137 {
138 0x00,
139 0x00,
140 0x00,
141 0x7E,
142 0x7E,
143 0x0C,
144 0x0C,
145 0x0C,
146 0x0C,
147 0x0C,
148 0x0C,
149 0x0C,
150 0x0C,
151 0x0C,
152 0x0C,
153 0x00,
154 0x00,
155 0x00,
156 0x00
157 }
158 },
159 {
160 0x05d4,
161 0x00,
162 {
163 0x00,
164 0x00,
165 0x00,
166 0x7C,
167 0x7E,
168 0x06,
169 0x06,
170 0x06,
171 0x06,
172 0x66,
173 0x66,
174 0x66,
175 0x66,
176 0x66,
177 0x66,
178 0x00,
179 0x00,
180 0x00,
181 0x00
182 }
183 },
184 {
185 0x05d5,
186 0x00,
187 {
188 0x00,
189 0x00,
190 0x00,
191 0x3C,
192 0x3C,
193 0x0C,
194 0x0C,
195 0x0C,
196 0x0C,
197 0x0C,
198 0x0C,
199 0x0C,
200 0x0C,
201 0x0C,
202 0x0C,
203 0x00,
204 0x00,
205 0x00,
206 0x00
207 }
208 },
209 {
210 0x05d6,
211 0x00,
212 {
213 0x00,
214 0x00,
215 0x00,
216 0x38,
217 0x38,
218 0x1E,
219 0x1E,
220 0x18,
221 0x18,
222 0x18,
223 0x18,
224 0x18,
225 0x18,
226 0x18,
227 0x18,
228 0x00,
229 0x00,
230 0x00,
231 0x00
232 }
233 },
234 {
235 0x0000,
236 0x00,
237 {
238 0x00,
239 0x00,
240 0x00,
241 0x00,
242 0x00,
243 0x00,
244 0x00,
245 0x00,
246 0x00,
247 0x00,
248 0x00,
249 0x00,
250 0x00,
251 0x00,
252 0x00,
253 0x00,
254 0x00,
255 0x00,
256 0x00
257 }
258 }
259 }
260 };
261
262 VOID
263 ExportFonts (
264 VOID
265 )
266 /*++
267
268 Routine Description:
269 Routine to export glyphs to the HII database. This is in addition to whatever is defined in the Graphics Console driver.
270
271 Arguments:
272 None
273
274 Returns:
275
276 --*/
277 {
278 EFI_STATUS Status;
279 EFI_HANDLE DriverHandle;
280 EFI_HII_HANDLE HiiHandle;
281 EFI_HII_PACKAGE_LIST_HEADER *PackageList;
282
283 //
284 // Create driver handle used by HII database
285 //
286 Status = HiiLibCreateHiiDriverHandle (&DriverHandle);
287 if (EFI_ERROR (Status)) {
288 return ;
289 }
290
291 PackageList = PreparePackageList (1, &mFontPackageGuid, &mFontBin);
292 ASSERT (PackageList != NULL);
293
294 gHiiDatabase->NewPackageList (gHiiDatabase, PackageList, DriverHandle, &HiiHandle);
295 FreePool (PackageList);
296 }
297
298 VOID
299 InitializeLanguage (
300 BOOLEAN LangCodesSettingRequired
301 )
302 /*++
303
304 Routine Description:
305 Determine the current language that will be used
306 based on language related EFI Variables
307
308 Arguments:
309 LangCodesSettingRequired - If required to set LangCode variable
310
311 Returns:
312
313 --*/
314 {
315 EFI_STATUS Status;
316 UINTN Size;
317 CHAR8 *Lang;
318 CHAR8 LangCode[ISO_639_2_ENTRY_SIZE];
319 CHAR8 *LangCodes;
320 CHAR8 *PlatformLang;
321 CHAR8 *PlatformLangCodes;
322 UINTN Index;
323 BOOLEAN Invalid;
324
325 ExportFonts ();
326
327 LangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLangCodes);
328 if (LangCodesSettingRequired) {
329 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDepricate)) {
330 //
331 // UEFI 2.1 depricated this variable so we support turning it off
332 //
333 Status = gRT->SetVariable (
334 L"LangCodes",
335 &gEfiGlobalVariableGuid,
336 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
337 AsciiStrLen (LangCodes),
338 LangCodes
339 );
340 }
341
342
343 PlatformLangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes);
344 Status = gRT->SetVariable (
345 L"PlatformLangCodes",
346 &gEfiGlobalVariableGuid,
347 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
348 AsciiStrSize (PlatformLangCodes),
349 PlatformLangCodes
350 );
351 }
352
353 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDepricate)) {
354 //
355 // UEFI 2.1 depricated this variable so we support turning it off
356 //
357
358 //
359 // Find current LangCode from Lang NV Variable
360 //
361 Size = ISO_639_2_ENTRY_SIZE;
362 Status = gRT->GetVariable (
363 L"Lang",
364 &gEfiGlobalVariableGuid,
365 NULL,
366 &Size,
367 &LangCode
368 );
369 if (!EFI_ERROR (Status)) {
370 Status = EFI_NOT_FOUND;
371 for (Index = 0; LangCodes[Index] != 0; Index += ISO_639_2_ENTRY_SIZE) {
372 if (CompareMem (&LangCodes[Index], LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
373 Status = EFI_SUCCESS;
374 break;
375 }
376 }
377 }
378
379 //
380 // If we cannot get language code from Lang variable,
381 // or LangCode cannot be found from language table,
382 // set the mDefaultLangCode to Lang variable.
383 //
384 if (EFI_ERROR (Status)) {
385 Lang = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLang);
386 Status = gRT->SetVariable (
387 L"Lang",
388 &gEfiGlobalVariableGuid,
389 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
390 ISO_639_2_ENTRY_SIZE,
391 Lang
392 );
393 }
394 }
395
396 Invalid = FALSE;
397 PlatformLang = BdsLibGetVariableAndSize (L"PlatformLang", &gEfiGlobalVariableGuid, &Size);
398 if (PlatformLang != NULL) {
399 //
400 // Check Current PlatformLang value against PlatformLangCode. Need a library that is TBD
401 // Set Invalid based on state of PlatformLang.
402 //
403
404 FreePool (PlatformLang);
405 } else {
406 // No valid variable is set
407 Invalid = TRUE;
408 }
409
410 if (Invalid) {
411 PlatformLang = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLang);
412 Status = gRT->SetVariable (
413 L"PlatformLang",
414 &gEfiGlobalVariableGuid,
415 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
416 AsciiStrSize (PlatformLang),
417 PlatformLang
418 );
419 }
420 }