3 Copyright (c) 2007, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 Implementation for EFI_HII_DATABASE_PROTOCOL.
26 #include "HiiDatabase.h"
31 STATIC EFI_GUID mHiiDatabaseNotifyGuid
= HII_DATABASE_NOTIFY_GUID
;
35 This function generates a HII_DATABASE_RECORD node and adds into hii database.
37 @param Private hii database private structure
38 @param DatabaseRecord HII_DATABASE_RECORD node which is used to store a
41 @retval EFI_SUCCESS A database record is generated successfully.
42 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
44 @retval EFI_INVALID_PARAMETER Private is NULL or DatabaseRecord is NULL.
49 GenerateHiiDatabaseRecord (
50 IN HII_DATABASE_PRIVATE_DATA
*Private
,
51 OUT HII_DATABASE_RECORD
**DatabaseNode
54 HII_DATABASE_RECORD
*DatabaseRecord
;
55 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
56 HII_HANDLE
*HiiHandle
;
58 if (Private
== NULL
|| DatabaseNode
== NULL
) {
59 return EFI_INVALID_PARAMETER
;
62 DatabaseRecord
= (HII_DATABASE_RECORD
*) AllocateZeroPool (sizeof (HII_DATABASE_RECORD
));
63 if (DatabaseRecord
== NULL
) {
64 return EFI_OUT_OF_RESOURCES
;
66 DatabaseRecord
->Signature
= HII_DATABASE_RECORD_SIGNATURE
;
68 DatabaseRecord
->PackageList
= AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE
));
69 if (DatabaseRecord
->PackageList
== NULL
) {
70 SafeFreePool (DatabaseRecord
);
71 return EFI_OUT_OF_RESOURCES
;
74 PackageList
= DatabaseRecord
->PackageList
;
76 InitializeListHead (&PackageList
->GuidPkgHdr
);
77 InitializeListHead (&PackageList
->FormPkgHdr
);
78 InitializeListHead (&PackageList
->KeyboardLayoutHdr
);
79 InitializeListHead (&PackageList
->StringPkgHdr
);
80 InitializeListHead (&PackageList
->FontPkgHdr
);
81 InitializeListHead (&PackageList
->SimpleFontPkgHdr
);
82 PackageList
->ImagePkg
= NULL
;
83 PackageList
->DevicePathPkg
= NULL
;
86 // Create a new hii handle
88 HiiHandle
= (HII_HANDLE
*) AllocateZeroPool (sizeof (HII_HANDLE
));
89 if (HiiHandle
== NULL
) {
90 SafeFreePool (DatabaseRecord
->PackageList
);
91 SafeFreePool (DatabaseRecord
);
92 return EFI_OUT_OF_RESOURCES
;
94 HiiHandle
->Signature
= HII_HANDLE_SIGNATURE
;
96 // Backup the number of Hii handles
98 Private
->HiiHandleCount
++;
99 HiiHandle
->Key
= Private
->HiiHandleCount
;
101 // Insert the handle to hii handle list of the whole database.
103 InsertTailList (&Private
->HiiHandleList
, &HiiHandle
->Handle
);
105 DatabaseRecord
->Handle
= (EFI_HII_HANDLE
) HiiHandle
;
108 // Insert the Package List node to Package List link of the whole database.
110 InsertTailList (&Private
->DatabaseList
, &DatabaseRecord
->DatabaseEntry
);
112 *DatabaseNode
= DatabaseRecord
;
120 This function checks whether a handle is a valid EFI_HII_HANDLE
122 @param Handle Pointer to a EFI_HII_HANDLE
125 @retval FALSE Invalid
130 EFI_HII_HANDLE Handle
133 HII_HANDLE
*HiiHandle
;
135 HiiHandle
= (HII_HANDLE
*) Handle
;
137 if (HiiHandle
== NULL
) {
141 if (HiiHandle
->Signature
!= HII_HANDLE_SIGNATURE
) {
150 This function invokes the matching registered function.
152 @param Private HII Database driver private structure.
153 @param NotifyType The type of change concerning the database.
154 @param PackageInstance Points to the package referred to by the
156 @param PackageType Package type
157 @param Handle The handle of the package list which contains the
160 @retval EFI_SUCCESS Already checked all registered function and
162 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
167 InvokeRegisteredFunction (
168 IN HII_DATABASE_PRIVATE_DATA
*Private
,
169 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
170 IN VOID
*PackageInstance
,
171 IN UINT8 PackageType
,
172 IN EFI_HII_HANDLE Handle
175 HII_DATABASE_NOTIFY
*Notify
;
177 EFI_HII_PACKAGE_HEADER
*Package
;
181 UINT32 ImageBlockSize
;
182 UINT32 PaletteInfoSize
;
184 if (Private
== NULL
|| (NotifyType
& 0xF) == 0 || PackageInstance
== NULL
) {
185 return EFI_INVALID_PARAMETER
;
187 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
188 return EFI_INVALID_PARAMETER
;
190 if (!IsHiiHandleValid (Handle
)) {
191 return EFI_INVALID_PARAMETER
;
198 // Convert the incoming package from hii database storage format to UEFI
199 // storage format. e.g. HII_GUID_PACKAGE_INSTANCE to EFI_HII_GUID_PACKAGE_HDR.
201 switch (PackageType
) {
202 case EFI_HII_PACKAGE_TYPE_GUID
:
203 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_GUID_PACKAGE_INSTANCE
*) PackageInstance
)->GuidPkg
);
206 case EFI_HII_PACKAGE_FORM
:
207 BufferSize
= ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
.Length
;
208 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
209 ASSERT (Buffer
!= NULL
);
212 &((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
,
213 sizeof (EFI_HII_PACKAGE_HEADER
)
216 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
217 ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->IfrData
,
218 BufferSize
- sizeof (EFI_HII_PACKAGE_HEADER
)
220 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
223 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
224 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*) PackageInstance
)->KeyboardPkg
);
227 case EFI_HII_PACKAGE_STRINGS
:
228 BufferSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->Header
.Length
;
229 HeaderSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->HdrSize
;
230 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
231 ASSERT (Buffer
!= NULL
);
234 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
,
239 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringBlock
,
240 BufferSize
- HeaderSize
242 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
245 case EFI_HII_PACKAGE_FONTS
:
246 BufferSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->Header
.Length
;
247 HeaderSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->HdrSize
;
248 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
249 ASSERT (Buffer
!= NULL
);
252 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
,
257 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->GlyphBlock
,
258 BufferSize
- HeaderSize
260 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
263 case EFI_HII_PACKAGE_IMAGES
:
264 BufferSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
.Header
.Length
;
265 HeaderSize
= sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
266 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
267 ASSERT (Buffer
!= NULL
);
271 &((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
,
275 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
280 ImageBlockSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlockSize
;
281 if (ImageBlockSize
!= 0) {
284 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlock
,
289 PaletteInfoSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteInfoSize
;
290 if (PaletteInfoSize
!= 0) {
292 Buffer
+ HeaderSize
+ ImageBlockSize
,
293 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteBlock
,
296 HeaderSize
+= ImageBlockSize
;
298 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT32
),
303 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
306 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
307 BufferSize
= ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
->Header
.Length
;
308 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
309 ASSERT (Buffer
!= NULL
);
312 ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
,
315 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
318 case EFI_HII_PACKAGE_DEVICE_PATH
:
319 Package
= (EFI_HII_PACKAGE_HEADER
*) PackageInstance
;
323 return EFI_INVALID_PARAMETER
;
326 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
;
327 Link
!= &Private
->DatabaseNotifyList
;
328 Link
= Link
->ForwardLink
330 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
331 if (Notify
->NotifyType
== NotifyType
&& Notify
->PackageType
== PackageType
) {
333 // Check in case PackageGuid is not NULL when Package is GUID package
335 if (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
) {
336 Notify
->PackageGuid
= NULL
;
339 // Status of Registered Function is unknown so did not check it
341 Notify
->PackageNotifyFn (
351 SafeFreePool (Buffer
);
359 This function insert a GUID package to a package list node.
361 @param PackageHdr Pointer to a buffer stored with GUID package
363 @param NotifyType The type of change concerning the database.
364 @param PackageList Pointer to a package list which will be inserted
366 @param Package Created GUID pacakge
368 @retval EFI_SUCCESS Guid Package is inserted successfully.
369 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
371 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
378 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
379 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
380 OUT HII_GUID_PACKAGE_INSTANCE
**Package
383 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
384 EFI_HII_PACKAGE_HEADER PackageHeader
;
386 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
387 return EFI_INVALID_PARAMETER
;
390 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
393 // Create a GUID package node
395 GuidPackage
= (HII_GUID_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_GUID_PACKAGE_INSTANCE
));
396 if (GuidPackage
== NULL
) {
397 return EFI_OUT_OF_RESOURCES
;
399 GuidPackage
->GuidPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
400 if (GuidPackage
->GuidPkg
== NULL
) {
401 SafeFreePool (GuidPackage
);
402 return EFI_OUT_OF_RESOURCES
;
405 GuidPackage
->Signature
= HII_GUID_PACKAGE_SIGNATURE
;
406 CopyMem (GuidPackage
->GuidPkg
, PackageHdr
, PackageHeader
.Length
);
407 InsertTailList (&PackageList
->GuidPkgHdr
, &GuidPackage
->GuidEntry
);
408 *Package
= GuidPackage
;
410 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
411 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
419 This function exports GUID packages to a buffer.
421 @param Private Hii database private structure.
422 @param Handle Identification of a package list.
423 @param PackageList Pointer to a package list which will be exported.
424 @param UsedSize The length of buffer be used.
425 @param BufferSize Length of the Buffer.
426 @param Buffer Allocated space for storing exported data.
427 @param ResultSize The size of the already exported content of this
430 @retval EFI_SUCCESS Guid Packages are exported successfully.
431 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
437 IN HII_DATABASE_PRIVATE_DATA
*Private
,
438 IN EFI_HII_HANDLE Handle
,
439 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
443 IN OUT UINTN
*ResultSize
446 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
449 EFI_HII_PACKAGE_HEADER PackageHeader
;
452 if (PackageList
== NULL
|| ResultSize
== NULL
) {
453 return EFI_INVALID_PARAMETER
;
456 if (BufferSize
> 0 && Buffer
== NULL
) {
457 return EFI_INVALID_PARAMETER
;
461 Status
= EFI_SUCCESS
;
463 for (Link
= PackageList
->GuidPkgHdr
.ForwardLink
; Link
!= &PackageList
->GuidPkgHdr
; Link
= Link
->ForwardLink
) {
464 GuidPackage
= CR (Link
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
465 CopyMem (&PackageHeader
, GuidPackage
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
466 PackageLength
+= PackageHeader
.Length
;
467 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
468 Status
= InvokeRegisteredFunction (
470 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
471 (VOID
*) GuidPackage
,
472 EFI_HII_PACKAGE_TYPE_GUID
,
475 ASSERT_EFI_ERROR (Status
);
476 CopyMem (Buffer
, GuidPackage
->GuidPkg
, PackageHeader
.Length
);
477 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
481 *ResultSize
+= PackageLength
;
487 This function deletes all GUID packages from a package list node.
489 @param Private Hii database private data.
490 @param Handle Handle of the package list which contains the to
491 be removed GUID packages.
492 @param PackageList Pointer to a package list that contains removing
495 @retval EFI_SUCCESS GUID Package(s) is deleted successfully.
496 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
502 IN HII_DATABASE_PRIVATE_DATA
*Private
,
503 IN EFI_HII_HANDLE Handle
,
504 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
507 LIST_ENTRY
*ListHead
;
508 HII_GUID_PACKAGE_INSTANCE
*Package
;
510 EFI_HII_PACKAGE_HEADER PackageHeader
;
512 ListHead
= &PackageList
->GuidPkgHdr
;
514 while (!IsListEmpty (ListHead
)) {
516 ListHead
->ForwardLink
,
517 HII_GUID_PACKAGE_INSTANCE
,
519 HII_GUID_PACKAGE_SIGNATURE
521 Status
= InvokeRegisteredFunction (
523 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
525 EFI_HII_PACKAGE_TYPE_GUID
,
528 if (EFI_ERROR (Status
)) {
532 RemoveEntryList (&Package
->GuidEntry
);
533 CopyMem (&PackageHeader
, Package
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
534 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
535 SafeFreePool (Package
->GuidPkg
);
536 SafeFreePool (Package
);
544 This function insert a Form package to a package list node.
546 @param PackageHdr Pointer to a buffer stored with Form package
548 @param NotifyType The type of change concerning the database.
549 @param PackageList Pointer to a package list which will be inserted
551 @param Package Created Form package
553 @retval EFI_SUCCESS Form Package is inserted successfully.
554 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
556 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
563 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
564 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
565 OUT HII_IFR_PACKAGE_INSTANCE
**Package
568 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
569 EFI_HII_PACKAGE_HEADER PackageHeader
;
571 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
572 return EFI_INVALID_PARAMETER
;
576 // Get the length of the package, including package header itself
578 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
581 // Create a Form package node
583 FormPackage
= (HII_IFR_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IFR_PACKAGE_INSTANCE
));
584 if (FormPackage
== NULL
) {
585 return EFI_OUT_OF_RESOURCES
;
588 FormPackage
->IfrData
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
));
589 if (FormPackage
->IfrData
== NULL
) {
590 SafeFreePool (FormPackage
);
591 return EFI_OUT_OF_RESOURCES
;
594 FormPackage
->Signature
= HII_IFR_PACKAGE_SIGNATURE
;
596 // Copy Package Header
598 CopyMem (&FormPackage
->FormPkgHdr
, &PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));
604 FormPackage
->IfrData
,
605 (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
),
606 PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
609 InsertTailList (&PackageList
->FormPkgHdr
, &FormPackage
->IfrEntry
);
610 *Package
= FormPackage
;
612 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
613 PackageList
->PackageListHdr
.PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
620 This function exports Form packages to a buffer.
622 @param Private Hii database private structure.
623 @param Handle Identification of a package list.
624 @param PackageList Pointer to a package list which will be exported.
625 @param UsedSize The length of buffer be used.
626 @param BufferSize Length of the Buffer.
627 @param Buffer Allocated space for storing exported data.
628 @param ResultSize The size of the already exported content of this
631 @retval EFI_SUCCESS Form Packages are exported successfully.
632 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
638 IN HII_DATABASE_PRIVATE_DATA
*Private
,
639 IN EFI_HII_HANDLE Handle
,
640 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
644 IN OUT UINTN
*ResultSize
647 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
652 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
653 return EFI_INVALID_PARAMETER
;
656 if (BufferSize
> 0 && Buffer
== NULL
) {
657 return EFI_INVALID_PARAMETER
;
661 Status
= EFI_SUCCESS
;
664 // Export Form packages.
666 for (Link
= PackageList
->FormPkgHdr
.ForwardLink
; Link
!= &PackageList
->FormPkgHdr
; Link
= Link
->ForwardLink
) {
667 FormPackage
= CR (Link
, HII_IFR_PACKAGE_INSTANCE
, IfrEntry
, HII_IFR_PACKAGE_SIGNATURE
);
668 PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
669 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
671 // Invoke registered notification if exists
673 Status
= InvokeRegisteredFunction (
675 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
676 (VOID
*) FormPackage
,
677 EFI_HII_PACKAGE_FORM
,
680 ASSERT_EFI_ERROR (Status
);
682 // Copy the Form package content.
684 CopyMem (Buffer
, (VOID
*) (&FormPackage
->FormPkgHdr
), sizeof (EFI_HII_PACKAGE_HEADER
));
685 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
);
688 (VOID
*) FormPackage
->IfrData
,
689 FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
691 Buffer
= (UINT8
*) Buffer
+ FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
);
695 *ResultSize
+= PackageLength
;
703 This function deletes all Form packages from a package list node.
705 @param Private Hii database private data.
706 @param Handle Handle of the package list which contains the to
707 be removed Form packages.
708 @param PackageList Pointer to a package list that contains removing
711 @retval EFI_SUCCESS Form Package(s) is deleted successfully.
712 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
718 IN HII_DATABASE_PRIVATE_DATA
*Private
,
719 IN EFI_HII_HANDLE Handle
,
720 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
723 LIST_ENTRY
*ListHead
;
724 HII_IFR_PACKAGE_INSTANCE
*Package
;
727 ListHead
= &PackageList
->FormPkgHdr
;
729 while (!IsListEmpty (ListHead
)) {
731 ListHead
->ForwardLink
,
732 HII_IFR_PACKAGE_INSTANCE
,
734 HII_IFR_PACKAGE_SIGNATURE
736 Status
= InvokeRegisteredFunction (
738 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
740 EFI_HII_PACKAGE_FORM
,
743 if (EFI_ERROR (Status
)) {
747 RemoveEntryList (&Package
->IfrEntry
);
748 PackageList
->PackageListHdr
.PackageLength
-= Package
->FormPkgHdr
.Length
;
749 SafeFreePool (Package
->IfrData
);
750 SafeFreePool (Package
);
760 This function insert a String package to a package list node.
762 @param Private Hii database private structure.
763 @param PackageHdr Pointer to a buffer stored with String package
765 @param NotifyType The type of change concerning the database.
766 @param PackageList Pointer to a package list which will be inserted
768 @param Package Created String package
770 @retval EFI_SUCCESS String Package is inserted successfully.
771 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
773 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
774 @retval EFI_UNSUPPORTED A string package with the same language already
775 exists in current package list.
780 InsertStringPackage (
781 IN HII_DATABASE_PRIVATE_DATA
*Private
,
783 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
784 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
785 OUT HII_STRING_PACKAGE_INSTANCE
**Package
789 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
792 EFI_HII_PACKAGE_HEADER PackageHeader
;
797 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
798 return EFI_INVALID_PARAMETER
;
800 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
801 return EFI_INVALID_PARAMETER
;
804 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
805 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
808 // It is illegal to have two string packages with same language within one packagelist
809 // since the stringid will be duplicate if so. Check it to avoid this potential issue.
811 LanguageSize
= HeaderSize
- sizeof (EFI_HII_STRING_PACKAGE_HDR
) + sizeof (CHAR8
);
812 Language
= (CHAR8
*) AllocateZeroPool (LanguageSize
);
813 if (Language
== NULL
) {
814 return EFI_OUT_OF_RESOURCES
;
816 AsciiStrCpy (Language
, (CHAR8
*) PackageHdr
+ HeaderSize
- LanguageSize
);
817 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
818 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
819 if (R8_EfiLibCompareLanguage (Language
, StringPackage
->StringPkgHdr
->Language
)) {
820 SafeFreePool (Language
);
821 return EFI_UNSUPPORTED
;
824 SafeFreePool (Language
);
827 // Create a String package node
829 StringPackage
= (HII_STRING_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_STRING_PACKAGE_INSTANCE
));
830 if (StringPackage
== NULL
) {
831 Status
= EFI_OUT_OF_RESOURCES
;
835 StringPackage
->StringPkgHdr
= (EFI_HII_STRING_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
836 if (StringPackage
->StringPkgHdr
== NULL
) {
837 Status
= EFI_OUT_OF_RESOURCES
;
841 StringPackage
->StringBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
842 if (StringPackage
->StringBlock
== NULL
) {
843 Status
= EFI_OUT_OF_RESOURCES
;
847 StringPackage
->Signature
= HII_STRING_PACKAGE_SIGNATURE
;
848 StringPackage
->FontId
= 0;
849 InitializeListHead (&StringPackage
->FontInfoList
);
852 // Copy the String package header.
854 CopyMem (StringPackage
->StringPkgHdr
, PackageHdr
, HeaderSize
);
857 // Copy the String blocks
860 StringPackage
->StringBlock
,
861 (UINT8
*) PackageHdr
+ HeaderSize
,
862 PackageHeader
.Length
- HeaderSize
866 // Collect all font block info
868 Status
= FindStringBlock (Private
, StringPackage
, (EFI_STRING_ID
) (-1), NULL
, NULL
, NULL
, NULL
);
869 if (EFI_ERROR (Status
)) {
874 // Insert to String package array
876 InsertTailList (&PackageList
->StringPkgHdr
, &StringPackage
->StringEntry
);
877 *Package
= StringPackage
;
879 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
880 PackageList
->PackageListHdr
.PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
887 SafeFreePool (StringPackage
->StringBlock
);
888 SafeFreePool (StringPackage
->StringPkgHdr
);
889 SafeFreePool (StringPackage
);
896 This function exports String packages to a buffer.
898 @param Private Hii database private structure.
899 @param Handle Identification of a package list.
900 @param PackageList Pointer to a package list which will be exported.
901 @param UsedSize The length of buffer be used.
902 @param BufferSize Length of the Buffer.
903 @param Buffer Allocated space for storing exported data.
904 @param ResultSize The size of the already exported content of this
907 @retval EFI_SUCCESS String Packages are exported successfully.
908 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
913 ExportStringPackages (
914 IN HII_DATABASE_PRIVATE_DATA
*Private
,
915 IN EFI_HII_HANDLE Handle
,
916 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
920 IN OUT UINTN
*ResultSize
926 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
928 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
929 return EFI_INVALID_PARAMETER
;
932 if (BufferSize
> 0 && Buffer
== NULL
) {
933 return EFI_INVALID_PARAMETER
;
937 Status
= EFI_SUCCESS
;
939 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
940 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
941 PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
942 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
944 // Invoke registered notification function with EXPORT_PACK notify type
946 Status
= InvokeRegisteredFunction (
948 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
949 (VOID
*) StringPackage
,
950 EFI_HII_PACKAGE_STRINGS
,
953 ASSERT_EFI_ERROR (Status
);
955 // Copy String package header
957 CopyMem (Buffer
, StringPackage
->StringPkgHdr
, StringPackage
->StringPkgHdr
->HdrSize
);
958 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->HdrSize
;
961 // Copy String blocks information
965 StringPackage
->StringBlock
,
966 StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
968 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
972 *ResultSize
+= PackageLength
;
978 This function deletes all String packages from a package list node.
980 @param Private Hii database private data.
981 @param Handle Handle of the package list which contains the to
982 be removed String packages.
983 @param PackageList Pointer to a package list that contains removing
986 @retval EFI_SUCCESS String Package(s) is deleted successfully.
987 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
992 RemoveStringPackages (
993 IN HII_DATABASE_PRIVATE_DATA
*Private
,
994 IN EFI_HII_HANDLE Handle
,
995 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
998 LIST_ENTRY
*ListHead
;
999 HII_STRING_PACKAGE_INSTANCE
*Package
;
1000 HII_FONT_INFO
*FontInfo
;
1003 ListHead
= &PackageList
->StringPkgHdr
;
1005 while (!IsListEmpty (ListHead
)) {
1007 ListHead
->ForwardLink
,
1008 HII_STRING_PACKAGE_INSTANCE
,
1010 HII_STRING_PACKAGE_SIGNATURE
1012 Status
= InvokeRegisteredFunction (
1014 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1016 EFI_HII_PACKAGE_STRINGS
,
1019 if (EFI_ERROR (Status
)) {
1023 RemoveEntryList (&Package
->StringEntry
);
1024 PackageList
->PackageListHdr
.PackageLength
-= Package
->StringPkgHdr
->Header
.Length
;
1025 SafeFreePool (Package
->StringBlock
);
1026 SafeFreePool (Package
->StringPkgHdr
);
1028 // Delete font information
1030 while (!IsListEmpty (&Package
->FontInfoList
)) {
1032 Package
->FontInfoList
.ForwardLink
,
1035 HII_FONT_INFO_SIGNATURE
1037 RemoveEntryList (&FontInfo
->Entry
);
1038 SafeFreePool (FontInfo
);
1041 SafeFreePool (Package
);
1049 This function insert a Font package to a package list node.
1051 @param Private Hii database private structure.
1052 @param PackageHdr Pointer to a buffer stored with Font package
1054 @param NotifyType The type of change concerning the database.
1055 @param PackageList Pointer to a package list which will be inserted
1057 @param Package Created Font package
1059 @retval EFI_SUCCESS Font Package is inserted successfully.
1060 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1062 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1063 @retval EFI_UNSUPPORTED A font package with same EFI_FONT_INFO already
1064 exists in current hii database.
1070 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1071 IN VOID
*PackageHdr
,
1072 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1073 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1074 OUT HII_FONT_PACKAGE_INSTANCE
**Package
1077 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
1078 EFI_HII_FONT_PACKAGE_HDR
*FontPkgHdr
;
1081 EFI_HII_PACKAGE_HEADER PackageHeader
;
1082 EFI_FONT_INFO
*FontInfo
;
1083 UINT32 FontInfoSize
;
1084 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1086 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
1087 return EFI_INVALID_PARAMETER
;
1090 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1091 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
1098 // It is illegal to have two font packages with same EFI_FONT_INFO within hii
1099 // database. EFI_FONT_INFO (FontName, FontSize, FontStyle) describes font's
1100 // attributes and identify a font uniquely.
1102 FontPkgHdr
= (EFI_HII_FONT_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
1103 if (FontPkgHdr
== NULL
) {
1104 Status
= EFI_OUT_OF_RESOURCES
;
1107 CopyMem (FontPkgHdr
, PackageHdr
, HeaderSize
);
1109 FontInfoSize
= sizeof (EFI_FONT_INFO
) + HeaderSize
- sizeof (EFI_HII_FONT_PACKAGE_HDR
);
1110 FontInfo
= (EFI_FONT_INFO
*) AllocateZeroPool (FontInfoSize
);
1111 if (FontInfo
== NULL
) {
1112 Status
= EFI_OUT_OF_RESOURCES
;
1115 FontInfo
->FontStyle
= FontPkgHdr
->FontStyle
;
1116 FontInfo
->FontSize
= FontPkgHdr
->Cell
.Height
;
1117 StrCpy (FontInfo
->FontName
, FontPkgHdr
->FontFamily
);
1119 if (IsFontInfoExisted (Private
, FontInfo
, NULL
, NULL
, NULL
)) {
1120 Status
= EFI_UNSUPPORTED
;
1125 // Create a Font package node
1127 FontPackage
= (HII_FONT_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_FONT_PACKAGE_INSTANCE
));
1128 if (FontPackage
== NULL
) {
1129 Status
= EFI_OUT_OF_RESOURCES
;
1132 FontPackage
->Signature
= HII_FONT_PACKAGE_SIGNATURE
;
1133 FontPackage
->FontPkgHdr
= FontPkgHdr
;
1134 InitializeListHead (&FontPackage
->GlyphInfoList
);
1136 FontPackage
->GlyphBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
1137 if (FontPackage
->GlyphBlock
== NULL
) {
1138 Status
= EFI_OUT_OF_RESOURCES
;
1141 CopyMem (FontPackage
->GlyphBlock
, (UINT8
*) PackageHdr
+ HeaderSize
, PackageHeader
.Length
- HeaderSize
);
1144 // Collect all default character cell information and backup in GlyphInfoList.
1146 Status
= FindGlyphBlock (FontPackage
, (CHAR16
) (-1), NULL
, NULL
, NULL
);
1147 if (EFI_ERROR (Status
)) {
1152 // This font package describes an unique EFI_FONT_INFO. Backup it in global
1155 GlobalFont
= (HII_GLOBAL_FONT_INFO
*) AllocateZeroPool (sizeof (HII_GLOBAL_FONT_INFO
));
1156 if (GlobalFont
== NULL
) {
1157 Status
= EFI_OUT_OF_RESOURCES
;
1160 GlobalFont
->Signature
= HII_GLOBAL_FONT_INFO_SIGNATURE
;
1161 GlobalFont
->FontPackage
= FontPackage
;
1162 GlobalFont
->FontInfoSize
= FontInfoSize
;
1163 GlobalFont
->FontInfo
= FontInfo
;
1164 InsertTailList (&Private
->FontInfoList
, &GlobalFont
->Entry
);
1167 // Insert this font package to Font package array
1169 InsertTailList (&PackageList
->FontPkgHdr
, &FontPackage
->FontEntry
);
1170 *Package
= FontPackage
;
1172 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1173 PackageList
->PackageListHdr
.PackageLength
+= FontPackage
->FontPkgHdr
->Header
.Length
;
1180 SafeFreePool (FontPkgHdr
);
1181 SafeFreePool (FontInfo
);
1182 SafeFreePool (FontPackage
->GlyphBlock
);
1183 SafeFreePool (FontPackage
);
1184 SafeFreePool (GlobalFont
);
1192 This function exports Font packages to a buffer.
1194 @param Private Hii database private structure.
1195 @param Handle Identification of a package list.
1196 @param PackageList Pointer to a package list which will be exported.
1197 @param UsedSize The length of buffer be used.
1198 @param BufferSize Length of the Buffer.
1199 @param Buffer Allocated space for storing exported data.
1200 @param ResultSize The size of the already exported content of this
1203 @retval EFI_SUCCESS Font Packages are exported successfully.
1204 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1209 ExportFontPackages (
1210 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1211 IN EFI_HII_HANDLE Handle
,
1212 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1214 IN UINTN BufferSize
,
1215 IN OUT VOID
*Buffer
,
1216 IN OUT UINTN
*ResultSize
1220 UINTN PackageLength
;
1222 HII_FONT_PACKAGE_INSTANCE
*Package
;
1225 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1226 return EFI_INVALID_PARAMETER
;
1229 if (BufferSize
> 0 && Buffer
== NULL
) {
1230 return EFI_INVALID_PARAMETER
;
1234 Status
= EFI_SUCCESS
;
1236 for (Link
= PackageList
->FontPkgHdr
.ForwardLink
; Link
!= &PackageList
->FontPkgHdr
; Link
= Link
->ForwardLink
) {
1237 Package
= CR (Link
, HII_FONT_PACKAGE_INSTANCE
, FontEntry
, HII_FONT_PACKAGE_SIGNATURE
);
1238 PackageLength
+= Package
->FontPkgHdr
->Header
.Length
;
1239 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1241 // Invoke registered notification function with EXPORT_PACK notify type
1243 Status
= InvokeRegisteredFunction (
1245 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1247 EFI_HII_PACKAGE_FONTS
,
1250 ASSERT_EFI_ERROR (Status
);
1252 // Copy Font package header
1254 CopyMem (Buffer
, Package
->FontPkgHdr
, Package
->FontPkgHdr
->HdrSize
);
1255 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->HdrSize
;
1258 // Copy Glyph blocks information
1262 Package
->GlyphBlock
,
1263 Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
1265 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
;
1269 *ResultSize
+= PackageLength
;
1275 This function deletes all Font packages from a package list node.
1277 @param Private Hii database private data.
1278 @param Handle Handle of the package list which contains the to
1279 be removed Font packages.
1280 @param PackageList Pointer to a package list that contains removing
1283 @retval EFI_SUCCESS Font Package(s) is deleted successfully.
1284 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1289 RemoveFontPackages (
1290 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1291 IN EFI_HII_HANDLE Handle
,
1292 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1295 LIST_ENTRY
*ListHead
;
1296 HII_FONT_PACKAGE_INSTANCE
*Package
;
1298 HII_GLYPH_INFO
*GlyphInfo
;
1300 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1302 ListHead
= &PackageList
->FontPkgHdr
;
1304 while (!IsListEmpty (ListHead
)) {
1306 ListHead
->ForwardLink
,
1307 HII_FONT_PACKAGE_INSTANCE
,
1309 HII_FONT_PACKAGE_SIGNATURE
1311 Status
= InvokeRegisteredFunction (
1313 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1315 EFI_HII_PACKAGE_FONTS
,
1318 if (EFI_ERROR (Status
)) {
1322 RemoveEntryList (&Package
->FontEntry
);
1323 PackageList
->PackageListHdr
.PackageLength
-= Package
->FontPkgHdr
->Header
.Length
;
1324 SafeFreePool (Package
->GlyphBlock
);
1325 SafeFreePool (Package
->FontPkgHdr
);
1327 // Delete default character cell information
1329 while (!IsListEmpty (&Package
->GlyphInfoList
)) {
1331 Package
->GlyphInfoList
.ForwardLink
,
1334 HII_GLYPH_INFO_SIGNATURE
1336 RemoveEntryList (&GlyphInfo
->Entry
);
1337 SafeFreePool (GlyphInfo
);
1341 // Remove corresponding global font info
1343 for (Link
= Private
->FontInfoList
.ForwardLink
; Link
!= &Private
->FontInfoList
; Link
= Link
->ForwardLink
) {
1344 GlobalFont
= CR (Link
, HII_GLOBAL_FONT_INFO
, Entry
, HII_GLOBAL_FONT_INFO_SIGNATURE
);
1345 if (GlobalFont
->FontPackage
== Package
) {
1346 RemoveEntryList (&GlobalFont
->Entry
);
1347 SafeFreePool (GlobalFont
->FontInfo
);
1348 SafeFreePool (GlobalFont
);
1353 SafeFreePool (Package
);
1361 This function insert a Image package to a package list node.
1363 @param PackageHdr Pointer to a buffer stored with Image package
1365 @param NotifyType The type of change concerning the database.
1366 @param PackageList Pointer to a package list which will be inserted
1368 @param Package Created Image package
1370 @retval EFI_SUCCESS Image Package is inserted successfully.
1371 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1373 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1378 InsertImagePackage (
1379 IN VOID
*PackageHdr
,
1380 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1381 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1382 OUT HII_IMAGE_PACKAGE_INSTANCE
**Package
1385 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
1389 EFI_HII_IMAGE_PALETTE_INFO_HEADER
*PaletteHdr
;
1390 EFI_HII_IMAGE_PALETTE_INFO
*PaletteInfo
;
1391 UINT32 PaletteInfoOffset
;
1392 UINT32 ImageInfoOffset
;
1395 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1396 return EFI_INVALID_PARAMETER
;
1400 // Less than one image package is allowed in one package list.
1402 if (PackageList
->ImagePkg
!= NULL
) {
1403 return EFI_INVALID_PARAMETER
;
1407 // Create a Image package node
1409 ImagePackage
= (HII_IMAGE_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE
));
1410 if (ImagePackage
== NULL
) {
1411 return EFI_OUT_OF_RESOURCES
;
1415 // Copy the Image package header.
1417 CopyMem (&ImagePackage
->ImagePkgHdr
, PackageHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1419 PaletteInfoOffset
= ImagePackage
->ImagePkgHdr
.PaletteInfoOffset
;
1420 ImageInfoOffset
= ImagePackage
->ImagePkgHdr
.ImageInfoOffset
;
1423 // If PaletteInfoOffset is zero, there are no palettes in this image package.
1426 ImagePackage
->PaletteBlock
= NULL
;
1427 if (PaletteInfoOffset
!= 0) {
1428 PaletteHdr
= (EFI_HII_IMAGE_PALETTE_INFO_HEADER
*) ((UINT8
*) PackageHdr
+ PaletteInfoOffset
);
1429 PaletteSize
= sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER
);
1430 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteHdr
+ PaletteSize
);
1432 for (Index
= 0; Index
< PaletteHdr
->PaletteCount
; Index
++) {
1433 CopyMem (&CurrentSize
, PaletteInfo
, sizeof (UINT16
));
1434 CurrentSize
+= sizeof (UINT16
);
1435 PaletteSize
+= (UINT32
) CurrentSize
;
1436 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteInfo
+ CurrentSize
);
1439 ImagePackage
->PaletteBlock
= (UINT8
*) AllocateZeroPool (PaletteSize
);
1440 if (ImagePackage
->PaletteBlock
== NULL
) {
1441 SafeFreePool (ImagePackage
);
1442 return EFI_OUT_OF_RESOURCES
;
1445 ImagePackage
->PaletteBlock
,
1446 (UINT8
*) PackageHdr
+ PaletteInfoOffset
,
1452 // If ImageInfoOffset is zero, there are no images in this package.
1455 ImagePackage
->ImageBlock
= NULL
;
1456 if (ImageInfoOffset
!= 0) {
1457 ImageSize
= ImagePackage
->ImagePkgHdr
.Header
.Length
-
1458 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) - PaletteSize
;
1459 ImagePackage
->ImageBlock
= (UINT8
*) AllocateZeroPool (ImageSize
);
1460 if (ImagePackage
->ImageBlock
== NULL
) {
1461 SafeFreePool (ImagePackage
->PaletteBlock
);
1462 SafeFreePool (ImagePackage
);
1463 return EFI_OUT_OF_RESOURCES
;
1466 ImagePackage
->ImageBlock
,
1467 (UINT8
*) PackageHdr
+ ImageInfoOffset
,
1472 ImagePackage
->ImageBlockSize
= ImageSize
;
1473 ImagePackage
->PaletteInfoSize
= PaletteSize
;
1474 PackageList
->ImagePkg
= ImagePackage
;
1475 *Package
= ImagePackage
;
1477 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1478 PackageList
->PackageListHdr
.PackageLength
+= ImagePackage
->ImagePkgHdr
.Header
.Length
;
1486 This function exports Image packages to a buffer.
1488 @param Private Hii database private structure.
1489 @param Handle Identification of a package list.
1490 @param PackageList Pointer to a package list which will be exported.
1491 @param UsedSize The length of buffer be used.
1492 @param BufferSize Length of the Buffer.
1493 @param Buffer Allocated space for storing exported data.
1494 @param ResultSize The size of the already exported content of this
1497 @retval EFI_SUCCESS Image Packages are exported successfully.
1498 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1503 ExportImagePackages (
1504 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1505 IN EFI_HII_HANDLE Handle
,
1506 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1508 IN UINTN BufferSize
,
1509 IN OUT VOID
*Buffer
,
1510 IN OUT UINTN
*ResultSize
1513 UINTN PackageLength
;
1515 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1518 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1519 return EFI_INVALID_PARAMETER
;
1522 if (BufferSize
> 0 && Buffer
== NULL
) {
1523 return EFI_INVALID_PARAMETER
;
1526 Package
= PackageList
->ImagePkg
;
1528 if (Package
== NULL
) {
1532 PackageLength
= Package
->ImagePkgHdr
.Header
.Length
;
1534 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1536 // Invoke registered notification function with EXPORT_PACK notify type
1538 Status
= InvokeRegisteredFunction (
1540 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1542 EFI_HII_PACKAGE_IMAGES
,
1545 ASSERT_EFI_ERROR (Status
);
1546 ASSERT (Package
->ImagePkgHdr
.Header
.Length
==
1547 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) + Package
->ImageBlockSize
+ Package
->PaletteInfoSize
);
1549 // Copy Image package header,
1550 // then justify the offset for image info and palette info in the header.
1552 CopyMem (Buffer
, &Package
->ImagePkgHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1553 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
1556 // Copy Image blocks information
1558 if (Package
->ImageBlockSize
!= 0) {
1559 CopyMem (Buffer
, Package
->ImageBlock
, Package
->ImageBlockSize
);
1560 Buffer
= (UINT8
*) Buffer
+ Package
->ImageBlockSize
;
1563 // Copy Palette information
1565 if (Package
->PaletteInfoSize
!= 0) {
1566 CopyMem (Buffer
, Package
->PaletteBlock
, Package
->PaletteInfoSize
);
1567 Buffer
= (UINT8
*) Buffer
+ Package
->PaletteInfoSize
;
1571 *ResultSize
+= PackageLength
;
1577 This function deletes Image package from a package list node.
1579 @param Private Hii database private data.
1580 @param Handle Handle of the package list which contains the to
1581 be removed Image packages.
1582 @param PackageList Package List which contains the to be removed
1585 @retval EFI_SUCCESS Image Package(s) is deleted successfully.
1586 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1591 RemoveImagePackages (
1592 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1593 IN EFI_HII_HANDLE Handle
,
1594 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1597 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1600 Package
= PackageList
->ImagePkg
;
1603 // Image package does not exist, return directly.
1605 if (Package
== NULL
) {
1609 Status
= InvokeRegisteredFunction (
1611 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1613 EFI_HII_PACKAGE_IMAGES
,
1616 if (EFI_ERROR (Status
)) {
1620 PackageList
->PackageListHdr
.PackageLength
-= Package
->ImagePkgHdr
.Header
.Length
;
1622 SafeFreePool (Package
->ImageBlock
);
1623 SafeFreePool (Package
->PaletteBlock
);
1624 SafeFreePool (Package
);
1626 PackageList
->ImagePkg
= NULL
;
1633 This function insert a Simple Font package to a package list node.
1635 @param PackageHdr Pointer to a buffer stored with Simple Font
1636 package information.
1637 @param NotifyType The type of change concerning the database.
1638 @param PackageList Pointer to a package list which will be inserted
1640 @param Package Created Simple Font package
1642 @retval EFI_SUCCESS Simple Font Package is inserted successfully.
1643 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1644 Simple Font package.
1645 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1650 InsertSimpleFontPackage (
1651 IN VOID
*PackageHdr
,
1652 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1653 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1654 OUT HII_SIMPLE_FONT_PACKAGE_INSTANCE
**Package
1657 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
1659 EFI_HII_PACKAGE_HEADER Header
;
1661 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1662 return EFI_INVALID_PARAMETER
;
1666 // Create a Simple Font package node
1668 SimpleFontPackage
= AllocateZeroPool (sizeof (HII_SIMPLE_FONT_PACKAGE_INSTANCE
));
1669 if (SimpleFontPackage
== NULL
) {
1670 Status
= EFI_OUT_OF_RESOURCES
;
1673 SimpleFontPackage
->Signature
= HII_S_FONT_PACKAGE_SIGNATURE
;
1676 // Copy the Simple Font package.
1678 CopyMem (&Header
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1680 SimpleFontPackage
->SimpleFontPkgHdr
= AllocateZeroPool (Header
.Length
);
1681 if (SimpleFontPackage
->SimpleFontPkgHdr
== NULL
) {
1682 Status
= EFI_OUT_OF_RESOURCES
;
1686 CopyMem (SimpleFontPackage
->SimpleFontPkgHdr
, PackageHdr
, Header
.Length
);
1689 // Insert to Simple Font package array
1691 InsertTailList (&PackageList
->SimpleFontPkgHdr
, &SimpleFontPackage
->SimpleFontEntry
);
1692 *Package
= SimpleFontPackage
;
1694 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1695 PackageList
->PackageListHdr
.PackageLength
+= Header
.Length
;
1702 SafeFreePool (SimpleFontPackage
->SimpleFontPkgHdr
);
1703 SafeFreePool (SimpleFontPackage
);
1709 This function exports SimpleFont packages to a buffer.
1711 @param Private Hii database private structure.
1712 @param Handle Identification of a package list.
1713 @param PackageList Pointer to a package list which will be exported.
1714 @param UsedSize The length of buffer be used.
1715 @param BufferSize Length of the Buffer.
1716 @param Buffer Allocated space for storing exported data.
1717 @param ResultSize The size of the already exported content of this
1720 @retval EFI_SUCCESS SimpleFont Packages are exported successfully.
1721 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1726 ExportSimpleFontPackages (
1727 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1728 IN EFI_HII_HANDLE Handle
,
1729 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1731 IN UINTN BufferSize
,
1732 IN OUT VOID
*Buffer
,
1733 IN OUT UINTN
*ResultSize
1737 UINTN PackageLength
;
1739 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1741 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1742 return EFI_INVALID_PARAMETER
;
1745 if (BufferSize
> 0 && Buffer
== NULL
) {
1746 return EFI_INVALID_PARAMETER
;
1750 Status
= EFI_SUCCESS
;
1752 for (Link
= PackageList
->SimpleFontPkgHdr
.ForwardLink
; Link
!= &PackageList
->SimpleFontPkgHdr
; Link
= Link
->ForwardLink
) {
1753 Package
= CR (Link
, HII_SIMPLE_FONT_PACKAGE_INSTANCE
, SimpleFontEntry
, HII_S_FONT_PACKAGE_SIGNATURE
);
1754 PackageLength
+= Package
->SimpleFontPkgHdr
->Header
.Length
;
1755 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1757 // Invoke registered notification function with EXPORT_PACK notify type
1759 Status
= InvokeRegisteredFunction (
1761 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1763 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1766 ASSERT_EFI_ERROR (Status
);
1769 // Copy SimpleFont package
1771 CopyMem (Buffer
, Package
->SimpleFontPkgHdr
, Package
->SimpleFontPkgHdr
->Header
.Length
);
1772 Buffer
= (UINT8
*) Buffer
+ Package
->SimpleFontPkgHdr
->Header
.Length
;
1776 *ResultSize
+= PackageLength
;
1782 This function deletes all Simple Font packages from a package list node.
1784 @param Private Hii database private data.
1785 @param Handle Handle of the package list which contains the to
1786 be removed Simple Font packages.
1787 @param PackageList Pointer to a package list that contains removing
1790 @retval EFI_SUCCESS Simple Font Package(s) is deleted successfully.
1791 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1796 RemoveSimpleFontPackages (
1797 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1798 IN EFI_HII_HANDLE Handle
,
1799 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1802 LIST_ENTRY
*ListHead
;
1803 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1806 ListHead
= &PackageList
->SimpleFontPkgHdr
;
1808 while (!IsListEmpty (ListHead
)) {
1810 ListHead
->ForwardLink
,
1811 HII_SIMPLE_FONT_PACKAGE_INSTANCE
,
1813 HII_S_FONT_PACKAGE_SIGNATURE
1815 Status
= InvokeRegisteredFunction (
1817 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1819 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1822 if (EFI_ERROR (Status
)) {
1826 RemoveEntryList (&Package
->SimpleFontEntry
);
1827 PackageList
->PackageListHdr
.PackageLength
-= Package
->SimpleFontPkgHdr
->Header
.Length
;
1828 SafeFreePool (Package
->SimpleFontPkgHdr
);
1829 SafeFreePool (Package
);
1837 This function insert a Device path package to a package list node.
1839 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
1841 @param NotifyType The type of change concerning the database.
1842 @param PackageList Pointer to a package list which will be inserted
1845 @retval EFI_SUCCESS Device path Package is inserted successfully.
1846 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1847 Device path package.
1848 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
1853 InsertDevicePathPackage (
1854 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
1855 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1856 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1859 UINT32 PackageLength
;
1860 EFI_HII_PACKAGE_HEADER Header
;
1862 if (DevicePath
== NULL
|| PackageList
== NULL
) {
1863 return EFI_INVALID_PARAMETER
;
1866 // Less than one device path package is allowed in one package list.
1868 if (PackageList
->DevicePathPkg
!= NULL
) {
1869 return EFI_INVALID_PARAMETER
;
1872 PackageLength
= (UINT32
) GetDevicePathSize (DevicePath
) + sizeof (EFI_HII_PACKAGE_HEADER
);
1873 PackageList
->DevicePathPkg
= (UINT8
*) AllocateZeroPool (PackageLength
);
1874 if (PackageList
->DevicePathPkg
== NULL
) {
1875 return EFI_OUT_OF_RESOURCES
;
1878 Header
.Length
= PackageLength
;
1879 Header
.Type
= EFI_HII_PACKAGE_DEVICE_PATH
;
1880 CopyMem (PackageList
->DevicePathPkg
, &Header
, sizeof (EFI_HII_PACKAGE_HEADER
));
1882 PackageList
->DevicePathPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
1884 PackageLength
- sizeof (EFI_HII_PACKAGE_HEADER
)
1888 // Since Device Path package is created by NewPackageList, either NEW_PACK
1889 // or ADD_PACK should increase the length of package list.
1891 PackageList
->PackageListHdr
.PackageLength
+= PackageLength
;
1897 This function exports device path package to a buffer.
1899 @param Private Hii database private structure.
1900 @param Handle Identification of a package list.
1901 @param PackageList Pointer to a package list which will be exported.
1902 @param UsedSize The length of buffer be used.
1903 @param BufferSize Length of the Buffer.
1904 @param Buffer Allocated space for storing exported data.
1905 @param ResultSize The size of the already exported content of this
1908 @retval EFI_SUCCESS Device path Package is exported successfully.
1909 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1914 ExportDevicePathPackage (
1915 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1916 IN EFI_HII_HANDLE Handle
,
1917 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1919 IN UINTN BufferSize
,
1920 IN OUT VOID
*Buffer
,
1921 IN OUT UINTN
*ResultSize
1926 EFI_HII_PACKAGE_HEADER Header
;
1928 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1929 return EFI_INVALID_PARAMETER
;
1931 if (BufferSize
> 0 && Buffer
== NULL
) {
1932 return EFI_INVALID_PARAMETER
;
1935 Package
= PackageList
->DevicePathPkg
;
1937 if (Package
== NULL
) {
1941 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
1943 if (Header
.Length
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1945 // Invoke registered notification function with EXPORT_PACK notify type
1947 Status
= InvokeRegisteredFunction (
1949 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1951 EFI_HII_PACKAGE_DEVICE_PATH
,
1954 ASSERT_EFI_ERROR (Status
);
1957 // Copy Device path package
1959 CopyMem (Buffer
, Package
, Header
.Length
);
1962 *ResultSize
+= Header
.Length
;
1968 This function deletes Device Path package from a package list node.
1970 @param Private Hii database private data.
1971 @param Handle Handle of the package list.
1972 @param PackageList Package List which contains the to be removed
1973 Device Path package.
1975 @retval EFI_SUCCESS Device Path Package is deleted successfully.
1976 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1981 RemoveDevicePathPackage (
1982 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1983 IN EFI_HII_HANDLE Handle
,
1984 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1989 EFI_HII_PACKAGE_HEADER Header
;
1991 Package
= PackageList
->DevicePathPkg
;
1994 // No device path, return directly.
1996 if (Package
== NULL
) {
2000 Status
= InvokeRegisteredFunction (
2002 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2004 EFI_HII_PACKAGE_DEVICE_PATH
,
2007 if (EFI_ERROR (Status
)) {
2011 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2012 PackageList
->PackageListHdr
.PackageLength
-= Header
.Length
;
2014 SafeFreePool (Package
);
2016 PackageList
->DevicePathPkg
= NULL
;
2023 This function will insert a device path package to package list firstly then
2024 invoke notification functions if any.
2026 @param Private Hii database private structure.
2027 @param NotifyType The type of change concerning the database.
2028 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
2030 @param DatabaseRecord Pointer to a database record contains a package
2031 list which will be inserted to.
2033 @retval EFI_SUCCESS Device path Package is inserted successfully.
2034 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2035 Device path package.
2036 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
2041 AddDevicePathPackage (
2042 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2043 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2044 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
2045 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2050 if (DevicePath
== NULL
) {
2054 ASSERT (Private
!= NULL
);
2055 ASSERT (DatabaseRecord
!= NULL
);
2058 // Create a device path package and insert to packagelist
2060 Status
= InsertDevicePathPackage (
2063 DatabaseRecord
->PackageList
2065 if (EFI_ERROR (Status
)) {
2069 return InvokeRegisteredFunction (
2072 (VOID
*) DatabaseRecord
->PackageList
->DevicePathPkg
,
2073 EFI_HII_PACKAGE_DEVICE_PATH
,
2074 DatabaseRecord
->Handle
2080 This function insert a Keyboard Layout package to a package list node.
2082 @param PackageHdr Pointer to a buffer stored with Keyboard Layout
2083 package information.
2084 @param NotifyType The type of change concerning the database.
2085 @param PackageList Pointer to a package list which will be inserted
2087 @param Package Created Keyboard Layout package
2089 @retval EFI_SUCCESS Keyboard Layout Package is inserted successfully.
2090 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2091 Keyboard Layout package.
2092 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
2097 InsertKeyboardLayoutPackage (
2098 IN VOID
*PackageHdr
,
2099 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2100 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2101 OUT HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
**Package
2104 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2105 EFI_HII_PACKAGE_HEADER PackageHeader
;
2108 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2109 return EFI_INVALID_PARAMETER
;
2112 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2115 // Create a Keyboard Layout package node
2117 KeyboardLayoutPackage
= AllocateZeroPool (sizeof (HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
));
2118 if (KeyboardLayoutPackage
== NULL
) {
2119 Status
= EFI_OUT_OF_RESOURCES
;
2122 KeyboardLayoutPackage
->Signature
= HII_KB_LAYOUT_PACKAGE_SIGNATURE
;
2124 KeyboardLayoutPackage
->KeyboardPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
2125 if (KeyboardLayoutPackage
->KeyboardPkg
== NULL
) {
2126 Status
= EFI_OUT_OF_RESOURCES
;
2130 CopyMem (KeyboardLayoutPackage
->KeyboardPkg
, PackageHdr
, PackageHeader
.Length
);
2131 InsertTailList (&PackageList
->KeyboardLayoutHdr
, &KeyboardLayoutPackage
->KeyboardEntry
);
2133 *Package
= KeyboardLayoutPackage
;
2135 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2136 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
2143 SafeFreePool (KeyboardLayoutPackage
->KeyboardPkg
);
2144 SafeFreePool (KeyboardLayoutPackage
);
2151 This function exports Keyboard Layout packages to a buffer.
2153 @param Private Hii database private structure.
2154 @param Handle Identification of a package list.
2155 @param PackageList Pointer to a package list which will be exported.
2156 @param UsedSize The length of buffer be used.
2157 @param BufferSize Length of the Buffer.
2158 @param Buffer Allocated space for storing exported data.
2159 @param ResultSize The size of the already exported content of this
2162 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2164 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2169 ExportKeyboardLayoutPackages (
2170 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2171 IN EFI_HII_HANDLE Handle
,
2172 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2174 IN UINTN BufferSize
,
2175 IN OUT VOID
*Buffer
,
2176 IN OUT UINTN
*ResultSize
2180 UINTN PackageLength
;
2182 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2183 EFI_HII_PACKAGE_HEADER PackageHeader
;
2185 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2186 return EFI_INVALID_PARAMETER
;
2189 if (BufferSize
> 0 && Buffer
== NULL
) {
2190 return EFI_INVALID_PARAMETER
;
2194 Status
= EFI_SUCCESS
;
2196 for (Link
= PackageList
->KeyboardLayoutHdr
.ForwardLink
; Link
!= &PackageList
->KeyboardLayoutHdr
; Link
= Link
->ForwardLink
) {
2197 Package
= CR (Link
, HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
, KeyboardEntry
, HII_KB_LAYOUT_PACKAGE_SIGNATURE
);
2198 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2199 PackageLength
+= PackageHeader
.Length
;
2200 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2202 // Invoke registered notification function with EXPORT_PACK notify type
2204 Status
= InvokeRegisteredFunction (
2206 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2207 (EFI_HII_PACKAGE_HEADER
*) Package
,
2208 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2211 ASSERT_EFI_ERROR (Status
);
2214 // Copy Keyboard Layout package
2216 CopyMem (Buffer
, Package
->KeyboardPkg
, PackageHeader
.Length
);
2217 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
2221 *ResultSize
+= PackageLength
;
2227 This function deletes all Keyboard Layout packages from a package list node.
2229 @param Private Hii database private data.
2230 @param Handle Handle of the package list which contains the to
2231 be removed Keyboard Layout packages.
2232 @param PackageList Pointer to a package list that contains removing
2235 @retval EFI_SUCCESS Keyboard Layout Package(s) is deleted
2237 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2242 RemoveKeyboardLayoutPackages (
2243 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2244 IN EFI_HII_HANDLE Handle
,
2245 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2248 LIST_ENTRY
*ListHead
;
2249 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2250 EFI_HII_PACKAGE_HEADER PackageHeader
;
2253 ListHead
= &PackageList
->KeyboardLayoutHdr
;
2255 while (!IsListEmpty (ListHead
)) {
2257 ListHead
->ForwardLink
,
2258 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
2260 HII_KB_LAYOUT_PACKAGE_SIGNATURE
2262 Status
= InvokeRegisteredFunction (
2264 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2266 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2269 if (EFI_ERROR (Status
)) {
2273 RemoveEntryList (&Package
->KeyboardEntry
);
2274 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2275 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
2276 SafeFreePool (Package
->KeyboardPkg
);
2277 SafeFreePool (Package
);
2285 This function will insert a package list to hii database firstly then
2286 invoke notification functions if any. It is the worker function of
2287 HiiNewPackageList and HiiUpdatePackageList.
2289 @param Private Hii database private structure.
2290 @param NotifyType The type of change concerning the database.
2291 @param PackageList Pointer to a package list.
2292 @param DatabaseRecord Pointer to a database record contains a package
2293 list instance which will be inserted to.
2295 @retval EFI_SUCCESS All incoming packages are inserted to current
2297 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2298 Device path package.
2299 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2305 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2306 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2307 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2308 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2312 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
2313 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
2314 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2315 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
2316 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
2317 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
2318 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
2319 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2320 EFI_HII_PACKAGE_HEADER PackageHeader
;
2321 UINT32 OldPackageListLen
;
2324 // Process the package list header
2326 OldPackageListLen
= DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
;
2328 &DatabaseRecord
->PackageList
->PackageListHdr
,
2329 (VOID
*) PackageList
,
2330 sizeof (EFI_HII_PACKAGE_LIST_HEADER
)
2332 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2333 DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
= OldPackageListLen
;
2336 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2337 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2339 Status
= EFI_SUCCESS
;
2341 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2342 switch (PackageHeader
.Type
) {
2343 case EFI_HII_PACKAGE_TYPE_GUID
:
2344 Status
= InsertGuidPackage (
2347 DatabaseRecord
->PackageList
,
2350 if (EFI_ERROR (Status
)) {
2353 Status
= InvokeRegisteredFunction (
2356 (VOID
*) GuidPackage
,
2357 (UINT8
) (PackageHeader
.Type
),
2358 DatabaseRecord
->Handle
2361 case EFI_HII_PACKAGE_FORM
:
2362 Status
= InsertFormPackage (
2365 DatabaseRecord
->PackageList
,
2368 if (EFI_ERROR (Status
)) {
2371 Status
= InvokeRegisteredFunction (
2374 (VOID
*) FormPackage
,
2375 (UINT8
) (PackageHeader
.Type
),
2376 DatabaseRecord
->Handle
2379 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2380 Status
= InsertKeyboardLayoutPackage (
2383 DatabaseRecord
->PackageList
,
2384 &KeyboardLayoutPackage
2386 if (EFI_ERROR (Status
)) {
2389 Status
= InvokeRegisteredFunction (
2392 (VOID
*) KeyboardLayoutPackage
,
2393 (UINT8
) (PackageHeader
.Type
),
2394 DatabaseRecord
->Handle
2397 case EFI_HII_PACKAGE_STRINGS
:
2398 Status
= InsertStringPackage (
2402 DatabaseRecord
->PackageList
,
2405 if (EFI_ERROR (Status
)) {
2408 Status
= InvokeRegisteredFunction (
2411 (VOID
*) StringPackage
,
2412 (UINT8
) (PackageHeader
.Type
),
2413 DatabaseRecord
->Handle
2416 case EFI_HII_PACKAGE_FONTS
:
2417 Status
= InsertFontPackage (
2421 DatabaseRecord
->PackageList
,
2424 if (EFI_ERROR (Status
)) {
2427 Status
= InvokeRegisteredFunction (
2430 (VOID
*) FontPackage
,
2431 (UINT8
) (PackageHeader
.Type
),
2432 DatabaseRecord
->Handle
2435 case EFI_HII_PACKAGE_IMAGES
:
2436 Status
= InsertImagePackage (
2439 DatabaseRecord
->PackageList
,
2442 if (EFI_ERROR (Status
)) {
2445 Status
= InvokeRegisteredFunction (
2448 (VOID
*) ImagePackage
,
2449 (UINT8
) (PackageHeader
.Type
),
2450 DatabaseRecord
->Handle
2453 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2454 Status
= InsertSimpleFontPackage (
2457 DatabaseRecord
->PackageList
,
2460 if (EFI_ERROR (Status
)) {
2463 Status
= InvokeRegisteredFunction (
2466 (VOID
*) SimpleFontPackage
,
2467 (UINT8
) (PackageHeader
.Type
),
2468 DatabaseRecord
->Handle
2471 case EFI_HII_PACKAGE_DEVICE_PATH
:
2472 Status
= AddDevicePathPackage (
2475 (EFI_DEVICE_PATH_PROTOCOL
*) ((UINT8
*) PackageHdrPtr
+ sizeof (EFI_HII_PACKAGE_HEADER
)),
2483 if (EFI_ERROR (Status
)) {
2487 // goto header of next package
2489 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2490 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2498 This function exports a package list to a buffer. It is the worker function
2499 of HiiExportPackageList.
2501 @param Private Hii database private structure.
2502 @param Handle Identification of a package list.
2503 @param PackageList Pointer to a package list which will be exported.
2504 @param UsedSize The length of buffer has been used by exporting
2505 package lists when Handle is NULL.
2506 @param BufferSize Length of the Buffer.
2507 @param Buffer Allocated space for storing exported data.
2509 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2511 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2517 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2518 IN EFI_HII_HANDLE Handle
,
2519 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2520 IN OUT UINTN
*UsedSize
,
2521 IN UINTN BufferSize
,
2522 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
2527 EFI_HII_PACKAGE_HEADER EndofPackageList
;
2529 ASSERT (Private
!= NULL
|| PackageList
!= NULL
|| UsedSize
!= NULL
);
2530 ASSERT (Private
->Signature
== HII_DATABASE_PRIVATE_DATA_SIGNATURE
);
2531 ASSERT (IsHiiHandleValid (Handle
));
2533 if (BufferSize
> 0 && Buffer
== NULL
) {
2534 return EFI_INVALID_PARAMETER
;
2538 // Copy the package list header
2539 // ResultSize indicates the length of the exported bytes of this package list
2541 ResultSize
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
2542 if (ResultSize
+ *UsedSize
<= BufferSize
) {
2543 CopyMem ((VOID
*) Buffer
, PackageList
, ResultSize
);
2546 // Copy the packages and invoke EXPORT_PACK notify functions if exists.
2548 Status
= ExportGuidPackages (
2554 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2557 if (EFI_ERROR (Status
)) {
2560 Status
= ExportFormPackages (
2566 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2569 if (EFI_ERROR (Status
)) {
2572 Status
= ExportKeyboardLayoutPackages (
2578 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2581 if (EFI_ERROR (Status
)) {
2584 Status
= ExportStringPackages (
2590 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2593 if (EFI_ERROR (Status
)) {
2596 Status
= ExportFontPackages (
2602 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2605 if (EFI_ERROR (Status
)) {
2608 Status
= ExportImagePackages (
2614 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2617 if (EFI_ERROR (Status
)) {
2620 Status
= ExportSimpleFontPackages (
2626 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2629 if (EFI_ERROR (Status
)) {
2632 Status
= ExportDevicePathPackage (
2638 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2641 if (EFI_ERROR (Status
)) {
2645 // Append the package list end.
2647 EndofPackageList
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
2648 EndofPackageList
.Type
= EFI_HII_PACKAGE_END
;
2649 if (ResultSize
+ *UsedSize
+ sizeof (EFI_HII_PACKAGE_HEADER
) <= BufferSize
) {
2651 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2652 (VOID
*) &EndofPackageList
,
2653 sizeof (EFI_HII_PACKAGE_HEADER
)
2657 *UsedSize
+= ResultSize
+ sizeof (EFI_HII_PACKAGE_HEADER
);
2664 This function adds the packages in the package list to the database and returns a handle. If there is a
2665 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
2666 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
2668 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2670 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2672 @param DriverHandle Associate the package list with this EFI handle.
2673 @param Handle A pointer to the EFI_HII_HANDLE instance.
2675 @retval EFI_SUCCESS The package list associated with the Handle was
2676 added to the HII database.
2677 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2679 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.
2680 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.
2686 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2687 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2688 IN CONST EFI_HANDLE DriverHandle
,
2689 OUT EFI_HII_HANDLE
*Handle
2693 HII_DATABASE_PRIVATE_DATA
*Private
;
2694 HII_DATABASE_RECORD
*DatabaseRecord
;
2695 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2697 EFI_GUID PackageListGuid
;
2699 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
2700 return EFI_INVALID_PARAMETER
;
2703 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2704 CopyMem (&PackageListGuid
, (VOID
*) PackageList
, sizeof (EFI_GUID
));
2707 // Check the Package list GUID to guarantee this GUID is unique in database.
2709 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2710 DatabaseRecord
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2712 &(DatabaseRecord
->PackageList
->PackageListHdr
.PackageListGuid
),
2716 return EFI_INVALID_PARAMETER
;
2721 // Build a PackageList node
2723 Status
= GenerateHiiDatabaseRecord (Private
, &DatabaseRecord
);
2724 if (EFI_ERROR (Status
)) {
2729 // Fill in information of the created Package List node
2730 // according to incoming package list.
2732 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, PackageList
, DatabaseRecord
);
2733 if (EFI_ERROR (Status
)) {
2737 DatabaseRecord
->DriverHandle
= DriverHandle
;
2740 // Create a Device path package and add into the package list if exists.
2742 Status
= gBS
->HandleProtocol (
2744 &gEfiDevicePathProtocolGuid
,
2745 (VOID
**) &DevicePath
2747 if (!EFI_ERROR (Status
)) {
2748 Status
= AddDevicePathPackage (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, DevicePath
, DatabaseRecord
);
2749 ASSERT_EFI_ERROR (Status
);
2752 *Handle
= DatabaseRecord
->Handle
;
2758 This function removes the package list that is associated with a handle Handle
2759 from the HII database. Before removing the package, any registered functions
2760 with the notification type REMOVE_PACK and the same package type will be called.
2762 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2764 @param Handle The handle that was registered to the data that is
2765 requested for removal.
2767 @retval EFI_SUCCESS The data associated with the Handle was removed
2768 from the HII database.
2769 @retval EFI_NOT_FOUND The specified PackageList could not be found in
2771 @retval EFI_INVALID_PARAMETER The Handle was not valid.
2776 HiiRemovePackageList (
2777 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2778 IN EFI_HII_HANDLE Handle
2782 HII_DATABASE_PRIVATE_DATA
*Private
;
2784 HII_DATABASE_RECORD
*Node
;
2785 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
2786 HII_HANDLE
*HiiHandle
;
2788 if (This
== NULL
|| !IsHiiHandleValid (Handle
)) {
2789 return EFI_INVALID_PARAMETER
;
2792 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2795 // Get the packagelist to be removed.
2797 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2798 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2799 if (Node
->Handle
== Handle
) {
2800 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
2801 ASSERT (PackageList
!= NULL
);
2804 // Call registered functions with REMOVE_PACK before removing packages
2805 // then remove them.
2807 Status
= RemoveGuidPackages (Private
, Handle
, PackageList
);
2808 if (EFI_ERROR (Status
)) {
2811 Status
= RemoveFormPackages (Private
, Handle
, PackageList
);
2812 if (EFI_ERROR (Status
)) {
2815 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, PackageList
);
2816 if (EFI_ERROR (Status
)) {
2819 Status
= RemoveStringPackages (Private
, Handle
, PackageList
);
2820 if (EFI_ERROR (Status
)) {
2823 Status
= RemoveFontPackages (Private
, Handle
, PackageList
);
2824 if (EFI_ERROR (Status
)) {
2827 Status
= RemoveImagePackages (Private
, Handle
, PackageList
);
2828 if (EFI_ERROR (Status
)) {
2831 Status
= RemoveSimpleFontPackages (Private
, Handle
, PackageList
);
2832 if (EFI_ERROR (Status
)) {
2835 Status
= RemoveDevicePathPackage (Private
, Handle
, PackageList
);
2836 if (EFI_ERROR (Status
)) {
2841 // Free resources of the package list
2843 RemoveEntryList (&Node
->DatabaseEntry
);
2845 HiiHandle
= (HII_HANDLE
*) Handle
;
2846 RemoveEntryList (&HiiHandle
->Handle
);
2847 Private
->HiiHandleCount
--;
2848 ASSERT (Private
->HiiHandleCount
>= 0);
2850 HiiHandle
->Signature
= 0;
2851 SafeFreePool (HiiHandle
);
2852 SafeFreePool (Node
->PackageList
);
2853 SafeFreePool (Node
);
2859 return EFI_NOT_FOUND
;
2864 This function updates the existing package list (which has the specified Handle)
2865 in the HII databases, using the new package list specified by PackageList.
2867 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2869 @param Handle The handle that was registered to the data that is
2870 requested to be updated.
2871 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2874 @retval EFI_SUCCESS The HII database was successfully updated.
2875 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
2877 @retval EFI_INVALID_PARAMETER Handle or PackageList was NULL.
2878 @retval EFI_NOT_FOUND The Handle was not valid or could not be found in
2884 HiiUpdatePackageList (
2885 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2886 IN EFI_HII_HANDLE Handle
,
2887 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
2891 HII_DATABASE_PRIVATE_DATA
*Private
;
2893 HII_DATABASE_RECORD
*Node
;
2894 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2895 HII_DATABASE_PACKAGE_LIST_INSTANCE
*OldPackageList
;
2896 EFI_HII_PACKAGE_HEADER PackageHeader
;
2898 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
2899 return EFI_INVALID_PARAMETER
;
2902 if (!IsHiiHandleValid (Handle
)) {
2903 return EFI_NOT_FOUND
;
2906 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2908 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2910 Status
= EFI_SUCCESS
;
2913 // Get original packagelist to be updated
2915 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2916 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2917 if (Node
->Handle
== Handle
) {
2918 OldPackageList
= Node
->PackageList
;
2920 // Remove the package if its type matches one of the package types which is
2921 // contained in the new package list.
2923 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2924 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2925 switch (PackageHeader
.Type
) {
2926 case EFI_HII_PACKAGE_TYPE_GUID
:
2927 Status
= RemoveGuidPackages (Private
, Handle
, OldPackageList
);
2929 case EFI_HII_PACKAGE_FORM
:
2930 Status
= RemoveFormPackages (Private
, Handle
, OldPackageList
);
2932 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2933 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, OldPackageList
);
2935 case EFI_HII_PACKAGE_STRINGS
:
2936 Status
= RemoveStringPackages (Private
, Handle
, OldPackageList
);
2938 case EFI_HII_PACKAGE_FONTS
:
2939 Status
= RemoveFontPackages (Private
, Handle
, OldPackageList
);
2941 case EFI_HII_PACKAGE_IMAGES
:
2942 Status
= RemoveImagePackages (Private
, Handle
, OldPackageList
);
2944 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2945 Status
= RemoveSimpleFontPackages (Private
, Handle
, OldPackageList
);
2947 case EFI_HII_PACKAGE_DEVICE_PATH
:
2948 Status
= RemoveDevicePathPackage (Private
, Handle
, OldPackageList
);
2952 if (EFI_ERROR (Status
)) {
2956 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2957 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2961 // Add all of the packages within the new package list
2963 return AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_ADD_PACK
, PackageList
, Node
);
2967 return EFI_NOT_FOUND
;
2972 This function returns a list of the package handles of the specified type
2973 that are currently active in the database. The pseudo-type
2974 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
2976 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2978 @param PackageType Specifies the package type of the packages to list
2979 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
2981 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
2982 this is the pointer to the GUID which must match
2983 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
2984 Otherwise, it must be NULL.
2985 @param HandleBufferLength On input, a pointer to the length of the handle
2986 buffer. On output, the length of the handle
2987 buffer that is required for the handles found.
2988 @param Handle An array of EFI_HII_HANDLE instances returned.
2990 @retval EFI_SUCCESS The matching handles are outputed successfully.
2991 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
2992 Handle is too small to support the number of
2993 handles. HandleBufferLength is updated with a
2994 value that will enable the data to fit.
2995 @retval EFI_NOT_FOUND No matching handle could not be found in database.
2996 @retval EFI_INVALID_PARAMETER Handle or HandleBufferLength was NULL.
3001 HiiListPackageLists (
3002 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3003 IN UINT8 PackageType
,
3004 IN CONST EFI_GUID
*PackageGuid
,
3005 IN OUT UINTN
*HandleBufferLength
,
3006 OUT EFI_HII_HANDLE
*Handle
3009 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
3010 HII_DATABASE_PRIVATE_DATA
*Private
;
3011 HII_DATABASE_RECORD
*Node
;
3014 HII_HANDLE
**Result
;
3016 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3020 // Check input parameters
3022 if (This
== NULL
|| HandleBufferLength
== NULL
) {
3023 return EFI_INVALID_PARAMETER
;
3025 if (*HandleBufferLength
> 0 && Handle
== NULL
) {
3026 return EFI_INVALID_PARAMETER
;
3028 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3029 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3030 return EFI_INVALID_PARAMETER
;
3033 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3035 Result
= (HII_HANDLE
**) Handle
;
3038 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3039 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3040 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3041 switch (PackageType
) {
3042 case EFI_HII_PACKAGE_TYPE_GUID
:
3043 for (Link1
= PackageList
->GuidPkgHdr
.ForwardLink
; Link1
!= &PackageList
->GuidPkgHdr
; Link1
= Link1
->ForwardLink
) {
3044 GuidPackage
= CR (Link1
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
3046 (EFI_GUID
*) PackageGuid
,
3047 (EFI_GUID
*) (GuidPackage
->GuidPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
))
3054 case EFI_HII_PACKAGE_FORM
:
3055 if (!IsListEmpty (&PackageList
->FormPkgHdr
)) {
3059 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3060 if (!IsListEmpty (&PackageList
->KeyboardLayoutHdr
)) {
3064 case EFI_HII_PACKAGE_STRINGS
:
3065 if (!IsListEmpty (&PackageList
->StringPkgHdr
)) {
3069 case EFI_HII_PACKAGE_FONTS
:
3070 if (!IsListEmpty (&PackageList
->FontPkgHdr
)) {
3074 case EFI_HII_PACKAGE_IMAGES
:
3075 if (PackageList
->ImagePkg
!= NULL
) {
3079 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3080 if (!IsListEmpty (&PackageList
->SimpleFontPkgHdr
)) {
3084 case EFI_HII_PACKAGE_DEVICE_PATH
:
3085 if (PackageList
->DevicePathPkg
!= NULL
) {
3090 // Pesudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles
3093 case EFI_HII_PACKAGE_TYPE_ALL
:
3101 // This active package list has the specified package type, list it.
3104 ResultSize
+= sizeof (EFI_HII_HANDLE
);
3105 if (ResultSize
<= *HandleBufferLength
) {
3106 *Result
++ = Node
->Handle
;
3112 if (ResultSize
== 0) {
3113 return EFI_NOT_FOUND
;
3116 if (*HandleBufferLength
< ResultSize
) {
3117 *HandleBufferLength
= ResultSize
;
3118 return EFI_BUFFER_TOO_SMALL
;
3121 *HandleBufferLength
= ResultSize
;
3127 This function will export one or all package lists in the database to a buffer.
3128 For each package list exported, this function will call functions registered
3129 with EXPORT_PACK and then copy the package list to the buffer.
3131 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3133 @param Handle An EFI_HII_HANDLE that corresponds to the desired
3134 package list in the HII database to export or NULL
3135 to indicate all package lists should be exported.
3136 @param BufferSize On input, a pointer to the length of the buffer.
3137 On output, the length of the buffer that is
3138 required for the exported data.
3139 @param Buffer A pointer to a buffer that will contain the
3140 results of the export function.
3142 @retval EFI_SUCCESS Package exported.
3143 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3144 Handle is too small to support the number of
3145 handles. HandleBufferLength is updated with a
3146 value that will enable the data to fit.
3147 @retval EFI_NOT_FOUND The specifiecd Handle could not be found in the
3149 @retval EFI_INVALID_PARAMETER Handle or Buffer or BufferSize was NULL.
3154 HiiExportPackageLists (
3155 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3156 IN EFI_HII_HANDLE Handle
,
3157 IN OUT UINTN
*BufferSize
,
3158 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3163 HII_DATABASE_PRIVATE_DATA
*Private
;
3164 HII_DATABASE_RECORD
*Node
;
3167 if (This
== NULL
|| BufferSize
== NULL
|| Handle
== NULL
) {
3168 return EFI_INVALID_PARAMETER
;
3170 if (*BufferSize
> 0 && Buffer
== NULL
) {
3171 return EFI_INVALID_PARAMETER
;
3173 if (!IsHiiHandleValid (Handle
)) {
3174 return EFI_NOT_FOUND
;
3177 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3180 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3181 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3182 if (Handle
== NULL
) {
3184 // Export all package lists in current hii database.
3186 Status
= ExportPackageList (
3189 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3192 (EFI_HII_PACKAGE_LIST_HEADER
*)((UINT8
*) Buffer
+ UsedSize
)
3194 ASSERT_EFI_ERROR (Status
);
3196 else if (Handle
!= NULL
&& Node
->Handle
== Handle
) {
3197 Status
= ExportPackageList (
3200 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3205 ASSERT_EFI_ERROR (Status
);
3206 if (*BufferSize
< UsedSize
) {
3207 *BufferSize
= UsedSize
;
3208 return EFI_BUFFER_TOO_SMALL
;
3214 if (Handle
== NULL
&& UsedSize
!= 0) {
3215 if (*BufferSize
< UsedSize
) {
3216 *BufferSize
= UsedSize
;
3217 return EFI_BUFFER_TOO_SMALL
;
3222 return EFI_NOT_FOUND
;
3227 This function registers a function which will be called when specified actions related to packages of
3228 the specified type occur in the HII database. By registering a function, other HII-related drivers are
3229 notified when specific package types are added, removed or updated in the HII database.
3230 Each driver or application which registers a notification should use
3231 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
3233 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3235 @param PackageType Specifies the package type of the packages to list
3236 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3238 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3239 this is the pointer to the GUID which must match
3241 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
3243 @param PackageNotifyFn Points to the function to be called when the event
3245 NotificationType occurs.
3246 @param NotifyType Describes the types of notification which this
3247 function will be receiving.
3248 @param NotifyHandle Points to the unique handle assigned to the
3249 registered notification. Can be used in
3250 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
3251 to stop notifications.
3253 @retval EFI_SUCCESS Notification registered successfully.
3254 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures
3255 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.
3256 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not
3257 EFI_HII_PACKAGE_TYPE_GUID.
3258 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is
3259 EFI_HII_PACKAGE_TYPE_GUID.
3264 HiiRegisterPackageNotify (
3265 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3266 IN UINT8 PackageType
,
3267 IN CONST EFI_GUID
*PackageGuid
,
3268 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn
,
3269 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
3270 OUT EFI_HANDLE
*NotifyHandle
3273 HII_DATABASE_PRIVATE_DATA
*Private
;
3274 HII_DATABASE_NOTIFY
*Notify
;
3277 if (This
== NULL
|| NotifyHandle
== NULL
) {
3278 return EFI_INVALID_PARAMETER
;
3280 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3281 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3282 return EFI_INVALID_PARAMETER
;
3285 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3288 // Allocate a notification node
3290 Notify
= (HII_DATABASE_NOTIFY
*) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY
));
3291 if (Notify
== NULL
) {
3292 return EFI_OUT_OF_RESOURCES
;
3296 // Generate a notify handle
3298 Status
= gBS
->InstallMultipleProtocolInterfaces (
3299 &Notify
->NotifyHandle
,
3300 &mHiiDatabaseNotifyGuid
,
3304 ASSERT_EFI_ERROR (Status
);
3307 // Fill in the information to the notification node
3309 Notify
->Signature
= HII_DATABASE_NOTIFY_SIGNATURE
;
3310 Notify
->PackageType
= PackageType
;
3311 Notify
->PackageGuid
= (EFI_GUID
*) PackageGuid
;
3312 Notify
->PackageNotifyFn
= (EFI_HII_DATABASE_NOTIFY
) PackageNotifyFn
;
3313 Notify
->NotifyType
= NotifyType
;
3315 InsertTailList (&Private
->DatabaseNotifyList
, &Notify
->DatabaseNotifyEntry
);
3316 *NotifyHandle
= Notify
->NotifyHandle
;
3323 Removes the specified HII database package-related notification.
3325 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3327 @param NotifyHandle The handle of the notification function being
3330 @retval EFI_SUCCESS Notification is unregistered successfully.
3331 @retval EFI_INVALID_PARAMETER The Handle is invalid.
3332 @retval EFI_NOT_FOUND The incoming notification handle does not exist
3333 in current hii database.
3338 HiiUnregisterPackageNotify (
3339 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3340 IN EFI_HANDLE NotificationHandle
3343 HII_DATABASE_PRIVATE_DATA
*Private
;
3344 HII_DATABASE_NOTIFY
*Notify
;
3348 if (This
== NULL
|| NotificationHandle
== NULL
) {
3349 return EFI_INVALID_PARAMETER
;
3352 Status
= gBS
->OpenProtocol (
3354 &mHiiDatabaseNotifyGuid
,
3358 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
3360 if (EFI_ERROR (Status
)) {
3361 return EFI_INVALID_PARAMETER
;
3364 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3366 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
; Link
!= &Private
->DatabaseNotifyList
; Link
= Link
->ForwardLink
) {
3367 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
3368 if (Notify
->NotifyHandle
== NotificationHandle
) {
3370 // Remove the matching notification node
3372 RemoveEntryList (&Notify
->DatabaseNotifyEntry
);
3373 Status
= gBS
->UninstallMultipleProtocolInterfaces (
3374 Notify
->NotifyHandle
,
3375 &mHiiDatabaseNotifyGuid
,
3379 ASSERT_EFI_ERROR (Status
);
3380 SafeFreePool (Notify
);
3387 return EFI_NOT_FOUND
;
3392 This routine retrieves an array of GUID values for each keyboard layout that
3393 was previously registered in the system.
3395 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3397 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard
3398 GUID buffer. On output, the length of the handle
3399 buffer that is required for the handles found.
3400 @param KeyGuidBuffer An array of keyboard layout GUID instances
3403 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.
3404 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates
3405 that KeyGuidBuffer is too small to support the
3406 number of GUIDs. KeyGuidBufferLength is
3407 updated with a value that will enable the data to
3409 @retval EFI_INVALID_PARAMETER The KeyGuidBuffer or KeyGuidBufferLength was NULL.
3410 @retval EFI_NOT_FOUND There was no keyboard layout.
3415 HiiFindKeyboardLayouts (
3416 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3417 IN OUT UINT16
*KeyGuidBufferLength
,
3418 OUT EFI_GUID
*KeyGuidBuffer
3421 HII_DATABASE_PRIVATE_DATA
*Private
;
3422 HII_DATABASE_RECORD
*Node
;
3423 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3429 UINT16 LayoutLength
;
3431 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3433 if (This
== NULL
|| KeyGuidBufferLength
== NULL
) {
3434 return EFI_INVALID_PARAMETER
;
3437 if (*KeyGuidBufferLength
> 0 && KeyGuidBuffer
== NULL
) {
3438 return EFI_INVALID_PARAMETER
;
3441 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3445 // Search all package lists in whole database to retrieve keyboard layout.
3447 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3448 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3449 PackageList
= Node
->PackageList
;
3450 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3451 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3452 Link1
= Link1
->ForwardLink
3455 // Find out all Keyboard Layout packages in this package list.
3459 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3461 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3463 Layout
= (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3466 (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
3469 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3470 ResultSize
+= sizeof (EFI_GUID
);
3471 if (ResultSize
<= *KeyGuidBufferLength
) {
3472 CopyMem (KeyGuidBuffer
+ Index
, Layout
+ sizeof (UINT16
), sizeof (EFI_GUID
));
3473 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3474 Layout
= Layout
+ LayoutLength
;
3480 if (ResultSize
== 0) {
3481 return EFI_NOT_FOUND
;
3484 if (*KeyGuidBufferLength
< ResultSize
) {
3485 *KeyGuidBufferLength
= ResultSize
;
3486 return EFI_BUFFER_TOO_SMALL
;
3489 *KeyGuidBufferLength
= ResultSize
;
3495 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
3496 on a keyboard and the character(s) that are associated with a particular set of key strokes.
3498 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3500 @param KeyGuid A pointer to the unique ID associated with a given
3501 keyboard layout. If KeyGuid is NULL then the
3502 current layout will be retrieved.
3503 @param KeyboardLayoutLength On input, a pointer to the length of the
3504 KeyboardLayout buffer. On output, the length of
3505 the data placed into KeyboardLayout.
3506 @param KeyboardLayout A pointer to a buffer containing the retrieved
3509 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.
3510 @retval EFI_NOT_FOUND The requested keyboard layout was not found.
3511 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was
3513 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates
3514 that KeyboardLayout is too small to support the
3515 requested keyboard layout. KeyboardLayoutLength is
3516 updated with a value that will enable the
3522 HiiGetKeyboardLayout (
3523 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3524 IN CONST EFI_GUID
*KeyGuid
,
3525 IN OUT UINT16
*KeyboardLayoutLength
,
3526 OUT EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
3529 HII_DATABASE_PRIVATE_DATA
*Private
;
3530 HII_DATABASE_RECORD
*Node
;
3531 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3537 UINT16 LayoutLength
;
3538 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3540 if (This
== NULL
|| KeyboardLayoutLength
== NULL
) {
3541 return EFI_INVALID_PARAMETER
;
3543 if (*KeyboardLayoutLength
> 0 && KeyboardLayout
== NULL
) {
3544 return EFI_INVALID_PARAMETER
;
3547 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3549 // Retrieve the current keyboard layout.
3551 if (KeyGuid
== NULL
) {
3552 if (Private
->CurrentLayout
== NULL
) {
3553 return EFI_NOT_FOUND
;
3555 CopyMem (&LayoutLength
, Private
->CurrentLayout
, sizeof (UINT16
));
3556 if (*KeyboardLayoutLength
< LayoutLength
) {
3557 *KeyboardLayoutLength
= LayoutLength
;
3558 return EFI_BUFFER_TOO_SMALL
;
3560 CopyMem (KeyboardLayout
, Private
->CurrentLayout
, LayoutLength
);
3564 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3565 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3566 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3567 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3568 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3569 Link1
= Link1
->ForwardLink
3573 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3575 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3578 Layout
= (UINT8
*) Package
->KeyboardPkg
+
3579 sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3580 CopyMem (&LayoutCount
, Layout
- sizeof (UINT16
), sizeof (UINT16
));
3581 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3582 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3583 if (CompareMem (Layout
+ sizeof (UINT16
), KeyGuid
, sizeof (EFI_GUID
)) == 0) {
3584 if (LayoutLength
<= *KeyboardLayoutLength
) {
3585 CopyMem (KeyboardLayout
, Layout
, LayoutLength
);
3588 *KeyboardLayoutLength
= LayoutLength
;
3589 return EFI_BUFFER_TOO_SMALL
;
3592 Layout
= Layout
+ LayoutLength
;
3597 return EFI_NOT_FOUND
;
3602 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
3603 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
3604 group type. This is so that agents which are sensitive to the current keyboard layout being changed
3605 can be notified of this change.
3607 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3609 @param KeyGuid A pointer to the unique ID associated with a given
3612 @retval EFI_SUCCESS The current keyboard layout was successfully set.
3613 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so
3615 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.
3620 HiiSetKeyboardLayout (
3621 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3622 IN CONST EFI_GUID
*KeyGuid
3625 HII_DATABASE_PRIVATE_DATA
*Private
;
3626 EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
;
3627 UINT16 KeyboardLayoutLength
;
3630 if (This
== NULL
|| KeyGuid
== NULL
) {
3631 return EFI_INVALID_PARAMETER
;
3634 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3637 // The specified GUID equals the current keyboard layout GUID,
3640 if (CompareGuid (&Private
->CurrentLayoutGuid
, KeyGuid
)) {
3645 // Try to find the incoming keyboard layout data in current database.
3647 KeyboardLayoutLength
= 0;
3648 KeyboardLayout
= NULL
;
3649 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3650 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
3654 KeyboardLayout
= (EFI_HII_KEYBOARD_LAYOUT
*) AllocateZeroPool (KeyboardLayoutLength
);
3655 ASSERT (KeyboardLayout
!= NULL
);
3656 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3657 ASSERT_EFI_ERROR (Status
);
3660 // Backup current keyboard layout.
3662 CopyMem (&Private
->CurrentLayoutGuid
, KeyGuid
, sizeof (EFI_GUID
));
3663 SafeFreePool(Private
->CurrentLayout
);
3664 Private
->CurrentLayout
= KeyboardLayout
;
3667 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify
3668 // current keyboard layout is changed.
3670 Status
= gBS
->SignalEvent (gHiiKeyboardLayoutChanged
);
3671 ASSERT_EFI_ERROR (Status
);
3678 Return the EFI handle associated with a package list.
3680 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3682 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired
3683 package list in the HIIdatabase.
3684 @param DriverHandle On return, contains the EFI_HANDLE which was
3685 registered with the package list in
3688 @retval EFI_SUCCESS The DriverHandle was returned successfully.
3689 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or
3690 DriverHandle was NULL.
3691 @retval EFI_NOT_FOUND This PackageList handle can not be found in
3697 HiiGetPackageListHandle (
3698 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3699 IN EFI_HII_HANDLE PackageListHandle
,
3700 OUT EFI_HANDLE
*DriverHandle
3703 HII_DATABASE_PRIVATE_DATA
*Private
;
3704 HII_DATABASE_RECORD
*Node
;
3707 if (This
== NULL
|| DriverHandle
== NULL
) {
3708 return EFI_INVALID_PARAMETER
;
3711 if (!IsHiiHandleValid (PackageListHandle
)) {
3712 return EFI_INVALID_PARAMETER
;
3715 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3717 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3718 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3719 if (Node
->Handle
== PackageListHandle
) {
3720 *DriverHandle
= Node
->DriverHandle
;
3725 return EFI_NOT_FOUND
;