]> git.proxmox.com Git - mirror_edk2.git/blob - EdkNt32Pkg/Dxe/PlatformBds/Generic/Language.c
Fix BDS boot from file . and .. fail assertion
[mirror_edk2.git] / EdkNt32Pkg / Dxe / PlatformBds / Generic / Language.c
1 /*++
2
3 Copyright (c) 2006, 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 "String.h"
25 #include "Language.h"
26
27 #define NARROW_GLYPH_NUMBER 8
28 #define WIDE_GLYPH_NUMBER 75
29
30 //
31 // Default language code, currently is English
32 //
33 CHAR8 *mDefaultLangCode = "eng";
34
35 typedef struct {
36 EFI_HII_FONT_PACK FixedLength;
37 EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER];
38 EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER];
39 } FONT_PACK;
40
41 FONT_PACK mFontPack = {
42 sizeof (EFI_HII_FONT_PACK) + (NARROW_GLYPH_NUMBER * sizeof (EFI_NARROW_GLYPH)) + (WIDE_GLYPH_NUMBER * sizeof (EFI_WIDE_GLYPH)),
43 EFI_HII_FONT,
44 NARROW_GLYPH_NUMBER,
45 WIDE_GLYPH_NUMBER,
46 { // Narrow Glyphs
47 {
48 0x05d0,
49 0x00,
50 {
51 0x00,
52 0x00,
53 0x00,
54 0x4E,
55 0x6E,
56 0x62,
57 0x32,
58 0x32,
59 0x3C,
60 0x68,
61 0x4C,
62 0x4C,
63 0x46,
64 0x76,
65 0x72,
66 0x00,
67 0x00,
68 0x00,
69 0x00
70 }
71 },
72 {
73 0x05d1,
74 0x00,
75 {
76 0x00,
77 0x00,
78 0x00,
79 0x78,
80 0x7C,
81 0x0C,
82 0x0C,
83 0x0C,
84 0x0C,
85 0x0C,
86 0x0C,
87 0x0C,
88 0x0C,
89 0x7E,
90 0x7E,
91 0x00,
92 0x00,
93 0x00,
94 0x00
95 }
96 },
97 {
98 0x05d2,
99 0x00,
100 {
101 0x00,
102 0x00,
103 0x00,
104 0x78,
105 0x7C,
106 0x0C,
107 0x0C,
108 0x0C,
109 0x0C,
110 0x0C,
111 0x0C,
112 0x1C,
113 0x3E,
114 0x66,
115 0x66,
116 0x00,
117 0x00,
118 0x00,
119 0x00
120 }
121 },
122 {
123 0x05d3,
124 0x00,
125 {
126 0x00,
127 0x00,
128 0x00,
129 0x7E,
130 0x7E,
131 0x0C,
132 0x0C,
133 0x0C,
134 0x0C,
135 0x0C,
136 0x0C,
137 0x0C,
138 0x0C,
139 0x0C,
140 0x0C,
141 0x00,
142 0x00,
143 0x00,
144 0x00
145 }
146 },
147 {
148 0x05d4,
149 0x00,
150 {
151 0x00,
152 0x00,
153 0x00,
154 0x7C,
155 0x7E,
156 0x06,
157 0x06,
158 0x06,
159 0x06,
160 0x66,
161 0x66,
162 0x66,
163 0x66,
164 0x66,
165 0x66,
166 0x00,
167 0x00,
168 0x00,
169 0x00
170 }
171 },
172 {
173 0x05d5,
174 0x00,
175 {
176 0x00,
177 0x00,
178 0x00,
179 0x3C,
180 0x3C,
181 0x0C,
182 0x0C,
183 0x0C,
184 0x0C,
185 0x0C,
186 0x0C,
187 0x0C,
188 0x0C,
189 0x0C,
190 0x0C,
191 0x00,
192 0x00,
193 0x00,
194 0x00
195 }
196 },
197 {
198 0x05d6,
199 0x00,
200 {
201 0x00,
202 0x00,
203 0x00,
204 0x38,
205 0x38,
206 0x1E,
207 0x1E,
208 0x18,
209 0x18,
210 0x18,
211 0x18,
212 0x18,
213 0x18,
214 0x18,
215 0x18,
216 0x00,
217 0x00,
218 0x00,
219 0x00
220 }
221 },
222 {
223 0x0000,
224 0x00,
225 {
226 0x00,
227 0x00,
228 0x00,
229 0x00,
230 0x00,
231 0x00,
232 0x00,
233 0x00,
234 0x00,
235 0x00,
236 0x00,
237 0x00,
238 0x00,
239 0x00,
240 0x00,
241 0x00,
242 0x00,
243 0x00,
244 0x00
245 }
246 }
247 },
248 { // Wide Glyphs
249 {
250 0x0020,
251 0x00,
252 {
253 0x00,
254 0x00,
255 0x00,
256 0x00,
257 0x00,
258 0x00,
259 0x00,
260 0x00,
261 0x00,
262 0x00,
263 0x00,
264 0x00,
265 0x00,
266 0x00,
267 0x00,
268 0x00,
269 0x00,
270 0x00,
271 0x00
272 },
273 {
274 0x00,
275 0x00,
276 0x00,
277 0x00,
278 0x00,
279 0x00,
280 0x00,
281 0x00,
282 0x00,
283 0x00,
284 0x00,
285 0x00,
286 0x00,
287 0x00,
288 0x00,
289 0x00,
290 0x00,
291 0x00,
292 0x00
293 },
294 {
295 0x00,
296 0x00,
297 0x00
298 }
299 }, //
300 }
301 };
302
303 VOID
304 ExportFonts (
305 VOID
306 )
307 /*++
308
309 Routine Description:
310 Routine to export glyphs to the HII database. This is in addition to whatever is defined in the Graphics Console driver.
311
312 Arguments:
313 None
314
315 Returns:
316
317 --*/
318 {
319 EFI_HII_HANDLE HiiHandle;
320 EFI_HII_PACKAGES *PackageList;
321
322 PackageList = PreparePackages (1, NULL, &mFontPack);
323 //
324 // Register our Fonts into the global database
325 //
326 HiiHandle = 0;
327 Hii->NewPack (Hii, PackageList, &HiiHandle);
328
329 gBS->FreePool (PackageList);
330 }
331
332 VOID
333 InitializeLanguage (
334 BOOLEAN LangCodesSettingRequired
335 )
336 /*++
337
338 Routine Description:
339 Determine the current language that will be used
340 based on language related EFI Variables
341
342 Arguments:
343 LangCodesSettingRequired - If required to set LangCode variable
344
345 Returns:
346
347 --*/
348 {
349 EFI_STATUS Status;
350 UINTN Index;
351 UINTN Size;
352 CHAR8 LangCode[ISO_639_2_ENTRY_SIZE];
353 CHAR8 *LangCodes;
354 CHAR16 *LanguageString;
355
356 LanguageString = NULL;
357 LangCodes = NULL;
358
359 ExportFonts ();
360
361 //
362 // Collect the languages from what our current Language support is based on our VFR
363 //
364 Hii->GetPrimaryLanguages (Hii, gStringPackHandle, &LanguageString);
365
366 LangCodes = AllocatePool (StrLen (LanguageString));
367 ASSERT (LangCodes);
368
369 //
370 // Convert LanguageString from Unicode to EFI defined ASCII LangCodes
371 //
372 for (Index = 0; LanguageString[Index] != 0x0000; Index++) {
373 LangCodes[Index] = (CHAR8) LanguageString[Index];
374 }
375
376 LangCodes[Index] = 0;
377
378 if (LangCodesSettingRequired) {
379 Status = gRT->SetVariable (
380 L"LangCodes",
381 &gEfiGlobalVariableGuid,
382 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
383 AsciiStrLen (LangCodes),
384 LangCodes
385 );
386 }
387 //
388 // Find current LangCode from Lang NV Variable
389 //
390 Size = ISO_639_2_ENTRY_SIZE;
391 Status = gRT->GetVariable (
392 L"Lang",
393 &gEfiGlobalVariableGuid,
394 NULL,
395 &Size,
396 &LangCode
397 );
398
399 if (!EFI_ERROR (Status)) {
400 Status = EFI_NOT_FOUND;
401 for (Index = 0; LangCodes[Index] != 0; Index += ISO_639_2_ENTRY_SIZE) {
402 if (CompareMem (&LangCodes[Index], LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
403 Status = EFI_SUCCESS;
404 break;
405 }
406 }
407 }
408 //
409 // If we cannot get language code from Lang variable,
410 // or LangCode cannot be found from language table,
411 // set the mDefaultLangCode to Lang variable.
412 //
413 if (EFI_ERROR (Status)) {
414 Status = gRT->SetVariable (
415 L"Lang",
416 &gEfiGlobalVariableGuid,
417 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
418 ISO_639_2_ENTRY_SIZE,
419 mDefaultLangCode
420 );
421 }
422
423 if (LangCodes) {
424 gBS->FreePool (LangCodes);
425 }
426
427 if (LanguageString != NULL) {
428 gBS->FreePool (LanguageString);
429 }
430
431 }