2 Common Library Routines to assist handle HII elements.
4 Copyright (c) 2007 - 2008, Intel Corporation. <BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 #include "LibraryInternal.h"
19 // Hii relative protocols
22 EFI_HII_DATABASE_PROTOCOL
*gIfrLibHiiDatabase
;
23 EFI_HII_STRING_PROTOCOL
*gIfrLibHiiString
;
24 GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_GUID mIfrVendorGuid
= EFI_IFR_TIANO_GUID
;
27 ExtendedIfrSupportLib's constructor. It locates the required protocol:
28 gEfiHiiDatabaseProtocolGuid and gEfiHiiStringProtocolGuid.
30 @param ImageHandle The firmware allocated handle for the EFI image.
32 @param SystemTable A pointer to the EFI System Table.
34 @retval EFI_SUCCESS This function always completes successfully.
39 ExtendedIfrSupportLibConstructor (
40 IN EFI_HANDLE ImageHandle
,
41 IN EFI_SYSTEM_TABLE
*SystemTable
46 Status
= gBS
->LocateProtocol (&gEfiHiiDatabaseProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiDatabase
);
47 ASSERT_EFI_ERROR (Status
);
49 Status
= gBS
->LocateProtocol (&gEfiHiiStringProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiString
);
50 ASSERT_EFI_ERROR (Status
);
57 Extract formset class for given HII handle.
60 @param Handle The HII handle.
61 @param Class Class of the formset.
62 @param FormSetTitle Formset title string.
63 @param FormSetHelp Formset help string.
65 @retval EFI_SUCCESS Successfully extract Class for specified Hii handle.
66 @return Other values if failed to export packages for the given HII handle.
71 IfrLibExtractClassFromHiiHandle (
72 IN EFI_HII_HANDLE Handle
,
74 OUT EFI_STRING_ID
*FormSetTitle
,
75 OUT EFI_STRING_ID
*FormSetHelp
80 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
85 UINT32 PackageListLength
;
86 EFI_HII_PACKAGE_HEADER PackageHeader
;
88 ASSERT (Handle
!= NULL
);
89 ASSERT (Class
!= NULL
);
90 ASSERT (FormSetTitle
!= NULL
);
91 ASSERT (FormSetHelp
!= NULL
);
93 *Class
= EFI_NON_DEVICE_CLASS
;
98 // Get HII PackageList
101 HiiPackageList
= NULL
;
102 Status
= gIfrLibHiiDatabase
->ExportPackageLists (gIfrLibHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
103 ASSERT (Status
!= EFI_NOT_FOUND
);
105 if (Status
== EFI_BUFFER_TOO_SMALL
) {
106 HiiPackageList
= AllocatePool (BufferSize
);
107 ASSERT (HiiPackageList
!= NULL
);
109 Status
= gIfrLibHiiDatabase
->ExportPackageLists (gIfrLibHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
111 if (EFI_ERROR (Status
)) {
116 // Get Form package from this HII package List
118 Offset
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
120 CopyMem (&PackageListLength
, &HiiPackageList
->PackageLength
, sizeof (UINT32
));
122 while (Offset
< PackageListLength
) {
123 Package
= ((UINT8
*) HiiPackageList
) + Offset
;
124 CopyMem (&PackageHeader
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
126 if (PackageHeader
.Type
== EFI_HII_PACKAGE_FORMS
) {
128 // Search Class Opcode in this Form Package
130 Offset2
= sizeof (EFI_HII_PACKAGE_HEADER
);
131 while (Offset2
< PackageHeader
.Length
) {
132 OpCodeData
= Package
+ Offset2
;
134 if (((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_FORM_SET_OP
) {
136 // Find FormSet OpCode
138 CopyMem (FormSetTitle
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->FormSetTitle
, sizeof (EFI_STRING_ID
));
139 CopyMem (FormSetHelp
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->Help
, sizeof (EFI_STRING_ID
));
142 if ((((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_GUID_OP
) &&
143 CompareGuid (&mIfrVendorGuid
, (EFI_GUID
*)(OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
))) &&
144 (((EFI_IFR_GUID_CLASS
*) OpCodeData
)->ExtendOpCode
== EFI_IFR_EXTEND_OP_CLASS
)
147 // Find GUIDed Class OpCode
149 CopyMem (Class
, &((EFI_IFR_GUID_CLASS
*) OpCodeData
)->Class
, sizeof (UINT16
));
152 // Till now, we ought to have found the formset Opcode
157 Offset2
+= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
160 if (Offset2
< PackageHeader
.Length
) {
162 // Target formset found
168 Offset
+= PackageHeader
.Length
;
171 FreePool (HiiPackageList
);