]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Library/ExtendedIfrSupportLib/Common.c
Update all files to follow doxygen style file header.
[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 EFI_STATUS
26 EFIAPI
27 ExtendedIfrSupportLibConstructor (
28 IN EFI_HANDLE ImageHandle,
29 IN EFI_SYSTEM_TABLE *SystemTable
30 )
31 {
32 EFI_STATUS Status;
33
34 Status = gBS->LocateProtocol (&gEfiHiiDatabaseProtocolGuid, NULL, (VOID **) &gIfrLibHiiDatabase);
35 ASSERT_EFI_ERROR (Status);
36
37 Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &gIfrLibHiiString);
38 ASSERT_EFI_ERROR (Status);
39
40 return EFI_SUCCESS;
41 }
42
43
44
45 STATIC EFI_GUID mIfrVendorGuid = EFI_IFR_TIANO_GUID;
46
47 EFI_STATUS
48 EFIAPI
49 IfrLibExtractClassFromHiiHandle (
50 IN EFI_HII_HANDLE Handle,
51 OUT UINT16 *Class,
52 OUT EFI_STRING_ID *FormSetTitle,
53 OUT EFI_STRING_ID *FormSetHelp
54 )
55 /*++
56
57 Routine Description:
58 Extract formset class for given HII handle.
59
60 Arguments:
61 HiiHandle - Hii handle
62 Class - Class of the formset
63 FormSetTitle - Formset title string
64 FormSetHelp - Formset help string
65
66 Returns:
67 EFI_SUCCESS - Successfully extract Class for specified Hii handle.
68
69 --*/
70 {
71 EFI_STATUS Status;
72 UINTN BufferSize;
73 EFI_HII_PACKAGE_LIST_HEADER *HiiPackageList;
74 UINT8 *Package;
75 UINT8 *OpCodeData;
76 UINT32 Offset;
77 UINT32 Offset2;
78 UINT32 PackageListLength;
79 EFI_HII_PACKAGE_HEADER PackageHeader;
80
81 ASSERT (Handle != NULL);
82 ASSERT (Class != NULL);
83 ASSERT (FormSetTitle != NULL);
84 ASSERT (FormSetHelp != NULL);
85
86 *Class = EFI_NON_DEVICE_CLASS;
87 *FormSetTitle = 0;
88 *FormSetHelp = 0;
89
90 //
91 // Get HII PackageList
92 //
93 BufferSize = 0;
94 HiiPackageList = NULL;
95 Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);
96 ASSERT (Status != EFI_NOT_FOUND);
97
98 if (Status == EFI_BUFFER_TOO_SMALL) {
99 HiiPackageList = AllocatePool (BufferSize);
100 ASSERT (HiiPackageList != NULL);
101
102 Status = gIfrLibHiiDatabase->ExportPackageLists (gIfrLibHiiDatabase, Handle, &BufferSize, HiiPackageList);
103 }
104 if (EFI_ERROR (Status)) {
105 return Status;
106 }
107
108 //
109 // Get Form package from this HII package List
110 //
111 Offset = sizeof (EFI_HII_PACKAGE_LIST_HEADER);
112 Offset2 = 0;
113 CopyMem (&PackageListLength, &HiiPackageList->PackageLength, sizeof (UINT32));
114
115 while (Offset < PackageListLength) {
116 Package = ((UINT8 *) HiiPackageList) + Offset;
117 CopyMem (&PackageHeader, Package, sizeof (EFI_HII_PACKAGE_HEADER));
118
119 if (PackageHeader.Type == EFI_HII_PACKAGE_FORM) {
120 //
121 // Search Class Opcode in this Form Package
122 //
123 Offset2 = sizeof (EFI_HII_PACKAGE_HEADER);
124 while (Offset2 < PackageHeader.Length) {
125 OpCodeData = Package + Offset2;
126
127 if (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode == EFI_IFR_FORM_SET_OP) {
128 //
129 // Find FormSet OpCode
130 //
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));
133 }
134
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)
138 ) {
139 //
140 // Find GUIDed Class OpCode
141 //
142 CopyMem (Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));
143
144 //
145 // Till now, we ought to have found the formset Opcode
146 //
147 break;
148 }
149
150 Offset2 += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;
151 }
152
153 if (Offset2 < PackageHeader.Length) {
154 //
155 // Target formset found
156 //
157 break;
158 }
159 }
160
161 Offset += PackageHeader.Length;
162 }
163
164 gBS->FreePool (HiiPackageList);
165
166 return EFI_SUCCESS;
167 }
168
169