]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/ExtendedIfrSupportLib/Common.c
Sync in bug fix from EDK I:
[mirror_edk2.git] / MdeModulePkg / Library / ExtendedIfrSupportLib / Common.c
CommitLineData
8dbae30d 1/** @file\r
2 Common Library Routines to assist handle HII elements.\r
3\r
4Copyright (c) 2007 - 2008, Intel Corporation. <BR>\r
5All rights reserved. This program and the accompanying materials\r
6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "LibraryInternal.h"\r
16\r
17\r
18//\r
19// Hii relative protocols\r
20//\r
21\r
22EFI_HII_DATABASE_PROTOCOL *gIfrLibHiiDatabase;\r
23EFI_HII_STRING_PROTOCOL *gIfrLibHiiString;\r
24\r
6ca46b63 25/**\r
26 ExtendedIfrSupportLib's constructor. It locates the required protocol:\r
27 gEfiHiiDatabaseProtocolGuid and gEfiHiiStringProtocolGuid.\r
28\r
29 @param ImageHandle The firmware allocated handle for the EFI image.\r
30 \r
31 @param SystemTable A pointer to the EFI System Table.\r
32\r
33 @retval EFI_SUCCESS This function always completes successfully.\r
34\r
35**/\r
8dbae30d 36EFI_STATUS\r
37EFIAPI\r
38ExtendedIfrSupportLibConstructor (\r
39 IN EFI_HANDLE ImageHandle,\r
40 IN EFI_SYSTEM_TABLE *SystemTable\r
41 )\r
42{\r
43 EFI_STATUS Status;\r
44\r
45 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &gIfrLibHiiDatabase);\r
46 ASSERT_EFI_ERROR (Status);\r
47\r
48 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &gIfrLibHiiString);\r
49 ASSERT_EFI_ERROR (Status);\r
50 \r
51 return EFI_SUCCESS;\r
52}\r
53\r
54\r
55\r
cfb9b643 56GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID mIfrVendorGuid = EFI_IFR_TIANO_GUID;\r
8dbae30d 57\r
6ca46b63 58/**\r
59 Extract formset class for given HII handle.\r
60\r
61\r
62 @param Handle The HII handle.\r
63 @param Class Class of the formset.\r
64 @param FormSetTitle Formset title string.\r
65 @param FormSetHelp Formset help string.\r
66\r
67 @retval EFI_SUCCESS Successfully extract Class for specified Hii handle.\r
68 @return Other values if failed to export packages for the given HII handle.\r
69\r
70**/\r
8dbae30d 71EFI_STATUS\r
72EFIAPI\r
73IfrLibExtractClassFromHiiHandle (\r
74 IN EFI_HII_HANDLE Handle,\r
75 OUT UINT16 *Class,\r
76 OUT EFI_STRING_ID *FormSetTitle,\r
77 OUT EFI_STRING_ID *FormSetHelp\r
78 )\r
8dbae30d 79{\r
80 EFI_STATUS Status;\r
81 UINTN BufferSize;\r
82 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
83 UINT8 *Package;\r
84 UINT8 *OpCodeData;\r
85 UINT32 Offset;\r
86 UINT32 Offset2;\r
87 UINT32 PackageListLength;\r
88 EFI_HII_PACKAGE_HEADER PackageHeader;\r
89\r
90 ASSERT (Handle != NULL);\r
91 ASSERT (Class != NULL); \r
92 ASSERT (FormSetTitle != NULL);\r
93 ASSERT (FormSetHelp != NULL);\r
94\r
95 *Class = EFI_NON_DEVICE_CLASS;\r
96 *FormSetTitle = 0;\r
97 *FormSetHelp = 0;\r
98\r
99 //\r
100 // Get HII PackageList\r
101 //\r
102 BufferSize = 0;\r
103 HiiPackageList = NULL;\r
104 Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
105 ASSERT (Status != EFI_NOT_FOUND);\r
106 \r
107 if (Status == EFI_BUFFER_TOO_SMALL) {\r
108 HiiPackageList = AllocatePool (BufferSize);\r
109 ASSERT (HiiPackageList != NULL);\r
110\r
111 Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
112 }\r
113 if (EFI_ERROR (Status)) {\r
114 return Status;\r
115 }\r
116\r
117 //\r
118 // Get Form package from this HII package List\r
119 //\r
120 Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
121 Offset2 = 0;\r
122 CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));\r
123\r
124 while (Offset < PackageListLength) {\r
125 Package = ((UINT8 *) HiiPackageList) + Offset;\r
126 CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
127\r
8d00a0f1 128 if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
8dbae30d 129 //\r
130 // Search Class Opcode in this Form Package\r
131 //\r
132 Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
133 while (Offset2 < PackageHeader.Length) {\r
134 OpCodeData = Package + Offset2;\r
135\r
136 if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
137 //\r
138 // Find FormSet OpCode\r
139 //\r
140 CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
141 CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
142 }\r
143\r
144 if ((((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_GUID_OP) &&\r
145 CompareGuid (&mIfrVendorGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER))) &&\r
146 (((EFI_IFR_GUID_CLASS *) OpCodeData)->ExtendOpCode == EFI_IFR_EXTEND_OP_CLASS)\r
147 ) {\r
148 //\r
149 // Find GUIDed Class OpCode\r
150 //\r
151 CopyMem (Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
152\r
153 //\r
154 // Till now, we ought to have found the formset Opcode\r
155 //\r
156 break;\r
157 }\r
158\r
159 Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
160 }\r
161\r
162 if (Offset2 < PackageHeader.Length) {\r
163 //\r
164 // Target formset found\r
165 //\r
166 break;\r
167 }\r
168 }\r
169\r
170 Offset += PackageHeader.Length;\r
171 }\r
172\r
cfb9b643 173 FreePool (HiiPackageList);\r
8dbae30d 174\r
175 return EFI_SUCCESS;\r
176}\r
177\r
178\r