]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/HiiDatabaseDxe/Database.c
remove the unused msa files in MdeModulePkg.
[mirror_edk2.git] / MdeModulePkg / Universal / HiiDatabaseDxe / Database.c
CommitLineData
93e3992d 1/** @file\r
e90b081a 2Implementation for EFI_HII_DATABASE_PROTOCOL.\r
3\r
93e3992d 4\r
813acf3a 5Copyright (c) 2007 - 2008, Intel Corporation\r
93e3992d 6All rights reserved. This program and the accompanying materials\r
7are licensed and made available under the terms and conditions of the BSD License\r
8which accompanies this distribution. The full text of the license may be found at\r
9http://opensource.org/licenses/bsd-license.php\r
10\r
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13\r
93e3992d 14**/\r
15\r
16\r
17#include "HiiDatabase.h"\r
18\r
19//\r
20// Global variables\r
21//\r
22STATIC EFI_GUID mHiiDatabaseNotifyGuid = HII_DATABASE_NOTIFY_GUID;\r
23\r
24\r
25/**\r
26 This function generates a HII_DATABASE_RECORD node and adds into hii database.\r
e90b081a 27 This is a internal function.\r
93e3992d 28\r
29 @param Private hii database private structure\r
e90b081a 30 @param DatabaseNode HII_DATABASE_RECORD node which is used to store a\r
93e3992d 31 package list\r
32\r
33 @retval EFI_SUCCESS A database record is generated successfully.\r
34 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
35 database contents.\r
36 @retval EFI_INVALID_PARAMETER Private is NULL or DatabaseRecord is NULL.\r
37\r
38**/\r
93e3992d 39EFI_STATUS\r
40GenerateHiiDatabaseRecord (\r
41 IN HII_DATABASE_PRIVATE_DATA *Private,\r
42 OUT HII_DATABASE_RECORD **DatabaseNode\r
43 )\r
44{\r
45 HII_DATABASE_RECORD *DatabaseRecord;\r
46 HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList;\r
47 HII_HANDLE *HiiHandle;\r
48\r
49 if (Private == NULL || DatabaseNode == NULL) {\r
50 return EFI_INVALID_PARAMETER;\r
51 }\r
52\r
53 DatabaseRecord = (HII_DATABASE_RECORD *) AllocateZeroPool (sizeof (HII_DATABASE_RECORD));\r
54 if (DatabaseRecord == NULL) {\r
55 return EFI_OUT_OF_RESOURCES;\r
56 }\r
57 DatabaseRecord->Signature = HII_DATABASE_RECORD_SIGNATURE;\r
58\r
59 DatabaseRecord->PackageList = AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE));\r
60 if (DatabaseRecord->PackageList == NULL) {\r
61 SafeFreePool (DatabaseRecord);\r
62 return EFI_OUT_OF_RESOURCES;\r
63 }\r
64\r
65 PackageList = DatabaseRecord->PackageList;\r
66\r
67 InitializeListHead (&PackageList->GuidPkgHdr);\r
68 InitializeListHead (&PackageList->FormPkgHdr);\r
69 InitializeListHead (&PackageList->KeyboardLayoutHdr);\r
70 InitializeListHead (&PackageList->StringPkgHdr);\r
71 InitializeListHead (&PackageList->FontPkgHdr);\r
72 InitializeListHead (&PackageList->SimpleFontPkgHdr);\r
73 PackageList->ImagePkg = NULL;\r
74 PackageList->DevicePathPkg = NULL;\r
75\r
76 //\r
77 // Create a new hii handle\r
78 //\r
79 HiiHandle = (HII_HANDLE *) AllocateZeroPool (sizeof (HII_HANDLE));\r
80 if (HiiHandle == NULL) {\r
81 SafeFreePool (DatabaseRecord->PackageList);\r
82 SafeFreePool (DatabaseRecord);\r
83 return EFI_OUT_OF_RESOURCES;\r
84 }\r
85 HiiHandle->Signature = HII_HANDLE_SIGNATURE;\r
86 //\r
87 // Backup the number of Hii handles\r
88 //\r
89 Private->HiiHandleCount++;\r
90 HiiHandle->Key = Private->HiiHandleCount;\r
91 //\r
92 // Insert the handle to hii handle list of the whole database.\r
93 //\r
94 InsertTailList (&Private->HiiHandleList, &HiiHandle->Handle);\r
95\r
96 DatabaseRecord->Handle = (EFI_HII_HANDLE) HiiHandle;\r
97\r
98 //\r
99 // Insert the Package List node to Package List link of the whole database.\r
100 //\r
101 InsertTailList (&Private->DatabaseList, &DatabaseRecord->DatabaseEntry);\r
102\r
103 *DatabaseNode = DatabaseRecord;\r
104\r
105 return EFI_SUCCESS;\r
106\r
107}\r
108\r
109\r
110/**\r
111 This function checks whether a handle is a valid EFI_HII_HANDLE\r
e90b081a 112 This is a internal function.\r
93e3992d 113\r
114 @param Handle Pointer to a EFI_HII_HANDLE\r
115\r
116 @retval TRUE Valid\r
117 @retval FALSE Invalid\r
118\r
119**/\r
120BOOLEAN\r
121IsHiiHandleValid (\r
122 EFI_HII_HANDLE Handle\r
123 )\r
124{\r
125 HII_HANDLE *HiiHandle;\r
126\r
127 HiiHandle = (HII_HANDLE *) Handle;\r
128\r
129 if (HiiHandle == NULL) {\r
130 return FALSE;\r
131 }\r
132\r
133 if (HiiHandle->Signature != HII_HANDLE_SIGNATURE) {\r
134 return FALSE;\r
135 }\r
136\r
137 return TRUE;\r
138}\r
139\r
140\r
141/**\r
142 This function invokes the matching registered function.\r
e90b081a 143 This is a internal function.\r
93e3992d 144\r
145 @param Private HII Database driver private structure.\r
146 @param NotifyType The type of change concerning the database.\r
147 @param PackageInstance Points to the package referred to by the\r
148 notification.\r
149 @param PackageType Package type\r
150 @param Handle The handle of the package list which contains the\r
151 specified package.\r
152\r
153 @retval EFI_SUCCESS Already checked all registered function and\r
154 invoked if matched.\r
155 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.\r
156\r
157**/\r
93e3992d 158EFI_STATUS\r
159InvokeRegisteredFunction (\r
160 IN HII_DATABASE_PRIVATE_DATA *Private,\r
161 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
162 IN VOID *PackageInstance,\r
163 IN UINT8 PackageType,\r
164 IN EFI_HII_HANDLE Handle\r
165 )\r
166{\r
167 HII_DATABASE_NOTIFY *Notify;\r
168 LIST_ENTRY *Link;\r
169 EFI_HII_PACKAGE_HEADER *Package;\r
170 UINT8 *Buffer;\r
171 UINT32 BufferSize;\r
172 UINT32 HeaderSize;\r
173 UINT32 ImageBlockSize;\r
174 UINT32 PaletteInfoSize;\r
175\r
176 if (Private == NULL || (NotifyType & 0xF) == 0 || PackageInstance == NULL) {\r
177 return EFI_INVALID_PARAMETER;\r
178 }\r
179 if (Private->Signature != HII_DATABASE_PRIVATE_DATA_SIGNATURE) {\r
180 return EFI_INVALID_PARAMETER;\r
181 }\r
182 if (!IsHiiHandleValid (Handle)) {\r
183 return EFI_INVALID_PARAMETER;\r
184 }\r
185\r
186 Buffer = NULL;\r
187 Package = NULL;\r
188\r
189 //\r
190 // Convert the incoming package from hii database storage format to UEFI\r
191 // storage format. e.g. HII_GUID_PACKAGE_INSTANCE to EFI_HII_GUID_PACKAGE_HDR.\r
192 //\r
193 switch (PackageType) {\r
194 case EFI_HII_PACKAGE_TYPE_GUID:\r
195 Package = (EFI_HII_PACKAGE_HEADER *) (((HII_GUID_PACKAGE_INSTANCE *) PackageInstance)->GuidPkg);\r
196 break;\r
197\r
198 case EFI_HII_PACKAGE_FORM:\r
199 BufferSize = ((HII_IFR_PACKAGE_INSTANCE *) PackageInstance)->FormPkgHdr.Length;\r
200 Buffer = (UINT8 *) AllocateZeroPool (BufferSize);\r
201 ASSERT (Buffer != NULL);\r
202 CopyMem (\r
203 Buffer,\r
204 &((HII_IFR_PACKAGE_INSTANCE *) PackageInstance)->FormPkgHdr,\r
205 sizeof (EFI_HII_PACKAGE_HEADER)\r
206 );\r
207 CopyMem (\r
208 Buffer + sizeof (EFI_HII_PACKAGE_HEADER),\r
209 ((HII_IFR_PACKAGE_INSTANCE *) PackageInstance)->IfrData,\r
210 BufferSize - sizeof (EFI_HII_PACKAGE_HEADER)\r
211 );\r
212 Package = (EFI_HII_PACKAGE_HEADER *) Buffer;\r
213 break;\r
214\r
215 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
216 Package = (EFI_HII_PACKAGE_HEADER *) (((HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE *) PackageInstance)->KeyboardPkg);\r
217 break;\r
218\r
219 case EFI_HII_PACKAGE_STRINGS:\r
220 BufferSize = ((HII_STRING_PACKAGE_INSTANCE *) PackageInstance)->StringPkgHdr->Header.Length;\r
221 HeaderSize = ((HII_STRING_PACKAGE_INSTANCE *) PackageInstance)->StringPkgHdr->HdrSize;\r
222 Buffer = (UINT8 *) AllocateZeroPool (BufferSize);\r
223 ASSERT (Buffer != NULL);\r
224 CopyMem (\r
225 Buffer,\r
226 ((HII_STRING_PACKAGE_INSTANCE *) PackageInstance)->StringPkgHdr,\r
227 HeaderSize\r
228 );\r
229 CopyMem (\r
230 Buffer + HeaderSize,\r
231 ((HII_STRING_PACKAGE_INSTANCE *) PackageInstance)->StringBlock,\r
232 BufferSize - HeaderSize\r
233 );\r
234 Package = (EFI_HII_PACKAGE_HEADER *) Buffer;\r
235 break;\r
236\r
237 case EFI_HII_PACKAGE_FONTS:\r
238 BufferSize = ((HII_FONT_PACKAGE_INSTANCE *) PackageInstance)->FontPkgHdr->Header.Length;\r
239 HeaderSize = ((HII_FONT_PACKAGE_INSTANCE *) PackageInstance)->FontPkgHdr->HdrSize;\r
240 Buffer = (UINT8 *) AllocateZeroPool (BufferSize);\r
241 ASSERT (Buffer != NULL);\r
242 CopyMem (\r
243 Buffer,\r
244 ((HII_FONT_PACKAGE_INSTANCE *) PackageInstance)->FontPkgHdr,\r
245 HeaderSize\r
246 );\r
247 CopyMem (\r
248 Buffer + HeaderSize,\r
249 ((HII_FONT_PACKAGE_INSTANCE *) PackageInstance)->GlyphBlock,\r
250 BufferSize - HeaderSize\r
251 );\r
252 Package = (EFI_HII_PACKAGE_HEADER *) Buffer;\r
253 break;\r
254\r
255 case EFI_HII_PACKAGE_IMAGES:\r
256 BufferSize = ((HII_IMAGE_PACKAGE_INSTANCE *) PackageInstance)->ImagePkgHdr.Header.Length;\r
257 HeaderSize = sizeof (EFI_HII_IMAGE_PACKAGE_HDR);\r
258 Buffer = (UINT8 *) AllocateZeroPool (BufferSize);\r
259 ASSERT (Buffer != NULL);\r
260\r
261 CopyMem (\r
262 Buffer,\r
263 &((HII_IMAGE_PACKAGE_INSTANCE *) PackageInstance)->ImagePkgHdr,\r
264 HeaderSize\r
265 );\r
266 CopyMem (\r
267 Buffer + sizeof (EFI_HII_PACKAGE_HEADER),\r
268 &HeaderSize,\r
269 sizeof (UINT32)\r
270 );\r
271\r
272 ImageBlockSize = ((HII_IMAGE_PACKAGE_INSTANCE *) PackageInstance)->ImageBlockSize;\r
273 if (ImageBlockSize != 0) {\r
274 CopyMem (\r
275 Buffer + HeaderSize,\r
276 ((HII_IMAGE_PACKAGE_INSTANCE *) PackageInstance)->ImageBlock,\r
277 ImageBlockSize\r
278 );\r
279 }\r
280\r
281 PaletteInfoSize = ((HII_IMAGE_PACKAGE_INSTANCE *) PackageInstance)->PaletteInfoSize;\r
282 if (PaletteInfoSize != 0) {\r
283 CopyMem (\r
284 Buffer + HeaderSize + ImageBlockSize,\r
285 ((HII_IMAGE_PACKAGE_INSTANCE *) PackageInstance)->PaletteBlock,\r
286 PaletteInfoSize\r
287 );\r
288 HeaderSize += ImageBlockSize;\r
289 CopyMem (\r
290 Buffer + sizeof (EFI_HII_PACKAGE_HEADER) + sizeof (UINT32),\r
291 &HeaderSize,\r
292 sizeof (UINT32)\r
293 );\r
294 }\r
295 Package = (EFI_HII_PACKAGE_HEADER *) Buffer;\r
296 break;\r
297\r
298 case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
299 BufferSize = ((HII_SIMPLE_FONT_PACKAGE_INSTANCE *) PackageInstance)->SimpleFontPkgHdr->Header.Length;\r
300 Buffer = (UINT8 *) AllocateZeroPool (BufferSize);\r
301 ASSERT (Buffer != NULL);\r
302 CopyMem (\r
303 Buffer,\r
304 ((HII_SIMPLE_FONT_PACKAGE_INSTANCE *) PackageInstance)->SimpleFontPkgHdr,\r
305 BufferSize\r
306 );\r
307 Package = (EFI_HII_PACKAGE_HEADER *) Buffer;\r
308 break;\r
309\r
310 case EFI_HII_PACKAGE_DEVICE_PATH:\r
311 Package = (EFI_HII_PACKAGE_HEADER *) PackageInstance;\r
312 break;\r
313\r
314 default:\r
315 return EFI_INVALID_PARAMETER;\r
316 }\r
317\r
318 for (Link = Private->DatabaseNotifyList.ForwardLink;\r
319 Link != &Private->DatabaseNotifyList;\r
320 Link = Link->ForwardLink\r
321 ) {\r
322 Notify = CR (Link, HII_DATABASE_NOTIFY, DatabaseNotifyEntry, HII_DATABASE_NOTIFY_SIGNATURE);\r
323 if (Notify->NotifyType == NotifyType && Notify->PackageType == PackageType) {\r
324 //\r
325 // Check in case PackageGuid is not NULL when Package is GUID package\r
326 //\r
327 if (PackageType != EFI_HII_PACKAGE_TYPE_GUID) {\r
328 Notify->PackageGuid = NULL;\r
329 }\r
330 //\r
331 // Status of Registered Function is unknown so did not check it\r
332 //\r
333 Notify->PackageNotifyFn (\r
334 Notify->PackageType,\r
335 Notify->PackageGuid,\r
336 Package,\r
337 Handle,\r
338 NotifyType\r
339 );\r
340 }\r
341 }\r
342\r
343 SafeFreePool (Buffer);\r
344 Buffer = NULL;\r
345\r
346 return EFI_SUCCESS;\r
347}\r
348\r
349\r
350/**\r
351 This function insert a GUID package to a package list node.\r
e90b081a 352 This is a internal function.\r
93e3992d 353\r
354 @param PackageHdr Pointer to a buffer stored with GUID package\r
355 information.\r
356 @param NotifyType The type of change concerning the database.\r
357 @param PackageList Pointer to a package list which will be inserted\r
358 to.\r
359 @param Package Created GUID pacakge\r
360\r
361 @retval EFI_SUCCESS Guid Package is inserted successfully.\r
362 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
363 Guid package.\r
364 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.\r
365\r
366**/\r
93e3992d 367EFI_STATUS\r
368InsertGuidPackage (\r
369 IN VOID *PackageHdr,\r
370 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
371 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
372 OUT HII_GUID_PACKAGE_INSTANCE **Package\r
373 )\r
374{\r
375 HII_GUID_PACKAGE_INSTANCE *GuidPackage;\r
376 EFI_HII_PACKAGE_HEADER PackageHeader;\r
377\r
378 if (PackageHdr == NULL || PackageList == NULL) {\r
379 return EFI_INVALID_PARAMETER;\r
380 }\r
381\r
382 CopyMem (&PackageHeader, PackageHdr, sizeof (EFI_HII_PACKAGE_HEADER));\r
383\r
384 //\r
385 // Create a GUID package node\r
386 //\r
387 GuidPackage = (HII_GUID_PACKAGE_INSTANCE *) AllocateZeroPool (sizeof (HII_GUID_PACKAGE_INSTANCE));\r
388 if (GuidPackage == NULL) {\r
389 return EFI_OUT_OF_RESOURCES;\r
390 }\r
391 GuidPackage->GuidPkg = (UINT8 *) AllocateZeroPool (PackageHeader.Length);\r
392 if (GuidPackage->GuidPkg == NULL) {\r
393 SafeFreePool (GuidPackage);\r
394 return EFI_OUT_OF_RESOURCES;\r
395 }\r
396\r
397 GuidPackage->Signature = HII_GUID_PACKAGE_SIGNATURE;\r
398 CopyMem (GuidPackage->GuidPkg, PackageHdr, PackageHeader.Length);\r
399 InsertTailList (&PackageList->GuidPkgHdr, &GuidPackage->GuidEntry);\r
400 *Package = GuidPackage;\r
401\r
402 if (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK) {\r
403 PackageList->PackageListHdr.PackageLength += PackageHeader.Length;\r
404 }\r
405\r
406 return EFI_SUCCESS;\r
407}\r
408\r
409\r
410/**\r
411 This function exports GUID packages to a buffer.\r
e90b081a 412 This is a internal function.\r
93e3992d 413\r
414 @param Private Hii database private structure.\r
415 @param Handle Identification of a package list.\r
416 @param PackageList Pointer to a package list which will be exported.\r
417 @param UsedSize The length of buffer be used.\r
418 @param BufferSize Length of the Buffer.\r
419 @param Buffer Allocated space for storing exported data.\r
420 @param ResultSize The size of the already exported content of this\r
421 package list.\r
422\r
423 @retval EFI_SUCCESS Guid Packages are exported successfully.\r
424 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
425\r
426**/\r
93e3992d 427EFI_STATUS\r
428ExportGuidPackages (\r
429 IN HII_DATABASE_PRIVATE_DATA *Private,\r
430 IN EFI_HII_HANDLE Handle,\r
431 IN HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
432 IN UINTN UsedSize,\r
433 IN UINTN BufferSize,\r
434 IN OUT VOID *Buffer,\r
435 IN OUT UINTN *ResultSize\r
436 )\r
437{\r
438 HII_GUID_PACKAGE_INSTANCE *GuidPackage;\r
439 LIST_ENTRY *Link;\r
440 UINTN PackageLength;\r
441 EFI_HII_PACKAGE_HEADER PackageHeader;\r
442 EFI_STATUS Status;\r
443\r
444 if (PackageList == NULL || ResultSize == NULL) {\r
445 return EFI_INVALID_PARAMETER;\r
446 }\r
447\r
448 if (BufferSize > 0 && Buffer == NULL ) {\r
449 return EFI_INVALID_PARAMETER;\r
450 }\r
451\r
452 PackageLength = 0;\r
453 Status = EFI_SUCCESS;\r
454\r
455 for (Link = PackageList->GuidPkgHdr.ForwardLink; Link != &PackageList->GuidPkgHdr; Link = Link->ForwardLink) {\r
456 GuidPackage = CR (Link, HII_GUID_PACKAGE_INSTANCE, GuidEntry, HII_GUID_PACKAGE_SIGNATURE);\r
457 CopyMem (&PackageHeader, GuidPackage->GuidPkg, sizeof (EFI_HII_PACKAGE_HEADER));\r
458 PackageLength += PackageHeader.Length;\r
459 if (PackageLength + *ResultSize + UsedSize <= BufferSize) {\r
460 Status = InvokeRegisteredFunction (\r
461 Private,\r
462 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK,\r
463 (VOID *) GuidPackage,\r
464 EFI_HII_PACKAGE_TYPE_GUID,\r
465 Handle\r
466 );\r
467 ASSERT_EFI_ERROR (Status);\r
468 CopyMem (Buffer, GuidPackage->GuidPkg, PackageHeader.Length);\r
469 Buffer = (UINT8 *) Buffer + PackageHeader.Length;\r
470 }\r
471 }\r
472\r
473 *ResultSize += PackageLength;\r
474 return EFI_SUCCESS;\r
475}\r
476\r
477\r
478/**\r
479 This function deletes all GUID packages from a package list node.\r
e90b081a 480 This is a internal function.\r
93e3992d 481\r
482 @param Private Hii database private data.\r
483 @param Handle Handle of the package list which contains the to\r
484 be removed GUID packages.\r
485 @param PackageList Pointer to a package list that contains removing\r
486 packages.\r
487\r
488 @retval EFI_SUCCESS GUID Package(s) is deleted successfully.\r
489 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.\r
490\r
491**/\r
93e3992d 492EFI_STATUS\r
493RemoveGuidPackages (\r
494 IN HII_DATABASE_PRIVATE_DATA *Private,\r
495 IN EFI_HII_HANDLE Handle,\r
496 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList\r
497 )\r
498{\r
499 LIST_ENTRY *ListHead;\r
500 HII_GUID_PACKAGE_INSTANCE *Package;\r
501 EFI_STATUS Status;\r
502 EFI_HII_PACKAGE_HEADER PackageHeader;\r
503\r
504 ListHead = &PackageList->GuidPkgHdr;\r
505\r
506 while (!IsListEmpty (ListHead)) {\r
507 Package = CR (\r
508 ListHead->ForwardLink,\r
509 HII_GUID_PACKAGE_INSTANCE,\r
510 GuidEntry,\r
511 HII_GUID_PACKAGE_SIGNATURE\r
512 );\r
513 Status = InvokeRegisteredFunction (\r
514 Private,\r
515 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
516 (VOID *) Package,\r
517 EFI_HII_PACKAGE_TYPE_GUID,\r
518 Handle\r
519 );\r
520 if (EFI_ERROR (Status)) {\r
521 return Status;\r
522 }\r
523\r
524 RemoveEntryList (&Package->GuidEntry);\r
525 CopyMem (&PackageHeader, Package->GuidPkg, sizeof (EFI_HII_PACKAGE_HEADER));\r
526 PackageList->PackageListHdr.PackageLength -= PackageHeader.Length;\r
527 SafeFreePool (Package->GuidPkg);\r
528 SafeFreePool (Package);\r
529 }\r
530\r
531 return EFI_SUCCESS;\r
532}\r
533\r
534\r
535/**\r
536 This function insert a Form package to a package list node.\r
e90b081a 537 This is a internal function.\r
93e3992d 538\r
539 @param PackageHdr Pointer to a buffer stored with Form package\r
540 information.\r
541 @param NotifyType The type of change concerning the database.\r
542 @param PackageList Pointer to a package list which will be inserted\r
543 to.\r
544 @param Package Created Form package\r
545\r
546 @retval EFI_SUCCESS Form Package is inserted successfully.\r
547 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
548 Form package.\r
549 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.\r
550\r
551**/\r
93e3992d 552EFI_STATUS\r
553InsertFormPackage (\r
554 IN VOID *PackageHdr,\r
555 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
556 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
557 OUT HII_IFR_PACKAGE_INSTANCE **Package\r
558 )\r
559{\r
560 HII_IFR_PACKAGE_INSTANCE *FormPackage;\r
561 EFI_HII_PACKAGE_HEADER PackageHeader;\r
562\r
563 if (PackageHdr == NULL || PackageList == NULL) {\r
564 return EFI_INVALID_PARAMETER;\r
565 }\r
566\r
567 //\r
568 // Get the length of the package, including package header itself\r
569 //\r
570 CopyMem (&PackageHeader, PackageHdr, sizeof (EFI_HII_PACKAGE_HEADER));\r
571\r
572 //\r
573 // Create a Form package node\r
574 //\r
575 FormPackage = (HII_IFR_PACKAGE_INSTANCE *) AllocateZeroPool (sizeof (HII_IFR_PACKAGE_INSTANCE));\r
576 if (FormPackage == NULL) {\r
577 return EFI_OUT_OF_RESOURCES;\r
578 }\r
579\r
580 FormPackage->IfrData = (UINT8 *) AllocateZeroPool (PackageHeader.Length - sizeof (EFI_HII_PACKAGE_HEADER));\r
581 if (FormPackage->IfrData == NULL) {\r
582 SafeFreePool (FormPackage);\r
583 return EFI_OUT_OF_RESOURCES;\r
584 }\r
585\r
586 FormPackage->Signature = HII_IFR_PACKAGE_SIGNATURE;\r
587 //\r
588 // Copy Package Header\r
589 //\r
590 CopyMem (&FormPackage->FormPkgHdr, &PackageHeader, sizeof (EFI_HII_PACKAGE_HEADER));\r
591\r
592 //\r
593 // Copy Ifr contents\r
594 //\r
595 CopyMem (\r
596 FormPackage->IfrData,\r
597 (UINT8 *) PackageHdr + sizeof (EFI_HII_PACKAGE_HEADER),\r
598 PackageHeader.Length - sizeof (EFI_HII_PACKAGE_HEADER)\r
599 );\r
600\r
601 InsertTailList (&PackageList->FormPkgHdr, &FormPackage->IfrEntry);\r
602 *Package = FormPackage;\r
603\r
604 if (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK) {\r
605 PackageList->PackageListHdr.PackageLength += FormPackage->FormPkgHdr.Length;\r
606 }\r
607 return EFI_SUCCESS;\r
608}\r
609\r
610\r
611/**\r
612 This function exports Form packages to a buffer.\r
e90b081a 613 This is a internal function.\r
93e3992d 614\r
615 @param Private Hii database private structure.\r
616 @param Handle Identification of a package list.\r
617 @param PackageList Pointer to a package list which will be exported.\r
618 @param UsedSize The length of buffer be used.\r
619 @param BufferSize Length of the Buffer.\r
620 @param Buffer Allocated space for storing exported data.\r
621 @param ResultSize The size of the already exported content of this\r
622 package list.\r
623\r
624 @retval EFI_SUCCESS Form Packages are exported successfully.\r
625 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
626\r
627**/\r
93e3992d 628EFI_STATUS\r
629ExportFormPackages (\r
630 IN HII_DATABASE_PRIVATE_DATA *Private,\r
631 IN EFI_HII_HANDLE Handle,\r
632 IN HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
633 IN UINTN UsedSize,\r
634 IN UINTN BufferSize,\r
635 IN OUT VOID *Buffer,\r
636 IN OUT UINTN *ResultSize\r
637 )\r
638{\r
639 HII_IFR_PACKAGE_INSTANCE *FormPackage;\r
640 UINTN PackageLength;\r
641 LIST_ENTRY *Link;\r
642 EFI_STATUS Status;\r
643\r
644 if (Private == NULL || PackageList == NULL || ResultSize == NULL) {\r
645 return EFI_INVALID_PARAMETER;\r
646 }\r
647\r
648 if (BufferSize > 0 && Buffer == NULL ) {\r
649 return EFI_INVALID_PARAMETER;\r
650 }\r
651\r
652 PackageLength = 0;\r
653 Status = EFI_SUCCESS;\r
654\r
655 //\r
656 // Export Form packages.\r
657 //\r
658 for (Link = PackageList->FormPkgHdr.ForwardLink; Link != &PackageList->FormPkgHdr; Link = Link->ForwardLink) {\r
659 FormPackage = CR (Link, HII_IFR_PACKAGE_INSTANCE, IfrEntry, HII_IFR_PACKAGE_SIGNATURE);\r
660 PackageLength += FormPackage->FormPkgHdr.Length;\r
661 if (PackageLength + *ResultSize + UsedSize <= BufferSize) {\r
662 //\r
663 // Invoke registered notification if exists\r
664 //\r
665 Status = InvokeRegisteredFunction (\r
666 Private,\r
667 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK,\r
668 (VOID *) FormPackage,\r
669 EFI_HII_PACKAGE_FORM,\r
670 Handle\r
671 );\r
672 ASSERT_EFI_ERROR (Status);\r
673 //\r
674 // Copy the Form package content.\r
675 //\r
676 CopyMem (Buffer, (VOID *) (&FormPackage->FormPkgHdr), sizeof (EFI_HII_PACKAGE_HEADER));\r
677 Buffer = (UINT8 *) Buffer + sizeof (EFI_HII_PACKAGE_HEADER);\r
678 CopyMem (\r
679 Buffer,\r
680 (VOID *) FormPackage->IfrData,\r
681 FormPackage->FormPkgHdr.Length - sizeof (EFI_HII_PACKAGE_HEADER)\r
682 );\r
683 Buffer = (UINT8 *) Buffer + FormPackage->FormPkgHdr.Length - sizeof (EFI_HII_PACKAGE_HEADER);\r
684 }\r
685 }\r
686\r
687 *ResultSize += PackageLength;\r
688\r
689 return EFI_SUCCESS;\r
690\r
691}\r
692\r
693\r
694/**\r
695 This function deletes all Form packages from a package list node.\r
e90b081a 696 This is a internal function.\r
93e3992d 697\r
698 @param Private Hii database private data.\r
699 @param Handle Handle of the package list which contains the to\r
700 be removed Form packages.\r
701 @param PackageList Pointer to a package list that contains removing\r
702 packages.\r
703\r
704 @retval EFI_SUCCESS Form Package(s) is deleted successfully.\r
705 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.\r
706\r
707**/\r
93e3992d 708EFI_STATUS\r
709RemoveFormPackages (\r
710 IN HII_DATABASE_PRIVATE_DATA *Private,\r
711 IN EFI_HII_HANDLE Handle,\r
712 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList\r
713 )\r
714{\r
715 LIST_ENTRY *ListHead;\r
716 HII_IFR_PACKAGE_INSTANCE *Package;\r
717 EFI_STATUS Status;\r
718\r
719 ListHead = &PackageList->FormPkgHdr;\r
720\r
721 while (!IsListEmpty (ListHead)) {\r
722 Package = CR (\r
723 ListHead->ForwardLink,\r
724 HII_IFR_PACKAGE_INSTANCE,\r
725 IfrEntry,\r
726 HII_IFR_PACKAGE_SIGNATURE\r
727 );\r
728 Status = InvokeRegisteredFunction (\r
729 Private,\r
730 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
731 (VOID *) Package,\r
732 EFI_HII_PACKAGE_FORM,\r
733 Handle\r
734 );\r
735 if (EFI_ERROR (Status)) {\r
736 return Status;\r
737 }\r
738\r
739 RemoveEntryList (&Package->IfrEntry);\r
740 PackageList->PackageListHdr.PackageLength -= Package->FormPkgHdr.Length;\r
741 SafeFreePool (Package->IfrData);\r
742 SafeFreePool (Package);\r
743\r
744 }\r
745\r
746 return EFI_SUCCESS;\r
747}\r
748\r
749\r
750\r
751/**\r
752 This function insert a String package to a package list node.\r
e90b081a 753 This is a internal function.\r
93e3992d 754\r
755 @param Private Hii database private structure.\r
756 @param PackageHdr Pointer to a buffer stored with String package\r
757 information.\r
758 @param NotifyType The type of change concerning the database.\r
759 @param PackageList Pointer to a package list which will be inserted\r
760 to.\r
761 @param Package Created String package\r
762\r
763 @retval EFI_SUCCESS String Package is inserted successfully.\r
764 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
765 String package.\r
766 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.\r
767 @retval EFI_UNSUPPORTED A string package with the same language already\r
768 exists in current package list.\r
769\r
770**/\r
93e3992d 771EFI_STATUS\r
772InsertStringPackage (\r
773 IN HII_DATABASE_PRIVATE_DATA *Private,\r
774 IN VOID *PackageHdr,\r
775 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
776 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
777 OUT HII_STRING_PACKAGE_INSTANCE **Package\r
778\r
779 )\r
780{\r
781 HII_STRING_PACKAGE_INSTANCE *StringPackage;\r
782 UINT32 HeaderSize;\r
783 EFI_STATUS Status;\r
784 EFI_HII_PACKAGE_HEADER PackageHeader;\r
785 CHAR8 *Language;\r
786 UINT32 LanguageSize;\r
787 LIST_ENTRY *Link;\r
788\r
789 if (Private == NULL || PackageHdr == NULL || PackageList == NULL) {\r
790 return EFI_INVALID_PARAMETER;\r
791 }\r
792 if (Private->Signature != HII_DATABASE_PRIVATE_DATA_SIGNATURE) {\r
793 return EFI_INVALID_PARAMETER;\r
794 }\r
795\r
796 CopyMem (&PackageHeader, PackageHdr, sizeof (EFI_HII_PACKAGE_HEADER));\r
797 CopyMem (&HeaderSize, (UINT8 *) PackageHdr + sizeof (EFI_HII_PACKAGE_HEADER), sizeof (UINT32));\r
798\r
799 //\r
800 // It is illegal to have two string packages with same language within one packagelist\r
801 // since the stringid will be duplicate if so. Check it to avoid this potential issue.\r
802 //\r
803 LanguageSize = HeaderSize - sizeof (EFI_HII_STRING_PACKAGE_HDR) + sizeof (CHAR8);\r
804 Language = (CHAR8 *) AllocateZeroPool (LanguageSize);\r
805 if (Language == NULL) {\r
806 return EFI_OUT_OF_RESOURCES;\r
807 }\r
808 AsciiStrCpy (Language, (CHAR8 *) PackageHdr + HeaderSize - LanguageSize);\r
809 for (Link = PackageList->StringPkgHdr.ForwardLink; Link != &PackageList->StringPkgHdr; Link = Link->ForwardLink) {\r
810 StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
811 if (R8_EfiLibCompareLanguage (Language, StringPackage->StringPkgHdr->Language)) {\r
812 SafeFreePool (Language);\r
813 return EFI_UNSUPPORTED;\r
814 }\r
815 }\r
816 SafeFreePool (Language);\r
817\r
818 //\r
819 // Create a String package node\r
820 //\r
821 StringPackage = (HII_STRING_PACKAGE_INSTANCE *) AllocateZeroPool (sizeof (HII_STRING_PACKAGE_INSTANCE));\r
822 if (StringPackage == NULL) {\r
823 Status = EFI_OUT_OF_RESOURCES;\r
824 goto Error;\r
825 }\r
826\r
827 StringPackage->StringPkgHdr = (EFI_HII_STRING_PACKAGE_HDR *) AllocateZeroPool (HeaderSize);\r
828 if (StringPackage->StringPkgHdr == NULL) {\r
829 Status = EFI_OUT_OF_RESOURCES;\r
830 goto Error;\r
831 }\r
832\r
833 StringPackage->StringBlock = (UINT8 *) AllocateZeroPool (PackageHeader.Length - HeaderSize);\r
834 if (StringPackage->StringBlock == NULL) {\r
835 Status = EFI_OUT_OF_RESOURCES;\r
836 goto Error;\r
837 }\r
838\r
839 StringPackage->Signature = HII_STRING_PACKAGE_SIGNATURE;\r
840 StringPackage->FontId = 0;\r
841 InitializeListHead (&StringPackage->FontInfoList);\r
842\r
843 //\r
844 // Copy the String package header.\r
845 //\r
846 CopyMem (StringPackage->StringPkgHdr, PackageHdr, HeaderSize);\r
847\r
848 //\r
849 // Copy the String blocks\r
850 //\r
851 CopyMem (\r
852 StringPackage->StringBlock,\r
853 (UINT8 *) PackageHdr + HeaderSize,\r
854 PackageHeader.Length - HeaderSize\r
855 );\r
856\r
857 //\r
858 // Collect all font block info\r
859 //\r
860 Status = FindStringBlock (Private, StringPackage, (EFI_STRING_ID) (-1), NULL, NULL, NULL, NULL);\r
861 if (EFI_ERROR (Status)) {\r
862 return Status;\r
863 }\r
864\r
865 //\r
866 // Insert to String package array\r
867 //\r
868 InsertTailList (&PackageList->StringPkgHdr, &StringPackage->StringEntry);\r
869 *Package = StringPackage;\r
870\r
871 if (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK) {\r
872 PackageList->PackageListHdr.PackageLength += StringPackage->StringPkgHdr->Header.Length;\r
873 }\r
874\r
875 return EFI_SUCCESS;\r
876\r
877Error:\r
878\r
879 SafeFreePool (StringPackage->StringBlock);\r
880 SafeFreePool (StringPackage->StringPkgHdr);\r
881 SafeFreePool (StringPackage);\r
882 return Status;\r
883\r
884}\r
885\r
886\r
887/**\r
888 This function exports String packages to a buffer.\r
e90b081a 889 This is a internal function.\r
93e3992d 890\r
891 @param Private Hii database private structure.\r
892 @param Handle Identification of a package list.\r
893 @param PackageList Pointer to a package list which will be exported.\r
894 @param UsedSize The length of buffer be used.\r
895 @param BufferSize Length of the Buffer.\r
896 @param Buffer Allocated space for storing exported data.\r
897 @param ResultSize The size of the already exported content of this\r
898 package list.\r
899\r
900 @retval EFI_SUCCESS String Packages are exported successfully.\r
901 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
902\r
903**/\r
93e3992d 904EFI_STATUS\r
905ExportStringPackages (\r
906 IN HII_DATABASE_PRIVATE_DATA *Private,\r
907 IN EFI_HII_HANDLE Handle,\r
908 IN HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
909 IN UINTN UsedSize,\r
910 IN UINTN BufferSize,\r
911 IN OUT VOID *Buffer,\r
912 IN OUT UINTN *ResultSize\r
913 )\r
914{\r
915 LIST_ENTRY *Link;\r
916 UINTN PackageLength;\r
917 EFI_STATUS Status;\r
918 HII_STRING_PACKAGE_INSTANCE *StringPackage;\r
919\r
920 if (Private == NULL || PackageList == NULL || ResultSize == NULL) {\r
921 return EFI_INVALID_PARAMETER;\r
922 }\r
923\r
924 if (BufferSize > 0 && Buffer == NULL ) {\r
925 return EFI_INVALID_PARAMETER;\r
926 }\r
927\r
928 PackageLength = 0;\r
929 Status = EFI_SUCCESS;\r
930\r
931 for (Link = PackageList->StringPkgHdr.ForwardLink; Link != &PackageList->StringPkgHdr; Link = Link->ForwardLink) {\r
932 StringPackage = CR (Link, HII_STRING_PACKAGE_INSTANCE, StringEntry, HII_STRING_PACKAGE_SIGNATURE);\r
933 PackageLength += StringPackage->StringPkgHdr->Header.Length;\r
934 if (PackageLength + *ResultSize + UsedSize <= BufferSize) {\r
935 //\r
936 // Invoke registered notification function with EXPORT_PACK notify type\r
937 //\r
938 Status = InvokeRegisteredFunction (\r
939 Private,\r
940 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK,\r
941 (VOID *) StringPackage,\r
942 EFI_HII_PACKAGE_STRINGS,\r
943 Handle\r
944 );\r
945 ASSERT_EFI_ERROR (Status);\r
946 //\r
947 // Copy String package header\r
948 //\r
949 CopyMem (Buffer, StringPackage->StringPkgHdr, StringPackage->StringPkgHdr->HdrSize);\r
950 Buffer = (UINT8 *) Buffer + StringPackage->StringPkgHdr->HdrSize;\r
951\r
952 //\r
953 // Copy String blocks information\r
954 //\r
955 CopyMem (\r
956 Buffer,\r
957 StringPackage->StringBlock,\r
958 StringPackage->StringPkgHdr->Header.Length - StringPackage->StringPkgHdr->HdrSize\r
959 );\r
960 Buffer = (UINT8 *) Buffer + StringPackage->StringPkgHdr->Header.Length - StringPackage->StringPkgHdr->HdrSize;\r
961 }\r
962 }\r
963\r
964 *ResultSize += PackageLength;\r
965 return EFI_SUCCESS;\r
966}\r
967\r
968\r
969/**\r
970 This function deletes all String packages from a package list node.\r
e90b081a 971 This is a internal function.\r
93e3992d 972\r
973 @param Private Hii database private data.\r
974 @param Handle Handle of the package list which contains the to\r
975 be removed String packages.\r
976 @param PackageList Pointer to a package list that contains removing\r
977 packages.\r
978\r
979 @retval EFI_SUCCESS String Package(s) is deleted successfully.\r
980 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.\r
981\r
982**/\r
93e3992d 983EFI_STATUS\r
984RemoveStringPackages (\r
985 IN HII_DATABASE_PRIVATE_DATA *Private,\r
986 IN EFI_HII_HANDLE Handle,\r
987 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList\r
988 )\r
989{\r
990 LIST_ENTRY *ListHead;\r
991 HII_STRING_PACKAGE_INSTANCE *Package;\r
992 HII_FONT_INFO *FontInfo;\r
993 EFI_STATUS Status;\r
994\r
995 ListHead = &PackageList->StringPkgHdr;\r
996\r
997 while (!IsListEmpty (ListHead)) {\r
998 Package = CR (\r
999 ListHead->ForwardLink,\r
1000 HII_STRING_PACKAGE_INSTANCE,\r
1001 StringEntry,\r
1002 HII_STRING_PACKAGE_SIGNATURE\r
1003 );\r
1004 Status = InvokeRegisteredFunction (\r
1005 Private,\r
1006 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
1007 (VOID *) Package,\r
1008 EFI_HII_PACKAGE_STRINGS,\r
1009 Handle\r
1010 );\r
1011 if (EFI_ERROR (Status)) {\r
1012 return Status;\r
1013 }\r
1014\r
1015 RemoveEntryList (&Package->StringEntry);\r
1016 PackageList->PackageListHdr.PackageLength -= Package->StringPkgHdr->Header.Length;\r
1017 SafeFreePool (Package->StringBlock);\r
1018 SafeFreePool (Package->StringPkgHdr);\r
1019 //\r
1020 // Delete font information\r
1021 //\r
1022 while (!IsListEmpty (&Package->FontInfoList)) {\r
1023 FontInfo = CR (\r
1024 Package->FontInfoList.ForwardLink,\r
1025 HII_FONT_INFO,\r
1026 Entry,\r
1027 HII_FONT_INFO_SIGNATURE\r
1028 );\r
1029 RemoveEntryList (&FontInfo->Entry);\r
1030 SafeFreePool (FontInfo);\r
1031 }\r
1032\r
1033 SafeFreePool (Package);\r
1034 }\r
1035\r
1036 return EFI_SUCCESS;\r
1037}\r
1038\r
1039\r
1040/**\r
1041 This function insert a Font package to a package list node.\r
e90b081a 1042 This is a internal function.\r
93e3992d 1043\r
1044 @param Private Hii database private structure.\r
1045 @param PackageHdr Pointer to a buffer stored with Font package\r
1046 information.\r
1047 @param NotifyType The type of change concerning the database.\r
1048 @param PackageList Pointer to a package list which will be inserted\r
1049 to.\r
1050 @param Package Created Font package\r
1051\r
1052 @retval EFI_SUCCESS Font Package is inserted successfully.\r
1053 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
1054 Font package.\r
1055 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.\r
1056 @retval EFI_UNSUPPORTED A font package with same EFI_FONT_INFO already\r
1057 exists in current hii database.\r
1058\r
1059**/\r
93e3992d 1060EFI_STATUS\r
1061InsertFontPackage (\r
1062 IN HII_DATABASE_PRIVATE_DATA *Private,\r
1063 IN VOID *PackageHdr,\r
1064 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
1065 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
1066 OUT HII_FONT_PACKAGE_INSTANCE **Package\r
1067 )\r
1068{\r
1069 HII_FONT_PACKAGE_INSTANCE *FontPackage;\r
1070 EFI_HII_FONT_PACKAGE_HDR *FontPkgHdr;\r
1071 UINT32 HeaderSize;\r
1072 EFI_STATUS Status;\r
1073 EFI_HII_PACKAGE_HEADER PackageHeader;\r
1074 EFI_FONT_INFO *FontInfo;\r
1075 UINT32 FontInfoSize;\r
1076 HII_GLOBAL_FONT_INFO *GlobalFont;\r
1077\r
1078 if (Private == NULL || PackageHdr == NULL || PackageList == NULL) {\r
1079 return EFI_INVALID_PARAMETER;\r
1080 }\r
1081\r
1082 CopyMem (&PackageHeader, PackageHdr, sizeof (EFI_HII_PACKAGE_HEADER));\r
1083 CopyMem (&HeaderSize, (UINT8 *) PackageHdr + sizeof (EFI_HII_PACKAGE_HEADER), sizeof (UINT32));\r
1084\r
1085 FontInfo = NULL;\r
1086 FontPackage = NULL;\r
1087 GlobalFont = NULL;\r
1088\r
1089 //\r
1090 // It is illegal to have two font packages with same EFI_FONT_INFO within hii\r
1091 // database. EFI_FONT_INFO (FontName, FontSize, FontStyle) describes font's\r
1092 // attributes and identify a font uniquely.\r
1093 //\r
1094 FontPkgHdr = (EFI_HII_FONT_PACKAGE_HDR *) AllocateZeroPool (HeaderSize);\r
1095 if (FontPkgHdr == NULL) {\r
1096 Status = EFI_OUT_OF_RESOURCES;\r
1097 goto Error;\r
1098 }\r
1099 CopyMem (FontPkgHdr, PackageHdr, HeaderSize);\r
1100\r
1101 FontInfoSize = sizeof (EFI_FONT_INFO) + HeaderSize - sizeof (EFI_HII_FONT_PACKAGE_HDR);\r
1102 FontInfo = (EFI_FONT_INFO *) AllocateZeroPool (FontInfoSize);\r
1103 if (FontInfo == NULL) {\r
1104 Status = EFI_OUT_OF_RESOURCES;\r
1105 goto Error;\r
1106 }\r
1107 FontInfo->FontStyle = FontPkgHdr->FontStyle;\r
1108 FontInfo->FontSize = FontPkgHdr->Cell.Height;\r
1109 StrCpy (FontInfo->FontName, FontPkgHdr->FontFamily);\r
1110\r
1111 if (IsFontInfoExisted (Private, FontInfo, NULL, NULL, NULL)) {\r
1112 Status = EFI_UNSUPPORTED;\r
1113 goto Error;\r
1114 }\r
1115\r
1116 //\r
1117 // Create a Font package node\r
1118 //\r
1119 FontPackage = (HII_FONT_PACKAGE_INSTANCE *) AllocateZeroPool (sizeof (HII_FONT_PACKAGE_INSTANCE));\r
1120 if (FontPackage == NULL) {\r
1121 Status = EFI_OUT_OF_RESOURCES;\r
1122 goto Error;\r
1123 }\r
1124 FontPackage->Signature = HII_FONT_PACKAGE_SIGNATURE;\r
1125 FontPackage->FontPkgHdr = FontPkgHdr;\r
1126 InitializeListHead (&FontPackage->GlyphInfoList);\r
1127\r
1128 FontPackage->GlyphBlock = (UINT8 *) AllocateZeroPool (PackageHeader.Length - HeaderSize);\r
1129 if (FontPackage->GlyphBlock == NULL) {\r
1130 Status = EFI_OUT_OF_RESOURCES;\r
1131 goto Error;\r
1132 }\r
1133 CopyMem (FontPackage->GlyphBlock, (UINT8 *) PackageHdr + HeaderSize, PackageHeader.Length - HeaderSize);\r
1134\r
1135 //\r
1136 // Collect all default character cell information and backup in GlyphInfoList.\r
1137 //\r
1138 Status = FindGlyphBlock (FontPackage, (CHAR16) (-1), NULL, NULL, NULL);\r
1139 if (EFI_ERROR (Status)) {\r
1140 goto Error;\r
1141 }\r
1142\r
1143 //\r
1144 // This font package describes an unique EFI_FONT_INFO. Backup it in global\r
1145 // font info list.\r
1146 //\r
1147 GlobalFont = (HII_GLOBAL_FONT_INFO *) AllocateZeroPool (sizeof (HII_GLOBAL_FONT_INFO));\r
1148 if (GlobalFont == NULL) {\r
1149 Status = EFI_OUT_OF_RESOURCES;\r
1150 goto Error;\r
1151 }\r
1152 GlobalFont->Signature = HII_GLOBAL_FONT_INFO_SIGNATURE;\r
1153 GlobalFont->FontPackage = FontPackage;\r
1154 GlobalFont->FontInfoSize = FontInfoSize;\r
1155 GlobalFont->FontInfo = FontInfo;\r
1156 InsertTailList (&Private->FontInfoList, &GlobalFont->Entry);\r
1157\r
1158 //\r
1159 // Insert this font package to Font package array\r
1160 //\r
1161 InsertTailList (&PackageList->FontPkgHdr, &FontPackage->FontEntry);\r
1162 *Package = FontPackage;\r
1163\r
1164 if (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK) {\r
1165 PackageList->PackageListHdr.PackageLength += FontPackage->FontPkgHdr->Header.Length;\r
1166 }\r
1167\r
1168 return EFI_SUCCESS;\r
1169\r
1170Error:\r
1171\r
1172 SafeFreePool (FontPkgHdr);\r
1173 SafeFreePool (FontInfo);\r
1174 SafeFreePool (FontPackage->GlyphBlock);\r
1175 SafeFreePool (FontPackage);\r
1176 SafeFreePool (GlobalFont);\r
1177\r
1178 return Status;\r
1179\r
1180}\r
1181\r
1182\r
1183/**\r
1184 This function exports Font packages to a buffer.\r
e90b081a 1185 This is a internal function.\r
93e3992d 1186\r
1187 @param Private Hii database private structure.\r
1188 @param Handle Identification of a package list.\r
1189 @param PackageList Pointer to a package list which will be exported.\r
1190 @param UsedSize The length of buffer be used.\r
1191 @param BufferSize Length of the Buffer.\r
1192 @param Buffer Allocated space for storing exported data.\r
1193 @param ResultSize The size of the already exported content of this\r
1194 package list.\r
1195\r
1196 @retval EFI_SUCCESS Font Packages are exported successfully.\r
1197 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
1198\r
1199**/\r
93e3992d 1200EFI_STATUS\r
1201ExportFontPackages (\r
1202 IN HII_DATABASE_PRIVATE_DATA *Private,\r
1203 IN EFI_HII_HANDLE Handle,\r
1204 IN HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
1205 IN UINTN UsedSize,\r
1206 IN UINTN BufferSize,\r
1207 IN OUT VOID *Buffer,\r
1208 IN OUT UINTN *ResultSize\r
1209 )\r
1210{\r
1211 LIST_ENTRY *Link;\r
1212 UINTN PackageLength;\r
1213 EFI_STATUS Status;\r
1214 HII_FONT_PACKAGE_INSTANCE *Package;\r
1215\r
1216\r
1217 if (Private == NULL || PackageList == NULL || ResultSize == NULL) {\r
1218 return EFI_INVALID_PARAMETER;\r
1219 }\r
1220\r
1221 if (BufferSize > 0 && Buffer == NULL ) {\r
1222 return EFI_INVALID_PARAMETER;\r
1223 }\r
1224\r
1225 PackageLength = 0;\r
1226 Status = EFI_SUCCESS;\r
1227\r
1228 for (Link = PackageList->FontPkgHdr.ForwardLink; Link != &PackageList->FontPkgHdr; Link = Link->ForwardLink) {\r
1229 Package = CR (Link, HII_FONT_PACKAGE_INSTANCE, FontEntry, HII_FONT_PACKAGE_SIGNATURE);\r
1230 PackageLength += Package->FontPkgHdr->Header.Length;\r
1231 if (PackageLength + *ResultSize + UsedSize <= BufferSize) {\r
1232 //\r
1233 // Invoke registered notification function with EXPORT_PACK notify type\r
1234 //\r
1235 Status = InvokeRegisteredFunction (\r
1236 Private,\r
1237 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK,\r
1238 (VOID *) Package,\r
1239 EFI_HII_PACKAGE_FONTS,\r
1240 Handle\r
1241 );\r
1242 ASSERT_EFI_ERROR (Status);\r
1243 //\r
1244 // Copy Font package header\r
1245 //\r
1246 CopyMem (Buffer, Package->FontPkgHdr, Package->FontPkgHdr->HdrSize);\r
1247 Buffer = (UINT8 *) Buffer + Package->FontPkgHdr->HdrSize;\r
1248\r
1249 //\r
1250 // Copy Glyph blocks information\r
1251 //\r
1252 CopyMem (\r
1253 Buffer,\r
1254 Package->GlyphBlock,\r
1255 Package->FontPkgHdr->Header.Length - Package->FontPkgHdr->HdrSize\r
1256 );\r
1257 Buffer = (UINT8 *) Buffer + Package->FontPkgHdr->Header.Length - Package->FontPkgHdr->HdrSize;\r
1258 }\r
1259 }\r
1260\r
1261 *ResultSize += PackageLength;\r
1262 return EFI_SUCCESS;\r
1263}\r
1264\r
1265\r
1266/**\r
1267 This function deletes all Font packages from a package list node.\r
e90b081a 1268 This is a internal function.\r
93e3992d 1269\r
1270 @param Private Hii database private data.\r
1271 @param Handle Handle of the package list which contains the to\r
1272 be removed Font packages.\r
1273 @param PackageList Pointer to a package list that contains removing\r
1274 packages.\r
1275\r
1276 @retval EFI_SUCCESS Font Package(s) is deleted successfully.\r
1277 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.\r
1278\r
1279**/\r
93e3992d 1280EFI_STATUS\r
1281RemoveFontPackages (\r
1282 IN HII_DATABASE_PRIVATE_DATA *Private,\r
1283 IN EFI_HII_HANDLE Handle,\r
1284 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList\r
1285 )\r
1286{\r
1287 LIST_ENTRY *ListHead;\r
1288 HII_FONT_PACKAGE_INSTANCE *Package;\r
1289 EFI_STATUS Status;\r
1290 HII_GLYPH_INFO *GlyphInfo;\r
1291 LIST_ENTRY *Link;\r
1292 HII_GLOBAL_FONT_INFO *GlobalFont;\r
1293\r
1294 ListHead = &PackageList->FontPkgHdr;\r
1295\r
1296 while (!IsListEmpty (ListHead)) {\r
1297 Package = CR (\r
1298 ListHead->ForwardLink,\r
1299 HII_FONT_PACKAGE_INSTANCE,\r
1300 FontEntry,\r
1301 HII_FONT_PACKAGE_SIGNATURE\r
1302 );\r
1303 Status = InvokeRegisteredFunction (\r
1304 Private,\r
1305 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
1306 (VOID *) Package,\r
1307 EFI_HII_PACKAGE_FONTS,\r
1308 Handle\r
1309 );\r
1310 if (EFI_ERROR (Status)) {\r
1311 return Status;\r
1312 }\r
1313\r
1314 RemoveEntryList (&Package->FontEntry);\r
1315 PackageList->PackageListHdr.PackageLength -= Package->FontPkgHdr->Header.Length;\r
1316 SafeFreePool (Package->GlyphBlock);\r
1317 SafeFreePool (Package->FontPkgHdr);\r
1318 //\r
1319 // Delete default character cell information\r
1320 //\r
1321 while (!IsListEmpty (&Package->GlyphInfoList)) {\r
1322 GlyphInfo = CR (\r
1323 Package->GlyphInfoList.ForwardLink,\r
1324 HII_GLYPH_INFO,\r
1325 Entry,\r
1326 HII_GLYPH_INFO_SIGNATURE\r
1327 );\r
1328 RemoveEntryList (&GlyphInfo->Entry);\r
1329 SafeFreePool (GlyphInfo);\r
1330 }\r
1331\r
1332 //\r
1333 // Remove corresponding global font info\r
1334 //\r
1335 for (Link = Private->FontInfoList.ForwardLink; Link != &Private->FontInfoList; Link = Link->ForwardLink) {\r
1336 GlobalFont = CR (Link, HII_GLOBAL_FONT_INFO, Entry, HII_GLOBAL_FONT_INFO_SIGNATURE);\r
1337 if (GlobalFont->FontPackage == Package) {\r
1338 RemoveEntryList (&GlobalFont->Entry);\r
1339 SafeFreePool (GlobalFont->FontInfo);\r
1340 SafeFreePool (GlobalFont);\r
1341 break;\r
1342 }\r
1343 }\r
1344\r
1345 SafeFreePool (Package);\r
1346 }\r
1347\r
1348 return EFI_SUCCESS;\r
1349}\r
1350\r
1351\r
1352/**\r
1353 This function insert a Image package to a package list node.\r
e90b081a 1354 This is a internal function.\r
93e3992d 1355\r
1356 @param PackageHdr Pointer to a buffer stored with Image package\r
1357 information.\r
1358 @param NotifyType The type of change concerning the database.\r
1359 @param PackageList Pointer to a package list which will be inserted\r
1360 to.\r
1361 @param Package Created Image package\r
1362\r
1363 @retval EFI_SUCCESS Image Package is inserted successfully.\r
1364 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
1365 Image package.\r
1366 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.\r
1367\r
1368**/\r
93e3992d 1369EFI_STATUS\r
1370InsertImagePackage (\r
1371 IN VOID *PackageHdr,\r
1372 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
1373 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
1374 OUT HII_IMAGE_PACKAGE_INSTANCE **Package\r
1375 )\r
1376{\r
1377 HII_IMAGE_PACKAGE_INSTANCE *ImagePackage;\r
1378 UINT32 PaletteSize;\r
1379 UINT32 ImageSize;\r
1380 UINT16 Index;\r
1381 EFI_HII_IMAGE_PALETTE_INFO_HEADER *PaletteHdr;\r
1382 EFI_HII_IMAGE_PALETTE_INFO *PaletteInfo;\r
1383 UINT32 PaletteInfoOffset;\r
1384 UINT32 ImageInfoOffset;\r
1385 UINT16 CurrentSize;\r
1386\r
1387 if (PackageHdr == NULL || PackageList == NULL) {\r
1388 return EFI_INVALID_PARAMETER;\r
1389 }\r
1390\r
1391 //\r
1392 // Less than one image package is allowed in one package list.\r
1393 //\r
1394 if (PackageList->ImagePkg != NULL) {\r
1395 return EFI_INVALID_PARAMETER;\r
1396 }\r
1397\r
1398 //\r
1399 // Create a Image package node\r
1400 //\r
1401 ImagePackage = (HII_IMAGE_PACKAGE_INSTANCE *) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE));\r
1402 if (ImagePackage == NULL) {\r
1403 return EFI_OUT_OF_RESOURCES;\r
1404 }\r
1405\r
1406 //\r
1407 // Copy the Image package header.\r
1408 //\r
1409 CopyMem (&ImagePackage->ImagePkgHdr, PackageHdr, sizeof (EFI_HII_IMAGE_PACKAGE_HDR));\r
1410\r
1411 PaletteInfoOffset = ImagePackage->ImagePkgHdr.PaletteInfoOffset;\r
1412 ImageInfoOffset = ImagePackage->ImagePkgHdr.ImageInfoOffset;\r
1413\r
1414 //\r
1415 // If PaletteInfoOffset is zero, there are no palettes in this image package.\r
1416 //\r
1417 PaletteSize = 0;\r
1418 ImagePackage->PaletteBlock = NULL;\r
1419 if (PaletteInfoOffset != 0) {\r
1420 PaletteHdr = (EFI_HII_IMAGE_PALETTE_INFO_HEADER *) ((UINT8 *) PackageHdr + PaletteInfoOffset);\r
1421 PaletteSize = sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER);\r
1422 PaletteInfo = (EFI_HII_IMAGE_PALETTE_INFO *) ((UINT8 *) PaletteHdr + PaletteSize);\r
1423\r
1424 for (Index = 0; Index < PaletteHdr->PaletteCount; Index++) {\r
1425 CopyMem (&CurrentSize, PaletteInfo, sizeof (UINT16));\r
1426 CurrentSize += sizeof (UINT16);\r
1427 PaletteSize += (UINT32) CurrentSize;\r
1428 PaletteInfo = (EFI_HII_IMAGE_PALETTE_INFO *) ((UINT8 *) PaletteInfo + CurrentSize);\r
1429 }\r
1430\r
1431 ImagePackage->PaletteBlock = (UINT8 *) AllocateZeroPool (PaletteSize);\r
1432 if (ImagePackage->PaletteBlock == NULL) {\r
1433 SafeFreePool (ImagePackage);\r
1434 return EFI_OUT_OF_RESOURCES;\r
1435 }\r
1436 CopyMem (\r
1437 ImagePackage->PaletteBlock,\r
1438 (UINT8 *) PackageHdr + PaletteInfoOffset,\r
1439 PaletteSize\r
1440 );\r
1441 }\r
1442\r
1443 //\r
1444 // If ImageInfoOffset is zero, there are no images in this package.\r
1445 //\r
1446 ImageSize = 0;\r
1447 ImagePackage->ImageBlock = NULL;\r
1448 if (ImageInfoOffset != 0) {\r
1449 ImageSize = ImagePackage->ImagePkgHdr.Header.Length -\r
1450 sizeof (EFI_HII_IMAGE_PACKAGE_HDR) - PaletteSize;\r
1451 ImagePackage->ImageBlock = (UINT8 *) AllocateZeroPool (ImageSize);\r
1452 if (ImagePackage->ImageBlock == NULL) {\r
1453 SafeFreePool (ImagePackage->PaletteBlock);\r
1454 SafeFreePool (ImagePackage);\r
1455 return EFI_OUT_OF_RESOURCES;\r
1456 }\r
1457 CopyMem (\r
1458 ImagePackage->ImageBlock,\r
1459 (UINT8 *) PackageHdr + ImageInfoOffset,\r
1460 ImageSize\r
1461 );\r
1462 }\r
1463\r
1464 ImagePackage->ImageBlockSize = ImageSize;\r
1465 ImagePackage->PaletteInfoSize = PaletteSize;\r
1466 PackageList->ImagePkg = ImagePackage;\r
1467 *Package = ImagePackage;\r
1468\r
1469 if (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK) {\r
1470 PackageList->PackageListHdr.PackageLength += ImagePackage->ImagePkgHdr.Header.Length;\r
1471 }\r
1472\r
1473 return EFI_SUCCESS;\r
1474}\r
1475\r
1476\r
1477/**\r
1478 This function exports Image packages to a buffer.\r
e90b081a 1479 This is a internal function.\r
93e3992d 1480\r
1481 @param Private Hii database private structure.\r
1482 @param Handle Identification of a package list.\r
1483 @param PackageList Pointer to a package list which will be exported.\r
1484 @param UsedSize The length of buffer be used.\r
1485 @param BufferSize Length of the Buffer.\r
1486 @param Buffer Allocated space for storing exported data.\r
1487 @param ResultSize The size of the already exported content of this\r
1488 package list.\r
1489\r
1490 @retval EFI_SUCCESS Image Packages are exported successfully.\r
1491 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
1492\r
1493**/\r
93e3992d 1494EFI_STATUS\r
1495ExportImagePackages (\r
1496 IN HII_DATABASE_PRIVATE_DATA *Private,\r
1497 IN EFI_HII_HANDLE Handle,\r
1498 IN HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
1499 IN UINTN UsedSize,\r
1500 IN UINTN BufferSize,\r
1501 IN OUT VOID *Buffer,\r
1502 IN OUT UINTN *ResultSize\r
1503 )\r
1504{\r
1505 UINTN PackageLength;\r
1506 EFI_STATUS Status;\r
1507 HII_IMAGE_PACKAGE_INSTANCE *Package;\r
1508\r
1509\r
1510 if (Private == NULL || PackageList == NULL || ResultSize == NULL) {\r
1511 return EFI_INVALID_PARAMETER;\r
1512 }\r
1513\r
1514 if (BufferSize > 0 && Buffer == NULL ) {\r
1515 return EFI_INVALID_PARAMETER;\r
1516 }\r
1517\r
1518 Package = PackageList->ImagePkg;\r
1519\r
1520 if (Package == NULL) {\r
1521 return EFI_SUCCESS;\r
1522 }\r
1523\r
1524 PackageLength = Package->ImagePkgHdr.Header.Length;\r
1525\r
1526 if (PackageLength + *ResultSize + UsedSize <= BufferSize) {\r
1527 //\r
1528 // Invoke registered notification function with EXPORT_PACK notify type\r
1529 //\r
1530 Status = InvokeRegisteredFunction (\r
1531 Private,\r
1532 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK,\r
1533 (VOID *) Package,\r
1534 EFI_HII_PACKAGE_IMAGES,\r
1535 Handle\r
1536 );\r
1537 ASSERT_EFI_ERROR (Status);\r
1538 ASSERT (Package->ImagePkgHdr.Header.Length ==\r
1539 sizeof (EFI_HII_IMAGE_PACKAGE_HDR) + Package->ImageBlockSize + Package->PaletteInfoSize);\r
1540 //\r
1541 // Copy Image package header,\r
1542 // then justify the offset for image info and palette info in the header.\r
1543 //\r
1544 CopyMem (Buffer, &Package->ImagePkgHdr, sizeof (EFI_HII_IMAGE_PACKAGE_HDR));\r
1545 Buffer = (UINT8 *) Buffer + sizeof (EFI_HII_IMAGE_PACKAGE_HDR);\r
1546\r
1547 //\r
1548 // Copy Image blocks information\r
1549 //\r
1550 if (Package->ImageBlockSize != 0) {\r
1551 CopyMem (Buffer, Package->ImageBlock, Package->ImageBlockSize);\r
1552 Buffer = (UINT8 *) Buffer + Package->ImageBlockSize;\r
1553 }\r
1554 //\r
1555 // Copy Palette information\r
1556 //\r
1557 if (Package->PaletteInfoSize != 0) {\r
1558 CopyMem (Buffer, Package->PaletteBlock, Package->PaletteInfoSize);\r
1559 Buffer = (UINT8 *) Buffer + Package->PaletteInfoSize;\r
1560 }\r
1561 }\r
1562\r
1563 *ResultSize += PackageLength;\r
1564 return EFI_SUCCESS;\r
1565}\r
1566\r
1567\r
1568/**\r
1569 This function deletes Image package from a package list node.\r
e90b081a 1570 This is a internal function.\r
93e3992d 1571\r
1572 @param Private Hii database private data.\r
1573 @param Handle Handle of the package list which contains the to\r
1574 be removed Image packages.\r
1575 @param PackageList Package List which contains the to be removed\r
1576 Image package.\r
1577\r
1578 @retval EFI_SUCCESS Image Package(s) is deleted successfully.\r
1579 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.\r
1580\r
1581**/\r
93e3992d 1582EFI_STATUS\r
1583RemoveImagePackages (\r
1584 IN HII_DATABASE_PRIVATE_DATA *Private,\r
1585 IN EFI_HII_HANDLE Handle,\r
1586 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList\r
1587 )\r
1588{\r
1589 HII_IMAGE_PACKAGE_INSTANCE *Package;\r
1590 EFI_STATUS Status;\r
1591\r
1592 Package = PackageList->ImagePkg;\r
1593\r
1594 //\r
1595 // Image package does not exist, return directly.\r
1596 //\r
1597 if (Package == NULL) {\r
1598 return EFI_SUCCESS;\r
1599 }\r
1600\r
1601 Status = InvokeRegisteredFunction (\r
1602 Private,\r
1603 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
1604 (VOID *) Package,\r
1605 EFI_HII_PACKAGE_IMAGES,\r
1606 Handle\r
1607 );\r
1608 if (EFI_ERROR (Status)) {\r
1609 return Status;\r
1610 }\r
1611\r
1612 PackageList->PackageListHdr.PackageLength -= Package->ImagePkgHdr.Header.Length;\r
1613\r
1614 SafeFreePool (Package->ImageBlock);\r
1615 SafeFreePool (Package->PaletteBlock);\r
1616 SafeFreePool (Package);\r
1617\r
1618 PackageList->ImagePkg = NULL;\r
1619\r
1620 return EFI_SUCCESS;\r
1621}\r
1622\r
1623\r
1624/**\r
1625 This function insert a Simple Font package to a package list node.\r
e90b081a 1626 This is a internal function.\r
93e3992d 1627\r
1628 @param PackageHdr Pointer to a buffer stored with Simple Font\r
1629 package information.\r
1630 @param NotifyType The type of change concerning the database.\r
1631 @param PackageList Pointer to a package list which will be inserted\r
1632 to.\r
1633 @param Package Created Simple Font package\r
1634\r
1635 @retval EFI_SUCCESS Simple Font Package is inserted successfully.\r
1636 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
1637 Simple Font package.\r
1638 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.\r
1639\r
1640**/\r
93e3992d 1641EFI_STATUS\r
1642InsertSimpleFontPackage (\r
1643 IN VOID *PackageHdr,\r
1644 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
1645 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
1646 OUT HII_SIMPLE_FONT_PACKAGE_INSTANCE **Package\r
1647 )\r
1648{\r
1649 HII_SIMPLE_FONT_PACKAGE_INSTANCE *SimpleFontPackage;\r
1650 EFI_STATUS Status;\r
1651 EFI_HII_PACKAGE_HEADER Header;\r
1652\r
1653 if (PackageHdr == NULL || PackageList == NULL) {\r
1654 return EFI_INVALID_PARAMETER;\r
1655 }\r
1656\r
1657 //\r
1658 // Create a Simple Font package node\r
1659 //\r
1660 SimpleFontPackage = AllocateZeroPool (sizeof (HII_SIMPLE_FONT_PACKAGE_INSTANCE));\r
1661 if (SimpleFontPackage == NULL) {\r
1662 Status = EFI_OUT_OF_RESOURCES;\r
1663 goto Error;\r
1664 }\r
1665 SimpleFontPackage->Signature = HII_S_FONT_PACKAGE_SIGNATURE;\r
1666\r
1667 //\r
1668 // Copy the Simple Font package.\r
1669 //\r
1670 CopyMem (&Header, PackageHdr, sizeof (EFI_HII_PACKAGE_HEADER));\r
1671\r
1672 SimpleFontPackage->SimpleFontPkgHdr = AllocateZeroPool (Header.Length);\r
1673 if (SimpleFontPackage->SimpleFontPkgHdr == NULL) {\r
1674 Status = EFI_OUT_OF_RESOURCES;\r
1675 goto Error;\r
1676 }\r
1677\r
1678 CopyMem (SimpleFontPackage->SimpleFontPkgHdr, PackageHdr, Header.Length);\r
1679\r
1680 //\r
1681 // Insert to Simple Font package array\r
1682 //\r
1683 InsertTailList (&PackageList->SimpleFontPkgHdr, &SimpleFontPackage->SimpleFontEntry);\r
1684 *Package = SimpleFontPackage;\r
1685\r
1686 if (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK) {\r
1687 PackageList->PackageListHdr.PackageLength += Header.Length;\r
1688 }\r
1689\r
1690 return EFI_SUCCESS;\r
1691\r
1692Error:\r
1693\r
1694 SafeFreePool (SimpleFontPackage->SimpleFontPkgHdr);\r
1695 SafeFreePool (SimpleFontPackage);\r
1696 return Status;\r
1697}\r
1698\r
1699\r
1700/**\r
1701 This function exports SimpleFont packages to a buffer.\r
e90b081a 1702 This is a internal function.\r
93e3992d 1703\r
1704 @param Private Hii database private structure.\r
1705 @param Handle Identification of a package list.\r
1706 @param PackageList Pointer to a package list which will be exported.\r
1707 @param UsedSize The length of buffer be used.\r
1708 @param BufferSize Length of the Buffer.\r
1709 @param Buffer Allocated space for storing exported data.\r
1710 @param ResultSize The size of the already exported content of this\r
1711 package list.\r
1712\r
1713 @retval EFI_SUCCESS SimpleFont Packages are exported successfully.\r
1714 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
1715\r
1716**/\r
93e3992d 1717EFI_STATUS\r
1718ExportSimpleFontPackages (\r
1719 IN HII_DATABASE_PRIVATE_DATA *Private,\r
1720 IN EFI_HII_HANDLE Handle,\r
1721 IN HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
1722 IN UINTN UsedSize,\r
1723 IN UINTN BufferSize,\r
1724 IN OUT VOID *Buffer,\r
1725 IN OUT UINTN *ResultSize\r
1726 )\r
1727{\r
1728 LIST_ENTRY *Link;\r
1729 UINTN PackageLength;\r
1730 EFI_STATUS Status;\r
1731 HII_SIMPLE_FONT_PACKAGE_INSTANCE *Package;\r
1732\r
1733 if (Private == NULL || PackageList == NULL || ResultSize == NULL) {\r
1734 return EFI_INVALID_PARAMETER;\r
1735 }\r
1736\r
1737 if (BufferSize > 0 && Buffer == NULL ) {\r
1738 return EFI_INVALID_PARAMETER;\r
1739 }\r
1740\r
1741 PackageLength = 0;\r
1742 Status = EFI_SUCCESS;\r
1743\r
1744 for (Link = PackageList->SimpleFontPkgHdr.ForwardLink; Link != &PackageList->SimpleFontPkgHdr; Link = Link->ForwardLink) {\r
1745 Package = CR (Link, HII_SIMPLE_FONT_PACKAGE_INSTANCE, SimpleFontEntry, HII_S_FONT_PACKAGE_SIGNATURE);\r
1746 PackageLength += Package->SimpleFontPkgHdr->Header.Length;\r
1747 if (PackageLength + *ResultSize + UsedSize <= BufferSize) {\r
1748 //\r
1749 // Invoke registered notification function with EXPORT_PACK notify type\r
1750 //\r
1751 Status = InvokeRegisteredFunction (\r
1752 Private,\r
1753 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK,\r
1754 (VOID *) Package,\r
1755 EFI_HII_PACKAGE_SIMPLE_FONTS,\r
1756 Handle\r
1757 );\r
1758 ASSERT_EFI_ERROR (Status);\r
1759\r
1760 //\r
1761 // Copy SimpleFont package\r
1762 //\r
1763 CopyMem (Buffer, Package->SimpleFontPkgHdr, Package->SimpleFontPkgHdr->Header.Length);\r
1764 Buffer = (UINT8 *) Buffer + Package->SimpleFontPkgHdr->Header.Length;\r
1765 }\r
1766 }\r
1767\r
1768 *ResultSize += PackageLength;\r
1769 return EFI_SUCCESS;\r
1770}\r
1771\r
1772\r
1773/**\r
1774 This function deletes all Simple Font packages from a package list node.\r
e90b081a 1775 This is a internal function.\r
93e3992d 1776\r
1777 @param Private Hii database private data.\r
1778 @param Handle Handle of the package list which contains the to\r
1779 be removed Simple Font packages.\r
1780 @param PackageList Pointer to a package list that contains removing\r
1781 packages.\r
1782\r
1783 @retval EFI_SUCCESS Simple Font Package(s) is deleted successfully.\r
1784 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.\r
1785\r
1786**/\r
93e3992d 1787EFI_STATUS\r
1788RemoveSimpleFontPackages (\r
1789 IN HII_DATABASE_PRIVATE_DATA *Private,\r
1790 IN EFI_HII_HANDLE Handle,\r
1791 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList\r
1792 )\r
1793{\r
1794 LIST_ENTRY *ListHead;\r
1795 HII_SIMPLE_FONT_PACKAGE_INSTANCE *Package;\r
1796 EFI_STATUS Status;\r
1797\r
1798 ListHead = &PackageList->SimpleFontPkgHdr;\r
1799\r
1800 while (!IsListEmpty (ListHead)) {\r
1801 Package = CR (\r
1802 ListHead->ForwardLink,\r
1803 HII_SIMPLE_FONT_PACKAGE_INSTANCE,\r
1804 SimpleFontEntry,\r
1805 HII_S_FONT_PACKAGE_SIGNATURE\r
1806 );\r
1807 Status = InvokeRegisteredFunction (\r
1808 Private,\r
1809 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
1810 (VOID *) Package,\r
1811 EFI_HII_PACKAGE_SIMPLE_FONTS,\r
1812 Handle\r
1813 );\r
1814 if (EFI_ERROR (Status)) {\r
1815 return Status;\r
1816 }\r
1817\r
1818 RemoveEntryList (&Package->SimpleFontEntry);\r
1819 PackageList->PackageListHdr.PackageLength -= Package->SimpleFontPkgHdr->Header.Length;\r
1820 SafeFreePool (Package->SimpleFontPkgHdr);\r
1821 SafeFreePool (Package);\r
1822 }\r
1823\r
1824 return EFI_SUCCESS;\r
1825}\r
1826\r
1827\r
1828/**\r
1829 This function insert a Device path package to a package list node.\r
e90b081a 1830 This is a internal function.\r
93e3992d 1831\r
1832 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol\r
1833 instance\r
1834 @param NotifyType The type of change concerning the database.\r
1835 @param PackageList Pointer to a package list which will be inserted\r
1836 to.\r
1837\r
1838 @retval EFI_SUCCESS Device path Package is inserted successfully.\r
1839 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
1840 Device path package.\r
1841 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.\r
1842\r
1843**/\r
93e3992d 1844EFI_STATUS\r
1845InsertDevicePathPackage (\r
1846 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
1847 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
1848 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList\r
1849 )\r
1850{\r
1851 UINT32 PackageLength;\r
1852 EFI_HII_PACKAGE_HEADER Header;\r
1853\r
1854 if (DevicePath == NULL || PackageList == NULL) {\r
1855 return EFI_INVALID_PARAMETER;\r
1856 }\r
1857 //\r
1858 // Less than one device path package is allowed in one package list.\r
1859 //\r
1860 if (PackageList->DevicePathPkg != NULL) {\r
1861 return EFI_INVALID_PARAMETER;\r
1862 }\r
1863\r
1864 PackageLength = (UINT32) GetDevicePathSize (DevicePath) + sizeof (EFI_HII_PACKAGE_HEADER);\r
1865 PackageList->DevicePathPkg = (UINT8 *) AllocateZeroPool (PackageLength);\r
1866 if (PackageList->DevicePathPkg == NULL) {\r
1867 return EFI_OUT_OF_RESOURCES;\r
1868 }\r
1869\r
1870 Header.Length = PackageLength;\r
1871 Header.Type = EFI_HII_PACKAGE_DEVICE_PATH;\r
1872 CopyMem (PackageList->DevicePathPkg, &Header, sizeof (EFI_HII_PACKAGE_HEADER));\r
1873 CopyMem (\r
1874 PackageList->DevicePathPkg + sizeof (EFI_HII_PACKAGE_HEADER),\r
1875 DevicePath,\r
1876 PackageLength - sizeof (EFI_HII_PACKAGE_HEADER)\r
1877 );\r
1878\r
1879 //\r
1880 // Since Device Path package is created by NewPackageList, either NEW_PACK\r
1881 // or ADD_PACK should increase the length of package list.\r
1882 //\r
1883 PackageList->PackageListHdr.PackageLength += PackageLength;\r
1884 return EFI_SUCCESS;\r
1885}\r
1886\r
1887\r
1888/**\r
1889 This function exports device path package to a buffer.\r
e90b081a 1890 This is a internal function.\r
93e3992d 1891\r
1892 @param Private Hii database private structure.\r
1893 @param Handle Identification of a package list.\r
1894 @param PackageList Pointer to a package list which will be exported.\r
1895 @param UsedSize The length of buffer be used.\r
1896 @param BufferSize Length of the Buffer.\r
1897 @param Buffer Allocated space for storing exported data.\r
1898 @param ResultSize The size of the already exported content of this\r
1899 package list.\r
1900\r
1901 @retval EFI_SUCCESS Device path Package is exported successfully.\r
1902 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
1903\r
1904**/\r
93e3992d 1905EFI_STATUS\r
1906ExportDevicePathPackage (\r
1907 IN HII_DATABASE_PRIVATE_DATA *Private,\r
1908 IN EFI_HII_HANDLE Handle,\r
1909 IN HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
1910 IN UINTN UsedSize,\r
1911 IN UINTN BufferSize,\r
1912 IN OUT VOID *Buffer,\r
1913 IN OUT UINTN *ResultSize\r
1914 )\r
1915{\r
1916 EFI_STATUS Status;\r
1917 UINT8 *Package;\r
1918 EFI_HII_PACKAGE_HEADER Header;\r
1919\r
1920 if (Private == NULL || PackageList == NULL || ResultSize == NULL) {\r
1921 return EFI_INVALID_PARAMETER;\r
1922 }\r
1923 if (BufferSize > 0 && Buffer == NULL ) {\r
1924 return EFI_INVALID_PARAMETER;\r
1925 }\r
1926\r
1927 Package = PackageList->DevicePathPkg;\r
1928\r
1929 if (Package == NULL) {\r
1930 return EFI_SUCCESS;\r
1931 }\r
1932\r
1933 CopyMem (&Header, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
1934\r
1935 if (Header.Length + *ResultSize + UsedSize <= BufferSize) {\r
1936 //\r
1937 // Invoke registered notification function with EXPORT_PACK notify type\r
1938 //\r
1939 Status = InvokeRegisteredFunction (\r
1940 Private,\r
1941 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK,\r
1942 (VOID *) Package,\r
1943 EFI_HII_PACKAGE_DEVICE_PATH,\r
1944 Handle\r
1945 );\r
1946 ASSERT_EFI_ERROR (Status);\r
1947\r
1948 //\r
1949 // Copy Device path package\r
1950 //\r
1951 CopyMem (Buffer, Package, Header.Length);\r
1952 }\r
1953\r
1954 *ResultSize += Header.Length;\r
1955 return EFI_SUCCESS;\r
1956}\r
1957\r
1958\r
1959/**\r
1960 This function deletes Device Path package from a package list node.\r
e90b081a 1961 This is a internal function.\r
93e3992d 1962\r
1963 @param Private Hii database private data.\r
1964 @param Handle Handle of the package list.\r
1965 @param PackageList Package List which contains the to be removed\r
1966 Device Path package.\r
1967\r
1968 @retval EFI_SUCCESS Device Path Package is deleted successfully.\r
1969 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.\r
1970\r
1971**/\r
93e3992d 1972EFI_STATUS\r
1973RemoveDevicePathPackage (\r
1974 IN HII_DATABASE_PRIVATE_DATA *Private,\r
1975 IN EFI_HII_HANDLE Handle,\r
1976 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList\r
1977 )\r
1978{\r
1979 EFI_STATUS Status;\r
1980 UINT8 *Package;\r
1981 EFI_HII_PACKAGE_HEADER Header;\r
1982\r
1983 Package = PackageList->DevicePathPkg;\r
1984\r
1985 //\r
1986 // No device path, return directly.\r
1987 //\r
1988 if (Package == NULL) {\r
1989 return EFI_SUCCESS;\r
1990 }\r
1991\r
1992 Status = InvokeRegisteredFunction (\r
1993 Private,\r
1994 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
1995 (VOID *) Package,\r
1996 EFI_HII_PACKAGE_DEVICE_PATH,\r
1997 Handle\r
1998 );\r
1999 if (EFI_ERROR (Status)) {\r
2000 return Status;\r
2001 }\r
2002\r
2003 CopyMem (&Header, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
2004 PackageList->PackageListHdr.PackageLength -= Header.Length;\r
2005\r
2006 SafeFreePool (Package);\r
2007\r
2008 PackageList->DevicePathPkg = NULL;\r
2009\r
2010 return EFI_SUCCESS;\r
2011}\r
2012\r
2013\r
2014/**\r
2015 This function will insert a device path package to package list firstly then\r
2016 invoke notification functions if any.\r
e90b081a 2017 This is a internal function.\r
93e3992d 2018\r
2019 @param Private Hii database private structure.\r
2020 @param NotifyType The type of change concerning the database.\r
2021 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol\r
2022 instance\r
2023 @param DatabaseRecord Pointer to a database record contains a package\r
2024 list which will be inserted to.\r
2025\r
2026 @retval EFI_SUCCESS Device path Package is inserted successfully.\r
2027 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
2028 Device path package.\r
2029 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.\r
2030\r
2031**/\r
93e3992d 2032EFI_STATUS\r
2033AddDevicePathPackage (\r
2034 IN HII_DATABASE_PRIVATE_DATA *Private,\r
2035 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
2036 IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
2037 IN OUT HII_DATABASE_RECORD *DatabaseRecord\r
2038 )\r
2039{\r
2040 EFI_STATUS Status;\r
2041\r
2042 if (DevicePath == NULL) {\r
2043 return EFI_SUCCESS;\r
2044 }\r
2045\r
2046 ASSERT (Private != NULL);\r
2047 ASSERT (DatabaseRecord != NULL);\r
2048\r
2049 //\r
2050 // Create a device path package and insert to packagelist\r
2051 //\r
2052 Status = InsertDevicePathPackage (\r
2053 DevicePath,\r
2054 NotifyType,\r
2055 DatabaseRecord->PackageList\r
2056 );\r
2057 if (EFI_ERROR (Status)) {\r
2058 return Status;\r
2059 }\r
2060\r
2061 return InvokeRegisteredFunction (\r
2062 Private,\r
2063 NotifyType,\r
2064 (VOID *) DatabaseRecord->PackageList->DevicePathPkg,\r
2065 EFI_HII_PACKAGE_DEVICE_PATH,\r
2066 DatabaseRecord->Handle\r
2067 );\r
2068}\r
2069\r
2070\r
2071/**\r
2072 This function insert a Keyboard Layout package to a package list node.\r
e90b081a 2073 This is a internal function.\r
93e3992d 2074\r
2075 @param PackageHdr Pointer to a buffer stored with Keyboard Layout\r
2076 package information.\r
2077 @param NotifyType The type of change concerning the database.\r
2078 @param PackageList Pointer to a package list which will be inserted\r
2079 to.\r
2080 @param Package Created Keyboard Layout package\r
2081\r
2082 @retval EFI_SUCCESS Keyboard Layout Package is inserted successfully.\r
2083 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
2084 Keyboard Layout package.\r
2085 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.\r
2086\r
2087**/\r
93e3992d 2088EFI_STATUS\r
2089InsertKeyboardLayoutPackage (\r
2090 IN VOID *PackageHdr,\r
2091 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
2092 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
2093 OUT HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE **Package\r
2094 )\r
2095{\r
2096 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE *KeyboardLayoutPackage;\r
2097 EFI_HII_PACKAGE_HEADER PackageHeader;\r
2098 EFI_STATUS Status;\r
2099\r
2100 if (PackageHdr == NULL || PackageList == NULL) {\r
2101 return EFI_INVALID_PARAMETER;\r
2102 }\r
2103\r
2104 CopyMem (&PackageHeader, PackageHdr, sizeof (EFI_HII_PACKAGE_HEADER));\r
2105\r
2106 //\r
2107 // Create a Keyboard Layout package node\r
2108 //\r
2109 KeyboardLayoutPackage = AllocateZeroPool (sizeof (HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE));\r
2110 if (KeyboardLayoutPackage == NULL) {\r
2111 Status = EFI_OUT_OF_RESOURCES;\r
2112 goto Error;\r
2113 }\r
2114 KeyboardLayoutPackage->Signature = HII_KB_LAYOUT_PACKAGE_SIGNATURE;\r
2115\r
2116 KeyboardLayoutPackage->KeyboardPkg = (UINT8 *) AllocateZeroPool (PackageHeader.Length);\r
2117 if (KeyboardLayoutPackage->KeyboardPkg == NULL) {\r
2118 Status = EFI_OUT_OF_RESOURCES;\r
2119 goto Error;\r
2120 }\r
2121\r
2122 CopyMem (KeyboardLayoutPackage->KeyboardPkg, PackageHdr, PackageHeader.Length);\r
2123 InsertTailList (&PackageList->KeyboardLayoutHdr, &KeyboardLayoutPackage->KeyboardEntry);\r
2124\r
2125 *Package = KeyboardLayoutPackage;\r
2126\r
2127 if (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK) {\r
2128 PackageList->PackageListHdr.PackageLength += PackageHeader.Length;\r
2129 }\r
2130\r
2131 return EFI_SUCCESS;\r
2132\r
2133Error:\r
2134\r
2135 SafeFreePool (KeyboardLayoutPackage->KeyboardPkg);\r
2136 SafeFreePool (KeyboardLayoutPackage);\r
2137\r
2138 return Status;\r
2139}\r
2140\r
2141\r
2142/**\r
2143 This function exports Keyboard Layout packages to a buffer.\r
e90b081a 2144 This is a internal function.\r
93e3992d 2145\r
2146 @param Private Hii database private structure.\r
2147 @param Handle Identification of a package list.\r
2148 @param PackageList Pointer to a package list which will be exported.\r
2149 @param UsedSize The length of buffer be used.\r
2150 @param BufferSize Length of the Buffer.\r
2151 @param Buffer Allocated space for storing exported data.\r
2152 @param ResultSize The size of the already exported content of this\r
2153 package list.\r
2154\r
2155 @retval EFI_SUCCESS Keyboard Layout Packages are exported\r
2156 successfully.\r
2157 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
2158\r
2159**/\r
93e3992d 2160EFI_STATUS\r
2161ExportKeyboardLayoutPackages (\r
2162 IN HII_DATABASE_PRIVATE_DATA *Private,\r
2163 IN EFI_HII_HANDLE Handle,\r
2164 IN HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
2165 IN UINTN UsedSize,\r
2166 IN UINTN BufferSize,\r
2167 IN OUT VOID *Buffer,\r
2168 IN OUT UINTN *ResultSize\r
2169 )\r
2170{\r
2171 LIST_ENTRY *Link;\r
2172 UINTN PackageLength;\r
2173 EFI_STATUS Status;\r
2174 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE *Package;\r
2175 EFI_HII_PACKAGE_HEADER PackageHeader;\r
2176\r
2177 if (Private == NULL || PackageList == NULL || ResultSize == NULL) {\r
2178 return EFI_INVALID_PARAMETER;\r
2179 }\r
2180\r
2181 if (BufferSize > 0 && Buffer == NULL ) {\r
2182 return EFI_INVALID_PARAMETER;\r
2183 }\r
2184\r
2185 PackageLength = 0;\r
2186 Status = EFI_SUCCESS;\r
2187\r
2188 for (Link = PackageList->KeyboardLayoutHdr.ForwardLink; Link != &PackageList->KeyboardLayoutHdr; Link = Link->ForwardLink) {\r
2189 Package = CR (Link, HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE, KeyboardEntry, HII_KB_LAYOUT_PACKAGE_SIGNATURE);\r
2190 CopyMem (&PackageHeader, Package->KeyboardPkg, sizeof (EFI_HII_PACKAGE_HEADER));\r
2191 PackageLength += PackageHeader.Length;\r
2192 if (PackageLength + *ResultSize + UsedSize <= BufferSize) {\r
2193 //\r
2194 // Invoke registered notification function with EXPORT_PACK notify type\r
2195 //\r
2196 Status = InvokeRegisteredFunction (\r
2197 Private,\r
2198 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK,\r
2199 (EFI_HII_PACKAGE_HEADER *) Package,\r
2200 EFI_HII_PACKAGE_KEYBOARD_LAYOUT,\r
2201 Handle\r
2202 );\r
2203 ASSERT_EFI_ERROR (Status);\r
2204\r
2205 //\r
2206 // Copy Keyboard Layout package\r
2207 //\r
2208 CopyMem (Buffer, Package->KeyboardPkg, PackageHeader.Length);\r
2209 Buffer = (UINT8 *) Buffer + PackageHeader.Length;\r
2210 }\r
2211 }\r
2212\r
2213 *ResultSize += PackageLength;\r
2214 return EFI_SUCCESS;\r
2215}\r
2216\r
2217\r
2218/**\r
2219 This function deletes all Keyboard Layout packages from a package list node.\r
e90b081a 2220 This is a internal function.\r
93e3992d 2221\r
2222 @param Private Hii database private data.\r
2223 @param Handle Handle of the package list which contains the to\r
2224 be removed Keyboard Layout packages.\r
2225 @param PackageList Pointer to a package list that contains removing\r
2226 packages.\r
2227\r
2228 @retval EFI_SUCCESS Keyboard Layout Package(s) is deleted\r
2229 successfully.\r
2230 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.\r
2231\r
2232**/\r
93e3992d 2233EFI_STATUS\r
2234RemoveKeyboardLayoutPackages (\r
2235 IN HII_DATABASE_PRIVATE_DATA *Private,\r
2236 IN EFI_HII_HANDLE Handle,\r
2237 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList\r
2238 )\r
2239{\r
2240 LIST_ENTRY *ListHead;\r
2241 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE *Package;\r
2242 EFI_HII_PACKAGE_HEADER PackageHeader;\r
2243 EFI_STATUS Status;\r
2244\r
2245 ListHead = &PackageList->KeyboardLayoutHdr;\r
2246\r
2247 while (!IsListEmpty (ListHead)) {\r
2248 Package = CR (\r
2249 ListHead->ForwardLink,\r
2250 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE,\r
2251 KeyboardEntry,\r
2252 HII_KB_LAYOUT_PACKAGE_SIGNATURE\r
2253 );\r
2254 Status = InvokeRegisteredFunction (\r
2255 Private,\r
2256 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK,\r
2257 (VOID *) Package,\r
2258 EFI_HII_PACKAGE_KEYBOARD_LAYOUT,\r
2259 Handle\r
2260 );\r
2261 if (EFI_ERROR (Status)) {\r
2262 return Status;\r
2263 }\r
2264\r
2265 RemoveEntryList (&Package->KeyboardEntry);\r
2266 CopyMem (&PackageHeader, Package->KeyboardPkg, sizeof (EFI_HII_PACKAGE_HEADER));\r
2267 PackageList->PackageListHdr.PackageLength -= PackageHeader.Length;\r
2268 SafeFreePool (Package->KeyboardPkg);\r
2269 SafeFreePool (Package);\r
2270 }\r
2271\r
2272 return EFI_SUCCESS;\r
2273}\r
2274\r
2275\r
2276/**\r
2277 This function will insert a package list to hii database firstly then\r
2278 invoke notification functions if any. It is the worker function of\r
2279 HiiNewPackageList and HiiUpdatePackageList.\r
2280\r
e90b081a 2281 This is a internal function.\r
2282\r
93e3992d 2283 @param Private Hii database private structure.\r
2284 @param NotifyType The type of change concerning the database.\r
2285 @param PackageList Pointer to a package list.\r
2286 @param DatabaseRecord Pointer to a database record contains a package\r
2287 list instance which will be inserted to.\r
2288\r
2289 @retval EFI_SUCCESS All incoming packages are inserted to current\r
2290 database.\r
2291 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
2292 Device path package.\r
2293 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
2294\r
2295**/\r
93e3992d 2296EFI_STATUS\r
2297AddPackages (\r
2298 IN HII_DATABASE_PRIVATE_DATA *Private,\r
2299 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
2300 IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageList,\r
2301 IN OUT HII_DATABASE_RECORD *DatabaseRecord\r
2302 )\r
2303{\r
2304 EFI_STATUS Status;\r
2305 HII_GUID_PACKAGE_INSTANCE *GuidPackage;\r
2306 HII_IFR_PACKAGE_INSTANCE *FormPackage;\r
2307 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE *KeyboardLayoutPackage;\r
2308 HII_STRING_PACKAGE_INSTANCE *StringPackage;\r
2309 HII_FONT_PACKAGE_INSTANCE *FontPackage;\r
2310 HII_SIMPLE_FONT_PACKAGE_INSTANCE *SimpleFontPackage;\r
2311 HII_IMAGE_PACKAGE_INSTANCE *ImagePackage;\r
2312 EFI_HII_PACKAGE_HEADER *PackageHdrPtr;\r
2313 EFI_HII_PACKAGE_HEADER PackageHeader;\r
2314 UINT32 OldPackageListLen;\r
2315\r
6c46a5ab 2316 //\r
2317 // Initialize Variables\r
2318 //\r
2319 FontPackage = NULL;\r
2320\r
93e3992d 2321 //\r
2322 // Process the package list header\r
2323 //\r
2324 OldPackageListLen = DatabaseRecord->PackageList->PackageListHdr.PackageLength;\r
2325 CopyMem (\r
2326 &DatabaseRecord->PackageList->PackageListHdr,\r
2327 (VOID *) PackageList,\r
2328 sizeof (EFI_HII_PACKAGE_LIST_HEADER)\r
2329 );\r
2330 if (NotifyType == EFI_HII_DATABASE_NOTIFY_ADD_PACK) {\r
2331 DatabaseRecord->PackageList->PackageListHdr.PackageLength = OldPackageListLen;\r
2332 }\r
2333\r
2334 PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageList + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
2335 CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
2336\r
2337 Status = EFI_SUCCESS;\r
2338\r
2339 while (PackageHeader.Type != EFI_HII_PACKAGE_END) {\r
2340 switch (PackageHeader.Type) {\r
2341 case EFI_HII_PACKAGE_TYPE_GUID:\r
2342 Status = InsertGuidPackage (\r
2343 PackageHdrPtr,\r
2344 NotifyType,\r
2345 DatabaseRecord->PackageList,\r
2346 &GuidPackage\r
2347 );\r
2348 if (EFI_ERROR (Status)) {\r
2349 return Status;\r
2350 }\r
2351 Status = InvokeRegisteredFunction (\r
2352 Private,\r
2353 NotifyType,\r
2354 (VOID *) GuidPackage,\r
2355 (UINT8) (PackageHeader.Type),\r
2356 DatabaseRecord->Handle\r
2357 );\r
2358 break;\r
2359 case EFI_HII_PACKAGE_FORM:\r
2360 Status = InsertFormPackage (\r
2361 PackageHdrPtr,\r
2362 NotifyType,\r
2363 DatabaseRecord->PackageList,\r
2364 &FormPackage\r
2365 );\r
2366 if (EFI_ERROR (Status)) {\r
2367 return Status;\r
2368 }\r
2369 Status = InvokeRegisteredFunction (\r
2370 Private,\r
2371 NotifyType,\r
2372 (VOID *) FormPackage,\r
2373 (UINT8) (PackageHeader.Type),\r
2374 DatabaseRecord->Handle\r
2375 );\r
2376 break;\r
2377 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
2378 Status = InsertKeyboardLayoutPackage (\r
2379 PackageHdrPtr,\r
2380 NotifyType,\r
2381 DatabaseRecord->PackageList,\r
2382 &KeyboardLayoutPackage\r
2383 );\r
2384 if (EFI_ERROR (Status)) {\r
2385 return Status;\r
2386 }\r
2387 Status = InvokeRegisteredFunction (\r
2388 Private,\r
2389 NotifyType,\r
2390 (VOID *) KeyboardLayoutPackage,\r
2391 (UINT8) (PackageHeader.Type),\r
2392 DatabaseRecord->Handle\r
2393 );\r
2394 break;\r
2395 case EFI_HII_PACKAGE_STRINGS:\r
2396 Status = InsertStringPackage (\r
2397 Private,\r
2398 PackageHdrPtr,\r
2399 NotifyType,\r
2400 DatabaseRecord->PackageList,\r
2401 &StringPackage\r
2402 );\r
2403 if (EFI_ERROR (Status)) {\r
2404 return Status;\r
2405 }\r
2406 Status = InvokeRegisteredFunction (\r
2407 Private,\r
2408 NotifyType,\r
2409 (VOID *) StringPackage,\r
2410 (UINT8) (PackageHeader.Type),\r
2411 DatabaseRecord->Handle\r
2412 );\r
2413 break;\r
2414 case EFI_HII_PACKAGE_FONTS:\r
2415 Status = InsertFontPackage (\r
2416 Private,\r
2417 PackageHdrPtr,\r
2418 NotifyType,\r
2419 DatabaseRecord->PackageList,\r
2420 &FontPackage\r
2421 );\r
2422 if (EFI_ERROR (Status)) {\r
2423 return Status;\r
2424 }\r
2425 Status = InvokeRegisteredFunction (\r
2426 Private,\r
2427 NotifyType,\r
2428 (VOID *) FontPackage,\r
2429 (UINT8) (PackageHeader.Type),\r
2430 DatabaseRecord->Handle\r
2431 );\r
2432 break;\r
2433 case EFI_HII_PACKAGE_IMAGES:\r
2434 Status = InsertImagePackage (\r
2435 PackageHdrPtr,\r
2436 NotifyType,\r
2437 DatabaseRecord->PackageList,\r
2438 &ImagePackage\r
2439 );\r
2440 if (EFI_ERROR (Status)) {\r
2441 return Status;\r
2442 }\r
2443 Status = InvokeRegisteredFunction (\r
2444 Private,\r
2445 NotifyType,\r
2446 (VOID *) ImagePackage,\r
2447 (UINT8) (PackageHeader.Type),\r
2448 DatabaseRecord->Handle\r
2449 );\r
2450 break;\r
2451 case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
2452 Status = InsertSimpleFontPackage (\r
2453 PackageHdrPtr,\r
2454 NotifyType,\r
2455 DatabaseRecord->PackageList,\r
2456 &SimpleFontPackage\r
2457 );\r
2458 if (EFI_ERROR (Status)) {\r
2459 return Status;\r
2460 }\r
2461 Status = InvokeRegisteredFunction (\r
2462 Private,\r
2463 NotifyType,\r
2464 (VOID *) SimpleFontPackage,\r
2465 (UINT8) (PackageHeader.Type),\r
2466 DatabaseRecord->Handle\r
2467 );\r
2468 break;\r
2469 case EFI_HII_PACKAGE_DEVICE_PATH:\r
2470 Status = AddDevicePathPackage (\r
2471 Private,\r
2472 NotifyType,\r
2473 (EFI_DEVICE_PATH_PROTOCOL *) ((UINT8 *) PackageHdrPtr + sizeof (EFI_HII_PACKAGE_HEADER)),\r
2474 DatabaseRecord\r
2475 );\r
2476 break;\r
2477 default:\r
2478 break;\r
2479 }\r
2480\r
2481 if (EFI_ERROR (Status)) {\r
2482 return Status;\r
2483 }\r
2484 //\r
2485 // goto header of next package\r
2486 //\r
2487 PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHdrPtr + PackageHeader.Length);\r
2488 CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
2489 }\r
2490\r
2491 return Status;\r
2492}\r
2493\r
2494\r
2495/**\r
2496 This function exports a package list to a buffer. It is the worker function\r
2497 of HiiExportPackageList.\r
2498\r
e90b081a 2499 This is a internal function.\r
2500\r
93e3992d 2501 @param Private Hii database private structure.\r
2502 @param Handle Identification of a package list.\r
2503 @param PackageList Pointer to a package list which will be exported.\r
2504 @param UsedSize The length of buffer has been used by exporting\r
2505 package lists when Handle is NULL.\r
2506 @param BufferSize Length of the Buffer.\r
2507 @param Buffer Allocated space for storing exported data.\r
2508\r
2509 @retval EFI_SUCCESS Keyboard Layout Packages are exported\r
2510 successfully.\r
2511 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.\r
2512\r
2513**/\r
93e3992d 2514EFI_STATUS\r
2515ExportPackageList (\r
2516 IN HII_DATABASE_PRIVATE_DATA *Private,\r
2517 IN EFI_HII_HANDLE Handle,\r
2518 IN HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList,\r
2519 IN OUT UINTN *UsedSize,\r
2520 IN UINTN BufferSize,\r
2521 OUT EFI_HII_PACKAGE_LIST_HEADER *Buffer\r
2522 )\r
2523{\r
2524 EFI_STATUS Status;\r
2525 UINTN ResultSize;\r
2526 EFI_HII_PACKAGE_HEADER EndofPackageList;\r
2527\r
2528 ASSERT (Private != NULL || PackageList != NULL || UsedSize != NULL);\r
2529 ASSERT (Private->Signature == HII_DATABASE_PRIVATE_DATA_SIGNATURE);\r
2530 ASSERT (IsHiiHandleValid (Handle));\r
2531\r
2532 if (BufferSize > 0 && Buffer == NULL ) {\r
2533 return EFI_INVALID_PARAMETER;\r
2534 }\r
2535\r
2536 //\r
2537 // Copy the package list header\r
2538 // ResultSize indicates the length of the exported bytes of this package list\r
2539 //\r
2540 ResultSize = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
2541 if (ResultSize + *UsedSize <= BufferSize) {\r
2542 CopyMem ((VOID *) Buffer, PackageList, ResultSize);\r
2543 }\r
2544 //\r
2545 // Copy the packages and invoke EXPORT_PACK notify functions if exists.\r
2546 //\r
2547 Status = ExportGuidPackages (\r
2548 Private,\r
2549 Handle,\r
2550 PackageList,\r
2551 *UsedSize,\r
2552 BufferSize,\r
2553 (VOID *) ((UINT8 *) Buffer + ResultSize),\r
2554 &ResultSize\r
2555 );\r
2556 if (EFI_ERROR (Status)) {\r
2557 return Status;\r
2558 }\r
2559 Status = ExportFormPackages (\r
2560 Private,\r
2561 Handle,\r
2562 PackageList,\r
2563 *UsedSize,\r
2564 BufferSize,\r
2565 (VOID *) ((UINT8 *) Buffer + ResultSize),\r
2566 &ResultSize\r
2567 );\r
2568 if (EFI_ERROR (Status)) {\r
2569 return Status;\r
2570 }\r
2571 Status = ExportKeyboardLayoutPackages (\r
2572 Private,\r
2573 Handle,\r
2574 PackageList,\r
2575 *UsedSize,\r
2576 BufferSize,\r
2577 (VOID *) ((UINT8 *) Buffer + ResultSize),\r
2578 &ResultSize\r
2579 );\r
2580 if (EFI_ERROR (Status)) {\r
2581 return Status;\r
2582 }\r
2583 Status = ExportStringPackages (\r
2584 Private,\r
2585 Handle,\r
2586 PackageList,\r
2587 *UsedSize,\r
2588 BufferSize,\r
2589 (VOID *) ((UINT8 *) Buffer + ResultSize),\r
2590 &ResultSize\r
2591 );\r
2592 if (EFI_ERROR (Status)) {\r
2593 return Status;\r
2594 }\r
2595 Status = ExportFontPackages (\r
2596 Private,\r
2597 Handle,\r
2598 PackageList,\r
2599 *UsedSize,\r
2600 BufferSize,\r
2601 (VOID *) ((UINT8 *) Buffer + ResultSize),\r
2602 &ResultSize\r
2603 );\r
2604 if (EFI_ERROR (Status)) {\r
2605 return Status;\r
2606 }\r
2607 Status = ExportImagePackages (\r
2608 Private,\r
2609 Handle,\r
2610 PackageList,\r
2611 *UsedSize,\r
2612 BufferSize,\r
2613 (VOID *) ((UINT8 *) Buffer + ResultSize),\r
2614 &ResultSize\r
2615 );\r
2616 if (EFI_ERROR (Status)) {\r
2617 return Status;\r
2618 }\r
2619 Status = ExportSimpleFontPackages (\r
2620 Private,\r
2621 Handle,\r
2622 PackageList,\r
2623 *UsedSize,\r
2624 BufferSize,\r
2625 (VOID *) ((UINT8 *) Buffer + ResultSize),\r
2626 &ResultSize\r
2627 );\r
2628 if (EFI_ERROR (Status)) {\r
2629 return Status;\r
2630 }\r
2631 Status = ExportDevicePathPackage (\r
2632 Private,\r
2633 Handle,\r
2634 PackageList,\r
2635 *UsedSize,\r
2636 BufferSize,\r
2637 (VOID *) ((UINT8 *) Buffer + ResultSize),\r
2638 &ResultSize\r
2639 );\r
2640 if (EFI_ERROR (Status)) {\r
2641 return Status;\r
2642 }\r
2643 //\r
2644 // Append the package list end.\r
2645 //\r
2646 EndofPackageList.Length = sizeof (EFI_HII_PACKAGE_HEADER);\r
2647 EndofPackageList.Type = EFI_HII_PACKAGE_END;\r
2648 if (ResultSize + *UsedSize + sizeof (EFI_HII_PACKAGE_HEADER) <= BufferSize) {\r
2649 CopyMem (\r
2650 (VOID *) ((UINT8 *) Buffer + ResultSize),\r
2651 (VOID *) &EndofPackageList,\r
2652 sizeof (EFI_HII_PACKAGE_HEADER)\r
2653 );\r
2654 }\r
2655\r
2656 *UsedSize += ResultSize + sizeof (EFI_HII_PACKAGE_HEADER);\r
2657\r
2658 return EFI_SUCCESS;\r
2659}\r
2660\r
2661\r
2662/**\r
2663 This function adds the packages in the package list to the database and returns a handle. If there is a\r
2664 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will\r
2665 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.\r
2666\r
2667 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
2668 instance.\r
2669 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER\r
2670 structure.\r
2671 @param DriverHandle Associate the package list with this EFI handle.\r
2672 @param Handle A pointer to the EFI_HII_HANDLE instance.\r
2673\r
2674 @retval EFI_SUCCESS The package list associated with the Handle was\r
2675 added to the HII database.\r
2676 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new\r
2677 database contents.\r
2678 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.\r
2679 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.\r
2680\r
2681**/\r
2682EFI_STATUS\r
2683EFIAPI\r
2684HiiNewPackageList (\r
2685 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
2686 IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageList,\r
2687 IN CONST EFI_HANDLE DriverHandle,\r
2688 OUT EFI_HII_HANDLE *Handle\r
2689 )\r
2690{\r
2691 EFI_STATUS Status;\r
2692 HII_DATABASE_PRIVATE_DATA *Private;\r
2693 HII_DATABASE_RECORD *DatabaseRecord;\r
2694 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
2695 LIST_ENTRY *Link;\r
2696 EFI_GUID PackageListGuid;\r
2697\r
2698 if (This == NULL || PackageList == NULL || Handle == NULL) {\r
2699 return EFI_INVALID_PARAMETER;\r
2700 }\r
2701\r
2702 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
2703 CopyMem (&PackageListGuid, (VOID *) PackageList, sizeof (EFI_GUID));\r
2704\r
2705 //\r
2706 // Check the Package list GUID to guarantee this GUID is unique in database.\r
2707 //\r
2708 for (Link = Private->DatabaseList.ForwardLink; Link != &Private->DatabaseList; Link = Link->ForwardLink) {\r
2709 DatabaseRecord = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
2710 if (CompareGuid (\r
2711 &(DatabaseRecord->PackageList->PackageListHdr.PackageListGuid),\r
2712 &PackageListGuid\r
2713 )\r
2714 ) {\r
2715 return EFI_INVALID_PARAMETER;\r
2716 }\r
2717 }\r
2718\r
2719 //\r
2720 // Build a PackageList node\r
2721 //\r
2722 Status = GenerateHiiDatabaseRecord (Private, &DatabaseRecord);\r
2723 if (EFI_ERROR (Status)) {\r
2724 return Status;\r
2725 }\r
2726\r
2727 //\r
2728 // Fill in information of the created Package List node\r
2729 // according to incoming package list.\r
2730 //\r
2731 Status = AddPackages (Private, EFI_HII_DATABASE_NOTIFY_NEW_PACK, PackageList, DatabaseRecord);\r
2732 if (EFI_ERROR (Status)) {\r
2733 return Status;\r
2734 }\r
2735\r
2736 DatabaseRecord->DriverHandle = DriverHandle;\r
2737\r
2738 //\r
2739 // Create a Device path package and add into the package list if exists.\r
2740 //\r
2741 Status = gBS->HandleProtocol (\r
2742 DriverHandle,\r
2743 &gEfiDevicePathProtocolGuid,\r
2744 (VOID **) &DevicePath\r
2745 );\r
2746 if (!EFI_ERROR (Status)) {\r
2747 Status = AddDevicePathPackage (Private, EFI_HII_DATABASE_NOTIFY_NEW_PACK, DevicePath, DatabaseRecord);\r
2748 ASSERT_EFI_ERROR (Status);\r
2749 }\r
2750\r
2751 *Handle = DatabaseRecord->Handle;\r
2752 return EFI_SUCCESS;\r
2753}\r
2754\r
2755\r
2756/**\r
2757 This function removes the package list that is associated with a handle Handle\r
2758 from the HII database. Before removing the package, any registered functions\r
2759 with the notification type REMOVE_PACK and the same package type will be called.\r
2760\r
2761 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
2762 instance.\r
2763 @param Handle The handle that was registered to the data that is\r
2764 requested for removal.\r
2765\r
2766 @retval EFI_SUCCESS The data associated with the Handle was removed\r
2767 from the HII database.\r
813acf3a 2768 @retval EFI_NOT_FOUND The specified andle is not in database.\r
93e3992d 2769 @retval EFI_INVALID_PARAMETER The Handle was not valid.\r
2770\r
2771**/\r
2772EFI_STATUS\r
2773EFIAPI\r
2774HiiRemovePackageList (\r
2775 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
2776 IN EFI_HII_HANDLE Handle\r
2777 )\r
2778{\r
2779 EFI_STATUS Status;\r
2780 HII_DATABASE_PRIVATE_DATA *Private;\r
2781 LIST_ENTRY *Link;\r
2782 HII_DATABASE_RECORD *Node;\r
2783 HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList;\r
2784 HII_HANDLE *HiiHandle;\r
2785\r
813acf3a 2786 if (This == NULL) {\r
93e3992d 2787 return EFI_INVALID_PARAMETER;\r
2788 }\r
2789\r
813acf3a 2790 if (!IsHiiHandleValid (Handle)) {\r
2791 return EFI_NOT_FOUND;\r
2792 }\r
2793\r
93e3992d 2794 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
2795\r
2796 //\r
2797 // Get the packagelist to be removed.\r
2798 //\r
2799 for (Link = Private->DatabaseList.ForwardLink; Link != &Private->DatabaseList; Link = Link->ForwardLink) {\r
2800 Node = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
2801 if (Node->Handle == Handle) {\r
2802 PackageList = (HII_DATABASE_PACKAGE_LIST_INSTANCE *) (Node->PackageList);\r
2803 ASSERT (PackageList != NULL);\r
2804\r
2805 //\r
2806 // Call registered functions with REMOVE_PACK before removing packages\r
2807 // then remove them.\r
2808 //\r
2809 Status = RemoveGuidPackages (Private, Handle, PackageList);\r
2810 if (EFI_ERROR (Status)) {\r
2811 return Status;\r
2812 }\r
2813 Status = RemoveFormPackages (Private, Handle, PackageList);\r
2814 if (EFI_ERROR (Status)) {\r
2815 return Status;\r
2816 }\r
2817 Status = RemoveKeyboardLayoutPackages (Private, Handle, PackageList);\r
2818 if (EFI_ERROR (Status)) {\r
2819 return Status;\r
2820 }\r
2821 Status = RemoveStringPackages (Private, Handle, PackageList);\r
2822 if (EFI_ERROR (Status)) {\r
2823 return Status;\r
2824 }\r
2825 Status = RemoveFontPackages (Private, Handle, PackageList);\r
2826 if (EFI_ERROR (Status)) {\r
2827 return Status;\r
2828 }\r
2829 Status = RemoveImagePackages (Private, Handle, PackageList);\r
2830 if (EFI_ERROR (Status)) {\r
2831 return Status;\r
2832 }\r
2833 Status = RemoveSimpleFontPackages (Private, Handle, PackageList);\r
2834 if (EFI_ERROR (Status)) {\r
2835 return Status;\r
2836 }\r
2837 Status = RemoveDevicePathPackage (Private, Handle, PackageList);\r
2838 if (EFI_ERROR (Status)) {\r
2839 return Status;\r
2840 }\r
2841\r
2842 //\r
2843 // Free resources of the package list\r
2844 //\r
2845 RemoveEntryList (&Node->DatabaseEntry);\r
2846\r
2847 HiiHandle = (HII_HANDLE *) Handle;\r
2848 RemoveEntryList (&HiiHandle->Handle);\r
2849 Private->HiiHandleCount--;\r
2850 ASSERT (Private->HiiHandleCount >= 0);\r
2851\r
2852 HiiHandle->Signature = 0;\r
2853 SafeFreePool (HiiHandle);\r
2854 SafeFreePool (Node->PackageList);\r
2855 SafeFreePool (Node);\r
2856\r
2857 return EFI_SUCCESS;\r
2858 }\r
2859 }\r
2860\r
2861 return EFI_NOT_FOUND;\r
2862}\r
2863\r
2864\r
2865/**\r
2866 This function updates the existing package list (which has the specified Handle)\r
2867 in the HII databases, using the new package list specified by PackageList.\r
2868\r
2869 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
2870 instance.\r
2871 @param Handle The handle that was registered to the data that is\r
2872 requested to be updated.\r
2873 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER\r
2874 package.\r
2875\r
2876 @retval EFI_SUCCESS The HII database was successfully updated.\r
2877 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated\r
2878 database.\r
813acf3a 2879 @retval EFI_INVALID_PARAMETER PackageList was NULL.\r
2880 @retval EFI_NOT_FOUND The specified Handle is not in database.\r
93e3992d 2881\r
2882**/\r
2883EFI_STATUS\r
2884EFIAPI\r
2885HiiUpdatePackageList (\r
2886 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
2887 IN EFI_HII_HANDLE Handle,\r
2888 IN CONST EFI_HII_PACKAGE_LIST_HEADER *PackageList\r
2889 )\r
2890{\r
2891 EFI_STATUS Status;\r
2892 HII_DATABASE_PRIVATE_DATA *Private;\r
2893 LIST_ENTRY *Link;\r
2894 HII_DATABASE_RECORD *Node;\r
2895 EFI_HII_PACKAGE_HEADER *PackageHdrPtr;\r
2896 HII_DATABASE_PACKAGE_LIST_INSTANCE *OldPackageList;\r
2897 EFI_HII_PACKAGE_HEADER PackageHeader;\r
2898\r
813acf3a 2899 if (This == NULL || PackageList == NULL) {\r
93e3992d 2900 return EFI_INVALID_PARAMETER;\r
2901 }\r
2902\r
2903 if (!IsHiiHandleValid (Handle)) {\r
2904 return EFI_NOT_FOUND;\r
2905 }\r
2906\r
2907 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
2908\r
2909 PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageList + sizeof (EFI_HII_PACKAGE_LIST_HEADER));\r
2910\r
2911 Status = EFI_SUCCESS;\r
2912\r
2913 //\r
2914 // Get original packagelist to be updated\r
2915 //\r
2916 for (Link = Private->DatabaseList.ForwardLink; Link != &Private->DatabaseList; Link = Link->ForwardLink) {\r
2917 Node = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
2918 if (Node->Handle == Handle) {\r
2919 OldPackageList = Node->PackageList;\r
2920 //\r
2921 // Remove the package if its type matches one of the package types which is\r
2922 // contained in the new package list.\r
2923 //\r
2924 CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
2925 while (PackageHeader.Type != EFI_HII_PACKAGE_END) {\r
2926 switch (PackageHeader.Type) {\r
2927 case EFI_HII_PACKAGE_TYPE_GUID:\r
2928 Status = RemoveGuidPackages (Private, Handle, OldPackageList);\r
2929 break;\r
2930 case EFI_HII_PACKAGE_FORM:\r
2931 Status = RemoveFormPackages (Private, Handle, OldPackageList);\r
2932 break;\r
2933 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
2934 Status = RemoveKeyboardLayoutPackages (Private, Handle, OldPackageList);\r
2935 break;\r
2936 case EFI_HII_PACKAGE_STRINGS:\r
2937 Status = RemoveStringPackages (Private, Handle, OldPackageList);\r
2938 break;\r
2939 case EFI_HII_PACKAGE_FONTS:\r
2940 Status = RemoveFontPackages (Private, Handle, OldPackageList);\r
2941 break;\r
2942 case EFI_HII_PACKAGE_IMAGES:\r
2943 Status = RemoveImagePackages (Private, Handle, OldPackageList);\r
2944 break;\r
2945 case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
2946 Status = RemoveSimpleFontPackages (Private, Handle, OldPackageList);\r
2947 break;\r
2948 case EFI_HII_PACKAGE_DEVICE_PATH:\r
2949 Status = RemoveDevicePathPackage (Private, Handle, OldPackageList);\r
2950 break;\r
2951 }\r
2952\r
2953 if (EFI_ERROR (Status)) {\r
2954 return Status;\r
2955 }\r
2956\r
2957 PackageHdrPtr = (EFI_HII_PACKAGE_HEADER *) ((UINT8 *) PackageHdrPtr + PackageHeader.Length);\r
2958 CopyMem (&PackageHeader, PackageHdrPtr, sizeof (EFI_HII_PACKAGE_HEADER));\r
2959 }\r
2960\r
2961 //\r
2962 // Add all of the packages within the new package list\r
2963 //\r
2964 return AddPackages (Private, EFI_HII_DATABASE_NOTIFY_ADD_PACK, PackageList, Node);\r
2965 }\r
2966 }\r
2967\r
2968 return EFI_NOT_FOUND;\r
2969}\r
2970\r
2971\r
2972/**\r
2973 This function returns a list of the package handles of the specified type\r
2974 that are currently active in the database. The pseudo-type\r
2975 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.\r
2976\r
2977 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
2978 instance.\r
2979 @param PackageType Specifies the package type of the packages to list\r
2980 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be\r
2981 listed.\r
2982 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then\r
2983 this is the pointer to the GUID which must match\r
2984 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.\r
2985 Otherwise, it must be NULL.\r
2986 @param HandleBufferLength On input, a pointer to the length of the handle\r
2987 buffer. On output, the length of the handle\r
2988 buffer that is required for the handles found.\r
2989 @param Handle An array of EFI_HII_HANDLE instances returned.\r
2990\r
2991 @retval EFI_SUCCESS The matching handles are outputed successfully.\r
813acf3a 2992 HandleBufferLength is updated with the actual length.\r
93e3992d 2993 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that\r
2994 Handle is too small to support the number of\r
2995 handles. HandleBufferLength is updated with a\r
2996 value that will enable the data to fit.\r
2997 @retval EFI_NOT_FOUND No matching handle could not be found in database.\r
2998 @retval EFI_INVALID_PARAMETER Handle or HandleBufferLength was NULL.\r
813acf3a 2999 \r
3000 @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but\r
3001 PackageGuid is not NULL, PackageType is a EFI_HII_\r
3002 PACKAGE_TYPE_GUID but PackageGuid is NULL.\r
93e3992d 3003\r
3004**/\r
3005EFI_STATUS\r
3006EFIAPI\r
3007HiiListPackageLists (\r
3008 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
3009 IN UINT8 PackageType,\r
3010 IN CONST EFI_GUID *PackageGuid,\r
3011 IN OUT UINTN *HandleBufferLength,\r
3012 OUT EFI_HII_HANDLE *Handle\r
3013 )\r
3014{\r
3015 HII_GUID_PACKAGE_INSTANCE *GuidPackage;\r
3016 HII_DATABASE_PRIVATE_DATA *Private;\r
3017 HII_DATABASE_RECORD *Node;\r
3018 LIST_ENTRY *Link;\r
3019 BOOLEAN Matched;\r
3020 HII_HANDLE **Result;\r
3021 UINTN ResultSize;\r
3022 HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList;\r
3023 LIST_ENTRY *Link1;\r
3024\r
3025 //\r
3026 // Check input parameters\r
3027 //\r
3028 if (This == NULL || HandleBufferLength == NULL) {\r
3029 return EFI_INVALID_PARAMETER;\r
3030 }\r
3031 if (*HandleBufferLength > 0 && Handle == NULL) {\r
3032 return EFI_INVALID_PARAMETER;\r
3033 }\r
3034 if ((PackageType == EFI_HII_PACKAGE_TYPE_GUID && PackageGuid == NULL) ||\r
3035 (PackageType != EFI_HII_PACKAGE_TYPE_GUID && PackageGuid != NULL)) {\r
3036 return EFI_INVALID_PARAMETER;\r
3037 }\r
3038\r
3039 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
3040 Matched = FALSE;\r
3041 Result = (HII_HANDLE **) Handle;\r
3042 ResultSize = 0;\r
3043\r
3044 for (Link = Private->DatabaseList.ForwardLink; Link != &Private->DatabaseList; Link = Link->ForwardLink) {\r
3045 Node = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
3046 PackageList = (HII_DATABASE_PACKAGE_LIST_INSTANCE *) (Node->PackageList);\r
3047 switch (PackageType) {\r
3048 case EFI_HII_PACKAGE_TYPE_GUID:\r
3049 for (Link1 = PackageList->GuidPkgHdr.ForwardLink; Link1 != &PackageList->GuidPkgHdr; Link1 = Link1->ForwardLink) {\r
3050 GuidPackage = CR (Link1, HII_GUID_PACKAGE_INSTANCE, GuidEntry, HII_GUID_PACKAGE_SIGNATURE);\r
3051 if (CompareGuid (\r
3052 (EFI_GUID *) PackageGuid,\r
3053 (EFI_GUID *) (GuidPackage->GuidPkg + sizeof (EFI_HII_PACKAGE_HEADER))\r
3054 )) {\r
3055 Matched = TRUE;\r
3056 break;\r
3057 }\r
3058 }\r
3059 break;\r
3060 case EFI_HII_PACKAGE_FORM:\r
3061 if (!IsListEmpty (&PackageList->FormPkgHdr)) {\r
3062 Matched = TRUE;\r
3063 }\r
3064 break;\r
3065 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT:\r
3066 if (!IsListEmpty (&PackageList->KeyboardLayoutHdr)) {\r
3067 Matched = TRUE;\r
3068 }\r
3069 break;\r
3070 case EFI_HII_PACKAGE_STRINGS:\r
3071 if (!IsListEmpty (&PackageList->StringPkgHdr)) {\r
3072 Matched = TRUE;\r
3073 }\r
3074 break;\r
3075 case EFI_HII_PACKAGE_FONTS:\r
3076 if (!IsListEmpty (&PackageList->FontPkgHdr)) {\r
3077 Matched = TRUE;\r
3078 }\r
3079 break;\r
3080 case EFI_HII_PACKAGE_IMAGES:\r
3081 if (PackageList->ImagePkg != NULL) {\r
3082 Matched = TRUE;\r
3083 }\r
3084 break;\r
3085 case EFI_HII_PACKAGE_SIMPLE_FONTS:\r
3086 if (!IsListEmpty (&PackageList->SimpleFontPkgHdr)) {\r
3087 Matched = TRUE;\r
3088 }\r
3089 break;\r
3090 case EFI_HII_PACKAGE_DEVICE_PATH:\r
3091 if (PackageList->DevicePathPkg != NULL) {\r
3092 Matched = TRUE;\r
3093 }\r
3094 break;\r
3095 //\r
3096 // Pesudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles\r
3097 // to be listed.\r
3098 //\r
3099 case EFI_HII_PACKAGE_TYPE_ALL:\r
3100 Matched = TRUE;\r
3101 break;\r
3102 default:\r
3103 break;\r
3104 }\r
3105\r
3106 //\r
3107 // This active package list has the specified package type, list it.\r
3108 //\r
3109 if (Matched) {\r
3110 ResultSize += sizeof (EFI_HII_HANDLE);\r
3111 if (ResultSize <= *HandleBufferLength) {\r
3112 *Result++ = Node->Handle;\r
3113 }\r
3114 }\r
3115 Matched = FALSE;\r
3116 }\r
3117\r
3118 if (ResultSize == 0) {\r
3119 return EFI_NOT_FOUND;\r
3120 }\r
3121\r
3122 if (*HandleBufferLength < ResultSize) {\r
3123 *HandleBufferLength = ResultSize;\r
3124 return EFI_BUFFER_TOO_SMALL;\r
3125 }\r
3126\r
3127 *HandleBufferLength = ResultSize;\r
3128 return EFI_SUCCESS;\r
3129}\r
3130\r
3131\r
3132/**\r
3133 This function will export one or all package lists in the database to a buffer.\r
3134 For each package list exported, this function will call functions registered\r
3135 with EXPORT_PACK and then copy the package list to the buffer.\r
3136\r
3137 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
3138 instance.\r
3139 @param Handle An EFI_HII_HANDLE that corresponds to the desired\r
3140 package list in the HII database to export or NULL\r
3141 to indicate all package lists should be exported.\r
3142 @param BufferSize On input, a pointer to the length of the buffer.\r
3143 On output, the length of the buffer that is\r
3144 required for the exported data.\r
3145 @param Buffer A pointer to a buffer that will contain the\r
3146 results of the export function.\r
3147\r
3148 @retval EFI_SUCCESS Package exported.\r
3149 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that\r
3150 Handle is too small to support the number of\r
3151 handles. HandleBufferLength is updated with a\r
3152 value that will enable the data to fit.\r
3153 @retval EFI_NOT_FOUND The specifiecd Handle could not be found in the\r
3154 current database.\r
3155 @retval EFI_INVALID_PARAMETER Handle or Buffer or BufferSize was NULL.\r
3156\r
3157**/\r
3158EFI_STATUS\r
3159EFIAPI\r
3160HiiExportPackageLists (\r
3161 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
3162 IN EFI_HII_HANDLE Handle,\r
3163 IN OUT UINTN *BufferSize,\r
3164 OUT EFI_HII_PACKAGE_LIST_HEADER *Buffer\r
3165 )\r
3166{\r
3167 LIST_ENTRY *Link;\r
3168 EFI_STATUS Status;\r
3169 HII_DATABASE_PRIVATE_DATA *Private;\r
3170 HII_DATABASE_RECORD *Node;\r
3171 UINTN UsedSize;\r
3172\r
3173 if (This == NULL || BufferSize == NULL || Handle == NULL) {\r
3174 return EFI_INVALID_PARAMETER;\r
3175 }\r
3176 if (*BufferSize > 0 && Buffer == NULL) {\r
3177 return EFI_INVALID_PARAMETER;\r
3178 }\r
3179 if (!IsHiiHandleValid (Handle)) {\r
3180 return EFI_NOT_FOUND;\r
3181 }\r
3182\r
3183 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
3184 UsedSize = 0;\r
3185\r
3186 for (Link = Private->DatabaseList.ForwardLink; Link != &Private->DatabaseList; Link = Link->ForwardLink) {\r
3187 Node = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
3188 if (Handle == NULL) {\r
3189 //\r
3190 // Export all package lists in current hii database.\r
3191 //\r
3192 Status = ExportPackageList (\r
3193 Private,\r
3194 Node->Handle,\r
3195 (HII_DATABASE_PACKAGE_LIST_INSTANCE *) (Node->PackageList),\r
3196 &UsedSize,\r
3197 *BufferSize,\r
3198 (EFI_HII_PACKAGE_LIST_HEADER *)((UINT8 *) Buffer + UsedSize)\r
3199 );\r
3200 ASSERT_EFI_ERROR (Status);\r
3201 }\r
3202 else if (Handle != NULL && Node->Handle == Handle) {\r
3203 Status = ExportPackageList (\r
3204 Private,\r
3205 Handle,\r
3206 (HII_DATABASE_PACKAGE_LIST_INSTANCE *) (Node->PackageList),\r
3207 &UsedSize,\r
3208 *BufferSize,\r
3209 Buffer\r
3210 );\r
3211 ASSERT_EFI_ERROR (Status);\r
3212 if (*BufferSize < UsedSize) {\r
3213 *BufferSize = UsedSize;\r
3214 return EFI_BUFFER_TOO_SMALL;\r
3215 }\r
3216 return EFI_SUCCESS;\r
3217 }\r
3218 }\r
3219\r
3220 if (Handle == NULL && UsedSize != 0) {\r
3221 if (*BufferSize < UsedSize) {\r
3222 *BufferSize = UsedSize;\r
3223 return EFI_BUFFER_TOO_SMALL;\r
3224 }\r
3225 return EFI_SUCCESS;\r
3226 }\r
3227\r
3228 return EFI_NOT_FOUND;\r
3229}\r
3230\r
3231\r
3232/**\r
3233 This function registers a function which will be called when specified actions related to packages of\r
3234 the specified type occur in the HII database. By registering a function, other HII-related drivers are\r
3235 notified when specific package types are added, removed or updated in the HII database.\r
3236 Each driver or application which registers a notification should use\r
3237 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.\r
3238\r
3239 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
3240 instance.\r
3241 @param PackageType Specifies the package type of the packages to list\r
3242 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be\r
3243 listed.\r
3244 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then\r
3245 this is the pointer to the GUID which must match\r
3246 the Guid field of\r
3247 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must\r
3248 be NULL.\r
3249 @param PackageNotifyFn Points to the function to be called when the event\r
3250 specified by\r
3251 NotificationType occurs.\r
3252 @param NotifyType Describes the types of notification which this\r
3253 function will be receiving.\r
3254 @param NotifyHandle Points to the unique handle assigned to the\r
3255 registered notification. Can be used in\r
3256 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()\r
3257 to stop notifications.\r
3258\r
3259 @retval EFI_SUCCESS Notification registered successfully.\r
3260 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures\r
3261 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.\r
3262 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not\r
3263 EFI_HII_PACKAGE_TYPE_GUID.\r
3264 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is\r
3265 EFI_HII_PACKAGE_TYPE_GUID.\r
3266\r
3267**/\r
3268EFI_STATUS\r
3269EFIAPI\r
3270HiiRegisterPackageNotify (\r
3271 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
3272 IN UINT8 PackageType,\r
3273 IN CONST EFI_GUID *PackageGuid,\r
3274 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn,\r
3275 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType,\r
3276 OUT EFI_HANDLE *NotifyHandle\r
3277 )\r
3278{\r
3279 HII_DATABASE_PRIVATE_DATA *Private;\r
3280 HII_DATABASE_NOTIFY *Notify;\r
3281 EFI_STATUS Status;\r
3282\r
3283 if (This == NULL || NotifyHandle == NULL) {\r
3284 return EFI_INVALID_PARAMETER;\r
3285 }\r
3286 if ((PackageType == EFI_HII_PACKAGE_TYPE_GUID && PackageGuid == NULL) ||\r
3287 (PackageType != EFI_HII_PACKAGE_TYPE_GUID && PackageGuid != NULL)) {\r
3288 return EFI_INVALID_PARAMETER;\r
3289 }\r
3290\r
3291 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
3292\r
3293 //\r
3294 // Allocate a notification node\r
3295 //\r
3296 Notify = (HII_DATABASE_NOTIFY *) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY));\r
3297 if (Notify == NULL) {\r
3298 return EFI_OUT_OF_RESOURCES;\r
3299 }\r
3300\r
3301 //\r
3302 // Generate a notify handle\r
3303 //\r
3304 Status = gBS->InstallMultipleProtocolInterfaces (\r
3305 &Notify->NotifyHandle,\r
3306 &mHiiDatabaseNotifyGuid,\r
3307 NULL,\r
3308 NULL\r
3309 );\r
3310 ASSERT_EFI_ERROR (Status);\r
3311\r
3312 //\r
3313 // Fill in the information to the notification node\r
3314 //\r
3315 Notify->Signature = HII_DATABASE_NOTIFY_SIGNATURE;\r
3316 Notify->PackageType = PackageType;\r
3317 Notify->PackageGuid = (EFI_GUID *) PackageGuid;\r
3318 Notify->PackageNotifyFn = (EFI_HII_DATABASE_NOTIFY) PackageNotifyFn;\r
3319 Notify->NotifyType = NotifyType;\r
3320\r
3321 InsertTailList (&Private->DatabaseNotifyList, &Notify->DatabaseNotifyEntry);\r
3322 *NotifyHandle = Notify->NotifyHandle;\r
3323\r
3324 return EFI_SUCCESS;\r
3325}\r
3326\r
3327\r
3328/**\r
3329 Removes the specified HII database package-related notification.\r
3330\r
3331 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
3332 instance.\r
e90b081a 3333 @param NotificationHandle The handle of the notification function being\r
93e3992d 3334 unregistered.\r
3335\r
3336 @retval EFI_SUCCESS Notification is unregistered successfully.\r
3337 @retval EFI_INVALID_PARAMETER The Handle is invalid.\r
3338 @retval EFI_NOT_FOUND The incoming notification handle does not exist\r
3339 in current hii database.\r
3340\r
3341**/\r
3342EFI_STATUS\r
3343EFIAPI\r
3344HiiUnregisterPackageNotify (\r
3345 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
3346 IN EFI_HANDLE NotificationHandle\r
3347 )\r
3348{\r
3349 HII_DATABASE_PRIVATE_DATA *Private;\r
3350 HII_DATABASE_NOTIFY *Notify;\r
3351 LIST_ENTRY *Link;\r
3352 EFI_STATUS Status;\r
3353\r
813acf3a 3354 if (This == NULL) {\r
93e3992d 3355 return EFI_INVALID_PARAMETER;\r
3356 }\r
3357\r
813acf3a 3358 if (NotificationHandle == NULL) {\r
3359 return EFI_NOT_FOUND;\r
3360 }\r
3361\r
93e3992d 3362 Status = gBS->OpenProtocol (\r
3363 NotificationHandle,\r
3364 &mHiiDatabaseNotifyGuid,\r
3365 NULL,\r
3366 NULL,\r
3367 NULL,\r
3368 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
3369 );\r
3370 if (EFI_ERROR (Status)) {\r
813acf3a 3371 return EFI_NOT_FOUND;\r
93e3992d 3372 }\r
3373\r
3374 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
3375\r
3376 for (Link = Private->DatabaseNotifyList.ForwardLink; Link != &Private->DatabaseNotifyList; Link = Link->ForwardLink) {\r
3377 Notify = CR (Link, HII_DATABASE_NOTIFY, DatabaseNotifyEntry, HII_DATABASE_NOTIFY_SIGNATURE);\r
3378 if (Notify->NotifyHandle == NotificationHandle) {\r
3379 //\r
3380 // Remove the matching notification node\r
3381 //\r
3382 RemoveEntryList (&Notify->DatabaseNotifyEntry);\r
3383 Status = gBS->UninstallMultipleProtocolInterfaces (\r
3384 Notify->NotifyHandle,\r
3385 &mHiiDatabaseNotifyGuid,\r
3386 NULL,\r
3387 NULL\r
3388 );\r
3389 ASSERT_EFI_ERROR (Status);\r
3390 SafeFreePool (Notify);\r
3391 Notify = NULL;\r
3392\r
3393 return EFI_SUCCESS;\r
3394 }\r
3395 }\r
3396\r
3397 return EFI_NOT_FOUND;\r
3398}\r
3399\r
3400\r
3401/**\r
3402 This routine retrieves an array of GUID values for each keyboard layout that\r
3403 was previously registered in the system.\r
3404\r
3405 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
3406 instance.\r
3407 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard\r
3408 GUID buffer. On output, the length of the handle\r
3409 buffer that is required for the handles found.\r
3410 @param KeyGuidBuffer An array of keyboard layout GUID instances\r
3411 returned.\r
3412\r
3413 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.\r
3414 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates\r
3415 that KeyGuidBuffer is too small to support the\r
3416 number of GUIDs. KeyGuidBufferLength is\r
3417 updated with a value that will enable the data to\r
3418 fit.\r
3419 @retval EFI_INVALID_PARAMETER The KeyGuidBuffer or KeyGuidBufferLength was NULL.\r
3420 @retval EFI_NOT_FOUND There was no keyboard layout.\r
3421\r
3422**/\r
3423EFI_STATUS\r
3424EFIAPI\r
3425HiiFindKeyboardLayouts (\r
3426 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
3427 IN OUT UINT16 *KeyGuidBufferLength,\r
3428 OUT EFI_GUID *KeyGuidBuffer\r
3429 )\r
3430{\r
3431 HII_DATABASE_PRIVATE_DATA *Private;\r
3432 HII_DATABASE_RECORD *Node;\r
3433 HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList;\r
3434 LIST_ENTRY *Link;\r
3435 LIST_ENTRY *Link1;\r
3436 UINT16 ResultSize;\r
3437 UINTN Index;\r
3438 UINT16 LayoutCount;\r
3439 UINT16 LayoutLength;\r
3440 UINT8 *Layout;\r
3441 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE *Package;\r
3442\r
3443 if (This == NULL || KeyGuidBufferLength == NULL) {\r
3444 return EFI_INVALID_PARAMETER;\r
3445 }\r
3446\r
3447 if (*KeyGuidBufferLength > 0 && KeyGuidBuffer == NULL) {\r
3448 return EFI_INVALID_PARAMETER;\r
3449 }\r
3450\r
3451 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
3452 ResultSize = 0;\r
3453\r
3454 //\r
3455 // Search all package lists in whole database to retrieve keyboard layout.\r
3456 //\r
3457 for (Link = Private->DatabaseList.ForwardLink; Link != &Private->DatabaseList; Link = Link->ForwardLink) {\r
3458 Node = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
3459 PackageList = Node->PackageList;\r
3460 for (Link1 = PackageList->KeyboardLayoutHdr.ForwardLink;\r
3461 Link1 != &PackageList->KeyboardLayoutHdr;\r
3462 Link1 = Link1->ForwardLink\r
3463 ) {\r
3464 //\r
3465 // Find out all Keyboard Layout packages in this package list.\r
3466 //\r
3467 Package = CR (\r
3468 Link1,\r
3469 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE,\r
3470 KeyboardEntry,\r
3471 HII_KB_LAYOUT_PACKAGE_SIGNATURE\r
3472 );\r
3473 Layout = (UINT8 *) Package->KeyboardPkg + sizeof (EFI_HII_PACKAGE_HEADER) + sizeof (UINT16);\r
3474 CopyMem (\r
3475 &LayoutCount,\r
3476 (UINT8 *) Package->KeyboardPkg + sizeof (EFI_HII_PACKAGE_HEADER),\r
3477 sizeof (UINT16)\r
3478 );\r
3479 for (Index = 0; Index < LayoutCount; Index++) {\r
3480 ResultSize += sizeof (EFI_GUID);\r
3481 if (ResultSize <= *KeyGuidBufferLength) {\r
813acf3a 3482 CopyMem (KeyGuidBuffer + (ResultSize / sizeof (EFI_GUID) - 1), Layout + sizeof (UINT16), sizeof (EFI_GUID));\r
93e3992d 3483 CopyMem (&LayoutLength, Layout, sizeof (UINT16));\r
3484 Layout = Layout + LayoutLength;\r
3485 }\r
3486 }\r
3487 }\r
3488 }\r
3489\r
3490 if (ResultSize == 0) {\r
3491 return EFI_NOT_FOUND;\r
3492 }\r
3493\r
3494 if (*KeyGuidBufferLength < ResultSize) {\r
3495 *KeyGuidBufferLength = ResultSize;\r
3496 return EFI_BUFFER_TOO_SMALL;\r
3497 }\r
3498\r
3499 *KeyGuidBufferLength = ResultSize;\r
3500 return EFI_SUCCESS;\r
3501}\r
3502\r
3503\r
3504/**\r
3505 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys\r
3506 on a keyboard and the character(s) that are associated with a particular set of key strokes.\r
3507\r
3508 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
3509 instance.\r
3510 @param KeyGuid A pointer to the unique ID associated with a given\r
3511 keyboard layout. If KeyGuid is NULL then the\r
3512 current layout will be retrieved.\r
3513 @param KeyboardLayoutLength On input, a pointer to the length of the\r
3514 KeyboardLayout buffer. On output, the length of\r
3515 the data placed into KeyboardLayout.\r
3516 @param KeyboardLayout A pointer to a buffer containing the retrieved\r
3517 keyboard layout.\r
3518\r
3519 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.\r
3520 @retval EFI_NOT_FOUND The requested keyboard layout was not found.\r
3521 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was\r
3522 NULL.\r
3523 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates\r
3524 that KeyboardLayout is too small to support the\r
3525 requested keyboard layout. KeyboardLayoutLength is\r
3526 updated with a value that will enable the\r
3527 data to fit.\r
3528\r
3529**/\r
3530EFI_STATUS\r
3531EFIAPI\r
3532HiiGetKeyboardLayout (\r
3533 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
3534 IN CONST EFI_GUID *KeyGuid,\r
3535 IN OUT UINT16 *KeyboardLayoutLength,\r
3536 OUT EFI_HII_KEYBOARD_LAYOUT *KeyboardLayout\r
3537 )\r
3538{\r
3539 HII_DATABASE_PRIVATE_DATA *Private;\r
3540 HII_DATABASE_RECORD *Node;\r
3541 HII_DATABASE_PACKAGE_LIST_INSTANCE *PackageList;\r
3542 LIST_ENTRY *Link;\r
3543 LIST_ENTRY *Link1;\r
3544 UINTN Index;\r
3545 UINT8 *Layout;\r
3546 UINT16 LayoutCount;\r
3547 UINT16 LayoutLength;\r
3548 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE *Package;\r
3549\r
3550 if (This == NULL || KeyboardLayoutLength == NULL) {\r
3551 return EFI_INVALID_PARAMETER;\r
3552 }\r
3553 if (*KeyboardLayoutLength > 0 && KeyboardLayout == NULL) {\r
3554 return EFI_INVALID_PARAMETER;\r
3555 }\r
3556\r
3557 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
3558 //\r
3559 // Retrieve the current keyboard layout.\r
3560 //\r
3561 if (KeyGuid == NULL) {\r
3562 if (Private->CurrentLayout == NULL) {\r
3563 return EFI_NOT_FOUND;\r
3564 }\r
3565 CopyMem (&LayoutLength, Private->CurrentLayout, sizeof (UINT16));\r
3566 if (*KeyboardLayoutLength < LayoutLength) {\r
3567 *KeyboardLayoutLength = LayoutLength;\r
3568 return EFI_BUFFER_TOO_SMALL;\r
3569 }\r
3570 CopyMem (KeyboardLayout, Private->CurrentLayout, LayoutLength);\r
3571 return EFI_SUCCESS;\r
3572 }\r
3573\r
3574 for (Link = Private->DatabaseList.ForwardLink; Link != &Private->DatabaseList; Link = Link->ForwardLink) {\r
3575 Node = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
3576 PackageList = (HII_DATABASE_PACKAGE_LIST_INSTANCE *) (Node->PackageList);\r
3577 for (Link1 = PackageList->KeyboardLayoutHdr.ForwardLink;\r
3578 Link1 != &PackageList->KeyboardLayoutHdr;\r
3579 Link1 = Link1->ForwardLink\r
3580 ) {\r
3581 Package = CR (\r
3582 Link1,\r
3583 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE,\r
3584 KeyboardEntry,\r
3585 HII_KB_LAYOUT_PACKAGE_SIGNATURE\r
3586 );\r
3587\r
3588 Layout = (UINT8 *) Package->KeyboardPkg +\r
3589 sizeof (EFI_HII_PACKAGE_HEADER) + sizeof (UINT16);\r
3590 CopyMem (&LayoutCount, Layout - sizeof (UINT16), sizeof (UINT16));\r
3591 for (Index = 0; Index < LayoutCount; Index++) {\r
3592 CopyMem (&LayoutLength, Layout, sizeof (UINT16));\r
3593 if (CompareMem (Layout + sizeof (UINT16), KeyGuid, sizeof (EFI_GUID)) == 0) {\r
3594 if (LayoutLength <= *KeyboardLayoutLength) {\r
3595 CopyMem (KeyboardLayout, Layout, LayoutLength);\r
3596 return EFI_SUCCESS;\r
3597 } else {\r
3598 *KeyboardLayoutLength = LayoutLength;\r
3599 return EFI_BUFFER_TOO_SMALL;\r
3600 }\r
3601 }\r
3602 Layout = Layout + LayoutLength;\r
3603 }\r
3604 }\r
3605 }\r
3606\r
3607 return EFI_NOT_FOUND;\r
3608}\r
3609\r
3610\r
3611/**\r
3612 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine\r
3613 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID\r
3614 group type. This is so that agents which are sensitive to the current keyboard layout being changed\r
3615 can be notified of this change.\r
3616\r
3617 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
3618 instance.\r
3619 @param KeyGuid A pointer to the unique ID associated with a given\r
3620 keyboard layout.\r
3621\r
3622 @retval EFI_SUCCESS The current keyboard layout was successfully set.\r
3623 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so\r
3624 action was taken.\r
3625 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.\r
3626\r
3627**/\r
3628EFI_STATUS\r
3629EFIAPI\r
3630HiiSetKeyboardLayout (\r
3631 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
3632 IN CONST EFI_GUID *KeyGuid\r
3633 )\r
3634{\r
3635 HII_DATABASE_PRIVATE_DATA *Private;\r
3636 EFI_HII_KEYBOARD_LAYOUT *KeyboardLayout;\r
3637 UINT16 KeyboardLayoutLength;\r
3638 EFI_STATUS Status;\r
3639\r
3640 if (This == NULL || KeyGuid == NULL) {\r
3641 return EFI_INVALID_PARAMETER;\r
3642 }\r
3643\r
3644 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
3645\r
3646 //\r
3647 // The specified GUID equals the current keyboard layout GUID,\r
3648 // return directly.\r
3649 //\r
3650 if (CompareGuid (&Private->CurrentLayoutGuid, KeyGuid)) {\r
3651 return EFI_SUCCESS;\r
3652 }\r
3653\r
3654 //\r
3655 // Try to find the incoming keyboard layout data in current database.\r
3656 //\r
3657 KeyboardLayoutLength = 0;\r
3658 KeyboardLayout = NULL;\r
3659 Status = HiiGetKeyboardLayout (This, KeyGuid, &KeyboardLayoutLength, KeyboardLayout);\r
3660 if (Status != EFI_BUFFER_TOO_SMALL) {\r
3661 return Status;\r
3662 }\r
3663\r
3664 KeyboardLayout = (EFI_HII_KEYBOARD_LAYOUT *) AllocateZeroPool (KeyboardLayoutLength);\r
3665 ASSERT (KeyboardLayout != NULL);\r
3666 Status = HiiGetKeyboardLayout (This, KeyGuid, &KeyboardLayoutLength, KeyboardLayout);\r
3667 ASSERT_EFI_ERROR (Status);\r
3668\r
3669 //\r
3670 // Backup current keyboard layout.\r
3671 //\r
3672 CopyMem (&Private->CurrentLayoutGuid, KeyGuid, sizeof (EFI_GUID));\r
3673 SafeFreePool(Private->CurrentLayout);\r
3674 Private->CurrentLayout = KeyboardLayout;\r
3675\r
3676 //\r
3677 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify\r
3678 // current keyboard layout is changed.\r
3679 //\r
3680 Status = gBS->SignalEvent (gHiiKeyboardLayoutChanged);\r
3681 ASSERT_EFI_ERROR (Status);\r
3682\r
3683 return EFI_SUCCESS;\r
3684}\r
3685\r
3686\r
3687/**\r
3688 Return the EFI handle associated with a package list.\r
3689\r
3690 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL\r
3691 instance.\r
3692 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired\r
3693 package list in the HIIdatabase.\r
3694 @param DriverHandle On return, contains the EFI_HANDLE which was\r
3695 registered with the package list in\r
3696 NewPackageList().\r
3697\r
3698 @retval EFI_SUCCESS The DriverHandle was returned successfully.\r
3699 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or\r
3700 DriverHandle was NULL.\r
3701 @retval EFI_NOT_FOUND This PackageList handle can not be found in\r
3702 current database.\r
3703\r
3704**/\r
3705EFI_STATUS\r
3706EFIAPI\r
3707HiiGetPackageListHandle (\r
3708 IN CONST EFI_HII_DATABASE_PROTOCOL *This,\r
3709 IN EFI_HII_HANDLE PackageListHandle,\r
3710 OUT EFI_HANDLE *DriverHandle\r
3711 )\r
3712{\r
3713 HII_DATABASE_PRIVATE_DATA *Private;\r
3714 HII_DATABASE_RECORD *Node;\r
3715 LIST_ENTRY *Link;\r
3716\r
3717 if (This == NULL || DriverHandle == NULL) {\r
3718 return EFI_INVALID_PARAMETER;\r
3719 }\r
3720\r
3721 if (!IsHiiHandleValid (PackageListHandle)) {\r
3722 return EFI_INVALID_PARAMETER;\r
3723 }\r
3724\r
3725 Private = HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This);\r
3726\r
3727 for (Link = Private->DatabaseList.ForwardLink; Link != &Private->DatabaseList; Link = Link->ForwardLink) {\r
3728 Node = CR (Link, HII_DATABASE_RECORD, DatabaseEntry, HII_DATABASE_RECORD_SIGNATURE);\r
3729 if (Node->Handle == PackageListHandle) {\r
3730 *DriverHandle = Node->DriverHandle;\r
3731 return EFI_SUCCESS;\r
3732 }\r
3733 }\r
3734\r
3735 return EFI_NOT_FOUND;\r
3736}\r
3737\r