]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Library/ExtendedIfrSupportLib/Common.c
Move MdeModuleHii.h into Include\Guid directory
[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
6ca46b63 55/**\r
56 Extract formset class for given HII handle.\r
57\r
58\r
59 @param Handle The HII handle.\r
60 @param Class Class of the formset.\r
61 @param FormSetTitle Formset title string.\r
62 @param FormSetHelp Formset help string.\r
63\r
64 @retval EFI_SUCCESS Successfully extract Class for specified Hii handle.\r
65 @return Other values if failed to export packages for the given HII handle.\r
66\r
67**/\r
8dbae30d 68EFI_STATUS\r
69EFIAPI\r
70IfrLibExtractClassFromHiiHandle (\r
71 IN EFI_HII_HANDLE Handle,\r
72 OUT UINT16 *Class,\r
73 OUT EFI_STRING_ID *FormSetTitle,\r
74 OUT EFI_STRING_ID *FormSetHelp\r
75 )\r
8dbae30d 76{\r
77 EFI_STATUS Status;\r
78 UINTN BufferSize;\r
79 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;\r
80 UINT8 *Package;\r
81 UINT8 *OpCodeData;\r
82 UINT32 Offset;\r
83 UINT32 Offset2;\r
84 UINT32 PackageListLength;\r
85 EFI_HII_PACKAGE_HEADER PackageHeader;\r
86\r
87 ASSERT (Handle != NULL);\r
88 ASSERT (Class != NULL); \r
89 ASSERT (FormSetTitle != NULL);\r
90 ASSERT (FormSetHelp != NULL);\r
91\r
92 *Class = EFI_NON_DEVICE_CLASS;\r
93 *FormSetTitle = 0;\r
94 *FormSetHelp = 0;\r
95\r
96 //\r
97 // Get HII PackageList\r
98 //\r
99 BufferSize = 0;\r
100 HiiPackageList = NULL;\r
101 Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
fa7b3168 102 //\r
103 // Handle is a invalid handle. Check if Handle is corrupted.\r
104 //\r
8dbae30d 105 ASSERT (Status != EFI_NOT_FOUND);\r
fa7b3168 106 //\r
107 // The return status should always be EFI_BUFFER_TOO_SMALL as input buffer's size is 0.\r
108 //\r
109 ASSERT (Status == EFI_BUFFER_TOO_SMALL);\r
8dbae30d 110 \r
fa7b3168 111 HiiPackageList = AllocatePool (BufferSize);\r
112 ASSERT (HiiPackageList != NULL);\r
8dbae30d 113\r
fa7b3168 114 Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);\r
8dbae30d 115 if (EFI_ERROR (Status)) {\r
116 return Status;\r
117 }\r
118\r
119 //\r
120 // Get Form package from this HII package List\r
121 //\r
122 Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);\r
123 Offset2 = 0;\r
3a306c10 124 PackageListLength = ReadUnaligned32 (&HiiPackageList->PackageLength);\r
8dbae30d 125\r
126 while (Offset < PackageListLength) {\r
127 Package = ((UINT8 *) HiiPackageList) + Offset;\r
128 CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));\r
129\r
8d00a0f1 130 if (PackageHeader.Type == EFI_HII_PACKAGE_FORMS) {\r
8dbae30d 131 //\r
132 // Search Class Opcode in this Form Package\r
133 //\r
134 Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);\r
135 while (Offset2 < PackageHeader.Length) {\r
136 OpCodeData = Package + Offset2;\r
137\r
138 if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {\r
139 //\r
140 // Find FormSet OpCode\r
141 //\r
142 CopyMem (FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
143 CopyMem (FormSetHelp, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
144 }\r
145\r
146 if ((((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_GUID_OP) &&\r
5c526736 147 CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER))) &&\r
8dbae30d 148 (((EFI_IFR_GUID_CLASS *) OpCodeData)->ExtendOpCode == EFI_IFR_EXTEND_OP_CLASS)\r
149 ) {\r
150 //\r
151 // Find GUIDed Class OpCode\r
152 //\r
153 CopyMem (Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
154\r
155 //\r
156 // Till now, we ought to have found the formset Opcode\r
157 //\r
158 break;\r
159 }\r
160\r
161 Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
162 }\r
163\r
164 if (Offset2 < PackageHeader.Length) {\r
165 //\r
166 // Target formset found\r
167 //\r
168 break;\r
169 }\r
170 }\r
171\r
172 Offset += PackageHeader.Length;\r
173 }\r
174\r
cfb9b643 175 FreePool (HiiPackageList);\r
8dbae30d 176\r
177 return EFI_SUCCESS;\r
178}\r
179\r
180\r