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