3 Copyright (c) 2007 - 2008, 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 // Initialize Variables
2329 // Process the package list header
2331 OldPackageListLen
= DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
;
2333 &DatabaseRecord
->PackageList
->PackageListHdr
,
2334 (VOID
*) PackageList
,
2335 sizeof (EFI_HII_PACKAGE_LIST_HEADER
)
2337 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2338 DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
= OldPackageListLen
;
2341 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2342 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2344 Status
= EFI_SUCCESS
;
2346 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2347 switch (PackageHeader
.Type
) {
2348 case EFI_HII_PACKAGE_TYPE_GUID
:
2349 Status
= InsertGuidPackage (
2352 DatabaseRecord
->PackageList
,
2355 if (EFI_ERROR (Status
)) {
2358 Status
= InvokeRegisteredFunction (
2361 (VOID
*) GuidPackage
,
2362 (UINT8
) (PackageHeader
.Type
),
2363 DatabaseRecord
->Handle
2366 case EFI_HII_PACKAGE_FORM
:
2367 Status
= InsertFormPackage (
2370 DatabaseRecord
->PackageList
,
2373 if (EFI_ERROR (Status
)) {
2376 Status
= InvokeRegisteredFunction (
2379 (VOID
*) FormPackage
,
2380 (UINT8
) (PackageHeader
.Type
),
2381 DatabaseRecord
->Handle
2384 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2385 Status
= InsertKeyboardLayoutPackage (
2388 DatabaseRecord
->PackageList
,
2389 &KeyboardLayoutPackage
2391 if (EFI_ERROR (Status
)) {
2394 Status
= InvokeRegisteredFunction (
2397 (VOID
*) KeyboardLayoutPackage
,
2398 (UINT8
) (PackageHeader
.Type
),
2399 DatabaseRecord
->Handle
2402 case EFI_HII_PACKAGE_STRINGS
:
2403 Status
= InsertStringPackage (
2407 DatabaseRecord
->PackageList
,
2410 if (EFI_ERROR (Status
)) {
2413 Status
= InvokeRegisteredFunction (
2416 (VOID
*) StringPackage
,
2417 (UINT8
) (PackageHeader
.Type
),
2418 DatabaseRecord
->Handle
2421 case EFI_HII_PACKAGE_FONTS
:
2422 Status
= InsertFontPackage (
2426 DatabaseRecord
->PackageList
,
2429 if (EFI_ERROR (Status
)) {
2432 Status
= InvokeRegisteredFunction (
2435 (VOID
*) FontPackage
,
2436 (UINT8
) (PackageHeader
.Type
),
2437 DatabaseRecord
->Handle
2440 case EFI_HII_PACKAGE_IMAGES
:
2441 Status
= InsertImagePackage (
2444 DatabaseRecord
->PackageList
,
2447 if (EFI_ERROR (Status
)) {
2450 Status
= InvokeRegisteredFunction (
2453 (VOID
*) ImagePackage
,
2454 (UINT8
) (PackageHeader
.Type
),
2455 DatabaseRecord
->Handle
2458 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2459 Status
= InsertSimpleFontPackage (
2462 DatabaseRecord
->PackageList
,
2465 if (EFI_ERROR (Status
)) {
2468 Status
= InvokeRegisteredFunction (
2471 (VOID
*) SimpleFontPackage
,
2472 (UINT8
) (PackageHeader
.Type
),
2473 DatabaseRecord
->Handle
2476 case EFI_HII_PACKAGE_DEVICE_PATH
:
2477 Status
= AddDevicePathPackage (
2480 (EFI_DEVICE_PATH_PROTOCOL
*) ((UINT8
*) PackageHdrPtr
+ sizeof (EFI_HII_PACKAGE_HEADER
)),
2488 if (EFI_ERROR (Status
)) {
2492 // goto header of next package
2494 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2495 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2503 This function exports a package list to a buffer. It is the worker function
2504 of HiiExportPackageList.
2506 @param Private Hii database private structure.
2507 @param Handle Identification of a package list.
2508 @param PackageList Pointer to a package list which will be exported.
2509 @param UsedSize The length of buffer has been used by exporting
2510 package lists when Handle is NULL.
2511 @param BufferSize Length of the Buffer.
2512 @param Buffer Allocated space for storing exported data.
2514 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2516 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2522 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2523 IN EFI_HII_HANDLE Handle
,
2524 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2525 IN OUT UINTN
*UsedSize
,
2526 IN UINTN BufferSize
,
2527 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
2532 EFI_HII_PACKAGE_HEADER EndofPackageList
;
2534 ASSERT (Private
!= NULL
|| PackageList
!= NULL
|| UsedSize
!= NULL
);
2535 ASSERT (Private
->Signature
== HII_DATABASE_PRIVATE_DATA_SIGNATURE
);
2536 ASSERT (IsHiiHandleValid (Handle
));
2538 if (BufferSize
> 0 && Buffer
== NULL
) {
2539 return EFI_INVALID_PARAMETER
;
2543 // Copy the package list header
2544 // ResultSize indicates the length of the exported bytes of this package list
2546 ResultSize
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
2547 if (ResultSize
+ *UsedSize
<= BufferSize
) {
2548 CopyMem ((VOID
*) Buffer
, PackageList
, ResultSize
);
2551 // Copy the packages and invoke EXPORT_PACK notify functions if exists.
2553 Status
= ExportGuidPackages (
2559 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2562 if (EFI_ERROR (Status
)) {
2565 Status
= ExportFormPackages (
2571 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2574 if (EFI_ERROR (Status
)) {
2577 Status
= ExportKeyboardLayoutPackages (
2583 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2586 if (EFI_ERROR (Status
)) {
2589 Status
= ExportStringPackages (
2595 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2598 if (EFI_ERROR (Status
)) {
2601 Status
= ExportFontPackages (
2607 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2610 if (EFI_ERROR (Status
)) {
2613 Status
= ExportImagePackages (
2619 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2622 if (EFI_ERROR (Status
)) {
2625 Status
= ExportSimpleFontPackages (
2631 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2634 if (EFI_ERROR (Status
)) {
2637 Status
= ExportDevicePathPackage (
2643 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2646 if (EFI_ERROR (Status
)) {
2650 // Append the package list end.
2652 EndofPackageList
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
2653 EndofPackageList
.Type
= EFI_HII_PACKAGE_END
;
2654 if (ResultSize
+ *UsedSize
+ sizeof (EFI_HII_PACKAGE_HEADER
) <= BufferSize
) {
2656 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2657 (VOID
*) &EndofPackageList
,
2658 sizeof (EFI_HII_PACKAGE_HEADER
)
2662 *UsedSize
+= ResultSize
+ sizeof (EFI_HII_PACKAGE_HEADER
);
2669 This function adds the packages in the package list to the database and returns a handle. If there is a
2670 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
2671 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
2673 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2675 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2677 @param DriverHandle Associate the package list with this EFI handle.
2678 @param Handle A pointer to the EFI_HII_HANDLE instance.
2680 @retval EFI_SUCCESS The package list associated with the Handle was
2681 added to the HII database.
2682 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2684 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.
2685 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.
2691 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2692 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2693 IN CONST EFI_HANDLE DriverHandle
,
2694 OUT EFI_HII_HANDLE
*Handle
2698 HII_DATABASE_PRIVATE_DATA
*Private
;
2699 HII_DATABASE_RECORD
*DatabaseRecord
;
2700 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2702 EFI_GUID PackageListGuid
;
2704 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
2705 return EFI_INVALID_PARAMETER
;
2708 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2709 CopyMem (&PackageListGuid
, (VOID
*) PackageList
, sizeof (EFI_GUID
));
2712 // Check the Package list GUID to guarantee this GUID is unique in database.
2714 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2715 DatabaseRecord
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2717 &(DatabaseRecord
->PackageList
->PackageListHdr
.PackageListGuid
),
2721 return EFI_INVALID_PARAMETER
;
2726 // Build a PackageList node
2728 Status
= GenerateHiiDatabaseRecord (Private
, &DatabaseRecord
);
2729 if (EFI_ERROR (Status
)) {
2734 // Fill in information of the created Package List node
2735 // according to incoming package list.
2737 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, PackageList
, DatabaseRecord
);
2738 if (EFI_ERROR (Status
)) {
2742 DatabaseRecord
->DriverHandle
= DriverHandle
;
2745 // Create a Device path package and add into the package list if exists.
2747 Status
= gBS
->HandleProtocol (
2749 &gEfiDevicePathProtocolGuid
,
2750 (VOID
**) &DevicePath
2752 if (!EFI_ERROR (Status
)) {
2753 Status
= AddDevicePathPackage (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, DevicePath
, DatabaseRecord
);
2754 ASSERT_EFI_ERROR (Status
);
2757 *Handle
= DatabaseRecord
->Handle
;
2763 This function removes the package list that is associated with a handle Handle
2764 from the HII database. Before removing the package, any registered functions
2765 with the notification type REMOVE_PACK and the same package type will be called.
2767 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2769 @param Handle The handle that was registered to the data that is
2770 requested for removal.
2772 @retval EFI_SUCCESS The data associated with the Handle was removed
2773 from the HII database.
2774 @retval EFI_NOT_FOUND The specified andle is not in database.
2775 @retval EFI_INVALID_PARAMETER The Handle was not valid.
2780 HiiRemovePackageList (
2781 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2782 IN EFI_HII_HANDLE Handle
2786 HII_DATABASE_PRIVATE_DATA
*Private
;
2788 HII_DATABASE_RECORD
*Node
;
2789 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
2790 HII_HANDLE
*HiiHandle
;
2793 return EFI_INVALID_PARAMETER
;
2796 if (!IsHiiHandleValid (Handle
)) {
2797 return EFI_NOT_FOUND
;
2800 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2803 // Get the packagelist to be removed.
2805 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2806 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2807 if (Node
->Handle
== Handle
) {
2808 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
2809 ASSERT (PackageList
!= NULL
);
2812 // Call registered functions with REMOVE_PACK before removing packages
2813 // then remove them.
2815 Status
= RemoveGuidPackages (Private
, Handle
, PackageList
);
2816 if (EFI_ERROR (Status
)) {
2819 Status
= RemoveFormPackages (Private
, Handle
, PackageList
);
2820 if (EFI_ERROR (Status
)) {
2823 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, PackageList
);
2824 if (EFI_ERROR (Status
)) {
2827 Status
= RemoveStringPackages (Private
, Handle
, PackageList
);
2828 if (EFI_ERROR (Status
)) {
2831 Status
= RemoveFontPackages (Private
, Handle
, PackageList
);
2832 if (EFI_ERROR (Status
)) {
2835 Status
= RemoveImagePackages (Private
, Handle
, PackageList
);
2836 if (EFI_ERROR (Status
)) {
2839 Status
= RemoveSimpleFontPackages (Private
, Handle
, PackageList
);
2840 if (EFI_ERROR (Status
)) {
2843 Status
= RemoveDevicePathPackage (Private
, Handle
, PackageList
);
2844 if (EFI_ERROR (Status
)) {
2849 // Free resources of the package list
2851 RemoveEntryList (&Node
->DatabaseEntry
);
2853 HiiHandle
= (HII_HANDLE
*) Handle
;
2854 RemoveEntryList (&HiiHandle
->Handle
);
2855 Private
->HiiHandleCount
--;
2856 ASSERT (Private
->HiiHandleCount
>= 0);
2858 HiiHandle
->Signature
= 0;
2859 SafeFreePool (HiiHandle
);
2860 SafeFreePool (Node
->PackageList
);
2861 SafeFreePool (Node
);
2867 return EFI_NOT_FOUND
;
2872 This function updates the existing package list (which has the specified Handle)
2873 in the HII databases, using the new package list specified by PackageList.
2875 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2877 @param Handle The handle that was registered to the data that is
2878 requested to be updated.
2879 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2882 @retval EFI_SUCCESS The HII database was successfully updated.
2883 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
2885 @retval EFI_INVALID_PARAMETER PackageList was NULL.
2886 @retval EFI_NOT_FOUND The specified Handle is not in database.
2891 HiiUpdatePackageList (
2892 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2893 IN EFI_HII_HANDLE Handle
,
2894 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
2898 HII_DATABASE_PRIVATE_DATA
*Private
;
2900 HII_DATABASE_RECORD
*Node
;
2901 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2902 HII_DATABASE_PACKAGE_LIST_INSTANCE
*OldPackageList
;
2903 EFI_HII_PACKAGE_HEADER PackageHeader
;
2905 if (This
== NULL
|| PackageList
== NULL
) {
2906 return EFI_INVALID_PARAMETER
;
2909 if (!IsHiiHandleValid (Handle
)) {
2910 return EFI_NOT_FOUND
;
2913 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2915 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2917 Status
= EFI_SUCCESS
;
2920 // Get original packagelist to be updated
2922 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2923 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2924 if (Node
->Handle
== Handle
) {
2925 OldPackageList
= Node
->PackageList
;
2927 // Remove the package if its type matches one of the package types which is
2928 // contained in the new package list.
2930 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2931 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2932 switch (PackageHeader
.Type
) {
2933 case EFI_HII_PACKAGE_TYPE_GUID
:
2934 Status
= RemoveGuidPackages (Private
, Handle
, OldPackageList
);
2936 case EFI_HII_PACKAGE_FORM
:
2937 Status
= RemoveFormPackages (Private
, Handle
, OldPackageList
);
2939 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2940 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, OldPackageList
);
2942 case EFI_HII_PACKAGE_STRINGS
:
2943 Status
= RemoveStringPackages (Private
, Handle
, OldPackageList
);
2945 case EFI_HII_PACKAGE_FONTS
:
2946 Status
= RemoveFontPackages (Private
, Handle
, OldPackageList
);
2948 case EFI_HII_PACKAGE_IMAGES
:
2949 Status
= RemoveImagePackages (Private
, Handle
, OldPackageList
);
2951 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2952 Status
= RemoveSimpleFontPackages (Private
, Handle
, OldPackageList
);
2954 case EFI_HII_PACKAGE_DEVICE_PATH
:
2955 Status
= RemoveDevicePathPackage (Private
, Handle
, OldPackageList
);
2959 if (EFI_ERROR (Status
)) {
2963 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2964 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2968 // Add all of the packages within the new package list
2970 return AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_ADD_PACK
, PackageList
, Node
);
2974 return EFI_NOT_FOUND
;
2979 This function returns a list of the package handles of the specified type
2980 that are currently active in the database. The pseudo-type
2981 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
2983 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2985 @param PackageType Specifies the package type of the packages to list
2986 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
2988 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
2989 this is the pointer to the GUID which must match
2990 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
2991 Otherwise, it must be NULL.
2992 @param HandleBufferLength On input, a pointer to the length of the handle
2993 buffer. On output, the length of the handle
2994 buffer that is required for the handles found.
2995 @param Handle An array of EFI_HII_HANDLE instances returned.
2997 @retval EFI_SUCCESS The matching handles are outputed successfully.
2998 HandleBufferLength is updated with the actual length.
2999 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3000 Handle is too small to support the number of
3001 handles. HandleBufferLength is updated with a
3002 value that will enable the data to fit.
3003 @retval EFI_NOT_FOUND No matching handle could not be found in database.
3004 @retval EFI_INVALID_PARAMETER Handle or HandleBufferLength was NULL.
3006 @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
3007 PackageGuid is not NULL, PackageType is a EFI_HII_
3008 PACKAGE_TYPE_GUID but PackageGuid is NULL.
3013 HiiListPackageLists (
3014 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3015 IN UINT8 PackageType
,
3016 IN CONST EFI_GUID
*PackageGuid
,
3017 IN OUT UINTN
*HandleBufferLength
,
3018 OUT EFI_HII_HANDLE
*Handle
3021 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
3022 HII_DATABASE_PRIVATE_DATA
*Private
;
3023 HII_DATABASE_RECORD
*Node
;
3026 HII_HANDLE
**Result
;
3028 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3032 // Check input parameters
3034 if (This
== NULL
|| HandleBufferLength
== NULL
) {
3035 return EFI_INVALID_PARAMETER
;
3037 if (*HandleBufferLength
> 0 && Handle
== NULL
) {
3038 return EFI_INVALID_PARAMETER
;
3040 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3041 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3042 return EFI_INVALID_PARAMETER
;
3045 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3047 Result
= (HII_HANDLE
**) Handle
;
3050 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3051 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3052 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3053 switch (PackageType
) {
3054 case EFI_HII_PACKAGE_TYPE_GUID
:
3055 for (Link1
= PackageList
->GuidPkgHdr
.ForwardLink
; Link1
!= &PackageList
->GuidPkgHdr
; Link1
= Link1
->ForwardLink
) {
3056 GuidPackage
= CR (Link1
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
3058 (EFI_GUID
*) PackageGuid
,
3059 (EFI_GUID
*) (GuidPackage
->GuidPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
))
3066 case EFI_HII_PACKAGE_FORM
:
3067 if (!IsListEmpty (&PackageList
->FormPkgHdr
)) {
3071 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3072 if (!IsListEmpty (&PackageList
->KeyboardLayoutHdr
)) {
3076 case EFI_HII_PACKAGE_STRINGS
:
3077 if (!IsListEmpty (&PackageList
->StringPkgHdr
)) {
3081 case EFI_HII_PACKAGE_FONTS
:
3082 if (!IsListEmpty (&PackageList
->FontPkgHdr
)) {
3086 case EFI_HII_PACKAGE_IMAGES
:
3087 if (PackageList
->ImagePkg
!= NULL
) {
3091 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3092 if (!IsListEmpty (&PackageList
->SimpleFontPkgHdr
)) {
3096 case EFI_HII_PACKAGE_DEVICE_PATH
:
3097 if (PackageList
->DevicePathPkg
!= NULL
) {
3102 // Pesudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles
3105 case EFI_HII_PACKAGE_TYPE_ALL
:
3113 // This active package list has the specified package type, list it.
3116 ResultSize
+= sizeof (EFI_HII_HANDLE
);
3117 if (ResultSize
<= *HandleBufferLength
) {
3118 *Result
++ = Node
->Handle
;
3124 if (ResultSize
== 0) {
3125 return EFI_NOT_FOUND
;
3128 if (*HandleBufferLength
< ResultSize
) {
3129 *HandleBufferLength
= ResultSize
;
3130 return EFI_BUFFER_TOO_SMALL
;
3133 *HandleBufferLength
= ResultSize
;
3139 This function will export one or all package lists in the database to a buffer.
3140 For each package list exported, this function will call functions registered
3141 with EXPORT_PACK and then copy the package list to the buffer.
3143 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3145 @param Handle An EFI_HII_HANDLE that corresponds to the desired
3146 package list in the HII database to export or NULL
3147 to indicate all package lists should be exported.
3148 @param BufferSize On input, a pointer to the length of the buffer.
3149 On output, the length of the buffer that is
3150 required for the exported data.
3151 @param Buffer A pointer to a buffer that will contain the
3152 results of the export function.
3154 @retval EFI_SUCCESS Package exported.
3155 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3156 Handle is too small to support the number of
3157 handles. HandleBufferLength is updated with a
3158 value that will enable the data to fit.
3159 @retval EFI_NOT_FOUND The specifiecd Handle could not be found in the
3161 @retval EFI_INVALID_PARAMETER Handle or Buffer or BufferSize was NULL.
3166 HiiExportPackageLists (
3167 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3168 IN EFI_HII_HANDLE Handle
,
3169 IN OUT UINTN
*BufferSize
,
3170 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3175 HII_DATABASE_PRIVATE_DATA
*Private
;
3176 HII_DATABASE_RECORD
*Node
;
3179 if (This
== NULL
|| BufferSize
== NULL
|| Handle
== NULL
) {
3180 return EFI_INVALID_PARAMETER
;
3182 if (*BufferSize
> 0 && Buffer
== NULL
) {
3183 return EFI_INVALID_PARAMETER
;
3185 if (!IsHiiHandleValid (Handle
)) {
3186 return EFI_NOT_FOUND
;
3189 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3192 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3193 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3194 if (Handle
== NULL
) {
3196 // Export all package lists in current hii database.
3198 Status
= ExportPackageList (
3201 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3204 (EFI_HII_PACKAGE_LIST_HEADER
*)((UINT8
*) Buffer
+ UsedSize
)
3206 ASSERT_EFI_ERROR (Status
);
3208 else if (Handle
!= NULL
&& Node
->Handle
== Handle
) {
3209 Status
= ExportPackageList (
3212 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3217 ASSERT_EFI_ERROR (Status
);
3218 if (*BufferSize
< UsedSize
) {
3219 *BufferSize
= UsedSize
;
3220 return EFI_BUFFER_TOO_SMALL
;
3226 if (Handle
== NULL
&& UsedSize
!= 0) {
3227 if (*BufferSize
< UsedSize
) {
3228 *BufferSize
= UsedSize
;
3229 return EFI_BUFFER_TOO_SMALL
;
3234 return EFI_NOT_FOUND
;
3239 This function registers a function which will be called when specified actions related to packages of
3240 the specified type occur in the HII database. By registering a function, other HII-related drivers are
3241 notified when specific package types are added, removed or updated in the HII database.
3242 Each driver or application which registers a notification should use
3243 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
3245 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3247 @param PackageType Specifies the package type of the packages to list
3248 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3250 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3251 this is the pointer to the GUID which must match
3253 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
3255 @param PackageNotifyFn Points to the function to be called when the event
3257 NotificationType occurs.
3258 @param NotifyType Describes the types of notification which this
3259 function will be receiving.
3260 @param NotifyHandle Points to the unique handle assigned to the
3261 registered notification. Can be used in
3262 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
3263 to stop notifications.
3265 @retval EFI_SUCCESS Notification registered successfully.
3266 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures
3267 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.
3268 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not
3269 EFI_HII_PACKAGE_TYPE_GUID.
3270 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is
3271 EFI_HII_PACKAGE_TYPE_GUID.
3276 HiiRegisterPackageNotify (
3277 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3278 IN UINT8 PackageType
,
3279 IN CONST EFI_GUID
*PackageGuid
,
3280 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn
,
3281 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
3282 OUT EFI_HANDLE
*NotifyHandle
3285 HII_DATABASE_PRIVATE_DATA
*Private
;
3286 HII_DATABASE_NOTIFY
*Notify
;
3289 if (This
== NULL
|| NotifyHandle
== NULL
) {
3290 return EFI_INVALID_PARAMETER
;
3292 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3293 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3294 return EFI_INVALID_PARAMETER
;
3297 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3300 // Allocate a notification node
3302 Notify
= (HII_DATABASE_NOTIFY
*) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY
));
3303 if (Notify
== NULL
) {
3304 return EFI_OUT_OF_RESOURCES
;
3308 // Generate a notify handle
3310 Status
= gBS
->InstallMultipleProtocolInterfaces (
3311 &Notify
->NotifyHandle
,
3312 &mHiiDatabaseNotifyGuid
,
3316 ASSERT_EFI_ERROR (Status
);
3319 // Fill in the information to the notification node
3321 Notify
->Signature
= HII_DATABASE_NOTIFY_SIGNATURE
;
3322 Notify
->PackageType
= PackageType
;
3323 Notify
->PackageGuid
= (EFI_GUID
*) PackageGuid
;
3324 Notify
->PackageNotifyFn
= (EFI_HII_DATABASE_NOTIFY
) PackageNotifyFn
;
3325 Notify
->NotifyType
= NotifyType
;
3327 InsertTailList (&Private
->DatabaseNotifyList
, &Notify
->DatabaseNotifyEntry
);
3328 *NotifyHandle
= Notify
->NotifyHandle
;
3335 Removes the specified HII database package-related notification.
3337 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3339 @param NotifyHandle The handle of the notification function being
3342 @retval EFI_SUCCESS Notification is unregistered successfully.
3343 @retval EFI_INVALID_PARAMETER The Handle is invalid.
3344 @retval EFI_NOT_FOUND The incoming notification handle does not exist
3345 in current hii database.
3350 HiiUnregisterPackageNotify (
3351 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3352 IN EFI_HANDLE NotificationHandle
3355 HII_DATABASE_PRIVATE_DATA
*Private
;
3356 HII_DATABASE_NOTIFY
*Notify
;
3361 return EFI_INVALID_PARAMETER
;
3364 if (NotificationHandle
== NULL
) {
3365 return EFI_NOT_FOUND
;
3368 Status
= gBS
->OpenProtocol (
3370 &mHiiDatabaseNotifyGuid
,
3374 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
3376 if (EFI_ERROR (Status
)) {
3377 return EFI_NOT_FOUND
;
3380 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3382 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
; Link
!= &Private
->DatabaseNotifyList
; Link
= Link
->ForwardLink
) {
3383 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
3384 if (Notify
->NotifyHandle
== NotificationHandle
) {
3386 // Remove the matching notification node
3388 RemoveEntryList (&Notify
->DatabaseNotifyEntry
);
3389 Status
= gBS
->UninstallMultipleProtocolInterfaces (
3390 Notify
->NotifyHandle
,
3391 &mHiiDatabaseNotifyGuid
,
3395 ASSERT_EFI_ERROR (Status
);
3396 SafeFreePool (Notify
);
3403 return EFI_NOT_FOUND
;
3408 This routine retrieves an array of GUID values for each keyboard layout that
3409 was previously registered in the system.
3411 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3413 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard
3414 GUID buffer. On output, the length of the handle
3415 buffer that is required for the handles found.
3416 @param KeyGuidBuffer An array of keyboard layout GUID instances
3419 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.
3420 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates
3421 that KeyGuidBuffer is too small to support the
3422 number of GUIDs. KeyGuidBufferLength is
3423 updated with a value that will enable the data to
3425 @retval EFI_INVALID_PARAMETER The KeyGuidBuffer or KeyGuidBufferLength was NULL.
3426 @retval EFI_NOT_FOUND There was no keyboard layout.
3431 HiiFindKeyboardLayouts (
3432 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3433 IN OUT UINT16
*KeyGuidBufferLength
,
3434 OUT EFI_GUID
*KeyGuidBuffer
3437 HII_DATABASE_PRIVATE_DATA
*Private
;
3438 HII_DATABASE_RECORD
*Node
;
3439 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3445 UINT16 LayoutLength
;
3447 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3449 if (This
== NULL
|| KeyGuidBufferLength
== NULL
) {
3450 return EFI_INVALID_PARAMETER
;
3453 if (*KeyGuidBufferLength
> 0 && KeyGuidBuffer
== NULL
) {
3454 return EFI_INVALID_PARAMETER
;
3457 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3461 // Search all package lists in whole database to retrieve keyboard layout.
3463 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3464 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3465 PackageList
= Node
->PackageList
;
3466 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3467 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3468 Link1
= Link1
->ForwardLink
3471 // Find out all Keyboard Layout packages in this package list.
3475 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3477 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3479 Layout
= (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3482 (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
3485 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3486 ResultSize
+= sizeof (EFI_GUID
);
3487 if (ResultSize
<= *KeyGuidBufferLength
) {
3488 CopyMem (KeyGuidBuffer
+ (ResultSize
/ sizeof (EFI_GUID
) - 1), Layout
+ sizeof (UINT16
), sizeof (EFI_GUID
));
3489 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3490 Layout
= Layout
+ LayoutLength
;
3496 if (ResultSize
== 0) {
3497 return EFI_NOT_FOUND
;
3500 if (*KeyGuidBufferLength
< ResultSize
) {
3501 *KeyGuidBufferLength
= ResultSize
;
3502 return EFI_BUFFER_TOO_SMALL
;
3505 *KeyGuidBufferLength
= ResultSize
;
3511 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
3512 on a keyboard and the character(s) that are associated with a particular set of key strokes.
3514 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3516 @param KeyGuid A pointer to the unique ID associated with a given
3517 keyboard layout. If KeyGuid is NULL then the
3518 current layout will be retrieved.
3519 @param KeyboardLayoutLength On input, a pointer to the length of the
3520 KeyboardLayout buffer. On output, the length of
3521 the data placed into KeyboardLayout.
3522 @param KeyboardLayout A pointer to a buffer containing the retrieved
3525 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.
3526 @retval EFI_NOT_FOUND The requested keyboard layout was not found.
3527 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was
3529 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates
3530 that KeyboardLayout is too small to support the
3531 requested keyboard layout. KeyboardLayoutLength is
3532 updated with a value that will enable the
3538 HiiGetKeyboardLayout (
3539 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3540 IN CONST EFI_GUID
*KeyGuid
,
3541 IN OUT UINT16
*KeyboardLayoutLength
,
3542 OUT EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
3545 HII_DATABASE_PRIVATE_DATA
*Private
;
3546 HII_DATABASE_RECORD
*Node
;
3547 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3553 UINT16 LayoutLength
;
3554 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3556 if (This
== NULL
|| KeyboardLayoutLength
== NULL
) {
3557 return EFI_INVALID_PARAMETER
;
3559 if (*KeyboardLayoutLength
> 0 && KeyboardLayout
== NULL
) {
3560 return EFI_INVALID_PARAMETER
;
3563 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3565 // Retrieve the current keyboard layout.
3567 if (KeyGuid
== NULL
) {
3568 if (Private
->CurrentLayout
== NULL
) {
3569 return EFI_NOT_FOUND
;
3571 CopyMem (&LayoutLength
, Private
->CurrentLayout
, sizeof (UINT16
));
3572 if (*KeyboardLayoutLength
< LayoutLength
) {
3573 *KeyboardLayoutLength
= LayoutLength
;
3574 return EFI_BUFFER_TOO_SMALL
;
3576 CopyMem (KeyboardLayout
, Private
->CurrentLayout
, LayoutLength
);
3580 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3581 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3582 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3583 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3584 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3585 Link1
= Link1
->ForwardLink
3589 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3591 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3594 Layout
= (UINT8
*) Package
->KeyboardPkg
+
3595 sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3596 CopyMem (&LayoutCount
, Layout
- sizeof (UINT16
), sizeof (UINT16
));
3597 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3598 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3599 if (CompareMem (Layout
+ sizeof (UINT16
), KeyGuid
, sizeof (EFI_GUID
)) == 0) {
3600 if (LayoutLength
<= *KeyboardLayoutLength
) {
3601 CopyMem (KeyboardLayout
, Layout
, LayoutLength
);
3604 *KeyboardLayoutLength
= LayoutLength
;
3605 return EFI_BUFFER_TOO_SMALL
;
3608 Layout
= Layout
+ LayoutLength
;
3613 return EFI_NOT_FOUND
;
3618 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
3619 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
3620 group type. This is so that agents which are sensitive to the current keyboard layout being changed
3621 can be notified of this change.
3623 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3625 @param KeyGuid A pointer to the unique ID associated with a given
3628 @retval EFI_SUCCESS The current keyboard layout was successfully set.
3629 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so
3631 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.
3636 HiiSetKeyboardLayout (
3637 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3638 IN CONST EFI_GUID
*KeyGuid
3641 HII_DATABASE_PRIVATE_DATA
*Private
;
3642 EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
;
3643 UINT16 KeyboardLayoutLength
;
3646 if (This
== NULL
|| KeyGuid
== NULL
) {
3647 return EFI_INVALID_PARAMETER
;
3650 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3653 // The specified GUID equals the current keyboard layout GUID,
3656 if (CompareGuid (&Private
->CurrentLayoutGuid
, KeyGuid
)) {
3661 // Try to find the incoming keyboard layout data in current database.
3663 KeyboardLayoutLength
= 0;
3664 KeyboardLayout
= NULL
;
3665 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3666 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
3670 KeyboardLayout
= (EFI_HII_KEYBOARD_LAYOUT
*) AllocateZeroPool (KeyboardLayoutLength
);
3671 ASSERT (KeyboardLayout
!= NULL
);
3672 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3673 ASSERT_EFI_ERROR (Status
);
3676 // Backup current keyboard layout.
3678 CopyMem (&Private
->CurrentLayoutGuid
, KeyGuid
, sizeof (EFI_GUID
));
3679 SafeFreePool(Private
->CurrentLayout
);
3680 Private
->CurrentLayout
= KeyboardLayout
;
3683 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify
3684 // current keyboard layout is changed.
3686 Status
= gBS
->SignalEvent (gHiiKeyboardLayoutChanged
);
3687 ASSERT_EFI_ERROR (Status
);
3694 Return the EFI handle associated with a package list.
3696 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3698 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired
3699 package list in the HIIdatabase.
3700 @param DriverHandle On return, contains the EFI_HANDLE which was
3701 registered with the package list in
3704 @retval EFI_SUCCESS The DriverHandle was returned successfully.
3705 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or
3706 DriverHandle was NULL.
3707 @retval EFI_NOT_FOUND This PackageList handle can not be found in
3713 HiiGetPackageListHandle (
3714 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3715 IN EFI_HII_HANDLE PackageListHandle
,
3716 OUT EFI_HANDLE
*DriverHandle
3719 HII_DATABASE_PRIVATE_DATA
*Private
;
3720 HII_DATABASE_RECORD
*Node
;
3723 if (This
== NULL
|| DriverHandle
== NULL
) {
3724 return EFI_INVALID_PARAMETER
;
3727 if (!IsHiiHandleValid (PackageListHandle
)) {
3728 return EFI_INVALID_PARAMETER
;
3731 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3733 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3734 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3735 if (Node
->Handle
== PackageListHandle
) {
3736 *DriverHandle
= Node
->DriverHandle
;
3741 return EFI_NOT_FOUND
;