2 Implementation for EFI_HII_DATABASE_PROTOCOL.
5 Copyright (c) 2007 - 2008, Intel Corporation
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
17 #include "HiiDatabase.h"
22 STATIC EFI_GUID mHiiDatabaseNotifyGuid
= HII_DATABASE_NOTIFY_GUID
;
26 This function generates a HII_DATABASE_RECORD node and adds into hii database.
27 This is a internal function.
29 @param Private hii database private structure
30 @param DatabaseNode HII_DATABASE_RECORD node which is used to store a
33 @retval EFI_SUCCESS A database record is generated successfully.
34 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
36 @retval EFI_INVALID_PARAMETER Private is NULL or DatabaseRecord is NULL.
40 GenerateHiiDatabaseRecord (
41 IN HII_DATABASE_PRIVATE_DATA
*Private
,
42 OUT HII_DATABASE_RECORD
**DatabaseNode
45 HII_DATABASE_RECORD
*DatabaseRecord
;
46 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
47 HII_HANDLE
*HiiHandle
;
49 if (Private
== NULL
|| DatabaseNode
== NULL
) {
50 return EFI_INVALID_PARAMETER
;
53 DatabaseRecord
= (HII_DATABASE_RECORD
*) AllocateZeroPool (sizeof (HII_DATABASE_RECORD
));
54 if (DatabaseRecord
== NULL
) {
55 return EFI_OUT_OF_RESOURCES
;
57 DatabaseRecord
->Signature
= HII_DATABASE_RECORD_SIGNATURE
;
59 DatabaseRecord
->PackageList
= AllocateZeroPool (sizeof (HII_DATABASE_PACKAGE_LIST_INSTANCE
));
60 if (DatabaseRecord
->PackageList
== NULL
) {
61 SafeFreePool (DatabaseRecord
);
62 return EFI_OUT_OF_RESOURCES
;
65 PackageList
= DatabaseRecord
->PackageList
;
67 InitializeListHead (&PackageList
->GuidPkgHdr
);
68 InitializeListHead (&PackageList
->FormPkgHdr
);
69 InitializeListHead (&PackageList
->KeyboardLayoutHdr
);
70 InitializeListHead (&PackageList
->StringPkgHdr
);
71 InitializeListHead (&PackageList
->FontPkgHdr
);
72 InitializeListHead (&PackageList
->SimpleFontPkgHdr
);
73 PackageList
->ImagePkg
= NULL
;
74 PackageList
->DevicePathPkg
= NULL
;
77 // Create a new hii handle
79 HiiHandle
= (HII_HANDLE
*) AllocateZeroPool (sizeof (HII_HANDLE
));
80 if (HiiHandle
== NULL
) {
81 SafeFreePool (DatabaseRecord
->PackageList
);
82 SafeFreePool (DatabaseRecord
);
83 return EFI_OUT_OF_RESOURCES
;
85 HiiHandle
->Signature
= HII_HANDLE_SIGNATURE
;
87 // Backup the number of Hii handles
89 Private
->HiiHandleCount
++;
90 HiiHandle
->Key
= Private
->HiiHandleCount
;
92 // Insert the handle to hii handle list of the whole database.
94 InsertTailList (&Private
->HiiHandleList
, &HiiHandle
->Handle
);
96 DatabaseRecord
->Handle
= (EFI_HII_HANDLE
) HiiHandle
;
99 // Insert the Package List node to Package List link of the whole database.
101 InsertTailList (&Private
->DatabaseList
, &DatabaseRecord
->DatabaseEntry
);
103 *DatabaseNode
= DatabaseRecord
;
111 This function checks whether a handle is a valid EFI_HII_HANDLE
112 This is a internal function.
114 @param Handle Pointer to a EFI_HII_HANDLE
117 @retval FALSE Invalid
122 EFI_HII_HANDLE Handle
125 HII_HANDLE
*HiiHandle
;
127 HiiHandle
= (HII_HANDLE
*) Handle
;
129 if (HiiHandle
== NULL
) {
133 if (HiiHandle
->Signature
!= HII_HANDLE_SIGNATURE
) {
142 This function invokes the matching registered function.
143 This is a internal function.
145 @param Private HII Database driver private structure.
146 @param NotifyType The type of change concerning the database.
147 @param PackageInstance Points to the package referred to by the
149 @param PackageType Package type
150 @param Handle The handle of the package list which contains the
153 @retval EFI_SUCCESS Already checked all registered function and
155 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
159 InvokeRegisteredFunction (
160 IN HII_DATABASE_PRIVATE_DATA
*Private
,
161 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
162 IN VOID
*PackageInstance
,
163 IN UINT8 PackageType
,
164 IN EFI_HII_HANDLE Handle
167 HII_DATABASE_NOTIFY
*Notify
;
169 EFI_HII_PACKAGE_HEADER
*Package
;
173 UINT32 ImageBlockSize
;
174 UINT32 PaletteInfoSize
;
176 if (Private
== NULL
|| (NotifyType
& 0xF) == 0 || PackageInstance
== NULL
) {
177 return EFI_INVALID_PARAMETER
;
179 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
180 return EFI_INVALID_PARAMETER
;
182 if (!IsHiiHandleValid (Handle
)) {
183 return EFI_INVALID_PARAMETER
;
190 // Convert the incoming package from hii database storage format to UEFI
191 // storage format. e.g. HII_GUID_PACKAGE_INSTANCE to EFI_HII_GUID_PACKAGE_HDR.
193 switch (PackageType
) {
194 case EFI_HII_PACKAGE_TYPE_GUID
:
195 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_GUID_PACKAGE_INSTANCE
*) PackageInstance
)->GuidPkg
);
198 case EFI_HII_PACKAGE_FORM
:
199 BufferSize
= ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
.Length
;
200 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
201 ASSERT (Buffer
!= NULL
);
204 &((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->FormPkgHdr
,
205 sizeof (EFI_HII_PACKAGE_HEADER
)
208 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
209 ((HII_IFR_PACKAGE_INSTANCE
*) PackageInstance
)->IfrData
,
210 BufferSize
- sizeof (EFI_HII_PACKAGE_HEADER
)
212 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
215 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
216 Package
= (EFI_HII_PACKAGE_HEADER
*) (((HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*) PackageInstance
)->KeyboardPkg
);
219 case EFI_HII_PACKAGE_STRINGS
:
220 BufferSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->Header
.Length
;
221 HeaderSize
= ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
->HdrSize
;
222 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
223 ASSERT (Buffer
!= NULL
);
226 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringPkgHdr
,
231 ((HII_STRING_PACKAGE_INSTANCE
*) PackageInstance
)->StringBlock
,
232 BufferSize
- HeaderSize
234 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
237 case EFI_HII_PACKAGE_FONTS
:
238 BufferSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->Header
.Length
;
239 HeaderSize
= ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
->HdrSize
;
240 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
241 ASSERT (Buffer
!= NULL
);
244 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->FontPkgHdr
,
249 ((HII_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->GlyphBlock
,
250 BufferSize
- HeaderSize
252 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
255 case EFI_HII_PACKAGE_IMAGES
:
256 BufferSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
.Header
.Length
;
257 HeaderSize
= sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
258 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
259 ASSERT (Buffer
!= NULL
);
263 &((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImagePkgHdr
,
267 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
),
272 ImageBlockSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlockSize
;
273 if (ImageBlockSize
!= 0) {
276 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->ImageBlock
,
281 PaletteInfoSize
= ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteInfoSize
;
282 if (PaletteInfoSize
!= 0) {
284 Buffer
+ HeaderSize
+ ImageBlockSize
,
285 ((HII_IMAGE_PACKAGE_INSTANCE
*) PackageInstance
)->PaletteBlock
,
288 HeaderSize
+= ImageBlockSize
;
290 Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT32
),
295 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
298 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
299 BufferSize
= ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
->Header
.Length
;
300 Buffer
= (UINT8
*) AllocateZeroPool (BufferSize
);
301 ASSERT (Buffer
!= NULL
);
304 ((HII_SIMPLE_FONT_PACKAGE_INSTANCE
*) PackageInstance
)->SimpleFontPkgHdr
,
307 Package
= (EFI_HII_PACKAGE_HEADER
*) Buffer
;
310 case EFI_HII_PACKAGE_DEVICE_PATH
:
311 Package
= (EFI_HII_PACKAGE_HEADER
*) PackageInstance
;
315 return EFI_INVALID_PARAMETER
;
318 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
;
319 Link
!= &Private
->DatabaseNotifyList
;
320 Link
= Link
->ForwardLink
322 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
323 if (Notify
->NotifyType
== NotifyType
&& Notify
->PackageType
== PackageType
) {
325 // Check in case PackageGuid is not NULL when Package is GUID package
327 if (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
) {
328 Notify
->PackageGuid
= NULL
;
331 // Status of Registered Function is unknown so did not check it
333 Notify
->PackageNotifyFn (
343 SafeFreePool (Buffer
);
351 This function insert a GUID package to a package list node.
352 This is a internal function.
354 @param PackageHdr Pointer to a buffer stored with GUID package
356 @param NotifyType The type of change concerning the database.
357 @param PackageList Pointer to a package list which will be inserted
359 @param Package Created GUID pacakge
361 @retval EFI_SUCCESS Guid Package is inserted successfully.
362 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
364 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
370 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
371 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
372 OUT HII_GUID_PACKAGE_INSTANCE
**Package
375 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
376 EFI_HII_PACKAGE_HEADER PackageHeader
;
378 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
379 return EFI_INVALID_PARAMETER
;
382 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
385 // Create a GUID package node
387 GuidPackage
= (HII_GUID_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_GUID_PACKAGE_INSTANCE
));
388 if (GuidPackage
== NULL
) {
389 return EFI_OUT_OF_RESOURCES
;
391 GuidPackage
->GuidPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
392 if (GuidPackage
->GuidPkg
== NULL
) {
393 SafeFreePool (GuidPackage
);
394 return EFI_OUT_OF_RESOURCES
;
397 GuidPackage
->Signature
= HII_GUID_PACKAGE_SIGNATURE
;
398 CopyMem (GuidPackage
->GuidPkg
, PackageHdr
, PackageHeader
.Length
);
399 InsertTailList (&PackageList
->GuidPkgHdr
, &GuidPackage
->GuidEntry
);
400 *Package
= GuidPackage
;
402 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
403 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
411 This function exports GUID packages to a buffer.
412 This is a internal function.
414 @param Private Hii database private structure.
415 @param Handle Identification of a package list.
416 @param PackageList Pointer to a package list which will be exported.
417 @param UsedSize The length of buffer be used.
418 @param BufferSize Length of the Buffer.
419 @param Buffer Allocated space for storing exported data.
420 @param ResultSize The size of the already exported content of this
423 @retval EFI_SUCCESS Guid Packages are exported successfully.
424 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
429 IN HII_DATABASE_PRIVATE_DATA
*Private
,
430 IN EFI_HII_HANDLE Handle
,
431 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
435 IN OUT UINTN
*ResultSize
438 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
441 EFI_HII_PACKAGE_HEADER PackageHeader
;
444 if (PackageList
== NULL
|| ResultSize
== NULL
) {
445 return EFI_INVALID_PARAMETER
;
448 if (BufferSize
> 0 && Buffer
== NULL
) {
449 return EFI_INVALID_PARAMETER
;
453 Status
= EFI_SUCCESS
;
455 for (Link
= PackageList
->GuidPkgHdr
.ForwardLink
; Link
!= &PackageList
->GuidPkgHdr
; Link
= Link
->ForwardLink
) {
456 GuidPackage
= CR (Link
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
457 CopyMem (&PackageHeader
, GuidPackage
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
458 PackageLength
+= PackageHeader
.Length
;
459 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
460 Status
= InvokeRegisteredFunction (
462 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
463 (VOID
*) GuidPackage
,
464 EFI_HII_PACKAGE_TYPE_GUID
,
467 ASSERT_EFI_ERROR (Status
);
468 CopyMem (Buffer
, GuidPackage
->GuidPkg
, PackageHeader
.Length
);
469 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
473 *ResultSize
+= PackageLength
;
479 This function deletes all GUID packages from a package list node.
480 This is a internal function.
482 @param Private Hii database private data.
483 @param Handle Handle of the package list which contains the to
484 be removed GUID packages.
485 @param PackageList Pointer to a package list that contains removing
488 @retval EFI_SUCCESS GUID Package(s) is deleted successfully.
489 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
494 IN HII_DATABASE_PRIVATE_DATA
*Private
,
495 IN EFI_HII_HANDLE Handle
,
496 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
499 LIST_ENTRY
*ListHead
;
500 HII_GUID_PACKAGE_INSTANCE
*Package
;
502 EFI_HII_PACKAGE_HEADER PackageHeader
;
504 ListHead
= &PackageList
->GuidPkgHdr
;
506 while (!IsListEmpty (ListHead
)) {
508 ListHead
->ForwardLink
,
509 HII_GUID_PACKAGE_INSTANCE
,
511 HII_GUID_PACKAGE_SIGNATURE
513 Status
= InvokeRegisteredFunction (
515 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
517 EFI_HII_PACKAGE_TYPE_GUID
,
520 if (EFI_ERROR (Status
)) {
524 RemoveEntryList (&Package
->GuidEntry
);
525 CopyMem (&PackageHeader
, Package
->GuidPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
526 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
527 SafeFreePool (Package
->GuidPkg
);
528 SafeFreePool (Package
);
536 This function insert a Form package to a package list node.
537 This is a internal function.
539 @param PackageHdr Pointer to a buffer stored with Form package
541 @param NotifyType The type of change concerning the database.
542 @param PackageList Pointer to a package list which will be inserted
544 @param Package Created Form package
546 @retval EFI_SUCCESS Form Package is inserted successfully.
547 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
549 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
555 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
556 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
557 OUT HII_IFR_PACKAGE_INSTANCE
**Package
560 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
561 EFI_HII_PACKAGE_HEADER PackageHeader
;
563 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
564 return EFI_INVALID_PARAMETER
;
568 // Get the length of the package, including package header itself
570 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
573 // Create a Form package node
575 FormPackage
= (HII_IFR_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IFR_PACKAGE_INSTANCE
));
576 if (FormPackage
== NULL
) {
577 return EFI_OUT_OF_RESOURCES
;
580 FormPackage
->IfrData
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
));
581 if (FormPackage
->IfrData
== NULL
) {
582 SafeFreePool (FormPackage
);
583 return EFI_OUT_OF_RESOURCES
;
586 FormPackage
->Signature
= HII_IFR_PACKAGE_SIGNATURE
;
588 // Copy Package Header
590 CopyMem (&FormPackage
->FormPkgHdr
, &PackageHeader
, sizeof (EFI_HII_PACKAGE_HEADER
));
596 FormPackage
->IfrData
,
597 (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
),
598 PackageHeader
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
601 InsertTailList (&PackageList
->FormPkgHdr
, &FormPackage
->IfrEntry
);
602 *Package
= FormPackage
;
604 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
605 PackageList
->PackageListHdr
.PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
612 This function exports Form packages to a buffer.
613 This is a internal function.
615 @param Private Hii database private structure.
616 @param Handle Identification of a package list.
617 @param PackageList Pointer to a package list which will be exported.
618 @param UsedSize The length of buffer be used.
619 @param BufferSize Length of the Buffer.
620 @param Buffer Allocated space for storing exported data.
621 @param ResultSize The size of the already exported content of this
624 @retval EFI_SUCCESS Form Packages are exported successfully.
625 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
630 IN HII_DATABASE_PRIVATE_DATA
*Private
,
631 IN EFI_HII_HANDLE Handle
,
632 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
636 IN OUT UINTN
*ResultSize
639 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
644 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
645 return EFI_INVALID_PARAMETER
;
648 if (BufferSize
> 0 && Buffer
== NULL
) {
649 return EFI_INVALID_PARAMETER
;
653 Status
= EFI_SUCCESS
;
656 // Export Form packages.
658 for (Link
= PackageList
->FormPkgHdr
.ForwardLink
; Link
!= &PackageList
->FormPkgHdr
; Link
= Link
->ForwardLink
) {
659 FormPackage
= CR (Link
, HII_IFR_PACKAGE_INSTANCE
, IfrEntry
, HII_IFR_PACKAGE_SIGNATURE
);
660 PackageLength
+= FormPackage
->FormPkgHdr
.Length
;
661 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
663 // Invoke registered notification if exists
665 Status
= InvokeRegisteredFunction (
667 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
668 (VOID
*) FormPackage
,
669 EFI_HII_PACKAGE_FORM
,
672 ASSERT_EFI_ERROR (Status
);
674 // Copy the Form package content.
676 CopyMem (Buffer
, (VOID
*) (&FormPackage
->FormPkgHdr
), sizeof (EFI_HII_PACKAGE_HEADER
));
677 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_PACKAGE_HEADER
);
680 (VOID
*) FormPackage
->IfrData
,
681 FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
)
683 Buffer
= (UINT8
*) Buffer
+ FormPackage
->FormPkgHdr
.Length
- sizeof (EFI_HII_PACKAGE_HEADER
);
687 *ResultSize
+= PackageLength
;
695 This function deletes all Form packages from a package list node.
696 This is a internal function.
698 @param Private Hii database private data.
699 @param Handle Handle of the package list which contains the to
700 be removed Form packages.
701 @param PackageList Pointer to a package list that contains removing
704 @retval EFI_SUCCESS Form Package(s) is deleted successfully.
705 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
710 IN HII_DATABASE_PRIVATE_DATA
*Private
,
711 IN EFI_HII_HANDLE Handle
,
712 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
715 LIST_ENTRY
*ListHead
;
716 HII_IFR_PACKAGE_INSTANCE
*Package
;
719 ListHead
= &PackageList
->FormPkgHdr
;
721 while (!IsListEmpty (ListHead
)) {
723 ListHead
->ForwardLink
,
724 HII_IFR_PACKAGE_INSTANCE
,
726 HII_IFR_PACKAGE_SIGNATURE
728 Status
= InvokeRegisteredFunction (
730 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
732 EFI_HII_PACKAGE_FORM
,
735 if (EFI_ERROR (Status
)) {
739 RemoveEntryList (&Package
->IfrEntry
);
740 PackageList
->PackageListHdr
.PackageLength
-= Package
->FormPkgHdr
.Length
;
741 SafeFreePool (Package
->IfrData
);
742 SafeFreePool (Package
);
752 This function insert a String package to a package list node.
753 This is a internal function.
755 @param Private Hii database private structure.
756 @param PackageHdr Pointer to a buffer stored with String package
758 @param NotifyType The type of change concerning the database.
759 @param PackageList Pointer to a package list which will be inserted
761 @param Package Created String package
763 @retval EFI_SUCCESS String Package is inserted successfully.
764 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
766 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
767 @retval EFI_UNSUPPORTED A string package with the same language already
768 exists in current package list.
772 InsertStringPackage (
773 IN HII_DATABASE_PRIVATE_DATA
*Private
,
775 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
776 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
777 OUT HII_STRING_PACKAGE_INSTANCE
**Package
781 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
784 EFI_HII_PACKAGE_HEADER PackageHeader
;
789 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
790 return EFI_INVALID_PARAMETER
;
792 if (Private
->Signature
!= HII_DATABASE_PRIVATE_DATA_SIGNATURE
) {
793 return EFI_INVALID_PARAMETER
;
796 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
797 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
800 // It is illegal to have two string packages with same language within one packagelist
801 // since the stringid will be duplicate if so. Check it to avoid this potential issue.
803 LanguageSize
= HeaderSize
- sizeof (EFI_HII_STRING_PACKAGE_HDR
) + sizeof (CHAR8
);
804 Language
= (CHAR8
*) AllocateZeroPool (LanguageSize
);
805 if (Language
== NULL
) {
806 return EFI_OUT_OF_RESOURCES
;
808 AsciiStrCpy (Language
, (CHAR8
*) PackageHdr
+ HeaderSize
- LanguageSize
);
809 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
810 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
811 if (R8_EfiLibCompareLanguage (Language
, StringPackage
->StringPkgHdr
->Language
)) {
812 SafeFreePool (Language
);
813 return EFI_UNSUPPORTED
;
816 SafeFreePool (Language
);
819 // Create a String package node
821 StringPackage
= (HII_STRING_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_STRING_PACKAGE_INSTANCE
));
822 if (StringPackage
== NULL
) {
823 Status
= EFI_OUT_OF_RESOURCES
;
827 StringPackage
->StringPkgHdr
= (EFI_HII_STRING_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
828 if (StringPackage
->StringPkgHdr
== NULL
) {
829 Status
= EFI_OUT_OF_RESOURCES
;
833 StringPackage
->StringBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
834 if (StringPackage
->StringBlock
== NULL
) {
835 Status
= EFI_OUT_OF_RESOURCES
;
839 StringPackage
->Signature
= HII_STRING_PACKAGE_SIGNATURE
;
840 StringPackage
->FontId
= 0;
841 InitializeListHead (&StringPackage
->FontInfoList
);
844 // Copy the String package header.
846 CopyMem (StringPackage
->StringPkgHdr
, PackageHdr
, HeaderSize
);
849 // Copy the String blocks
852 StringPackage
->StringBlock
,
853 (UINT8
*) PackageHdr
+ HeaderSize
,
854 PackageHeader
.Length
- HeaderSize
858 // Collect all font block info
860 Status
= FindStringBlock (Private
, StringPackage
, (EFI_STRING_ID
) (-1), NULL
, NULL
, NULL
, NULL
);
861 if (EFI_ERROR (Status
)) {
866 // Insert to String package array
868 InsertTailList (&PackageList
->StringPkgHdr
, &StringPackage
->StringEntry
);
869 *Package
= StringPackage
;
871 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
872 PackageList
->PackageListHdr
.PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
879 SafeFreePool (StringPackage
->StringBlock
);
880 SafeFreePool (StringPackage
->StringPkgHdr
);
881 SafeFreePool (StringPackage
);
888 This function exports String packages to a buffer.
889 This is a internal function.
891 @param Private Hii database private structure.
892 @param Handle Identification of a package list.
893 @param PackageList Pointer to a package list which will be exported.
894 @param UsedSize The length of buffer be used.
895 @param BufferSize Length of the Buffer.
896 @param Buffer Allocated space for storing exported data.
897 @param ResultSize The size of the already exported content of this
900 @retval EFI_SUCCESS String Packages are exported successfully.
901 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
905 ExportStringPackages (
906 IN HII_DATABASE_PRIVATE_DATA
*Private
,
907 IN EFI_HII_HANDLE Handle
,
908 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
912 IN OUT UINTN
*ResultSize
918 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
920 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
921 return EFI_INVALID_PARAMETER
;
924 if (BufferSize
> 0 && Buffer
== NULL
) {
925 return EFI_INVALID_PARAMETER
;
929 Status
= EFI_SUCCESS
;
931 for (Link
= PackageList
->StringPkgHdr
.ForwardLink
; Link
!= &PackageList
->StringPkgHdr
; Link
= Link
->ForwardLink
) {
932 StringPackage
= CR (Link
, HII_STRING_PACKAGE_INSTANCE
, StringEntry
, HII_STRING_PACKAGE_SIGNATURE
);
933 PackageLength
+= StringPackage
->StringPkgHdr
->Header
.Length
;
934 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
936 // Invoke registered notification function with EXPORT_PACK notify type
938 Status
= InvokeRegisteredFunction (
940 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
941 (VOID
*) StringPackage
,
942 EFI_HII_PACKAGE_STRINGS
,
945 ASSERT_EFI_ERROR (Status
);
947 // Copy String package header
949 CopyMem (Buffer
, StringPackage
->StringPkgHdr
, StringPackage
->StringPkgHdr
->HdrSize
);
950 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->HdrSize
;
953 // Copy String blocks information
957 StringPackage
->StringBlock
,
958 StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
960 Buffer
= (UINT8
*) Buffer
+ StringPackage
->StringPkgHdr
->Header
.Length
- StringPackage
->StringPkgHdr
->HdrSize
;
964 *ResultSize
+= PackageLength
;
970 This function deletes all String packages from a package list node.
971 This is a internal function.
973 @param Private Hii database private data.
974 @param Handle Handle of the package list which contains the to
975 be removed String packages.
976 @param PackageList Pointer to a package list that contains removing
979 @retval EFI_SUCCESS String Package(s) is deleted successfully.
980 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
984 RemoveStringPackages (
985 IN HII_DATABASE_PRIVATE_DATA
*Private
,
986 IN EFI_HII_HANDLE Handle
,
987 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
990 LIST_ENTRY
*ListHead
;
991 HII_STRING_PACKAGE_INSTANCE
*Package
;
992 HII_FONT_INFO
*FontInfo
;
995 ListHead
= &PackageList
->StringPkgHdr
;
997 while (!IsListEmpty (ListHead
)) {
999 ListHead
->ForwardLink
,
1000 HII_STRING_PACKAGE_INSTANCE
,
1002 HII_STRING_PACKAGE_SIGNATURE
1004 Status
= InvokeRegisteredFunction (
1006 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1008 EFI_HII_PACKAGE_STRINGS
,
1011 if (EFI_ERROR (Status
)) {
1015 RemoveEntryList (&Package
->StringEntry
);
1016 PackageList
->PackageListHdr
.PackageLength
-= Package
->StringPkgHdr
->Header
.Length
;
1017 SafeFreePool (Package
->StringBlock
);
1018 SafeFreePool (Package
->StringPkgHdr
);
1020 // Delete font information
1022 while (!IsListEmpty (&Package
->FontInfoList
)) {
1024 Package
->FontInfoList
.ForwardLink
,
1027 HII_FONT_INFO_SIGNATURE
1029 RemoveEntryList (&FontInfo
->Entry
);
1030 SafeFreePool (FontInfo
);
1033 SafeFreePool (Package
);
1041 This function insert a Font package to a package list node.
1042 This is a internal function.
1044 @param Private Hii database private structure.
1045 @param PackageHdr Pointer to a buffer stored with Font package
1047 @param NotifyType The type of change concerning the database.
1048 @param PackageList Pointer to a package list which will be inserted
1050 @param Package Created Font package
1052 @retval EFI_SUCCESS Font Package is inserted successfully.
1053 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1055 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1056 @retval EFI_UNSUPPORTED A font package with same EFI_FONT_INFO already
1057 exists in current hii database.
1062 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1063 IN VOID
*PackageHdr
,
1064 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1065 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1066 OUT HII_FONT_PACKAGE_INSTANCE
**Package
1069 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
1070 EFI_HII_FONT_PACKAGE_HDR
*FontPkgHdr
;
1073 EFI_HII_PACKAGE_HEADER PackageHeader
;
1074 EFI_FONT_INFO
*FontInfo
;
1075 UINT32 FontInfoSize
;
1076 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1078 if (Private
== NULL
|| PackageHdr
== NULL
|| PackageList
== NULL
) {
1079 return EFI_INVALID_PARAMETER
;
1082 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1083 CopyMem (&HeaderSize
, (UINT8
*) PackageHdr
+ sizeof (EFI_HII_PACKAGE_HEADER
), sizeof (UINT32
));
1090 // It is illegal to have two font packages with same EFI_FONT_INFO within hii
1091 // database. EFI_FONT_INFO (FontName, FontSize, FontStyle) describes font's
1092 // attributes and identify a font uniquely.
1094 FontPkgHdr
= (EFI_HII_FONT_PACKAGE_HDR
*) AllocateZeroPool (HeaderSize
);
1095 if (FontPkgHdr
== NULL
) {
1096 Status
= EFI_OUT_OF_RESOURCES
;
1099 CopyMem (FontPkgHdr
, PackageHdr
, HeaderSize
);
1101 FontInfoSize
= sizeof (EFI_FONT_INFO
) + HeaderSize
- sizeof (EFI_HII_FONT_PACKAGE_HDR
);
1102 FontInfo
= (EFI_FONT_INFO
*) AllocateZeroPool (FontInfoSize
);
1103 if (FontInfo
== NULL
) {
1104 Status
= EFI_OUT_OF_RESOURCES
;
1107 FontInfo
->FontStyle
= FontPkgHdr
->FontStyle
;
1108 FontInfo
->FontSize
= FontPkgHdr
->Cell
.Height
;
1109 StrCpy (FontInfo
->FontName
, FontPkgHdr
->FontFamily
);
1111 if (IsFontInfoExisted (Private
, FontInfo
, NULL
, NULL
, NULL
)) {
1112 Status
= EFI_UNSUPPORTED
;
1117 // Create a Font package node
1119 FontPackage
= (HII_FONT_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_FONT_PACKAGE_INSTANCE
));
1120 if (FontPackage
== NULL
) {
1121 Status
= EFI_OUT_OF_RESOURCES
;
1124 FontPackage
->Signature
= HII_FONT_PACKAGE_SIGNATURE
;
1125 FontPackage
->FontPkgHdr
= FontPkgHdr
;
1126 InitializeListHead (&FontPackage
->GlyphInfoList
);
1128 FontPackage
->GlyphBlock
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
- HeaderSize
);
1129 if (FontPackage
->GlyphBlock
== NULL
) {
1130 Status
= EFI_OUT_OF_RESOURCES
;
1133 CopyMem (FontPackage
->GlyphBlock
, (UINT8
*) PackageHdr
+ HeaderSize
, PackageHeader
.Length
- HeaderSize
);
1136 // Collect all default character cell information and backup in GlyphInfoList.
1138 Status
= FindGlyphBlock (FontPackage
, (CHAR16
) (-1), NULL
, NULL
, NULL
);
1139 if (EFI_ERROR (Status
)) {
1144 // This font package describes an unique EFI_FONT_INFO. Backup it in global
1147 GlobalFont
= (HII_GLOBAL_FONT_INFO
*) AllocateZeroPool (sizeof (HII_GLOBAL_FONT_INFO
));
1148 if (GlobalFont
== NULL
) {
1149 Status
= EFI_OUT_OF_RESOURCES
;
1152 GlobalFont
->Signature
= HII_GLOBAL_FONT_INFO_SIGNATURE
;
1153 GlobalFont
->FontPackage
= FontPackage
;
1154 GlobalFont
->FontInfoSize
= FontInfoSize
;
1155 GlobalFont
->FontInfo
= FontInfo
;
1156 InsertTailList (&Private
->FontInfoList
, &GlobalFont
->Entry
);
1159 // Insert this font package to Font package array
1161 InsertTailList (&PackageList
->FontPkgHdr
, &FontPackage
->FontEntry
);
1162 *Package
= FontPackage
;
1164 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1165 PackageList
->PackageListHdr
.PackageLength
+= FontPackage
->FontPkgHdr
->Header
.Length
;
1172 SafeFreePool (FontPkgHdr
);
1173 SafeFreePool (FontInfo
);
1174 SafeFreePool (FontPackage
->GlyphBlock
);
1175 SafeFreePool (FontPackage
);
1176 SafeFreePool (GlobalFont
);
1184 This function exports Font packages to a buffer.
1185 This is a internal function.
1187 @param Private Hii database private structure.
1188 @param Handle Identification of a package list.
1189 @param PackageList Pointer to a package list which will be exported.
1190 @param UsedSize The length of buffer be used.
1191 @param BufferSize Length of the Buffer.
1192 @param Buffer Allocated space for storing exported data.
1193 @param ResultSize The size of the already exported content of this
1196 @retval EFI_SUCCESS Font Packages are exported successfully.
1197 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1201 ExportFontPackages (
1202 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1203 IN EFI_HII_HANDLE Handle
,
1204 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1206 IN UINTN BufferSize
,
1207 IN OUT VOID
*Buffer
,
1208 IN OUT UINTN
*ResultSize
1212 UINTN PackageLength
;
1214 HII_FONT_PACKAGE_INSTANCE
*Package
;
1217 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1218 return EFI_INVALID_PARAMETER
;
1221 if (BufferSize
> 0 && Buffer
== NULL
) {
1222 return EFI_INVALID_PARAMETER
;
1226 Status
= EFI_SUCCESS
;
1228 for (Link
= PackageList
->FontPkgHdr
.ForwardLink
; Link
!= &PackageList
->FontPkgHdr
; Link
= Link
->ForwardLink
) {
1229 Package
= CR (Link
, HII_FONT_PACKAGE_INSTANCE
, FontEntry
, HII_FONT_PACKAGE_SIGNATURE
);
1230 PackageLength
+= Package
->FontPkgHdr
->Header
.Length
;
1231 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1233 // Invoke registered notification function with EXPORT_PACK notify type
1235 Status
= InvokeRegisteredFunction (
1237 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1239 EFI_HII_PACKAGE_FONTS
,
1242 ASSERT_EFI_ERROR (Status
);
1244 // Copy Font package header
1246 CopyMem (Buffer
, Package
->FontPkgHdr
, Package
->FontPkgHdr
->HdrSize
);
1247 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->HdrSize
;
1250 // Copy Glyph blocks information
1254 Package
->GlyphBlock
,
1255 Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
1257 Buffer
= (UINT8
*) Buffer
+ Package
->FontPkgHdr
->Header
.Length
- Package
->FontPkgHdr
->HdrSize
;
1261 *ResultSize
+= PackageLength
;
1267 This function deletes all Font packages from a package list node.
1268 This is a internal function.
1270 @param Private Hii database private data.
1271 @param Handle Handle of the package list which contains the to
1272 be removed Font packages.
1273 @param PackageList Pointer to a package list that contains removing
1276 @retval EFI_SUCCESS Font Package(s) is deleted successfully.
1277 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1281 RemoveFontPackages (
1282 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1283 IN EFI_HII_HANDLE Handle
,
1284 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1287 LIST_ENTRY
*ListHead
;
1288 HII_FONT_PACKAGE_INSTANCE
*Package
;
1290 HII_GLYPH_INFO
*GlyphInfo
;
1292 HII_GLOBAL_FONT_INFO
*GlobalFont
;
1294 ListHead
= &PackageList
->FontPkgHdr
;
1296 while (!IsListEmpty (ListHead
)) {
1298 ListHead
->ForwardLink
,
1299 HII_FONT_PACKAGE_INSTANCE
,
1301 HII_FONT_PACKAGE_SIGNATURE
1303 Status
= InvokeRegisteredFunction (
1305 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1307 EFI_HII_PACKAGE_FONTS
,
1310 if (EFI_ERROR (Status
)) {
1314 RemoveEntryList (&Package
->FontEntry
);
1315 PackageList
->PackageListHdr
.PackageLength
-= Package
->FontPkgHdr
->Header
.Length
;
1316 SafeFreePool (Package
->GlyphBlock
);
1317 SafeFreePool (Package
->FontPkgHdr
);
1319 // Delete default character cell information
1321 while (!IsListEmpty (&Package
->GlyphInfoList
)) {
1323 Package
->GlyphInfoList
.ForwardLink
,
1326 HII_GLYPH_INFO_SIGNATURE
1328 RemoveEntryList (&GlyphInfo
->Entry
);
1329 SafeFreePool (GlyphInfo
);
1333 // Remove corresponding global font info
1335 for (Link
= Private
->FontInfoList
.ForwardLink
; Link
!= &Private
->FontInfoList
; Link
= Link
->ForwardLink
) {
1336 GlobalFont
= CR (Link
, HII_GLOBAL_FONT_INFO
, Entry
, HII_GLOBAL_FONT_INFO_SIGNATURE
);
1337 if (GlobalFont
->FontPackage
== Package
) {
1338 RemoveEntryList (&GlobalFont
->Entry
);
1339 SafeFreePool (GlobalFont
->FontInfo
);
1340 SafeFreePool (GlobalFont
);
1345 SafeFreePool (Package
);
1353 This function insert a Image package to a package list node.
1354 This is a internal function.
1356 @param PackageHdr Pointer to a buffer stored with Image package
1358 @param NotifyType The type of change concerning the database.
1359 @param PackageList Pointer to a package list which will be inserted
1361 @param Package Created Image package
1363 @retval EFI_SUCCESS Image Package is inserted successfully.
1364 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1366 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1370 InsertImagePackage (
1371 IN VOID
*PackageHdr
,
1372 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1373 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1374 OUT HII_IMAGE_PACKAGE_INSTANCE
**Package
1377 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
1381 EFI_HII_IMAGE_PALETTE_INFO_HEADER
*PaletteHdr
;
1382 EFI_HII_IMAGE_PALETTE_INFO
*PaletteInfo
;
1383 UINT32 PaletteInfoOffset
;
1384 UINT32 ImageInfoOffset
;
1387 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1388 return EFI_INVALID_PARAMETER
;
1392 // Less than one image package is allowed in one package list.
1394 if (PackageList
->ImagePkg
!= NULL
) {
1395 return EFI_INVALID_PARAMETER
;
1399 // Create a Image package node
1401 ImagePackage
= (HII_IMAGE_PACKAGE_INSTANCE
*) AllocateZeroPool (sizeof (HII_IMAGE_PACKAGE_INSTANCE
));
1402 if (ImagePackage
== NULL
) {
1403 return EFI_OUT_OF_RESOURCES
;
1407 // Copy the Image package header.
1409 CopyMem (&ImagePackage
->ImagePkgHdr
, PackageHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1411 PaletteInfoOffset
= ImagePackage
->ImagePkgHdr
.PaletteInfoOffset
;
1412 ImageInfoOffset
= ImagePackage
->ImagePkgHdr
.ImageInfoOffset
;
1415 // If PaletteInfoOffset is zero, there are no palettes in this image package.
1418 ImagePackage
->PaletteBlock
= NULL
;
1419 if (PaletteInfoOffset
!= 0) {
1420 PaletteHdr
= (EFI_HII_IMAGE_PALETTE_INFO_HEADER
*) ((UINT8
*) PackageHdr
+ PaletteInfoOffset
);
1421 PaletteSize
= sizeof (EFI_HII_IMAGE_PALETTE_INFO_HEADER
);
1422 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteHdr
+ PaletteSize
);
1424 for (Index
= 0; Index
< PaletteHdr
->PaletteCount
; Index
++) {
1425 CopyMem (&CurrentSize
, PaletteInfo
, sizeof (UINT16
));
1426 CurrentSize
+= sizeof (UINT16
);
1427 PaletteSize
+= (UINT32
) CurrentSize
;
1428 PaletteInfo
= (EFI_HII_IMAGE_PALETTE_INFO
*) ((UINT8
*) PaletteInfo
+ CurrentSize
);
1431 ImagePackage
->PaletteBlock
= (UINT8
*) AllocateZeroPool (PaletteSize
);
1432 if (ImagePackage
->PaletteBlock
== NULL
) {
1433 SafeFreePool (ImagePackage
);
1434 return EFI_OUT_OF_RESOURCES
;
1437 ImagePackage
->PaletteBlock
,
1438 (UINT8
*) PackageHdr
+ PaletteInfoOffset
,
1444 // If ImageInfoOffset is zero, there are no images in this package.
1447 ImagePackage
->ImageBlock
= NULL
;
1448 if (ImageInfoOffset
!= 0) {
1449 ImageSize
= ImagePackage
->ImagePkgHdr
.Header
.Length
-
1450 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) - PaletteSize
;
1451 ImagePackage
->ImageBlock
= (UINT8
*) AllocateZeroPool (ImageSize
);
1452 if (ImagePackage
->ImageBlock
== NULL
) {
1453 SafeFreePool (ImagePackage
->PaletteBlock
);
1454 SafeFreePool (ImagePackage
);
1455 return EFI_OUT_OF_RESOURCES
;
1458 ImagePackage
->ImageBlock
,
1459 (UINT8
*) PackageHdr
+ ImageInfoOffset
,
1464 ImagePackage
->ImageBlockSize
= ImageSize
;
1465 ImagePackage
->PaletteInfoSize
= PaletteSize
;
1466 PackageList
->ImagePkg
= ImagePackage
;
1467 *Package
= ImagePackage
;
1469 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1470 PackageList
->PackageListHdr
.PackageLength
+= ImagePackage
->ImagePkgHdr
.Header
.Length
;
1478 This function exports Image packages to a buffer.
1479 This is a internal function.
1481 @param Private Hii database private structure.
1482 @param Handle Identification of a package list.
1483 @param PackageList Pointer to a package list which will be exported.
1484 @param UsedSize The length of buffer be used.
1485 @param BufferSize Length of the Buffer.
1486 @param Buffer Allocated space for storing exported data.
1487 @param ResultSize The size of the already exported content of this
1490 @retval EFI_SUCCESS Image Packages are exported successfully.
1491 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1495 ExportImagePackages (
1496 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1497 IN EFI_HII_HANDLE Handle
,
1498 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1500 IN UINTN BufferSize
,
1501 IN OUT VOID
*Buffer
,
1502 IN OUT UINTN
*ResultSize
1505 UINTN PackageLength
;
1507 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1510 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1511 return EFI_INVALID_PARAMETER
;
1514 if (BufferSize
> 0 && Buffer
== NULL
) {
1515 return EFI_INVALID_PARAMETER
;
1518 Package
= PackageList
->ImagePkg
;
1520 if (Package
== NULL
) {
1524 PackageLength
= Package
->ImagePkgHdr
.Header
.Length
;
1526 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1528 // Invoke registered notification function with EXPORT_PACK notify type
1530 Status
= InvokeRegisteredFunction (
1532 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1534 EFI_HII_PACKAGE_IMAGES
,
1537 ASSERT_EFI_ERROR (Status
);
1538 ASSERT (Package
->ImagePkgHdr
.Header
.Length
==
1539 sizeof (EFI_HII_IMAGE_PACKAGE_HDR
) + Package
->ImageBlockSize
+ Package
->PaletteInfoSize
);
1541 // Copy Image package header,
1542 // then justify the offset for image info and palette info in the header.
1544 CopyMem (Buffer
, &Package
->ImagePkgHdr
, sizeof (EFI_HII_IMAGE_PACKAGE_HDR
));
1545 Buffer
= (UINT8
*) Buffer
+ sizeof (EFI_HII_IMAGE_PACKAGE_HDR
);
1548 // Copy Image blocks information
1550 if (Package
->ImageBlockSize
!= 0) {
1551 CopyMem (Buffer
, Package
->ImageBlock
, Package
->ImageBlockSize
);
1552 Buffer
= (UINT8
*) Buffer
+ Package
->ImageBlockSize
;
1555 // Copy Palette information
1557 if (Package
->PaletteInfoSize
!= 0) {
1558 CopyMem (Buffer
, Package
->PaletteBlock
, Package
->PaletteInfoSize
);
1559 Buffer
= (UINT8
*) Buffer
+ Package
->PaletteInfoSize
;
1563 *ResultSize
+= PackageLength
;
1569 This function deletes Image package from a package list node.
1570 This is a internal function.
1572 @param Private Hii database private data.
1573 @param Handle Handle of the package list which contains the to
1574 be removed Image packages.
1575 @param PackageList Package List which contains the to be removed
1578 @retval EFI_SUCCESS Image Package(s) is deleted successfully.
1579 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1583 RemoveImagePackages (
1584 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1585 IN EFI_HII_HANDLE Handle
,
1586 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1589 HII_IMAGE_PACKAGE_INSTANCE
*Package
;
1592 Package
= PackageList
->ImagePkg
;
1595 // Image package does not exist, return directly.
1597 if (Package
== NULL
) {
1601 Status
= InvokeRegisteredFunction (
1603 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1605 EFI_HII_PACKAGE_IMAGES
,
1608 if (EFI_ERROR (Status
)) {
1612 PackageList
->PackageListHdr
.PackageLength
-= Package
->ImagePkgHdr
.Header
.Length
;
1614 SafeFreePool (Package
->ImageBlock
);
1615 SafeFreePool (Package
->PaletteBlock
);
1616 SafeFreePool (Package
);
1618 PackageList
->ImagePkg
= NULL
;
1625 This function insert a Simple Font package to a package list node.
1626 This is a internal function.
1628 @param PackageHdr Pointer to a buffer stored with Simple Font
1629 package information.
1630 @param NotifyType The type of change concerning the database.
1631 @param PackageList Pointer to a package list which will be inserted
1633 @param Package Created Simple Font package
1635 @retval EFI_SUCCESS Simple Font Package is inserted successfully.
1636 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1637 Simple Font package.
1638 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
1642 InsertSimpleFontPackage (
1643 IN VOID
*PackageHdr
,
1644 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1645 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1646 OUT HII_SIMPLE_FONT_PACKAGE_INSTANCE
**Package
1649 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
1651 EFI_HII_PACKAGE_HEADER Header
;
1653 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
1654 return EFI_INVALID_PARAMETER
;
1658 // Create a Simple Font package node
1660 SimpleFontPackage
= AllocateZeroPool (sizeof (HII_SIMPLE_FONT_PACKAGE_INSTANCE
));
1661 if (SimpleFontPackage
== NULL
) {
1662 Status
= EFI_OUT_OF_RESOURCES
;
1665 SimpleFontPackage
->Signature
= HII_S_FONT_PACKAGE_SIGNATURE
;
1668 // Copy the Simple Font package.
1670 CopyMem (&Header
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
1672 SimpleFontPackage
->SimpleFontPkgHdr
= AllocateZeroPool (Header
.Length
);
1673 if (SimpleFontPackage
->SimpleFontPkgHdr
== NULL
) {
1674 Status
= EFI_OUT_OF_RESOURCES
;
1678 CopyMem (SimpleFontPackage
->SimpleFontPkgHdr
, PackageHdr
, Header
.Length
);
1681 // Insert to Simple Font package array
1683 InsertTailList (&PackageList
->SimpleFontPkgHdr
, &SimpleFontPackage
->SimpleFontEntry
);
1684 *Package
= SimpleFontPackage
;
1686 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
1687 PackageList
->PackageListHdr
.PackageLength
+= Header
.Length
;
1694 SafeFreePool (SimpleFontPackage
->SimpleFontPkgHdr
);
1695 SafeFreePool (SimpleFontPackage
);
1701 This function exports SimpleFont packages to a buffer.
1702 This is a internal function.
1704 @param Private Hii database private structure.
1705 @param Handle Identification of a package list.
1706 @param PackageList Pointer to a package list which will be exported.
1707 @param UsedSize The length of buffer be used.
1708 @param BufferSize Length of the Buffer.
1709 @param Buffer Allocated space for storing exported data.
1710 @param ResultSize The size of the already exported content of this
1713 @retval EFI_SUCCESS SimpleFont Packages are exported successfully.
1714 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1718 ExportSimpleFontPackages (
1719 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1720 IN EFI_HII_HANDLE Handle
,
1721 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1723 IN UINTN BufferSize
,
1724 IN OUT VOID
*Buffer
,
1725 IN OUT UINTN
*ResultSize
1729 UINTN PackageLength
;
1731 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1733 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1734 return EFI_INVALID_PARAMETER
;
1737 if (BufferSize
> 0 && Buffer
== NULL
) {
1738 return EFI_INVALID_PARAMETER
;
1742 Status
= EFI_SUCCESS
;
1744 for (Link
= PackageList
->SimpleFontPkgHdr
.ForwardLink
; Link
!= &PackageList
->SimpleFontPkgHdr
; Link
= Link
->ForwardLink
) {
1745 Package
= CR (Link
, HII_SIMPLE_FONT_PACKAGE_INSTANCE
, SimpleFontEntry
, HII_S_FONT_PACKAGE_SIGNATURE
);
1746 PackageLength
+= Package
->SimpleFontPkgHdr
->Header
.Length
;
1747 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1749 // Invoke registered notification function with EXPORT_PACK notify type
1751 Status
= InvokeRegisteredFunction (
1753 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1755 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1758 ASSERT_EFI_ERROR (Status
);
1761 // Copy SimpleFont package
1763 CopyMem (Buffer
, Package
->SimpleFontPkgHdr
, Package
->SimpleFontPkgHdr
->Header
.Length
);
1764 Buffer
= (UINT8
*) Buffer
+ Package
->SimpleFontPkgHdr
->Header
.Length
;
1768 *ResultSize
+= PackageLength
;
1774 This function deletes all Simple Font packages from a package list node.
1775 This is a internal function.
1777 @param Private Hii database private data.
1778 @param Handle Handle of the package list which contains the to
1779 be removed Simple Font packages.
1780 @param PackageList Pointer to a package list that contains removing
1783 @retval EFI_SUCCESS Simple Font Package(s) is deleted successfully.
1784 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1788 RemoveSimpleFontPackages (
1789 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1790 IN EFI_HII_HANDLE Handle
,
1791 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1794 LIST_ENTRY
*ListHead
;
1795 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*Package
;
1798 ListHead
= &PackageList
->SimpleFontPkgHdr
;
1800 while (!IsListEmpty (ListHead
)) {
1802 ListHead
->ForwardLink
,
1803 HII_SIMPLE_FONT_PACKAGE_INSTANCE
,
1805 HII_S_FONT_PACKAGE_SIGNATURE
1807 Status
= InvokeRegisteredFunction (
1809 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1811 EFI_HII_PACKAGE_SIMPLE_FONTS
,
1814 if (EFI_ERROR (Status
)) {
1818 RemoveEntryList (&Package
->SimpleFontEntry
);
1819 PackageList
->PackageListHdr
.PackageLength
-= Package
->SimpleFontPkgHdr
->Header
.Length
;
1820 SafeFreePool (Package
->SimpleFontPkgHdr
);
1821 SafeFreePool (Package
);
1829 This function insert a Device path package to a package list node.
1830 This is a internal function.
1832 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
1834 @param NotifyType The type of change concerning the database.
1835 @param PackageList Pointer to a package list which will be inserted
1838 @retval EFI_SUCCESS Device path Package is inserted successfully.
1839 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
1840 Device path package.
1841 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
1845 InsertDevicePathPackage (
1846 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
1847 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
1848 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1851 UINT32 PackageLength
;
1852 EFI_HII_PACKAGE_HEADER Header
;
1854 if (DevicePath
== NULL
|| PackageList
== NULL
) {
1855 return EFI_INVALID_PARAMETER
;
1858 // Less than one device path package is allowed in one package list.
1860 if (PackageList
->DevicePathPkg
!= NULL
) {
1861 return EFI_INVALID_PARAMETER
;
1864 PackageLength
= (UINT32
) GetDevicePathSize (DevicePath
) + sizeof (EFI_HII_PACKAGE_HEADER
);
1865 PackageList
->DevicePathPkg
= (UINT8
*) AllocateZeroPool (PackageLength
);
1866 if (PackageList
->DevicePathPkg
== NULL
) {
1867 return EFI_OUT_OF_RESOURCES
;
1870 Header
.Length
= PackageLength
;
1871 Header
.Type
= EFI_HII_PACKAGE_DEVICE_PATH
;
1872 CopyMem (PackageList
->DevicePathPkg
, &Header
, sizeof (EFI_HII_PACKAGE_HEADER
));
1874 PackageList
->DevicePathPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
1876 PackageLength
- sizeof (EFI_HII_PACKAGE_HEADER
)
1880 // Since Device Path package is created by NewPackageList, either NEW_PACK
1881 // or ADD_PACK should increase the length of package list.
1883 PackageList
->PackageListHdr
.PackageLength
+= PackageLength
;
1889 This function exports device path package to a buffer.
1890 This is a internal function.
1892 @param Private Hii database private structure.
1893 @param Handle Identification of a package list.
1894 @param PackageList Pointer to a package list which will be exported.
1895 @param UsedSize The length of buffer be used.
1896 @param BufferSize Length of the Buffer.
1897 @param Buffer Allocated space for storing exported data.
1898 @param ResultSize The size of the already exported content of this
1901 @retval EFI_SUCCESS Device path Package is exported successfully.
1902 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
1906 ExportDevicePathPackage (
1907 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1908 IN EFI_HII_HANDLE Handle
,
1909 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
1911 IN UINTN BufferSize
,
1912 IN OUT VOID
*Buffer
,
1913 IN OUT UINTN
*ResultSize
1918 EFI_HII_PACKAGE_HEADER Header
;
1920 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
1921 return EFI_INVALID_PARAMETER
;
1923 if (BufferSize
> 0 && Buffer
== NULL
) {
1924 return EFI_INVALID_PARAMETER
;
1927 Package
= PackageList
->DevicePathPkg
;
1929 if (Package
== NULL
) {
1933 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
1935 if (Header
.Length
+ *ResultSize
+ UsedSize
<= BufferSize
) {
1937 // Invoke registered notification function with EXPORT_PACK notify type
1939 Status
= InvokeRegisteredFunction (
1941 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
1943 EFI_HII_PACKAGE_DEVICE_PATH
,
1946 ASSERT_EFI_ERROR (Status
);
1949 // Copy Device path package
1951 CopyMem (Buffer
, Package
, Header
.Length
);
1954 *ResultSize
+= Header
.Length
;
1960 This function deletes Device Path package from a package list node.
1961 This is a internal function.
1963 @param Private Hii database private data.
1964 @param Handle Handle of the package list.
1965 @param PackageList Package List which contains the to be removed
1966 Device Path package.
1968 @retval EFI_SUCCESS Device Path Package is deleted successfully.
1969 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
1973 RemoveDevicePathPackage (
1974 IN HII_DATABASE_PRIVATE_DATA
*Private
,
1975 IN EFI_HII_HANDLE Handle
,
1976 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
1981 EFI_HII_PACKAGE_HEADER Header
;
1983 Package
= PackageList
->DevicePathPkg
;
1986 // No device path, return directly.
1988 if (Package
== NULL
) {
1992 Status
= InvokeRegisteredFunction (
1994 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
1996 EFI_HII_PACKAGE_DEVICE_PATH
,
1999 if (EFI_ERROR (Status
)) {
2003 CopyMem (&Header
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
2004 PackageList
->PackageListHdr
.PackageLength
-= Header
.Length
;
2006 SafeFreePool (Package
);
2008 PackageList
->DevicePathPkg
= NULL
;
2015 This function will insert a device path package to package list firstly then
2016 invoke notification functions if any.
2017 This is a internal function.
2019 @param Private Hii database private structure.
2020 @param NotifyType The type of change concerning the database.
2021 @param DevicePath Pointer to a EFI_DEVICE_PATH_PROTOCOL protocol
2023 @param DatabaseRecord Pointer to a database record contains a package
2024 list which will be inserted to.
2026 @retval EFI_SUCCESS Device path Package is inserted successfully.
2027 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2028 Device path package.
2029 @retval EFI_INVALID_PARAMETER DevicePath is NULL or PackageList is NULL.
2033 AddDevicePathPackage (
2034 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2035 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2036 IN EFI_DEVICE_PATH_PROTOCOL
*DevicePath
,
2037 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2042 if (DevicePath
== NULL
) {
2046 ASSERT (Private
!= NULL
);
2047 ASSERT (DatabaseRecord
!= NULL
);
2050 // Create a device path package and insert to packagelist
2052 Status
= InsertDevicePathPackage (
2055 DatabaseRecord
->PackageList
2057 if (EFI_ERROR (Status
)) {
2061 return InvokeRegisteredFunction (
2064 (VOID
*) DatabaseRecord
->PackageList
->DevicePathPkg
,
2065 EFI_HII_PACKAGE_DEVICE_PATH
,
2066 DatabaseRecord
->Handle
2072 This function insert a Keyboard Layout package to a package list node.
2073 This is a internal function.
2075 @param PackageHdr Pointer to a buffer stored with Keyboard Layout
2076 package information.
2077 @param NotifyType The type of change concerning the database.
2078 @param PackageList Pointer to a package list which will be inserted
2080 @param Package Created Keyboard Layout package
2082 @retval EFI_SUCCESS Keyboard Layout Package is inserted successfully.
2083 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2084 Keyboard Layout package.
2085 @retval EFI_INVALID_PARAMETER PackageHdr is NULL or PackageList is NULL.
2089 InsertKeyboardLayoutPackage (
2090 IN VOID
*PackageHdr
,
2091 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2092 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2093 OUT HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
**Package
2096 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2097 EFI_HII_PACKAGE_HEADER PackageHeader
;
2100 if (PackageHdr
== NULL
|| PackageList
== NULL
) {
2101 return EFI_INVALID_PARAMETER
;
2104 CopyMem (&PackageHeader
, PackageHdr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2107 // Create a Keyboard Layout package node
2109 KeyboardLayoutPackage
= AllocateZeroPool (sizeof (HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
));
2110 if (KeyboardLayoutPackage
== NULL
) {
2111 Status
= EFI_OUT_OF_RESOURCES
;
2114 KeyboardLayoutPackage
->Signature
= HII_KB_LAYOUT_PACKAGE_SIGNATURE
;
2116 KeyboardLayoutPackage
->KeyboardPkg
= (UINT8
*) AllocateZeroPool (PackageHeader
.Length
);
2117 if (KeyboardLayoutPackage
->KeyboardPkg
== NULL
) {
2118 Status
= EFI_OUT_OF_RESOURCES
;
2122 CopyMem (KeyboardLayoutPackage
->KeyboardPkg
, PackageHdr
, PackageHeader
.Length
);
2123 InsertTailList (&PackageList
->KeyboardLayoutHdr
, &KeyboardLayoutPackage
->KeyboardEntry
);
2125 *Package
= KeyboardLayoutPackage
;
2127 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2128 PackageList
->PackageListHdr
.PackageLength
+= PackageHeader
.Length
;
2135 SafeFreePool (KeyboardLayoutPackage
->KeyboardPkg
);
2136 SafeFreePool (KeyboardLayoutPackage
);
2143 This function exports Keyboard Layout packages to a buffer.
2144 This is a internal function.
2146 @param Private Hii database private structure.
2147 @param Handle Identification of a package list.
2148 @param PackageList Pointer to a package list which will be exported.
2149 @param UsedSize The length of buffer be used.
2150 @param BufferSize Length of the Buffer.
2151 @param Buffer Allocated space for storing exported data.
2152 @param ResultSize The size of the already exported content of this
2155 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2157 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2161 ExportKeyboardLayoutPackages (
2162 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2163 IN EFI_HII_HANDLE Handle
,
2164 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2166 IN UINTN BufferSize
,
2167 IN OUT VOID
*Buffer
,
2168 IN OUT UINTN
*ResultSize
2172 UINTN PackageLength
;
2174 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2175 EFI_HII_PACKAGE_HEADER PackageHeader
;
2177 if (Private
== NULL
|| PackageList
== NULL
|| ResultSize
== NULL
) {
2178 return EFI_INVALID_PARAMETER
;
2181 if (BufferSize
> 0 && Buffer
== NULL
) {
2182 return EFI_INVALID_PARAMETER
;
2186 Status
= EFI_SUCCESS
;
2188 for (Link
= PackageList
->KeyboardLayoutHdr
.ForwardLink
; Link
!= &PackageList
->KeyboardLayoutHdr
; Link
= Link
->ForwardLink
) {
2189 Package
= CR (Link
, HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
, KeyboardEntry
, HII_KB_LAYOUT_PACKAGE_SIGNATURE
);
2190 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2191 PackageLength
+= PackageHeader
.Length
;
2192 if (PackageLength
+ *ResultSize
+ UsedSize
<= BufferSize
) {
2194 // Invoke registered notification function with EXPORT_PACK notify type
2196 Status
= InvokeRegisteredFunction (
2198 EFI_HII_DATABASE_NOTIFY_EXPORT_PACK
,
2199 (EFI_HII_PACKAGE_HEADER
*) Package
,
2200 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2203 ASSERT_EFI_ERROR (Status
);
2206 // Copy Keyboard Layout package
2208 CopyMem (Buffer
, Package
->KeyboardPkg
, PackageHeader
.Length
);
2209 Buffer
= (UINT8
*) Buffer
+ PackageHeader
.Length
;
2213 *ResultSize
+= PackageLength
;
2219 This function deletes all Keyboard Layout packages from a package list node.
2220 This is a internal function.
2222 @param Private Hii database private data.
2223 @param Handle Handle of the package list which contains the to
2224 be removed Keyboard Layout packages.
2225 @param PackageList Pointer to a package list that contains removing
2228 @retval EFI_SUCCESS Keyboard Layout Package(s) is deleted
2230 @retval EFI_INVALID_PARAMETER Any input parameter is not valid.
2234 RemoveKeyboardLayoutPackages (
2235 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2236 IN EFI_HII_HANDLE Handle
,
2237 IN OUT HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
2240 LIST_ENTRY
*ListHead
;
2241 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
2242 EFI_HII_PACKAGE_HEADER PackageHeader
;
2245 ListHead
= &PackageList
->KeyboardLayoutHdr
;
2247 while (!IsListEmpty (ListHead
)) {
2249 ListHead
->ForwardLink
,
2250 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
2252 HII_KB_LAYOUT_PACKAGE_SIGNATURE
2254 Status
= InvokeRegisteredFunction (
2256 EFI_HII_DATABASE_NOTIFY_REMOVE_PACK
,
2258 EFI_HII_PACKAGE_KEYBOARD_LAYOUT
,
2261 if (EFI_ERROR (Status
)) {
2265 RemoveEntryList (&Package
->KeyboardEntry
);
2266 CopyMem (&PackageHeader
, Package
->KeyboardPkg
, sizeof (EFI_HII_PACKAGE_HEADER
));
2267 PackageList
->PackageListHdr
.PackageLength
-= PackageHeader
.Length
;
2268 SafeFreePool (Package
->KeyboardPkg
);
2269 SafeFreePool (Package
);
2277 This function will insert a package list to hii database firstly then
2278 invoke notification functions if any. It is the worker function of
2279 HiiNewPackageList and HiiUpdatePackageList.
2281 This is a internal function.
2283 @param Private Hii database private structure.
2284 @param NotifyType The type of change concerning the database.
2285 @param PackageList Pointer to a package list.
2286 @param DatabaseRecord Pointer to a database record contains a package
2287 list instance which will be inserted to.
2289 @retval EFI_SUCCESS All incoming packages are inserted to current
2291 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2292 Device path package.
2293 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2298 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2299 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
2300 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2301 IN OUT HII_DATABASE_RECORD
*DatabaseRecord
2305 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
2306 HII_IFR_PACKAGE_INSTANCE
*FormPackage
;
2307 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*KeyboardLayoutPackage
;
2308 HII_STRING_PACKAGE_INSTANCE
*StringPackage
;
2309 HII_FONT_PACKAGE_INSTANCE
*FontPackage
;
2310 HII_SIMPLE_FONT_PACKAGE_INSTANCE
*SimpleFontPackage
;
2311 HII_IMAGE_PACKAGE_INSTANCE
*ImagePackage
;
2312 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2313 EFI_HII_PACKAGE_HEADER PackageHeader
;
2314 UINT32 OldPackageListLen
;
2317 // Initialize Variables
2322 // Process the package list header
2324 OldPackageListLen
= DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
;
2326 &DatabaseRecord
->PackageList
->PackageListHdr
,
2327 (VOID
*) PackageList
,
2328 sizeof (EFI_HII_PACKAGE_LIST_HEADER
)
2330 if (NotifyType
== EFI_HII_DATABASE_NOTIFY_ADD_PACK
) {
2331 DatabaseRecord
->PackageList
->PackageListHdr
.PackageLength
= OldPackageListLen
;
2334 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2335 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2337 Status
= EFI_SUCCESS
;
2339 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2340 switch (PackageHeader
.Type
) {
2341 case EFI_HII_PACKAGE_TYPE_GUID
:
2342 Status
= InsertGuidPackage (
2345 DatabaseRecord
->PackageList
,
2348 if (EFI_ERROR (Status
)) {
2351 Status
= InvokeRegisteredFunction (
2354 (VOID
*) GuidPackage
,
2355 (UINT8
) (PackageHeader
.Type
),
2356 DatabaseRecord
->Handle
2359 case EFI_HII_PACKAGE_FORM
:
2360 Status
= InsertFormPackage (
2363 DatabaseRecord
->PackageList
,
2366 if (EFI_ERROR (Status
)) {
2369 Status
= InvokeRegisteredFunction (
2372 (VOID
*) FormPackage
,
2373 (UINT8
) (PackageHeader
.Type
),
2374 DatabaseRecord
->Handle
2377 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2378 Status
= InsertKeyboardLayoutPackage (
2381 DatabaseRecord
->PackageList
,
2382 &KeyboardLayoutPackage
2384 if (EFI_ERROR (Status
)) {
2387 Status
= InvokeRegisteredFunction (
2390 (VOID
*) KeyboardLayoutPackage
,
2391 (UINT8
) (PackageHeader
.Type
),
2392 DatabaseRecord
->Handle
2395 case EFI_HII_PACKAGE_STRINGS
:
2396 Status
= InsertStringPackage (
2400 DatabaseRecord
->PackageList
,
2403 if (EFI_ERROR (Status
)) {
2406 Status
= InvokeRegisteredFunction (
2409 (VOID
*) StringPackage
,
2410 (UINT8
) (PackageHeader
.Type
),
2411 DatabaseRecord
->Handle
2414 case EFI_HII_PACKAGE_FONTS
:
2415 Status
= InsertFontPackage (
2419 DatabaseRecord
->PackageList
,
2422 if (EFI_ERROR (Status
)) {
2425 Status
= InvokeRegisteredFunction (
2428 (VOID
*) FontPackage
,
2429 (UINT8
) (PackageHeader
.Type
),
2430 DatabaseRecord
->Handle
2433 case EFI_HII_PACKAGE_IMAGES
:
2434 Status
= InsertImagePackage (
2437 DatabaseRecord
->PackageList
,
2440 if (EFI_ERROR (Status
)) {
2443 Status
= InvokeRegisteredFunction (
2446 (VOID
*) ImagePackage
,
2447 (UINT8
) (PackageHeader
.Type
),
2448 DatabaseRecord
->Handle
2451 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2452 Status
= InsertSimpleFontPackage (
2455 DatabaseRecord
->PackageList
,
2458 if (EFI_ERROR (Status
)) {
2461 Status
= InvokeRegisteredFunction (
2464 (VOID
*) SimpleFontPackage
,
2465 (UINT8
) (PackageHeader
.Type
),
2466 DatabaseRecord
->Handle
2469 case EFI_HII_PACKAGE_DEVICE_PATH
:
2470 Status
= AddDevicePathPackage (
2473 (EFI_DEVICE_PATH_PROTOCOL
*) ((UINT8
*) PackageHdrPtr
+ sizeof (EFI_HII_PACKAGE_HEADER
)),
2481 if (EFI_ERROR (Status
)) {
2485 // goto header of next package
2487 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2488 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2496 This function exports a package list to a buffer. It is the worker function
2497 of HiiExportPackageList.
2499 This is a internal function.
2501 @param Private Hii database private structure.
2502 @param Handle Identification of a package list.
2503 @param PackageList Pointer to a package list which will be exported.
2504 @param UsedSize The length of buffer has been used by exporting
2505 package lists when Handle is NULL.
2506 @param BufferSize Length of the Buffer.
2507 @param Buffer Allocated space for storing exported data.
2509 @retval EFI_SUCCESS Keyboard Layout Packages are exported
2511 @retval EFI_INVALID_PARAMETER Any input parameter is invalid.
2516 IN HII_DATABASE_PRIVATE_DATA
*Private
,
2517 IN EFI_HII_HANDLE Handle
,
2518 IN HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
,
2519 IN OUT UINTN
*UsedSize
,
2520 IN UINTN BufferSize
,
2521 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
2526 EFI_HII_PACKAGE_HEADER EndofPackageList
;
2528 ASSERT (Private
!= NULL
|| PackageList
!= NULL
|| UsedSize
!= NULL
);
2529 ASSERT (Private
->Signature
== HII_DATABASE_PRIVATE_DATA_SIGNATURE
);
2530 ASSERT (IsHiiHandleValid (Handle
));
2532 if (BufferSize
> 0 && Buffer
== NULL
) {
2533 return EFI_INVALID_PARAMETER
;
2537 // Copy the package list header
2538 // ResultSize indicates the length of the exported bytes of this package list
2540 ResultSize
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
2541 if (ResultSize
+ *UsedSize
<= BufferSize
) {
2542 CopyMem ((VOID
*) Buffer
, PackageList
, ResultSize
);
2545 // Copy the packages and invoke EXPORT_PACK notify functions if exists.
2547 Status
= ExportGuidPackages (
2553 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2556 if (EFI_ERROR (Status
)) {
2559 Status
= ExportFormPackages (
2565 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2568 if (EFI_ERROR (Status
)) {
2571 Status
= ExportKeyboardLayoutPackages (
2577 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2580 if (EFI_ERROR (Status
)) {
2583 Status
= ExportStringPackages (
2589 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2592 if (EFI_ERROR (Status
)) {
2595 Status
= ExportFontPackages (
2601 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2604 if (EFI_ERROR (Status
)) {
2607 Status
= ExportImagePackages (
2613 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2616 if (EFI_ERROR (Status
)) {
2619 Status
= ExportSimpleFontPackages (
2625 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2628 if (EFI_ERROR (Status
)) {
2631 Status
= ExportDevicePathPackage (
2637 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2640 if (EFI_ERROR (Status
)) {
2644 // Append the package list end.
2646 EndofPackageList
.Length
= sizeof (EFI_HII_PACKAGE_HEADER
);
2647 EndofPackageList
.Type
= EFI_HII_PACKAGE_END
;
2648 if (ResultSize
+ *UsedSize
+ sizeof (EFI_HII_PACKAGE_HEADER
) <= BufferSize
) {
2650 (VOID
*) ((UINT8
*) Buffer
+ ResultSize
),
2651 (VOID
*) &EndofPackageList
,
2652 sizeof (EFI_HII_PACKAGE_HEADER
)
2656 *UsedSize
+= ResultSize
+ sizeof (EFI_HII_PACKAGE_HEADER
);
2663 This function adds the packages in the package list to the database and returns a handle. If there is a
2664 EFI_DEVICE_PATH_PROTOCOL associated with the DriverHandle, then this function will
2665 create a package of type EFI_PACKAGE_TYPE_DEVICE_PATH and add it to the package list.
2667 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2669 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2671 @param DriverHandle Associate the package list with this EFI handle.
2672 @param Handle A pointer to the EFI_HII_HANDLE instance.
2674 @retval EFI_SUCCESS The package list associated with the Handle was
2675 added to the HII database.
2676 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary resources for the new
2678 @retval EFI_INVALID_PARAMETER PackageList is NULL or Handle is NULL.
2679 @retval EFI_INVALID_PARAMETER PackageListGuid already exists in database.
2685 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2686 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
,
2687 IN CONST EFI_HANDLE DriverHandle
,
2688 OUT EFI_HII_HANDLE
*Handle
2692 HII_DATABASE_PRIVATE_DATA
*Private
;
2693 HII_DATABASE_RECORD
*DatabaseRecord
;
2694 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
2696 EFI_GUID PackageListGuid
;
2698 if (This
== NULL
|| PackageList
== NULL
|| Handle
== NULL
) {
2699 return EFI_INVALID_PARAMETER
;
2702 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2703 CopyMem (&PackageListGuid
, (VOID
*) PackageList
, sizeof (EFI_GUID
));
2706 // Check the Package list GUID to guarantee this GUID is unique in database.
2708 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2709 DatabaseRecord
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2711 &(DatabaseRecord
->PackageList
->PackageListHdr
.PackageListGuid
),
2715 return EFI_INVALID_PARAMETER
;
2720 // Build a PackageList node
2722 Status
= GenerateHiiDatabaseRecord (Private
, &DatabaseRecord
);
2723 if (EFI_ERROR (Status
)) {
2728 // Fill in information of the created Package List node
2729 // according to incoming package list.
2731 Status
= AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, PackageList
, DatabaseRecord
);
2732 if (EFI_ERROR (Status
)) {
2736 DatabaseRecord
->DriverHandle
= DriverHandle
;
2739 // Create a Device path package and add into the package list if exists.
2741 Status
= gBS
->HandleProtocol (
2743 &gEfiDevicePathProtocolGuid
,
2744 (VOID
**) &DevicePath
2746 if (!EFI_ERROR (Status
)) {
2747 Status
= AddDevicePathPackage (Private
, EFI_HII_DATABASE_NOTIFY_NEW_PACK
, DevicePath
, DatabaseRecord
);
2748 ASSERT_EFI_ERROR (Status
);
2751 *Handle
= DatabaseRecord
->Handle
;
2757 This function removes the package list that is associated with a handle Handle
2758 from the HII database. Before removing the package, any registered functions
2759 with the notification type REMOVE_PACK and the same package type will be called.
2761 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2763 @param Handle The handle that was registered to the data that is
2764 requested for removal.
2766 @retval EFI_SUCCESS The data associated with the Handle was removed
2767 from the HII database.
2768 @retval EFI_NOT_FOUND The specified andle is not in database.
2769 @retval EFI_INVALID_PARAMETER The Handle was not valid.
2774 HiiRemovePackageList (
2775 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2776 IN EFI_HII_HANDLE Handle
2780 HII_DATABASE_PRIVATE_DATA
*Private
;
2782 HII_DATABASE_RECORD
*Node
;
2783 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
2784 HII_HANDLE
*HiiHandle
;
2787 return EFI_INVALID_PARAMETER
;
2790 if (!IsHiiHandleValid (Handle
)) {
2791 return EFI_NOT_FOUND
;
2794 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2797 // Get the packagelist to be removed.
2799 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2800 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2801 if (Node
->Handle
== Handle
) {
2802 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
2803 ASSERT (PackageList
!= NULL
);
2806 // Call registered functions with REMOVE_PACK before removing packages
2807 // then remove them.
2809 Status
= RemoveGuidPackages (Private
, Handle
, PackageList
);
2810 if (EFI_ERROR (Status
)) {
2813 Status
= RemoveFormPackages (Private
, Handle
, PackageList
);
2814 if (EFI_ERROR (Status
)) {
2817 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, PackageList
);
2818 if (EFI_ERROR (Status
)) {
2821 Status
= RemoveStringPackages (Private
, Handle
, PackageList
);
2822 if (EFI_ERROR (Status
)) {
2825 Status
= RemoveFontPackages (Private
, Handle
, PackageList
);
2826 if (EFI_ERROR (Status
)) {
2829 Status
= RemoveImagePackages (Private
, Handle
, PackageList
);
2830 if (EFI_ERROR (Status
)) {
2833 Status
= RemoveSimpleFontPackages (Private
, Handle
, PackageList
);
2834 if (EFI_ERROR (Status
)) {
2837 Status
= RemoveDevicePathPackage (Private
, Handle
, PackageList
);
2838 if (EFI_ERROR (Status
)) {
2843 // Free resources of the package list
2845 RemoveEntryList (&Node
->DatabaseEntry
);
2847 HiiHandle
= (HII_HANDLE
*) Handle
;
2848 RemoveEntryList (&HiiHandle
->Handle
);
2849 Private
->HiiHandleCount
--;
2850 ASSERT (Private
->HiiHandleCount
>= 0);
2852 HiiHandle
->Signature
= 0;
2853 SafeFreePool (HiiHandle
);
2854 SafeFreePool (Node
->PackageList
);
2855 SafeFreePool (Node
);
2861 return EFI_NOT_FOUND
;
2866 This function updates the existing package list (which has the specified Handle)
2867 in the HII databases, using the new package list specified by PackageList.
2869 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2871 @param Handle The handle that was registered to the data that is
2872 requested to be updated.
2873 @param PackageList A pointer to an EFI_HII_PACKAGE_LIST_HEADER
2876 @retval EFI_SUCCESS The HII database was successfully updated.
2877 @retval EFI_OUT_OF_RESOURCES Unable to allocate enough memory for the updated
2879 @retval EFI_INVALID_PARAMETER PackageList was NULL.
2880 @retval EFI_NOT_FOUND The specified Handle is not in database.
2885 HiiUpdatePackageList (
2886 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
2887 IN EFI_HII_HANDLE Handle
,
2888 IN CONST EFI_HII_PACKAGE_LIST_HEADER
*PackageList
2892 HII_DATABASE_PRIVATE_DATA
*Private
;
2894 HII_DATABASE_RECORD
*Node
;
2895 EFI_HII_PACKAGE_HEADER
*PackageHdrPtr
;
2896 HII_DATABASE_PACKAGE_LIST_INSTANCE
*OldPackageList
;
2897 EFI_HII_PACKAGE_HEADER PackageHeader
;
2899 if (This
== NULL
|| PackageList
== NULL
) {
2900 return EFI_INVALID_PARAMETER
;
2903 if (!IsHiiHandleValid (Handle
)) {
2904 return EFI_NOT_FOUND
;
2907 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
2909 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageList
+ sizeof (EFI_HII_PACKAGE_LIST_HEADER
));
2911 Status
= EFI_SUCCESS
;
2914 // Get original packagelist to be updated
2916 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
2917 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
2918 if (Node
->Handle
== Handle
) {
2919 OldPackageList
= Node
->PackageList
;
2921 // Remove the package if its type matches one of the package types which is
2922 // contained in the new package list.
2924 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2925 while (PackageHeader
.Type
!= EFI_HII_PACKAGE_END
) {
2926 switch (PackageHeader
.Type
) {
2927 case EFI_HII_PACKAGE_TYPE_GUID
:
2928 Status
= RemoveGuidPackages (Private
, Handle
, OldPackageList
);
2930 case EFI_HII_PACKAGE_FORM
:
2931 Status
= RemoveFormPackages (Private
, Handle
, OldPackageList
);
2933 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
2934 Status
= RemoveKeyboardLayoutPackages (Private
, Handle
, OldPackageList
);
2936 case EFI_HII_PACKAGE_STRINGS
:
2937 Status
= RemoveStringPackages (Private
, Handle
, OldPackageList
);
2939 case EFI_HII_PACKAGE_FONTS
:
2940 Status
= RemoveFontPackages (Private
, Handle
, OldPackageList
);
2942 case EFI_HII_PACKAGE_IMAGES
:
2943 Status
= RemoveImagePackages (Private
, Handle
, OldPackageList
);
2945 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
2946 Status
= RemoveSimpleFontPackages (Private
, Handle
, OldPackageList
);
2948 case EFI_HII_PACKAGE_DEVICE_PATH
:
2949 Status
= RemoveDevicePathPackage (Private
, Handle
, OldPackageList
);
2953 if (EFI_ERROR (Status
)) {
2957 PackageHdrPtr
= (EFI_HII_PACKAGE_HEADER
*) ((UINT8
*) PackageHdrPtr
+ PackageHeader
.Length
);
2958 CopyMem (&PackageHeader
, PackageHdrPtr
, sizeof (EFI_HII_PACKAGE_HEADER
));
2962 // Add all of the packages within the new package list
2964 return AddPackages (Private
, EFI_HII_DATABASE_NOTIFY_ADD_PACK
, PackageList
, Node
);
2968 return EFI_NOT_FOUND
;
2973 This function returns a list of the package handles of the specified type
2974 that are currently active in the database. The pseudo-type
2975 EFI_HII_PACKAGE_TYPE_ALL will cause all package handles to be listed.
2977 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
2979 @param PackageType Specifies the package type of the packages to list
2980 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
2982 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
2983 this is the pointer to the GUID which must match
2984 the Guid field of EFI_HII_GUID_PACKAGE_GUID_HDR.
2985 Otherwise, it must be NULL.
2986 @param HandleBufferLength On input, a pointer to the length of the handle
2987 buffer. On output, the length of the handle
2988 buffer that is required for the handles found.
2989 @param Handle An array of EFI_HII_HANDLE instances returned.
2991 @retval EFI_SUCCESS The matching handles are outputed successfully.
2992 HandleBufferLength is updated with the actual length.
2993 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
2994 Handle is too small to support the number of
2995 handles. HandleBufferLength is updated with a
2996 value that will enable the data to fit.
2997 @retval EFI_NOT_FOUND No matching handle could not be found in database.
2998 @retval EFI_INVALID_PARAMETER Handle or HandleBufferLength was NULL.
3000 @retval EFI_INVALID_PARAMETER PackageType is not a EFI_HII_PACKAGE_TYPE_GUID but
3001 PackageGuid is not NULL, PackageType is a EFI_HII_
3002 PACKAGE_TYPE_GUID but PackageGuid is NULL.
3007 HiiListPackageLists (
3008 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3009 IN UINT8 PackageType
,
3010 IN CONST EFI_GUID
*PackageGuid
,
3011 IN OUT UINTN
*HandleBufferLength
,
3012 OUT EFI_HII_HANDLE
*Handle
3015 HII_GUID_PACKAGE_INSTANCE
*GuidPackage
;
3016 HII_DATABASE_PRIVATE_DATA
*Private
;
3017 HII_DATABASE_RECORD
*Node
;
3020 HII_HANDLE
**Result
;
3022 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3026 // Check input parameters
3028 if (This
== NULL
|| HandleBufferLength
== NULL
) {
3029 return EFI_INVALID_PARAMETER
;
3031 if (*HandleBufferLength
> 0 && Handle
== NULL
) {
3032 return EFI_INVALID_PARAMETER
;
3034 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3035 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3036 return EFI_INVALID_PARAMETER
;
3039 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3041 Result
= (HII_HANDLE
**) Handle
;
3044 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3045 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3046 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3047 switch (PackageType
) {
3048 case EFI_HII_PACKAGE_TYPE_GUID
:
3049 for (Link1
= PackageList
->GuidPkgHdr
.ForwardLink
; Link1
!= &PackageList
->GuidPkgHdr
; Link1
= Link1
->ForwardLink
) {
3050 GuidPackage
= CR (Link1
, HII_GUID_PACKAGE_INSTANCE
, GuidEntry
, HII_GUID_PACKAGE_SIGNATURE
);
3052 (EFI_GUID
*) PackageGuid
,
3053 (EFI_GUID
*) (GuidPackage
->GuidPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
))
3060 case EFI_HII_PACKAGE_FORM
:
3061 if (!IsListEmpty (&PackageList
->FormPkgHdr
)) {
3065 case EFI_HII_PACKAGE_KEYBOARD_LAYOUT
:
3066 if (!IsListEmpty (&PackageList
->KeyboardLayoutHdr
)) {
3070 case EFI_HII_PACKAGE_STRINGS
:
3071 if (!IsListEmpty (&PackageList
->StringPkgHdr
)) {
3075 case EFI_HII_PACKAGE_FONTS
:
3076 if (!IsListEmpty (&PackageList
->FontPkgHdr
)) {
3080 case EFI_HII_PACKAGE_IMAGES
:
3081 if (PackageList
->ImagePkg
!= NULL
) {
3085 case EFI_HII_PACKAGE_SIMPLE_FONTS
:
3086 if (!IsListEmpty (&PackageList
->SimpleFontPkgHdr
)) {
3090 case EFI_HII_PACKAGE_DEVICE_PATH
:
3091 if (PackageList
->DevicePathPkg
!= NULL
) {
3096 // Pesudo-type EFI_HII_PACKAGE_TYPE_ALL will cause all package handles
3099 case EFI_HII_PACKAGE_TYPE_ALL
:
3107 // This active package list has the specified package type, list it.
3110 ResultSize
+= sizeof (EFI_HII_HANDLE
);
3111 if (ResultSize
<= *HandleBufferLength
) {
3112 *Result
++ = Node
->Handle
;
3118 if (ResultSize
== 0) {
3119 return EFI_NOT_FOUND
;
3122 if (*HandleBufferLength
< ResultSize
) {
3123 *HandleBufferLength
= ResultSize
;
3124 return EFI_BUFFER_TOO_SMALL
;
3127 *HandleBufferLength
= ResultSize
;
3133 This function will export one or all package lists in the database to a buffer.
3134 For each package list exported, this function will call functions registered
3135 with EXPORT_PACK and then copy the package list to the buffer.
3137 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3139 @param Handle An EFI_HII_HANDLE that corresponds to the desired
3140 package list in the HII database to export or NULL
3141 to indicate all package lists should be exported.
3142 @param BufferSize On input, a pointer to the length of the buffer.
3143 On output, the length of the buffer that is
3144 required for the exported data.
3145 @param Buffer A pointer to a buffer that will contain the
3146 results of the export function.
3148 @retval EFI_SUCCESS Package exported.
3149 @retval EFI_BUFFER_TO_SMALL The HandleBufferLength parameter indicates that
3150 Handle is too small to support the number of
3151 handles. HandleBufferLength is updated with a
3152 value that will enable the data to fit.
3153 @retval EFI_NOT_FOUND The specifiecd Handle could not be found in the
3155 @retval EFI_INVALID_PARAMETER Handle or Buffer or BufferSize was NULL.
3160 HiiExportPackageLists (
3161 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3162 IN EFI_HII_HANDLE Handle
,
3163 IN OUT UINTN
*BufferSize
,
3164 OUT EFI_HII_PACKAGE_LIST_HEADER
*Buffer
3169 HII_DATABASE_PRIVATE_DATA
*Private
;
3170 HII_DATABASE_RECORD
*Node
;
3173 if (This
== NULL
|| BufferSize
== NULL
|| Handle
== NULL
) {
3174 return EFI_INVALID_PARAMETER
;
3176 if (*BufferSize
> 0 && Buffer
== NULL
) {
3177 return EFI_INVALID_PARAMETER
;
3179 if (!IsHiiHandleValid (Handle
)) {
3180 return EFI_NOT_FOUND
;
3183 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3186 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3187 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3188 if (Handle
== NULL
) {
3190 // Export all package lists in current hii database.
3192 Status
= ExportPackageList (
3195 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3198 (EFI_HII_PACKAGE_LIST_HEADER
*)((UINT8
*) Buffer
+ UsedSize
)
3200 ASSERT_EFI_ERROR (Status
);
3202 else if (Handle
!= NULL
&& Node
->Handle
== Handle
) {
3203 Status
= ExportPackageList (
3206 (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
),
3211 ASSERT_EFI_ERROR (Status
);
3212 if (*BufferSize
< UsedSize
) {
3213 *BufferSize
= UsedSize
;
3214 return EFI_BUFFER_TOO_SMALL
;
3220 if (Handle
== NULL
&& UsedSize
!= 0) {
3221 if (*BufferSize
< UsedSize
) {
3222 *BufferSize
= UsedSize
;
3223 return EFI_BUFFER_TOO_SMALL
;
3228 return EFI_NOT_FOUND
;
3233 This function registers a function which will be called when specified actions related to packages of
3234 the specified type occur in the HII database. By registering a function, other HII-related drivers are
3235 notified when specific package types are added, removed or updated in the HII database.
3236 Each driver or application which registers a notification should use
3237 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify() before exiting.
3239 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3241 @param PackageType Specifies the package type of the packages to list
3242 or EFI_HII_PACKAGE_TYPE_ALL for all packages to be
3244 @param PackageGuid If PackageType is EFI_HII_PACKAGE_TYPE_GUID, then
3245 this is the pointer to the GUID which must match
3247 EFI_HII_GUID_PACKAGE_GUID_HDR. Otherwise, it must
3249 @param PackageNotifyFn Points to the function to be called when the event
3251 NotificationType occurs.
3252 @param NotifyType Describes the types of notification which this
3253 function will be receiving.
3254 @param NotifyHandle Points to the unique handle assigned to the
3255 registered notification. Can be used in
3256 EFI_HII_DATABASE_PROTOCOL.UnregisterPackageNotify()
3257 to stop notifications.
3259 @retval EFI_SUCCESS Notification registered successfully.
3260 @retval EFI_OUT_OF_RESOURCES Unable to allocate necessary data structures
3261 @retval EFI_INVALID_PARAMETER NotifyHandle is NULL.
3262 @retval EFI_INVALID_PARAMETER PackageGuid is not NULL when PackageType is not
3263 EFI_HII_PACKAGE_TYPE_GUID.
3264 @retval EFI_INVALID_PARAMETER PackageGuid is NULL when PackageType is
3265 EFI_HII_PACKAGE_TYPE_GUID.
3270 HiiRegisterPackageNotify (
3271 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3272 IN UINT8 PackageType
,
3273 IN CONST EFI_GUID
*PackageGuid
,
3274 IN CONST EFI_HII_DATABASE_NOTIFY PackageNotifyFn
,
3275 IN EFI_HII_DATABASE_NOTIFY_TYPE NotifyType
,
3276 OUT EFI_HANDLE
*NotifyHandle
3279 HII_DATABASE_PRIVATE_DATA
*Private
;
3280 HII_DATABASE_NOTIFY
*Notify
;
3283 if (This
== NULL
|| NotifyHandle
== NULL
) {
3284 return EFI_INVALID_PARAMETER
;
3286 if ((PackageType
== EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
== NULL
) ||
3287 (PackageType
!= EFI_HII_PACKAGE_TYPE_GUID
&& PackageGuid
!= NULL
)) {
3288 return EFI_INVALID_PARAMETER
;
3291 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3294 // Allocate a notification node
3296 Notify
= (HII_DATABASE_NOTIFY
*) AllocateZeroPool (sizeof (HII_DATABASE_NOTIFY
));
3297 if (Notify
== NULL
) {
3298 return EFI_OUT_OF_RESOURCES
;
3302 // Generate a notify handle
3304 Status
= gBS
->InstallMultipleProtocolInterfaces (
3305 &Notify
->NotifyHandle
,
3306 &mHiiDatabaseNotifyGuid
,
3310 ASSERT_EFI_ERROR (Status
);
3313 // Fill in the information to the notification node
3315 Notify
->Signature
= HII_DATABASE_NOTIFY_SIGNATURE
;
3316 Notify
->PackageType
= PackageType
;
3317 Notify
->PackageGuid
= (EFI_GUID
*) PackageGuid
;
3318 Notify
->PackageNotifyFn
= (EFI_HII_DATABASE_NOTIFY
) PackageNotifyFn
;
3319 Notify
->NotifyType
= NotifyType
;
3321 InsertTailList (&Private
->DatabaseNotifyList
, &Notify
->DatabaseNotifyEntry
);
3322 *NotifyHandle
= Notify
->NotifyHandle
;
3329 Removes the specified HII database package-related notification.
3331 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3333 @param NotificationHandle The handle of the notification function being
3336 @retval EFI_SUCCESS Notification is unregistered successfully.
3337 @retval EFI_INVALID_PARAMETER The Handle is invalid.
3338 @retval EFI_NOT_FOUND The incoming notification handle does not exist
3339 in current hii database.
3344 HiiUnregisterPackageNotify (
3345 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3346 IN EFI_HANDLE NotificationHandle
3349 HII_DATABASE_PRIVATE_DATA
*Private
;
3350 HII_DATABASE_NOTIFY
*Notify
;
3355 return EFI_INVALID_PARAMETER
;
3358 if (NotificationHandle
== NULL
) {
3359 return EFI_NOT_FOUND
;
3362 Status
= gBS
->OpenProtocol (
3364 &mHiiDatabaseNotifyGuid
,
3368 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
3370 if (EFI_ERROR (Status
)) {
3371 return EFI_NOT_FOUND
;
3374 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3376 for (Link
= Private
->DatabaseNotifyList
.ForwardLink
; Link
!= &Private
->DatabaseNotifyList
; Link
= Link
->ForwardLink
) {
3377 Notify
= CR (Link
, HII_DATABASE_NOTIFY
, DatabaseNotifyEntry
, HII_DATABASE_NOTIFY_SIGNATURE
);
3378 if (Notify
->NotifyHandle
== NotificationHandle
) {
3380 // Remove the matching notification node
3382 RemoveEntryList (&Notify
->DatabaseNotifyEntry
);
3383 Status
= gBS
->UninstallMultipleProtocolInterfaces (
3384 Notify
->NotifyHandle
,
3385 &mHiiDatabaseNotifyGuid
,
3389 ASSERT_EFI_ERROR (Status
);
3390 SafeFreePool (Notify
);
3397 return EFI_NOT_FOUND
;
3402 This routine retrieves an array of GUID values for each keyboard layout that
3403 was previously registered in the system.
3405 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3407 @param KeyGuidBufferLength On input, a pointer to the length of the keyboard
3408 GUID buffer. On output, the length of the handle
3409 buffer that is required for the handles found.
3410 @param KeyGuidBuffer An array of keyboard layout GUID instances
3413 @retval EFI_SUCCESS KeyGuidBuffer was updated successfully.
3414 @retval EFI_BUFFER_TOO_SMALL The KeyGuidBufferLength parameter indicates
3415 that KeyGuidBuffer is too small to support the
3416 number of GUIDs. KeyGuidBufferLength is
3417 updated with a value that will enable the data to
3419 @retval EFI_INVALID_PARAMETER The KeyGuidBuffer or KeyGuidBufferLength was NULL.
3420 @retval EFI_NOT_FOUND There was no keyboard layout.
3425 HiiFindKeyboardLayouts (
3426 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3427 IN OUT UINT16
*KeyGuidBufferLength
,
3428 OUT EFI_GUID
*KeyGuidBuffer
3431 HII_DATABASE_PRIVATE_DATA
*Private
;
3432 HII_DATABASE_RECORD
*Node
;
3433 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3439 UINT16 LayoutLength
;
3441 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3443 if (This
== NULL
|| KeyGuidBufferLength
== NULL
) {
3444 return EFI_INVALID_PARAMETER
;
3447 if (*KeyGuidBufferLength
> 0 && KeyGuidBuffer
== NULL
) {
3448 return EFI_INVALID_PARAMETER
;
3451 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3455 // Search all package lists in whole database to retrieve keyboard layout.
3457 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3458 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3459 PackageList
= Node
->PackageList
;
3460 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3461 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3462 Link1
= Link1
->ForwardLink
3465 // Find out all Keyboard Layout packages in this package list.
3469 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3471 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3473 Layout
= (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3476 (UINT8
*) Package
->KeyboardPkg
+ sizeof (EFI_HII_PACKAGE_HEADER
),
3479 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3480 ResultSize
+= sizeof (EFI_GUID
);
3481 if (ResultSize
<= *KeyGuidBufferLength
) {
3482 CopyMem (KeyGuidBuffer
+ (ResultSize
/ sizeof (EFI_GUID
) - 1), Layout
+ sizeof (UINT16
), sizeof (EFI_GUID
));
3483 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3484 Layout
= Layout
+ LayoutLength
;
3490 if (ResultSize
== 0) {
3491 return EFI_NOT_FOUND
;
3494 if (*KeyGuidBufferLength
< ResultSize
) {
3495 *KeyGuidBufferLength
= ResultSize
;
3496 return EFI_BUFFER_TOO_SMALL
;
3499 *KeyGuidBufferLength
= ResultSize
;
3505 This routine retrieves the requested keyboard layout. The layout is a physical description of the keys
3506 on a keyboard and the character(s) that are associated with a particular set of key strokes.
3508 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3510 @param KeyGuid A pointer to the unique ID associated with a given
3511 keyboard layout. If KeyGuid is NULL then the
3512 current layout will be retrieved.
3513 @param KeyboardLayoutLength On input, a pointer to the length of the
3514 KeyboardLayout buffer. On output, the length of
3515 the data placed into KeyboardLayout.
3516 @param KeyboardLayout A pointer to a buffer containing the retrieved
3519 @retval EFI_SUCCESS The keyboard layout was retrieved successfully.
3520 @retval EFI_NOT_FOUND The requested keyboard layout was not found.
3521 @retval EFI_INVALID_PARAMETER The KeyboardLayout or KeyboardLayoutLength was
3523 @retval EFI_BUFFER_TOO_SMALL The KeyboardLayoutLength parameter indicates
3524 that KeyboardLayout is too small to support the
3525 requested keyboard layout. KeyboardLayoutLength is
3526 updated with a value that will enable the
3532 HiiGetKeyboardLayout (
3533 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3534 IN CONST EFI_GUID
*KeyGuid
,
3535 IN OUT UINT16
*KeyboardLayoutLength
,
3536 OUT EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
3539 HII_DATABASE_PRIVATE_DATA
*Private
;
3540 HII_DATABASE_RECORD
*Node
;
3541 HII_DATABASE_PACKAGE_LIST_INSTANCE
*PackageList
;
3547 UINT16 LayoutLength
;
3548 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
*Package
;
3550 if (This
== NULL
|| KeyboardLayoutLength
== NULL
) {
3551 return EFI_INVALID_PARAMETER
;
3553 if (*KeyboardLayoutLength
> 0 && KeyboardLayout
== NULL
) {
3554 return EFI_INVALID_PARAMETER
;
3557 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3559 // Retrieve the current keyboard layout.
3561 if (KeyGuid
== NULL
) {
3562 if (Private
->CurrentLayout
== NULL
) {
3563 return EFI_NOT_FOUND
;
3565 CopyMem (&LayoutLength
, Private
->CurrentLayout
, sizeof (UINT16
));
3566 if (*KeyboardLayoutLength
< LayoutLength
) {
3567 *KeyboardLayoutLength
= LayoutLength
;
3568 return EFI_BUFFER_TOO_SMALL
;
3570 CopyMem (KeyboardLayout
, Private
->CurrentLayout
, LayoutLength
);
3574 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3575 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3576 PackageList
= (HII_DATABASE_PACKAGE_LIST_INSTANCE
*) (Node
->PackageList
);
3577 for (Link1
= PackageList
->KeyboardLayoutHdr
.ForwardLink
;
3578 Link1
!= &PackageList
->KeyboardLayoutHdr
;
3579 Link1
= Link1
->ForwardLink
3583 HII_KEYBOARD_LAYOUT_PACKAGE_INSTANCE
,
3585 HII_KB_LAYOUT_PACKAGE_SIGNATURE
3588 Layout
= (UINT8
*) Package
->KeyboardPkg
+
3589 sizeof (EFI_HII_PACKAGE_HEADER
) + sizeof (UINT16
);
3590 CopyMem (&LayoutCount
, Layout
- sizeof (UINT16
), sizeof (UINT16
));
3591 for (Index
= 0; Index
< LayoutCount
; Index
++) {
3592 CopyMem (&LayoutLength
, Layout
, sizeof (UINT16
));
3593 if (CompareMem (Layout
+ sizeof (UINT16
), KeyGuid
, sizeof (EFI_GUID
)) == 0) {
3594 if (LayoutLength
<= *KeyboardLayoutLength
) {
3595 CopyMem (KeyboardLayout
, Layout
, LayoutLength
);
3598 *KeyboardLayoutLength
= LayoutLength
;
3599 return EFI_BUFFER_TOO_SMALL
;
3602 Layout
= Layout
+ LayoutLength
;
3607 return EFI_NOT_FOUND
;
3612 This routine sets the default keyboard layout to the one referenced by KeyGuid. When this routine
3613 is called, an event will be signaled of the EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID
3614 group type. This is so that agents which are sensitive to the current keyboard layout being changed
3615 can be notified of this change.
3617 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3619 @param KeyGuid A pointer to the unique ID associated with a given
3622 @retval EFI_SUCCESS The current keyboard layout was successfully set.
3623 @retval EFI_NOT_FOUND The referenced keyboard layout was not found, so
3625 @retval EFI_INVALID_PARAMETER The KeyGuid was NULL.
3630 HiiSetKeyboardLayout (
3631 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3632 IN CONST EFI_GUID
*KeyGuid
3635 HII_DATABASE_PRIVATE_DATA
*Private
;
3636 EFI_HII_KEYBOARD_LAYOUT
*KeyboardLayout
;
3637 UINT16 KeyboardLayoutLength
;
3640 if (This
== NULL
|| KeyGuid
== NULL
) {
3641 return EFI_INVALID_PARAMETER
;
3644 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3647 // The specified GUID equals the current keyboard layout GUID,
3650 if (CompareGuid (&Private
->CurrentLayoutGuid
, KeyGuid
)) {
3655 // Try to find the incoming keyboard layout data in current database.
3657 KeyboardLayoutLength
= 0;
3658 KeyboardLayout
= NULL
;
3659 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3660 if (Status
!= EFI_BUFFER_TOO_SMALL
) {
3664 KeyboardLayout
= (EFI_HII_KEYBOARD_LAYOUT
*) AllocateZeroPool (KeyboardLayoutLength
);
3665 ASSERT (KeyboardLayout
!= NULL
);
3666 Status
= HiiGetKeyboardLayout (This
, KeyGuid
, &KeyboardLayoutLength
, KeyboardLayout
);
3667 ASSERT_EFI_ERROR (Status
);
3670 // Backup current keyboard layout.
3672 CopyMem (&Private
->CurrentLayoutGuid
, KeyGuid
, sizeof (EFI_GUID
));
3673 SafeFreePool(Private
->CurrentLayout
);
3674 Private
->CurrentLayout
= KeyboardLayout
;
3677 // Signal EFI_HII_SET_KEYBOARD_LAYOUT_EVENT_GUID group to notify
3678 // current keyboard layout is changed.
3680 Status
= gBS
->SignalEvent (gHiiKeyboardLayoutChanged
);
3681 ASSERT_EFI_ERROR (Status
);
3688 Return the EFI handle associated with a package list.
3690 @param This A pointer to the EFI_HII_DATABASE_PROTOCOL
3692 @param PackageListHandle An EFI_HII_HANDLE that corresponds to the desired
3693 package list in the HIIdatabase.
3694 @param DriverHandle On return, contains the EFI_HANDLE which was
3695 registered with the package list in
3698 @retval EFI_SUCCESS The DriverHandle was returned successfully.
3699 @retval EFI_INVALID_PARAMETER The PackageListHandle was not valid or
3700 DriverHandle was NULL.
3701 @retval EFI_NOT_FOUND This PackageList handle can not be found in
3707 HiiGetPackageListHandle (
3708 IN CONST EFI_HII_DATABASE_PROTOCOL
*This
,
3709 IN EFI_HII_HANDLE PackageListHandle
,
3710 OUT EFI_HANDLE
*DriverHandle
3713 HII_DATABASE_PRIVATE_DATA
*Private
;
3714 HII_DATABASE_RECORD
*Node
;
3717 if (This
== NULL
|| DriverHandle
== NULL
) {
3718 return EFI_INVALID_PARAMETER
;
3721 if (!IsHiiHandleValid (PackageListHandle
)) {
3722 return EFI_INVALID_PARAMETER
;
3725 Private
= HII_DATABASE_DATABASE_PRIVATE_DATA_FROM_THIS (This
);
3727 for (Link
= Private
->DatabaseList
.ForwardLink
; Link
!= &Private
->DatabaseList
; Link
= Link
->ForwardLink
) {
3728 Node
= CR (Link
, HII_DATABASE_RECORD
, DatabaseEntry
, HII_DATABASE_RECORD_SIGNATURE
);
3729 if (Node
->Handle
== PackageListHandle
) {
3730 *DriverHandle
= Node
->DriverHandle
;
3735 return EFI_NOT_FOUND
;