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
;
26 ExtendedIfrSupportLib's constructor. It locates the required protocol:
27 gEfiHiiDatabaseProtocolGuid and gEfiHiiStringProtocolGuid.
29 @param ImageHandle The firmware allocated handle for the EFI image.
31 @param SystemTable A pointer to the EFI System Table.
33 @retval EFI_SUCCESS This function always completes successfully.
38 ExtendedIfrSupportLibConstructor (
39 IN EFI_HANDLE ImageHandle
,
40 IN EFI_SYSTEM_TABLE
*SystemTable
45 Status
= gBS
->LocateProtocol (&gEfiHiiDatabaseProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiDatabase
);
46 ASSERT_EFI_ERROR (Status
);
48 Status
= gBS
->LocateProtocol (&gEfiHiiStringProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiString
);
49 ASSERT_EFI_ERROR (Status
);
56 GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_GUID mIfrVendorGuid
= EFI_IFR_TIANO_GUID
;
59 Extract formset class for given HII handle.
62 @param Handle The HII handle.
63 @param Class Class of the formset.
64 @param FormSetTitle Formset title string.
65 @param FormSetHelp Formset help string.
67 @retval EFI_SUCCESS Successfully extract Class for specified Hii handle.
68 @return Other values if failed to export packages for the given HII handle.
73 IfrLibExtractClassFromHiiHandle (
74 IN EFI_HII_HANDLE Handle
,
76 OUT EFI_STRING_ID
*FormSetTitle
,
77 OUT EFI_STRING_ID
*FormSetHelp
82 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
87 UINT32 PackageListLength
;
88 EFI_HII_PACKAGE_HEADER PackageHeader
;
90 ASSERT (Handle
!= NULL
);
91 ASSERT (Class
!= NULL
);
92 ASSERT (FormSetTitle
!= NULL
);
93 ASSERT (FormSetHelp
!= NULL
);
95 *Class
= EFI_NON_DEVICE_CLASS
;
100 // Get HII PackageList
103 HiiPackageList
= NULL
;
104 Status
= gIfrLibHiiDatabase
->ExportPackageLists (gIfrLibHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
105 ASSERT (Status
!= EFI_NOT_FOUND
);
107 if (Status
== EFI_BUFFER_TOO_SMALL
) {
108 HiiPackageList
= AllocatePool (BufferSize
);
109 ASSERT (HiiPackageList
!= NULL
);
111 Status
= gIfrLibHiiDatabase
->ExportPackageLists (gIfrLibHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
113 if (EFI_ERROR (Status
)) {
118 // Get Form package from this HII package List
120 Offset
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
122 CopyMem (&PackageListLength
, &HiiPackageList
->PackageLength
, sizeof (UINT32
));
124 while (Offset
< PackageListLength
) {
125 Package
= ((UINT8
*) HiiPackageList
) + Offset
;
126 CopyMem (&PackageHeader
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
128 if (PackageHeader
.Type
== EFI_HII_PACKAGE_FORMS
) {
130 // Search Class Opcode in this Form Package
132 Offset2
= sizeof (EFI_HII_PACKAGE_HEADER
);
133 while (Offset2
< PackageHeader
.Length
) {
134 OpCodeData
= Package
+ Offset2
;
136 if (((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_FORM_SET_OP
) {
138 // Find FormSet OpCode
140 CopyMem (FormSetTitle
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->FormSetTitle
, sizeof (EFI_STRING_ID
));
141 CopyMem (FormSetHelp
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->Help
, sizeof (EFI_STRING_ID
));
144 if ((((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_GUID_OP
) &&
145 CompareGuid (&mIfrVendorGuid
, (EFI_GUID
*)(OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
))) &&
146 (((EFI_IFR_GUID_CLASS
*) OpCodeData
)->ExtendOpCode
== EFI_IFR_EXTEND_OP_CLASS
)
149 // Find GUIDed Class OpCode
151 CopyMem (Class
, &((EFI_IFR_GUID_CLASS
*) OpCodeData
)->Class
, sizeof (UINT16
));
154 // Till now, we ought to have found the formset Opcode
159 Offset2
+= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
162 if (Offset2
< PackageHeader
.Length
) {
164 // Target formset found
170 Offset
+= PackageHeader
.Length
;
173 FreePool (HiiPackageList
);