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