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
;
27 ExtendedIfrSupportLibConstructor (
28 IN EFI_HANDLE ImageHandle
,
29 IN EFI_SYSTEM_TABLE
*SystemTable
34 Status
= gBS
->LocateProtocol (&gEfiHiiDatabaseProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiDatabase
);
35 ASSERT_EFI_ERROR (Status
);
37 Status
= gBS
->LocateProtocol (&gEfiHiiStringProtocolGuid
, NULL
, (VOID
**) &gIfrLibHiiString
);
38 ASSERT_EFI_ERROR (Status
);
45 STATIC EFI_GUID mIfrVendorGuid
= EFI_IFR_TIANO_GUID
;
49 IfrLibExtractClassFromHiiHandle (
50 IN EFI_HII_HANDLE Handle
,
52 OUT EFI_STRING_ID
*FormSetTitle
,
53 OUT EFI_STRING_ID
*FormSetHelp
58 Extract formset class for given HII handle.
61 HiiHandle - Hii handle
62 Class - Class of the formset
63 FormSetTitle - Formset title string
64 FormSetHelp - Formset help string
67 EFI_SUCCESS - Successfully extract Class for specified Hii handle.
73 EFI_HII_PACKAGE_LIST_HEADER
*HiiPackageList
;
78 UINT32 PackageListLength
;
79 EFI_HII_PACKAGE_HEADER PackageHeader
;
81 ASSERT (Handle
!= NULL
);
82 ASSERT (Class
!= NULL
);
83 ASSERT (FormSetTitle
!= NULL
);
84 ASSERT (FormSetHelp
!= NULL
);
86 *Class
= EFI_NON_DEVICE_CLASS
;
91 // Get HII PackageList
94 HiiPackageList
= NULL
;
95 Status
= gIfrLibHiiDatabase
->ExportPackageLists (gIfrLibHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
96 ASSERT (Status
!= EFI_NOT_FOUND
);
98 if (Status
== EFI_BUFFER_TOO_SMALL
) {
99 HiiPackageList
= AllocatePool (BufferSize
);
100 ASSERT (HiiPackageList
!= NULL
);
102 Status
= gIfrLibHiiDatabase
->ExportPackageLists (gIfrLibHiiDatabase
, Handle
, &BufferSize
, HiiPackageList
);
104 if (EFI_ERROR (Status
)) {
109 // Get Form package from this HII package List
111 Offset
= sizeof (EFI_HII_PACKAGE_LIST_HEADER
);
113 CopyMem (&PackageListLength
, &HiiPackageList
->PackageLength
, sizeof (UINT32
));
115 while (Offset
< PackageListLength
) {
116 Package
= ((UINT8
*) HiiPackageList
) + Offset
;
117 CopyMem (&PackageHeader
, Package
, sizeof (EFI_HII_PACKAGE_HEADER
));
119 if (PackageHeader
.Type
== EFI_HII_PACKAGE_FORM
) {
121 // Search Class Opcode in this Form Package
123 Offset2
= sizeof (EFI_HII_PACKAGE_HEADER
);
124 while (Offset2
< PackageHeader
.Length
) {
125 OpCodeData
= Package
+ Offset2
;
127 if (((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_FORM_SET_OP
) {
129 // Find FormSet OpCode
131 CopyMem (FormSetTitle
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->FormSetTitle
, sizeof (EFI_STRING_ID
));
132 CopyMem (FormSetHelp
, &((EFI_IFR_FORM_SET
*) OpCodeData
)->Help
, sizeof (EFI_STRING_ID
));
135 if ((((EFI_IFR_OP_HEADER
*) OpCodeData
)->OpCode
== EFI_IFR_GUID_OP
) &&
136 CompareGuid (&mIfrVendorGuid
, (EFI_GUID
*)(OpCodeData
+ sizeof (EFI_IFR_OP_HEADER
))) &&
137 (((EFI_IFR_GUID_CLASS
*) OpCodeData
)->ExtendOpCode
== EFI_IFR_EXTEND_OP_CLASS
)
140 // Find GUIDed Class OpCode
142 CopyMem (Class
, &((EFI_IFR_GUID_CLASS
*) OpCodeData
)->Class
, sizeof (UINT16
));
145 // Till now, we ought to have found the formset Opcode
150 Offset2
+= ((EFI_IFR_OP_HEADER
*) OpCodeData
)->Length
;
153 if (Offset2
< PackageHeader
.Length
) {
155 // Target formset found
161 Offset
+= PackageHeader
.Length
;
164 gBS
->FreePool (HiiPackageList
);