]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiToUefiHiiThunk/Forms.c
add in data type cast to ensure stringent compilers are happy.
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiToUefiHiiThunk / Forms.c
CommitLineData
4259256b 1/**@file\r
2 This file contains the form processing code to the HII database.\r
3\r
4Copyright (c) 2006 - 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\r
16#include "HiiDatabase.h"\r
17\r
18EFI_STATUS\r
19EFIAPI\r
20HiiExportDatabase (\r
21 IN EFI_HII_PROTOCOL *This,\r
22 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
23 IN OUT UINTN *BufferSize,\r
24 OUT VOID *Buffer\r
25 )\r
26/*++\r
27\r
28Routine Description:\r
29\r
30 This function allows a program to extract a form or form package that has\r
31 previously been registered with the EFI HII database.\r
32\r
33Arguments:\r
34\r
35Returns:\r
36\r
37--*/\r
38{\r
39 ASSERT (FALSE);\r
40 return EFI_UNSUPPORTED;\r
41}\r
42\r
43EFI_STATUS\r
44EFIAPI\r
45HiiGetForms (\r
46 IN EFI_HII_PROTOCOL *This,\r
47 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
48 IN EFI_FORM_ID FormId,\r
49 IN OUT UINTN *BufferLengthTemp,\r
50 OUT UINT8 *Buffer\r
51 )\r
52/*++\r
53\r
54Routine Description:\r
55\r
56 This function allows a program to extract a form or form package that has\r
57 previously been registered with the EFI HII database.\r
58\r
59Arguments:\r
60 This - A pointer to the EFI_HII_PROTOCOL instance.\r
61\r
62 Handle - Handle on which the form resides. Type FRAMEWORK_EFI_HII_HANDLE is defined in\r
63 EFI_HII_PROTOCOL.NewPack() in the Packages section.\r
64\r
65 FormId - The ID of the form to return. If the ID is zero, the entire form package is returned.\r
66 Type EFI_FORM_ID is defined in "Related Definitions" below.\r
67\r
68 BufferLength - On input, the length of the Buffer. On output, the length of the returned buffer, if\r
69 the length was sufficient and, if it was not, the length that is required to fit the\r
70 requested form(s).\r
71\r
72 Buffer - The buffer designed to receive the form(s).\r
73\r
74Returns:\r
75\r
76 EFI_SUCCESS - Buffer filled with the requested forms. BufferLength\r
77 was updated.\r
78\r
79 EFI_INVALID_PARAMETER - The handle is unknown.\r
80\r
81 EFI_NOT_FOUND - A form on the requested handle cannot be found with the\r
82 requested FormId.\r
83\r
84 EFI_BUFFER_TOO_SMALL - The buffer provided was not large enough to allow the form to be stored.\r
85\r
86--*/\r
87{\r
88 ASSERT (FALSE);\r
89 return EFI_UNSUPPORTED;\r
90}\r
91\r
92EFI_STATUS\r
93EFIAPI\r
94HiiGetDefaultImage (\r
95 IN EFI_HII_PROTOCOL *This,\r
96 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
97 IN UINTN DefaultMask,\r
98 OUT EFI_HII_VARIABLE_PACK_LIST **VariablePackList\r
99 )\r
100/*++\r
101\r
102 Routine Description:\r
103\r
104 This function allows a program to extract the NV Image\r
105 that represents the default storage image\r
106\r
107 Arguments:\r
108 This - A pointer to the EFI_HII_PROTOCOL instance.\r
109 Handle - The HII handle from which will have default data retrieved.\r
110 UINTN - Mask used to retrieve the default image.\r
111 VariablePackList - Callee allocated, tightly-packed, link list data\r
112 structure that contain all default varaible packs\r
113 from the Hii Database.\r
114\r
115 Returns:\r
116 EFI_NOT_FOUND - If Hii database does not contain any default images.\r
117 EFI_INVALID_PARAMETER - Invalid input parameter.\r
118 EFI_SUCCESS - Operation successful.\r
119\r
120--*/\r
121{\r
122 return EFI_SUCCESS;\r
123}\r
124\r
ebbd2793 125EFI_STATUS\r
126ThunkUpdateFormCallBack (\r
127 IN EFI_HANDLE CallbackHandle,\r
128 IN CONST HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry\r
129 )\r
130{\r
131 EFI_STATUS Status;\r
132 EFI_FORM_CALLBACK_PROTOCOL *FrameworkFormCallbackProtocol;\r
133 EFI_HII_CONFIG_ACCESS_PROTOCOL *ConfigAccessProtocol;\r
134 EFI_HANDLE UefiDriverHandle;\r
135 HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE *ConfigAccessProtocolInstance;\r
136 \r
137 Status = gBS->HandleProtocol (\r
138 CallbackHandle,\r
139 &gEfiFormCallbackProtocolGuid,\r
140 (VOID **) &FrameworkFormCallbackProtocol\r
141 );\r
142 if (EFI_ERROR (Status)) {\r
143 return EFI_INVALID_PARAMETER;\r
144 }\r
145 \r
146 Status = mUefiHiiDatabaseProtocol->GetPackageListHandle (\r
147 mUefiHiiDatabaseProtocol,\r
148 HandleMapEntry->UefiHiiHandle,\r
149 &UefiDriverHandle\r
150 );\r
151 ASSERT_EFI_ERROR (Status);\r
152 Status = gBS->HandleProtocol (\r
153 UefiDriverHandle,\r
154 &gEfiHiiConfigAccessProtocolGuid,\r
155 (VOID **) &ConfigAccessProtocol\r
156 );\r
157 ASSERT_EFI_ERROR (Status);\r
158 \r
159 ConfigAccessProtocolInstance = HII_TRHUNK_CONFIG_ACCESS_PROTOCOL_INSTANCE_FROM_PROTOCOL (ConfigAccessProtocol);\r
160 \r
161 ConfigAccessProtocolInstance->FrameworkFormCallbackProtocol = FrameworkFormCallbackProtocol;\r
162\r
163 return EFI_SUCCESS;\r
164}\r
4259256b 165\r
99a83b4c 166#define LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL 0x1000\r
167\r
168EFI_STATUS\r
169AppendToUpdateBuffer (\r
170 IN CONST UINT8 *OpCodeBuf,\r
171 IN UINTN BufSize,\r
172 OUT EFI_HII_UPDATE_DATA *UefiData\r
173 )\r
174{\r
175 UINT8 * NewBuff;\r
176 \r
177 if (UefiData->Offset + BufSize > UefiData->BufferSize) {\r
178 NewBuff = AllocateCopyPool (UefiData->BufferSize + LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL, UefiData->Data);\r
179 if (NewBuff == NULL) {\r
180 return EFI_OUT_OF_RESOURCES;\r
181 }\r
182 UefiData->BufferSize += LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
183 FreePool (UefiData->Data);\r
184 UefiData->Data = NewBuff;\r
185 }\r
186 \r
187 CopyMem (UefiData->Data + UefiData->Offset, OpCodeBuf, BufSize);\r
f62c116e 188 UefiData->Offset += (UINT32) BufSize;\r
99a83b4c 189\r
190 return EFI_SUCCESS;\r
191}\r
192\r
193EFI_STATUS\r
194Framework2UefiCreateSubtitleOpCode (\r
195 IN CONST FRAMEWORK_EFI_IFR_SUBTITLE *FwSubTitle,\r
196 OUT EFI_HII_UPDATE_DATA *UefiData\r
197 )\r
198{\r
199 EFI_IFR_SUBTITLE USubTitle;\r
200\r
201 ZeroMem (&USubTitle, sizeof(USubTitle));\r
202\r
203 USubTitle.Header.OpCode = EFI_IFR_SUBTITLE_OP;\r
204 USubTitle.Header.Length = sizeof (EFI_IFR_SUBTITLE);\r
205\r
206 USubTitle.Statement.Prompt = FwSubTitle->SubTitle;\r
207\r
208 return AppendToUpdateBuffer ((UINT8 *)&USubTitle, sizeof(EFI_IFR_SUBTITLE), UefiData);\r
209}\r
210\r
211EFI_STATUS\r
212Framework2UefiCreateTextOpCode (\r
213 IN CONST FRAMEWORK_EFI_IFR_TEXT *FwText,\r
214 OUT EFI_HII_UPDATE_DATA *UefiData\r
215 )\r
216{\r
217 EFI_IFR_TEXT UText;\r
218\r
219 ZeroMem (&UText, sizeof(UText));\r
220 \r
221 UText.Header.OpCode = EFI_IFR_TEXT_OP;\r
222 UText.Header.Length = sizeof (EFI_IFR_TEXT);\r
223\r
224 UText.Statement.Help = FwText->Help;\r
225\r
226 UText.Statement.Prompt = FwText->Text;\r
227 UText.TextTwo = FwText->TextTwo;\r
228 \r
229 return AppendToUpdateBuffer ((UINT8 *) &UText, sizeof(EFI_IFR_TEXT), UefiData);\r
230}\r
231\r
232\r
233EFI_STATUS\r
234ThunkFrameworkUpdateDataToUefiUpdateData (\r
235 IN CONST FRAMEWORK_EFI_HII_UPDATE_DATA *Data,\r
236 IN BOOLEAN AddData,\r
237 OUT EFI_HII_UPDATE_DATA **UefiData\r
238 )\r
239{\r
240 FRAMEWORK_EFI_IFR_OP_HEADER *FrameworkOpcodeBuffer;\r
241 EFI_HII_UPDATE_DATA *UefiUpdateDataBuffer;\r
242 UINTN Index;\r
243 EFI_STATUS Status;\r
244\r
245 UefiUpdateDataBuffer = AllocateZeroPool (sizeof (EFI_HII_UPDATE_DATA));\r
246 if (UefiUpdateDataBuffer == NULL) {\r
247 return EFI_OUT_OF_RESOURCES;\r
248 }\r
249 \r
250 UefiUpdateDataBuffer->Data = AllocateZeroPool (LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL);\r
251 if (UefiUpdateDataBuffer->Data == NULL) {\r
252 return EFI_OUT_OF_RESOURCES;\r
253 }\r
254\r
255 UefiUpdateDataBuffer->BufferSize = LOCAL_UPDATE_DATA_BUFFER_INCREMENTAL;\r
256 UefiUpdateDataBuffer->Offset = 0;\r
257\r
258 FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *) &Data->Data;\r
259\r
260 for (Index = 0; Index < Data->DataCount; Index++) {\r
261 switch (FrameworkOpcodeBuffer->OpCode) {\r
262 case FRAMEWORK_EFI_IFR_SUBTITLE_OP:\r
263 Status = Framework2UefiCreateSubtitleOpCode ((FRAMEWORK_EFI_IFR_SUBTITLE *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer);\r
264 break;\r
265 \r
266 case FRAMEWORK_EFI_IFR_TEXT_OP:\r
267 Status = Framework2UefiCreateTextOpCode ((FRAMEWORK_EFI_IFR_TEXT *) FrameworkOpcodeBuffer, UefiUpdateDataBuffer); \r
268 break;\r
269 \r
270 default:\r
271 ASSERT (FALSE);\r
272 return EFI_UNSUPPORTED;\r
273 }\r
274\r
275 if (EFI_ERROR (Status)) {\r
276 FreePool (UefiUpdateDataBuffer->Data);\r
277 FreePool (UefiUpdateDataBuffer);\r
278 return Status;\r
279 }\r
280\r
281 FrameworkOpcodeBuffer = (FRAMEWORK_EFI_IFR_OP_HEADER *)((UINT8 *) FrameworkOpcodeBuffer + FrameworkOpcodeBuffer->Length);\r
282 }\r
283\r
284 *UefiData = UefiUpdateDataBuffer;\r
285 \r
286 return EFI_SUCCESS;\r
287}\r
4259256b 288EFI_STATUS\r
289EFIAPI\r
290HiiUpdateForm (\r
291 IN EFI_HII_PROTOCOL *This,\r
292 IN FRAMEWORK_EFI_HII_HANDLE Handle,\r
293 IN EFI_FORM_LABEL Label,\r
294 IN BOOLEAN AddData,\r
99a83b4c 295 IN FRAMEWORK_EFI_HII_UPDATE_DATA *Data\r
4259256b 296 )\r
297/*++\r
298\r
299Routine Description:\r
300 This function allows the caller to update a form that has\r
301 previously been registered with the EFI HII database.\r
302\r
303Arguments:\r
304 Handle - Hii Handle associated with the Formset to modify\r
305 Label - Update information starting immediately after this label in the IFR\r
306 AddData - If TRUE, add data. If FALSE, remove data\r
307 Data - If adding data, this is the pointer to the data to add\r
308\r
309Returns:\r
310 EFI_SUCCESS - Update success.\r
311 Other - Update fail.\r
312\r
313--*/\r
314{\r
ebbd2793 315 EFI_STATUS Status;\r
316 EFI_HII_THUNK_PRIVATE_DATA *Private;\r
317 HII_TRHUNK_HANDLE_MAPPING_DATABASE_ENTRY *HandleMapEntry;\r
99a83b4c 318 EFI_HII_UPDATE_DATA *UefiHiiUpdateData;\r
319 EFI_HII_HANDLE UefiHiiHandle;\r
320\r
321 Status = EFI_SUCCESS;\r
ebbd2793 322\r
323 Private = EFI_HII_THUNK_PRIVATE_DATA_FROM_THIS(This);\r
324\r
325 HandleMapEntry = FrameworkHiiHandleToMapDatabaseEntry (Private, Handle);\r
326\r
327 if (HandleMapEntry == NULL) {\r
328 return EFI_NOT_FOUND;\r
329 }\r
330 \r
331 if (Data->FormSetUpdate) {\r
332 Status = ThunkUpdateFormCallBack ((EFI_HANDLE) (UINTN) Data->FormCallbackHandle, HandleMapEntry);\r
333 if (EFI_ERROR (Status)) {\r
334 return Status;\r
335 }\r
336 }\r
99a83b4c 337\r
338 if (Data->DataCount != 0) {\r
339 if (HandleMapEntry->IsPackageListWithOnlyStringPackages) {\r
340 UefiHiiHandle = TagGuidToUefiIfrHiiHandle (Private, &HandleMapEntry->TagGuid);\r
341\r
342 if (UefiHiiHandle == NULL) {\r
343 return EFI_INVALID_PARAMETER;\r
344 }\r
345 } else {\r
346 UefiHiiHandle = HandleMapEntry->UefiHiiHandle;\r
347 }\r
348\r
349 UefiHiiUpdateData = NULL;\r
350 \r
351 ThunkFrameworkUpdateDataToUefiUpdateData (Data, AddData, &UefiHiiUpdateData);\r
352\r
353 Status = IfrLibUpdateForm (UefiHiiHandle, NULL, 0, Label, AddData, UefiHiiUpdateData);\r
354 ASSERT_EFI_ERROR (Status);\r
355 \r
356 if (UefiHiiUpdateData != NULL) {\r
357 SafeFreePool (UefiHiiUpdateData->Data);\r
358 SafeFreePool (UefiHiiUpdateData);\r
359 }\r
360 }\r
361\r
362 return Status;\r
4259256b 363}\r