]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Library/ExtendedIfrSupportLib/Common.c
3853a2ec1d8a77b76fb7a2fb15a3afeacece38d6
[mirror_edk2.git] / MdeModulePkg / Library / ExtendedIfrSupportLib / Common.c
1 /** @file
2 Common Library Routines to assist handle HII elements.
3
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
9
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.
12
13 **/
14
15 #include "LibraryInternal.h"
16
17
18 //
19 // Hii relative protocols
20 //
21
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;
25
26 /**
27 ExtendedIfrSupportLib's constructor. It locates the required protocol:
28 gEfiHiiDatabaseProtocolGuid and gEfiHiiStringProtocolGuid.
29
30 @param ImageHandle The firmware allocated handle for the EFI image.
31
32 @param SystemTable A pointer to the EFI System Table.
33
34 @retval EFI_SUCCESS This function always completes successfully.
35
36 **/
37 EFI_STATUS
38 EFIAPI
39 ExtendedIfrSupportLibConstructor (
40 IN EFI_HANDLE ImageHandle,
41 IN EFI_SYSTEM_TABLE *SystemTable
42 )
43 {
44 EFI_STATUS Status;
45
46 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &gIfrLibHiiDatabase);
47 ASSERT_EFI_ERROR (Status);
48
49 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &gIfrLibHiiString);
50 ASSERT_EFI_ERROR (Status);
51
52 return EFI_SUCCESS;
53 }
54
55
56 /**
57 Extract formset class for given HII handle.
58
59
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.
64
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.
67
68 **/
69 EFI_STATUS
70 EFIAPI
71 IfrLibExtractClassFromHiiHandle (
72 IN EFI_HII_HANDLE Handle,
73 OUT UINT16 *Class,
74 OUT EFI_STRING_ID *FormSetTitle,
75 OUT EFI_STRING_ID *FormSetHelp
76 )
77 {
78 EFI_STATUS Status;
79 UINTN BufferSize;
80 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
81 UINT8 *Package;
82 UINT8 *OpCodeData;
83 UINT32 Offset;
84 UINT32 Offset2;
85 UINT32 PackageListLength;
86 EFI_HII_PACKAGE_HEADER PackageHeader;
87
88 ASSERT (Handle != NULL);
89 ASSERT (Class != NULL);
90 ASSERT (FormSetTitle != NULL);
91 ASSERT (FormSetHelp != NULL);
92
93 *Class = EFI_NON_DEVICE_CLASS;
94 *FormSetTitle = 0;
95 *FormSetHelp = 0;
96
97 //
98 // Get HII PackageList
99 //
100 BufferSize = 0;
101 HiiPackageList = NULL;
102 Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);
103 //
104 // Handle is a invalid handle. Check if Handle is corrupted.
105 //
106 ASSERT (Status != EFI_NOT_FOUND);
107 //
108 // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.
109 //
110 ASSERT (Status == EFI_BUFFER_TOO_SMALL);
111
112 HiiPackageList = AllocatePool (BufferSize);
113 ASSERT (HiiPackageList != NULL);
114
115 Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);
116 if (EFI_ERROR (Status)) {
117 return Status;
118 }
119
120 //
121 // Get Form package from this HII package List
122 //
123 Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
124 Offset2 = 0;
125 PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);
126
127 while (Offset < PackageListLength) {
128 Package = ((UINT8 *) HiiPackageList) + Offset;
129 CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
130
131 if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {
132 //
133 // Search Class Opcode in this Form Package
134 //
135 Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);
136 while (Offset2 < PackageHeader.Length) {
137 OpCodeData = Package + Offset2;
138
139 if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {
140 //
141 // Find FormSet OpCode
142 //
143 CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));
144 CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));
145 }
146
147 if ((((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_GUID_OP) &&
148 CompareGuid (&mIfrVendorGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER))) &&
149 (((EFI_IFR_GUID_CLASS *) OpCodeData)->ExtendOpCode == EFI_IFR_EXTEND_OP_CLASS)
150 ) {
151 //
152 // Find GUIDed Class OpCode
153 //
154 CopyMem (Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));
155
156 //
157 // Till now, we ought to have found the formset Opcode
158 //
159 break;
160 }
161
162 Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;
163 }
164
165 if (Offset2 < PackageHeader.Length) {
166 //
167 // Target formset found
168 //
169 break;
170 }
171 }
172
173 Offset += PackageHeader.Length;
174 }
175
176 FreePool (HiiPackageList);
177
178 return EFI_SUCCESS;
179 }
180
181