]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Universal/HiiDataBaseDxe/HiiDatabase.c
Modules cleanup.
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / HiiDataBaseDxe / HiiDatabase.c
CommitLineData
103b6520 1/*++\r
2\r
ececc2eb 3Copyright (c) 2006 - 2007, Intel Corporation\r
4All rights reserved. This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
103b6520 7http://opensource.org/licenses/bsd-license.php \r
ececc2eb 8 \r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
103b6520 11\r
12Module Name:\r
13\r
14 HiiDatabase.c\r
15\r
16Abstract:\r
17\r
18 This file contains the entry code to the HII database.\r
19\r
20--*/\r
21\r
103b6520 22#include "HiiDatabase.h"\r
23\r
24EFI_STATUS\r
25EFIAPI\r
26InitializeHiiDatabase (\r
27 IN EFI_HANDLE ImageHandle,\r
28 IN EFI_SYSTEM_TABLE *SystemTable\r
29 )\r
30/*++\r
31\r
32Routine Description:\r
33 Initialize HII Database\r
ececc2eb 34\r
103b6520 35Arguments:\r
36 (Standard EFI Image entry - EFI_IMAGE_ENTRY_POINT)\r
37\r
ececc2eb 38Returns:\r
103b6520 39 EFI_SUCCESS - Setup loaded.\r
40 other - Setup Error\r
41\r
42--*/\r
43{\r
44 EFI_STATUS Status;\r
45 EFI_HII_DATA *HiiData;\r
46 EFI_HII_GLOBAL_DATA *GlobalData;\r
47 EFI_HANDLE *HandleBuffer;\r
48 EFI_HANDLE Handle;\r
49 UINTN HandleCount;\r
50 UINTN Index;\r
51\r
52 //\r
53 // There will be only one HII Database in the system\r
54 // If there is another out there, someone is trying to install us\r
55 // again. Fail that scenario.\r
56 //\r
57 Status = gBS->LocateHandleBuffer (\r
58 ByProtocol,\r
59 &gEfiHiiProtocolGuid,\r
60 NULL,\r
61 &HandleCount,\r
62 &HandleBuffer\r
63 );\r
64\r
65 //\r
66 // If there was no error, assume there is an installation and fail to load\r
67 //\r
68 if (!EFI_ERROR (Status)) {\r
69 if (HandleBuffer != NULL) {\r
70 FreePool (HandleBuffer);\r
71 }\r
72\r
73 return EFI_DEVICE_ERROR;\r
74 }\r
75\r
76 HiiData = AllocatePool (sizeof (EFI_HII_DATA));\r
77\r
78 ASSERT (HiiData);\r
79\r
80 GlobalData = AllocateZeroPool (sizeof (EFI_HII_GLOBAL_DATA));\r
81\r
82 ASSERT (GlobalData);\r
83\r
84 //\r
85 // Seed the Font Database with a known non-character glyph\r
86 //\r
87 for (Index = 0; Index <= MAX_GLYPH_COUNT; Index++) {\r
88 //\r
89 // Seeding the UnicodeWeight with 0 signifies that it is uninitialized\r
90 //\r
91 GlobalData->NarrowGlyphs[Index].UnicodeWeight = 0;\r
92 GlobalData->WideGlyphs[Index].UnicodeWeight = 0;\r
93 GlobalData->NarrowGlyphs[Index].Attributes = 0;\r
94 GlobalData->WideGlyphs[Index].Attributes = 0;\r
95 CopyMem (GlobalData->NarrowGlyphs[Index].GlyphCol1, &mUnknownGlyph, NARROW_GLYPH_ARRAY_SIZE);\r
96 CopyMem (GlobalData->WideGlyphs[Index].GlyphCol1, &mUnknownGlyph, WIDE_GLYPH_ARRAY_SIZE);\r
97 }\r
98 //\r
99 // Fill in HII data\r
100 //\r
101 HiiData->Signature = EFI_HII_DATA_SIGNATURE;\r
102 HiiData->GlobalData = GlobalData;\r
103 HiiData->GlobalData->SystemKeyboardUpdate = FALSE;\r
104 HiiData->DatabaseHead = NULL;\r
105 HiiData->Hii.NewPack = HiiNewPack;\r
106 HiiData->Hii.RemovePack = HiiRemovePack;\r
107 HiiData->Hii.FindHandles = HiiFindHandles;\r
108 HiiData->Hii.ExportDatabase = HiiExportDatabase;\r
109 HiiData->Hii.GetGlyph = HiiGetGlyph;\r
110 HiiData->Hii.GetPrimaryLanguages = HiiGetPrimaryLanguages;\r
111 HiiData->Hii.GetSecondaryLanguages = HiiGetSecondaryLanguages;\r
112 HiiData->Hii.NewString = HiiNewString;\r
113 HiiData->Hii.GetString = HiiGetString;\r
114 HiiData->Hii.ResetStrings = HiiResetStrings;\r
115 HiiData->Hii.TestString = HiiTestString;\r
116 HiiData->Hii.GetLine = HiiGetLine;\r
117 HiiData->Hii.GetForms = HiiGetForms;\r
118 HiiData->Hii.GetDefaultImage = HiiGetDefaultImage;\r
119 HiiData->Hii.UpdateForm = HiiUpdateForm;\r
120 HiiData->Hii.GetKeyboardLayout = HiiGetKeyboardLayout;\r
121 HiiData->Hii.GlyphToBlt = HiiGlyphToBlt;\r
122\r
123 //\r
124 // Install protocol interface\r
125 //\r
126 Handle = NULL;\r
127 Status = gBS->InstallProtocolInterface (\r
128 &Handle,\r
129 &gEfiHiiProtocolGuid,\r
130 EFI_NATIVE_INTERFACE,\r
131 &HiiData->Hii\r
132 );\r
133\r
134 ASSERT_EFI_ERROR (Status);\r
135\r
136 return Status;\r
137}\r
138\r
139EFI_STATUS\r
140EFIAPI\r
141HiiFindHandles (\r
142 IN EFI_HII_PROTOCOL *This,\r
143 IN OUT UINT16 *HandleBufferLength,\r
144 OUT EFI_HII_HANDLE Handle[1]\r
145 )\r
146/*++\r
147\r
148Routine Description:\r
149 Determines the handles that are currently active in the database.\r
ececc2eb 150\r
103b6520 151Arguments:\r
152\r
ececc2eb 153Returns:\r
103b6520 154\r
155--*/\r
156{\r
157 EFI_HII_HANDLE_DATABASE *Database;\r
158 EFI_HII_DATA *HiiData;\r
159 UINTN HandleCount;\r
160\r
161 if (This == NULL) {\r
162 return EFI_INVALID_PARAMETER;\r
163 }\r
164\r
165 HiiData = EFI_HII_DATA_FROM_THIS (This);\r
166\r
167 Database = HiiData->DatabaseHead;\r
168\r
169 if (Database == NULL) {\r
170 *HandleBufferLength = 0;\r
171 return EFI_NOT_FOUND;\r
172 }\r
173\r
174 for (HandleCount = 0; Database != NULL; HandleCount++) {\r
175 Database = Database->NextHandleDatabase;\r
176 }\r
177 //\r
178 // Is there a sufficient buffer for the data being passed back?\r
179 //\r
180 if (*HandleBufferLength >= (sizeof (EFI_HII_HANDLE) * HandleCount)) {\r
181 Database = HiiData->DatabaseHead;\r
182\r
183 //\r
184 // Copy the Head information\r
185 //\r
186 if (Database->Handle != 0) {\r
187 CopyMem (&Handle[0], &Database->Handle, sizeof (EFI_HII_HANDLE));\r
188 Database = Database->NextHandleDatabase;\r
189 }\r
190 //\r
191 // Copy more data if appropriate\r
192 //\r
193 for (HandleCount = 1; Database != NULL; HandleCount++) {\r
194 CopyMem (&Handle[HandleCount], &Database->Handle, sizeof (EFI_HII_HANDLE));\r
195 Database = Database->NextHandleDatabase;\r
196 }\r
197\r
198 *HandleBufferLength = (UINT16) (sizeof (EFI_HII_HANDLE) * HandleCount);\r
199 return EFI_SUCCESS;\r
200 } else {\r
201 //\r
202 // Insufficient buffer length\r
203 //\r
204 *HandleBufferLength = (UINT16) (sizeof (EFI_HII_HANDLE) * HandleCount);\r
205 return EFI_BUFFER_TOO_SMALL;\r
206 }\r
207}\r
208\r
209EFI_STATUS\r
210EFIAPI\r
211HiiGetPrimaryLanguages (\r
212 IN EFI_HII_PROTOCOL *This,\r
213 IN EFI_HII_HANDLE Handle,\r
214 OUT EFI_STRING *LanguageString\r
215 )\r
216/*++\r
217\r
218Routine Description:\r
ececc2eb 219\r
103b6520 220 This function allows a program to determine what the primary languages that are supported on a given handle.\r
221\r
222Arguments:\r
223\r
ececc2eb 224Returns:\r
103b6520 225\r
226--*/\r
227{\r
228 UINTN Count;\r
229 EFI_HII_PACKAGE_INSTANCE *PackageInstance;\r
230 EFI_HII_PACKAGE_INSTANCE *StringPackageInstance;\r
231 EFI_HII_DATA *HiiData;\r
232 EFI_HII_HANDLE_DATABASE *HandleDatabase;\r
233 EFI_HII_STRING_PACK *StringPack;\r
234 EFI_HII_STRING_PACK *Location;\r
235 UINT32 Length;\r
236 RELOFST Token;\r
237\r
238 if (This == NULL) {\r
239 return EFI_INVALID_PARAMETER;\r
240 }\r
241\r
242 HiiData = EFI_HII_DATA_FROM_THIS (This);\r
243\r
244 PackageInstance = NULL;\r
245 //\r
246 // Find matching handle in the handle database. Then get the package instance.\r
247 //\r
248 for (HandleDatabase = HiiData->DatabaseHead;\r
249 HandleDatabase != NULL;\r
250 HandleDatabase = HandleDatabase->NextHandleDatabase\r
251 ) {\r
252 if (Handle == HandleDatabase->Handle) {\r
253 PackageInstance = HandleDatabase->Buffer;\r
254 }\r
255 }\r
256 //\r
257 // No handle was found - error condition\r
258 //\r
259 if (PackageInstance == NULL) {\r
260 return EFI_INVALID_PARAMETER;\r
261 }\r
262\r
263 ValidatePack (This, PackageInstance, &StringPackageInstance, NULL);\r
264\r
265 //\r
266 // Based on if there is IFR data in this package instance, determine\r
267 // what the location is of the beginning of the string data.\r
268 //\r
269 if (StringPackageInstance->IfrSize > 0) {\r
270 StringPack = (EFI_HII_STRING_PACK *) ((CHAR8 *) (&StringPackageInstance->IfrData) + StringPackageInstance->IfrSize);\r
271 } else {\r
272 StringPack = (EFI_HII_STRING_PACK *) (&StringPackageInstance->IfrData);\r
273 }\r
274\r
275 Location = StringPack;\r
276 //\r
277 // Remember that the string packages are formed into contiguous blocks of language data.\r
278 //\r
279 CopyMem (&Length, &StringPack->Header.Length, sizeof (UINT32));\r
280 for (Count = 0; Length != 0; Count = Count + 3) {\r
281 StringPack = (EFI_HII_STRING_PACK *) ((CHAR8 *) (StringPack) + Length);\r
282 CopyMem (&Length, &StringPack->Header.Length, sizeof (UINT32));\r
283 }\r
284\r
285 *LanguageString = AllocateZeroPool (2 * (Count + 1));\r
286\r
287 ASSERT (*LanguageString);\r
288\r
289 StringPack = (EFI_HII_STRING_PACK *) Location;\r
290\r
291 //\r
292 // Copy the 6 bytes to LanguageString - keep concatenating it. Shouldn't we just store uint8's since the ISO\r
293 // standard defines the lettering as all US English characters anyway? Save a few bytes.\r
294 //\r
295 CopyMem (&Length, &StringPack->Header.Length, sizeof (UINT32));\r
296 for (Count = 0; Length != 0; Count = Count + 3) {\r
297 CopyMem (&Token, &StringPack->LanguageNameString, sizeof (RELOFST));\r
298 CopyMem (*LanguageString + Count, (VOID *) ((CHAR8 *) (StringPack) + Token), 6);\r
299 StringPack = (EFI_HII_STRING_PACK *) ((CHAR8 *) (StringPack) + Length);\r
300 CopyMem (&Length, &StringPack->Header.Length, sizeof (UINT32));\r
301 }\r
302\r
303 return EFI_SUCCESS;\r
304}\r
305\r
306EFI_STATUS\r
307EFIAPI\r
308HiiGetSecondaryLanguages (\r
309 IN EFI_HII_PROTOCOL *This,\r
310 IN EFI_HII_HANDLE Handle,\r
311 IN CHAR16 *PrimaryLanguage,\r
312 OUT EFI_STRING *LanguageString\r
313 )\r
314/*++\r
315\r
316Routine Description:\r
ececc2eb 317\r
318 This function allows a program to determine which secondary languages are supported\r
103b6520 319 on a given handle for a given primary language.\r
320\r
321 Arguments:\r
322\r
ececc2eb 323Returns:\r
103b6520 324\r
325--*/\r
326{\r
327 UINTN Count;\r
328 EFI_HII_PACKAGE_INSTANCE *PackageInstance;\r
329 EFI_HII_PACKAGE_INSTANCE *StringPackageInstance;\r
330 EFI_HII_DATA *HiiData;\r
331 EFI_HII_HANDLE_DATABASE *HandleDatabase;\r
332 EFI_HII_STRING_PACK *StringPack;\r
333 RELOFST Token;\r
334 UINT32 Length;\r
335\r
336 if (This == NULL) {\r
337 return EFI_INVALID_PARAMETER;\r
338 }\r
339\r
340 HiiData = EFI_HII_DATA_FROM_THIS (This);\r
341 //\r
342 // Check numeric value against the head of the database\r
343 //\r
344 PackageInstance = NULL;\r
345 for (HandleDatabase = HiiData->DatabaseHead;\r
346 HandleDatabase != NULL;\r
347 HandleDatabase = HandleDatabase->NextHandleDatabase\r
348 ) {\r
349 //\r
350 // Match the numeric value with the database entry - if matched, extract PackageInstance\r
351 //\r
352 if (Handle == HandleDatabase->Handle) {\r
353 PackageInstance = HandleDatabase->Buffer;\r
354 }\r
355 }\r
356 //\r
357 // No handle was found - error condition\r
358 //\r
359 if (PackageInstance == NULL) {\r
360 return EFI_INVALID_PARAMETER;\r
361 }\r
362\r
363 ValidatePack (This, PackageInstance, &StringPackageInstance, NULL);\r
364\r
365 //\r
366 // Based on if there is IFR data in this package instance, determine\r
367 // what the location is of the beginning of the string data.\r
368 //\r
369 if (StringPackageInstance->IfrSize > 0) {\r
370 StringPack = (EFI_HII_STRING_PACK *) ((CHAR8 *) (&StringPackageInstance->IfrData) + StringPackageInstance->IfrSize);\r
371 } else {\r
372 StringPack = (EFI_HII_STRING_PACK *) (&StringPackageInstance->IfrData);\r
373 }\r
374\r
375 //\r
376 // Remember that the string packages are formed into contiguous blocks of language data.\r
377 //\r
378 for (; StringPack->Header.Length != 0;) {\r
379 //\r
380 // Find the PrimaryLanguage being requested\r
381 //\r
382 Token = StringPack->LanguageNameString;\r
383 if (CompareMem ((VOID *) ((CHAR8 *) (StringPack) + Token), PrimaryLanguage, 3) == 0) {\r
384 //\r
385 // Now that we found the primary, the secondary languages will follow immediately\r
386 // or the next character is a NULL if there are no secondary languages. We determine\r
387 // the number by getting the stringsize based on the StringPack origination + the LanguageNameString\r
388 // offset + 6 (which is the size of the first 3 letter ISO primary language name). If we get 2, there\r
389 // are no secondary languages (2 = null-terminator).\r
390 //\r
391 Count = StrSize ((VOID *) ((CHAR8 *) (StringPack) + Token + 6));\r
392\r
393 *LanguageString = AllocateZeroPool (2 * (Count + 1));\r
394\r
395 ASSERT (*LanguageString);\r
396\r
397 CopyMem (*LanguageString, (VOID *) ((CHAR8 *) (StringPack) + Token + 6), Count);\r
398 break;\r
399 }\r
400\r
401 CopyMem (&Length, &StringPack->Header.Length, sizeof (UINT32));\r
402 StringPack = (EFI_HII_STRING_PACK *) ((CHAR8 *) (StringPack) + Length);\r
403 }\r
404\r
405 return EFI_SUCCESS;\r
406}\r
407\r