]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkPkg/Library/FrameworkIfrSupportLib/IfrOnTheFly.c
Fix VS2005 build error
[mirror_edk2.git] / IntelFrameworkPkg / Library / FrameworkIfrSupportLib / IfrOnTheFly.c
CommitLineData
cf7e50f8 1/** @file\r
2ec4d269 2 Library Routines to create IFR on-the-fly\r
3 \r
5d01b0f7 4Copyright (c) 2006, Intel Corporation \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
cf7e50f8 13**/\r
5d01b0f7 14\r
82096802 15#include "IfrSupportLibInternal.h"\r
5d01b0f7 16\r
2ec4d269 17/**\r
409f118c 18 Create a formset.\r
2ec4d269 19 \r
20 The form package is a collection of forms that are intended to describe the pages that will be\r
21 displayed to the user.\r
22 \r
49a049e6 23 @param FormSetTitle Title of formset\r
24 @param Guid Guid of formset\r
25 @param Class Class of formset\r
26 @param SubClass Sub class of formset\r
27 @param FormBuffer Pointer of the formset created\r
28 @param StringBuffer Pointer of FormSetTitile string created\r
2ec4d269 29 \r
49a049e6 30 @retval EFI_OUT_OF_RESOURCES No enough buffer to allocate\r
31 @retval EFI_SUCCESS Formset successfully created \r
2ec4d269 32**/\r
5d01b0f7 33EFI_STATUS\r
409f118c 34EFIAPI\r
5d01b0f7 35CreateFormSet (\r
49a049e6 36 IN CHAR16 *FormSetTitle,\r
37 IN EFI_GUID *Guid,\r
38 IN UINT8 Class,\r
39 IN UINT8 SubClass,\r
40 IN OUT VOID **FormBuffer,\r
41 IN OUT VOID **StringBuffer\r
5d01b0f7 42 )\r
5d01b0f7 43{\r
49a049e6 44 EFI_STATUS Status;\r
45 EFI_HII_IFR_PACK IfrPack;\r
46 FRAMEWORK_EFI_IFR_FORM_SET FormSet;\r
47 FRAMEWORK_EFI_IFR_END_FORM_SET EndFormSet;\r
48 UINT8 *Destination;\r
49 CHAR16 CurrentLanguage[4];\r
50 STRING_REF StringToken;\r
5d01b0f7 51\r
52 //\r
53 // Pre-allocate a buffer sufficient for us to work from.\r
54 //\r
55 FormBuffer = AllocateZeroPool (DEFAULT_FORM_BUFFER_SIZE);\r
56 if (FormBuffer == NULL) {\r
57 return EFI_OUT_OF_RESOURCES;\r
58 }\r
59\r
60 //\r
61 // Pre-allocate a buffer sufficient for us to work from.\r
62 //\r
63 StringBuffer = AllocateZeroPool (DEFAULT_STRING_BUFFER_SIZE);\r
64 if (StringBuffer == NULL) {\r
409f118c 65 FreePool (FormBuffer);\r
5d01b0f7 66 return EFI_OUT_OF_RESOURCES;\r
67 }\r
68\r
69 //\r
409f118c 70 // Add FormSetTitle to the StringBuffer, get FormSetTitle's token\r
5d01b0f7 71 //\r
72 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 73 Status = AddString (*StringBuffer, CurrentLanguage, FormSetTitle, &StringToken);\r
5d01b0f7 74 if (EFI_ERROR (Status)) {\r
75 return Status;\r
76 }\r
77\r
78 //\r
79 // Initialize the Ifr Package header data\r
80 //\r
dc7b4a5c 81 IfrPack.Header.Length = sizeof (EFI_HII_PACK_HEADER) + sizeof (FRAMEWORK_EFI_IFR_FORM_SET) + sizeof (FRAMEWORK_EFI_IFR_END_FORM_SET);\r
5d01b0f7 82 IfrPack.Header.Type = EFI_HII_IFR;\r
83\r
84 //\r
85 // Initialize FormSet with the appropriate information\r
86 //\r
dc7b4a5c 87 FormSet.Header.OpCode = FRAMEWORK_EFI_IFR_FORM_SET_OP;\r
88 FormSet.Header.Length = sizeof (FRAMEWORK_EFI_IFR_FORM_SET);\r
5d01b0f7 89 FormSet.FormSetTitle = StringToken;\r
90 FormSet.Class = Class;\r
91 FormSet.SubClass = SubClass;\r
77980854 92 CopyGuid ((GUID *)(VOID *)&FormSet.Guid, Guid);\r
409f118c 93 \r
5d01b0f7 94 //\r
95 // Initialize the end formset data\r
96 //\r
dc7b4a5c 97 EndFormSet.Header.Length = sizeof (FRAMEWORK_EFI_IFR_END_FORM_SET);\r
98 EndFormSet.Header.OpCode = FRAMEWORK_EFI_IFR_END_FORM_SET_OP;\r
5d01b0f7 99\r
5d01b0f7 100 //\r
101 // Copy the formset/endformset data to the form buffer\r
102 //\r
409f118c 103 Destination = (UINT8 *) *FormBuffer;\r
5d01b0f7 104 CopyMem (Destination, &IfrPack, sizeof (EFI_HII_PACK_HEADER));\r
105\r
106 Destination = Destination + sizeof (EFI_HII_PACK_HEADER);\r
dc7b4a5c 107 CopyMem (Destination, &FormSet, sizeof (FRAMEWORK_EFI_IFR_FORM_SET));\r
5d01b0f7 108\r
dc7b4a5c 109 Destination = Destination + sizeof (FRAMEWORK_EFI_IFR_FORM_SET);\r
dc7b4a5c 110 CopyMem (Destination, &EndFormSet, sizeof (FRAMEWORK_EFI_IFR_END_FORM_SET));\r
409f118c 111 \r
5d01b0f7 112 return EFI_SUCCESS;\r
113}\r
114\r
2ec4d269 115/**\r
49a049e6 116 Create a form.\r
2ec4d269 117 A form is the encapsulation of what amounts to a browser page. The header defines a FormId,\r
118 which is referenced by the form package, among others. It also defines a FormTitle, which is a\r
119 string to be used as the title for the form\r
120 \r
49a049e6 121 @param FormTitle Title of the form\r
122 @param FormId Id of the form\r
123 @param FormBuffer Pointer of the form created\r
124 @param StringBuffer Pointer of FormTitil string created\r
2ec4d269 125 \r
49a049e6 126 @retval EFI_SUCCESS Form successfully created\r
2ec4d269 127**/\r
5d01b0f7 128EFI_STATUS\r
409f118c 129EFIAPI\r
5d01b0f7 130CreateForm (\r
49a049e6 131 IN CHAR16 *FormTitle,\r
132 IN UINT16 FormId,\r
133 IN OUT VOID *FormBuffer,\r
134 IN OUT VOID *StringBuffer\r
5d01b0f7 135 )\r
5d01b0f7 136{\r
49a049e6 137 EFI_STATUS Status;\r
138 FRAMEWORK_EFI_IFR_FORM Form;\r
139 FRAMEWORK_EFI_IFR_END_FORM EndForm;\r
140 CHAR16 CurrentLanguage[4];\r
141 STRING_REF StringToken;\r
5d01b0f7 142\r
143 //\r
409f118c 144 // Add FormTitle to the StringBuffer, get FormTitle's token\r
5d01b0f7 145 //\r
146 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 147 Status = AddString (StringBuffer, CurrentLanguage, FormTitle, &StringToken);\r
5d01b0f7 148 if (EFI_ERROR (Status)) {\r
149 return Status;\r
150 }\r
151\r
dc7b4a5c 152 Form.Header.OpCode = FRAMEWORK_EFI_IFR_FORM_OP;\r
153 Form.Header.Length = sizeof (FRAMEWORK_EFI_IFR_FORM);\r
5d01b0f7 154 Form.FormId = FormId;\r
155 Form.FormTitle = StringToken;\r
156\r
409f118c 157 Status = AddOpCode (FormBuffer, &Form);\r
5d01b0f7 158 if (EFI_ERROR (Status)) {\r
159 return Status;\r
160 }\r
161\r
dc7b4a5c 162 EndForm.Header.OpCode = FRAMEWORK_EFI_IFR_END_FORM_OP;\r
163 EndForm.Header.Length = sizeof (FRAMEWORK_EFI_IFR_END_FORM);\r
5d01b0f7 164\r
165 Status = AddOpCode (FormBuffer, &EndForm);\r
409f118c 166 \r
2ec4d269 167 return Status;\r
5d01b0f7 168}\r
169\r
2ec4d269 170/**\r
409f118c 171 Create a SubTitle.\r
2ec4d269 172 \r
173 Subtitle strings are intended to be used by authors to separate sections of questions into semantic\r
174 groups.\r
175 \r
49a049e6 176 @param SubTitle Sub title to be created\r
177 @param FormBuffer Where this subtitle to add to\r
178 @param StringBuffer String buffer created for subtitle\r
2ec4d269 179 \r
180 @retval EFI_SUCCESS Subtitle successfully created\r
181**/\r
5d01b0f7 182EFI_STATUS\r
409f118c 183EFIAPI\r
5d01b0f7 184CreateSubTitle (\r
49a049e6 185 IN CHAR16 *SubTitle,\r
186 IN OUT VOID *FormBuffer,\r
187 IN OUT VOID *StringBuffer\r
5d01b0f7 188 )\r
5d01b0f7 189{\r
49a049e6 190 EFI_STATUS Status;\r
191 FRAMEWORK_EFI_IFR_SUBTITLE Subtitle;\r
192 CHAR16 CurrentLanguage[4];\r
193 STRING_REF StringToken;\r
5d01b0f7 194\r
195 //\r
409f118c 196 // Add SubTitle to the StringBuffer, get SubTitle's token\r
5d01b0f7 197 //\r
198 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 199 Status = AddString (StringBuffer, CurrentLanguage, SubTitle, &StringToken);\r
5d01b0f7 200 if (EFI_ERROR (Status)) {\r
201 return Status;\r
202 }\r
203\r
dc7b4a5c 204 Subtitle.Header.OpCode = FRAMEWORK_EFI_IFR_SUBTITLE_OP;\r
205 Subtitle.Header.Length = sizeof (FRAMEWORK_EFI_IFR_SUBTITLE);\r
5d01b0f7 206 Subtitle.SubTitle = StringToken;\r
207\r
208 Status = AddOpCode (FormBuffer, &Subtitle);\r
209\r
2ec4d269 210 return Status;\r
5d01b0f7 211}\r
212\r
2ec4d269 213/**\r
409f118c 214 Create a line of text.\r
2ec4d269 215 Unlike HTML, text is simply another tag. \r
216 This tag type enables IFR to be more easily localized.\r
217 \r
49a049e6 218 @param String First string of the text\r
219 @param String2 Second string of the text\r
220 @param String3 Help string of the text\r
221 @param Flags Flag of the text\r
222 @param Key Key of the text\r
223 @param FormBuffer The form where this text adds to\r
224 @param StringBuffer String buffer created for String, String2 and String3\r
2ec4d269 225 \r
49a049e6 226 @retval EFI_SUCCESS Text successfully created\r
2ec4d269 227**/\r
5d01b0f7 228EFI_STATUS\r
409f118c 229EFIAPI\r
5d01b0f7 230CreateText (\r
49a049e6 231 IN CHAR16 *String,\r
232 IN CHAR16 *String2,\r
233 IN CHAR16 *String3,\r
234 IN UINT8 Flags,\r
235 IN UINT16 Key,\r
236 IN OUT VOID *FormBuffer,\r
237 IN OUT VOID *StringBuffer\r
5d01b0f7 238 )\r
5d01b0f7 239{\r
49a049e6 240 EFI_STATUS Status;\r
241 FRAMEWORK_EFI_IFR_TEXT Text;\r
242 CHAR16 CurrentLanguage[4];\r
243 STRING_REF StringToken;\r
5d01b0f7 244\r
245 //\r
409f118c 246 // Add first string to the StringBuffer, get first string's token\r
5d01b0f7 247 //\r
248 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 249 Status = AddString (StringBuffer, CurrentLanguage, String, &StringToken);\r
5d01b0f7 250 if (EFI_ERROR (Status)) {\r
251 return Status;\r
252 }\r
253\r
dc7b4a5c 254 Text.Header.OpCode = FRAMEWORK_EFI_IFR_TEXT_OP;\r
255 Text.Header.Length = sizeof (FRAMEWORK_EFI_IFR_TEXT);\r
5d01b0f7 256 Text.Text = StringToken;\r
257\r
258 //\r
259 // Add second string, get first string's token\r
260 //\r
261 Status = AddString (StringBuffer, CurrentLanguage, String2, &StringToken);\r
5d01b0f7 262 if (EFI_ERROR (Status)) {\r
263 return Status;\r
264 }\r
265\r
266 Text.TextTwo = StringToken;\r
dc7b4a5c 267 Text.Flags = (UINT8) (Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 268 Text.Key = Key;\r
269\r
270 //\r
271 // Add second string, get first string's token\r
272 //\r
273 Status = AddString (StringBuffer, CurrentLanguage, String3, &StringToken);\r
5d01b0f7 274 if (EFI_ERROR (Status)) {\r
275 return Status;\r
276 }\r
277\r
278 Text.Help = StringToken;\r
279\r
280 Status = AddOpCode (FormBuffer, &Text);\r
281\r
2ec4d269 282 return Status;\r
5d01b0f7 283}\r
284\r
2ec4d269 285/**\r
49a049e6 286 Create a hyperlink.\r
2ec4d269 287 \r
49a049e6 288 @param FormId Form ID of the hyperlink\r
289 @param Prompt Prompt of the hyperlink\r
290 @param FormBuffer The form where this hyperlink adds to\r
291 @param StringBuffer String buffer created for Prompt\r
2ec4d269 292 \r
49a049e6 293 @retval EFI_SUCCESS Hyperlink successfully created \r
2ec4d269 294**/\r
5d01b0f7 295EFI_STATUS\r
409f118c 296EFIAPI\r
5d01b0f7 297CreateGoto (\r
49a049e6 298 IN UINT16 FormId,\r
299 IN CHAR16 *Prompt,\r
300 IN OUT VOID *FormBuffer,\r
301 IN OUT VOID *StringBuffer\r
5d01b0f7 302 )\r
5d01b0f7 303{\r
49a049e6 304 EFI_STATUS Status;\r
305 FRAMEWORK_EFI_IFR_REF Hyperlink;\r
306 CHAR16 CurrentLanguage[4];\r
307 STRING_REF StringToken;\r
5d01b0f7 308\r
309 //\r
409f118c 310 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 311 //\r
312 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 313 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 314 if (EFI_ERROR (Status)) {\r
315 return Status;\r
316 }\r
317\r
dc7b4a5c 318 Hyperlink.Header.OpCode = FRAMEWORK_EFI_IFR_REF_OP;\r
319 Hyperlink.Header.Length = sizeof (FRAMEWORK_EFI_IFR_REF);\r
5d01b0f7 320 Hyperlink.FormId = FormId;\r
321 Hyperlink.Prompt = StringToken;\r
322\r
323 Status = AddOpCode (FormBuffer, &Hyperlink);\r
324\r
2ec4d269 325 return Status;\r
5d01b0f7 326}\r
327\r
2ec4d269 328/**\r
329 Create a one-of question with a set of options to choose from. The\r
330 OptionsList is a pointer to a null-terminated list of option descriptions.\r
5d01b0f7 331\r
49a049e6 332 @param QuestionId Question ID of the one-of box\r
333 @param DataWidth DataWidth of the one-of box\r
334 @param Prompt Prompt of the one-of box\r
335 @param Help Help of the one-of box\r
336 @param OptionsList Each string in it is an option of the one-of box\r
337 @param OptionCount Option string count\r
338 @param FormBuffer The form where this one-of box adds to\r
339 @param StringBuffer String buffer created for Prompt, Help and Option strings\r
2ec4d269 340 \r
49a049e6 341 @retval EFI_DEVICE_ERROR DataWidth > 2\r
342 @retval EFI_SUCCESS One-Of box successfully created.\r
2ec4d269 343**/\r
5d01b0f7 344EFI_STATUS\r
409f118c 345EFIAPI\r
5d01b0f7 346CreateOneOf (\r
49a049e6 347 IN UINT16 QuestionId,\r
348 IN UINT8 DataWidth,\r
349 IN CHAR16 *Prompt,\r
350 IN CHAR16 *Help,\r
351 IN IFR_OPTION *OptionsList,\r
352 IN UINTN OptionCount,\r
353 IN OUT VOID *FormBuffer,\r
354 IN OUT VOID *StringBuffer\r
5d01b0f7 355 )\r
5d01b0f7 356{\r
49a049e6 357 EFI_STATUS Status;\r
358 UINTN Index;\r
359 FRAMEWORK_EFI_IFR_ONE_OF OneOf;\r
360 FRAMEWORK_EFI_IFR_ONE_OF_OPTION OneOfOption;\r
361 FRAMEWORK_EFI_IFR_END_ONE_OF EndOneOf;\r
362 CHAR16 CurrentLanguage[4];\r
363 STRING_REF StringToken;\r
5d01b0f7 364\r
365 //\r
366 // We do not create op-code storage widths for one-of in excess of 16 bits for now\r
367 //\r
368 if (DataWidth > 2) {\r
369 return EFI_DEVICE_ERROR;\r
370 }\r
371\r
372 //\r
409f118c 373 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 374 //\r
375 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 376 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 377 if (EFI_ERROR (Status)) {\r
378 return Status;\r
379 }\r
380\r
dc7b4a5c 381 OneOf.Header.OpCode = FRAMEWORK_EFI_IFR_ONE_OF_OP;\r
382 OneOf.Header.Length = sizeof (FRAMEWORK_EFI_IFR_ONE_OF);\r
5d01b0f7 383 OneOf.QuestionId = QuestionId;\r
384 OneOf.Width = DataWidth;\r
385 OneOf.Prompt = StringToken;\r
386\r
387 //\r
409f118c 388 // Add Help string to the StringBuffer, get Help string's token\r
5d01b0f7 389 //\r
390 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
5d01b0f7 391 if (EFI_ERROR (Status)) {\r
392 return Status;\r
393 }\r
394\r
395 OneOf.Help = StringToken;\r
396\r
409f118c 397 Status = AddOpCode (FormBuffer, &OneOf);\r
5d01b0f7 398 if (EFI_ERROR (Status)) {\r
399 return Status;\r
400 }\r
401\r
402 for (Index = 0; Index < OptionCount; Index++) {\r
dc7b4a5c 403 OneOfOption.Header.OpCode = FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP;\r
404 OneOfOption.Header.Length = sizeof (FRAMEWORK_EFI_IFR_ONE_OF_OPTION);\r
5d01b0f7 405\r
406 //\r
409f118c 407 // Add OptionString string to the StringBuffer, get OptionString string's token\r
5d01b0f7 408 //\r
409f118c 409 Status = AddString (StringBuffer, CurrentLanguage, OptionsList[Index].OptionString, &StringToken);\r
5d01b0f7 410\r
411 OneOfOption.Option = StringToken;\r
412 OneOfOption.Value = OptionsList[Index].Value;\r
dc7b4a5c 413 OneOfOption.Flags = (UINT8) (OptionsList[Index].Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 414 OneOfOption.Key = OptionsList[Index].Key;\r
415\r
409f118c 416 Status = AddOpCode (FormBuffer, &OneOfOption);\r
5d01b0f7 417 if (EFI_ERROR (Status)) {\r
418 return Status;\r
419 }\r
420 }\r
421\r
dc7b4a5c 422 EndOneOf.Header.Length = sizeof (FRAMEWORK_EFI_IFR_END_ONE_OF);\r
423 EndOneOf.Header.OpCode = FRAMEWORK_EFI_IFR_END_ONE_OF_OP;\r
5d01b0f7 424\r
409f118c 425 Status = AddOpCode (FormBuffer, &EndOneOf);\r
5d01b0f7 426 if (EFI_ERROR (Status)) {\r
427 return Status;\r
428 }\r
429\r
430 return EFI_SUCCESS;\r
431}\r
432\r
2ec4d269 433/**\r
434 Create a one-of question with a set of options to choose from. The\r
435 OptionsList is a pointer to a null-terminated list of option descriptions.\r
436 \r
49a049e6 437 @param QuestionId Question ID of the ordered list\r
438 @param MaxEntries MaxEntries of the ordered list\r
439 @param Prompt Prompt of the ordered list\r
440 @param Help Help of the ordered list\r
441 @param OptionsList Each string in it is an option of the ordered list\r
442 @param OptionCount Option string count\r
443 @param FormBuffer The form where this ordered list adds to\r
444 @param StringBuffer String buffer created for Prompt, Help and Option strings\r
2ec4d269 445 \r
49a049e6 446 @retval EFI_SUCCESS Ordered list successfully created.\r
2ec4d269 447**/\r
5d01b0f7 448EFI_STATUS\r
409f118c 449EFIAPI\r
5d01b0f7 450CreateOrderedList (\r
49a049e6 451 IN UINT16 QuestionId,\r
452 IN UINT8 MaxEntries,\r
453 IN CHAR16 *Prompt,\r
454 IN CHAR16 *Help,\r
455 IN IFR_OPTION *OptionsList,\r
456 IN UINTN OptionCount,\r
457 IN OUT VOID *FormBuffer,\r
458 IN OUT VOID *StringBuffer\r
5d01b0f7 459 )\r
5d01b0f7 460{\r
49a049e6 461 EFI_STATUS Status;\r
462 UINTN Index;\r
463 FRAMEWORK_EFI_IFR_ORDERED_LIST OrderedList;\r
464 FRAMEWORK_EFI_IFR_ONE_OF_OPTION OrderedListOption;\r
465 FRAMEWORK_EFI_IFR_END_ONE_OF EndOrderedList;\r
466 CHAR16 CurrentLanguage[4];\r
467 STRING_REF StringToken;\r
5d01b0f7 468\r
469 //\r
409f118c 470 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 471 //\r
472 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 473 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 474 if (EFI_ERROR (Status)) {\r
475 return Status;\r
476 }\r
477\r
dc7b4a5c 478 OrderedList.Header.OpCode = FRAMEWORK_EFI_IFR_ORDERED_LIST_OP;\r
479 OrderedList.Header.Length = sizeof (FRAMEWORK_EFI_IFR_ORDERED_LIST);\r
5d01b0f7 480 OrderedList.QuestionId = QuestionId;\r
481 OrderedList.MaxEntries = MaxEntries;\r
482 OrderedList.Prompt = StringToken;\r
483\r
484 //\r
409f118c 485 // Add Help string to the StringBuffer, get Help string's token\r
5d01b0f7 486 //\r
487 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
5d01b0f7 488 if (EFI_ERROR (Status)) {\r
489 return Status;\r
490 }\r
491\r
492 OrderedList.Help = StringToken;\r
493\r
409f118c 494 Status = AddOpCode (FormBuffer, &OrderedList);\r
5d01b0f7 495 if (EFI_ERROR (Status)) {\r
496 return Status;\r
497 }\r
498\r
499 for (Index = 0; Index < OptionCount; Index++) {\r
dc7b4a5c 500 OrderedListOption.Header.OpCode = FRAMEWORK_EFI_IFR_ONE_OF_OPTION_OP;\r
501 OrderedListOption.Header.Length = sizeof (FRAMEWORK_EFI_IFR_ONE_OF_OPTION);\r
5d01b0f7 502\r
503 //\r
409f118c 504 // Add OptionString string to the StringBuffer, get OptionString string's token\r
5d01b0f7 505 //\r
409f118c 506 Status = AddString (StringBuffer, CurrentLanguage, OptionsList[Index].OptionString, &StringToken);\r
5d01b0f7 507\r
508 OrderedListOption.Option = StringToken;\r
509 OrderedListOption.Value = OptionsList[Index].Value;\r
dc7b4a5c 510 OrderedListOption.Flags = (UINT8) (OptionsList[Index].Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 511 OrderedListOption.Key = OptionsList[Index].Key;\r
512\r
409f118c 513 Status = AddOpCode (FormBuffer, &OrderedListOption);\r
5d01b0f7 514 if (EFI_ERROR (Status)) {\r
515 return Status;\r
516 }\r
517 }\r
518\r
dc7b4a5c 519 EndOrderedList.Header.Length = sizeof (FRAMEWORK_EFI_IFR_END_ONE_OF);\r
520 EndOrderedList.Header.OpCode = FRAMEWORK_EFI_IFR_END_ONE_OF_OP;\r
5d01b0f7 521\r
522 Status = AddOpCode (FormBuffer, &EndOrderedList);\r
523\r
2ec4d269 524 return Status;\r
5d01b0f7 525}\r
526\r
2ec4d269 527/**\r
49a049e6 528 Create a checkbox.\r
2ec4d269 529 \r
49a049e6 530 @param QuestionId Question ID of the check box\r
531 @param DataWidth DataWidth of the check box\r
532 @param Prompt Prompt of the check box\r
533 @param Help Help of the check box \r
534 @param Flags Flags of the check box\r
535 @param FormBuffer The form where this check box adds to\r
536 @param StringBuffer String buffer created for Prompt and Help.\r
2ec4d269 537 \r
49a049e6 538 @retval EFI_DEVICE_ERROR DataWidth > 1\r
539 @retval EFI_SUCCESS Check box successfully created\r
2ec4d269 540**/\r
5d01b0f7 541EFI_STATUS\r
409f118c 542EFIAPI\r
5d01b0f7 543CreateCheckBox (\r
49a049e6 544 IN UINT16 QuestionId,\r
545 IN UINT8 DataWidth,\r
546 IN CHAR16 *Prompt,\r
547 IN CHAR16 *Help,\r
548 IN UINT8 Flags,\r
549 IN OUT VOID *FormBuffer,\r
550 IN OUT VOID *StringBuffer\r
5d01b0f7 551 )\r
5d01b0f7 552{\r
49a049e6 553 EFI_STATUS Status;\r
554 FRAMEWORK_EFI_IFR_CHECKBOX CheckBox;\r
555 CHAR16 CurrentLanguage[4];\r
556 STRING_REF StringToken;\r
5d01b0f7 557\r
558 //\r
559 // We do not create op-code storage widths for checkbox in excess of 8 bits for now\r
560 //\r
561 if (DataWidth > 1) {\r
562 return EFI_DEVICE_ERROR;\r
563 }\r
564\r
565 //\r
409f118c 566 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 567 //\r
568 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 569 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 570 if (EFI_ERROR (Status)) {\r
571 return Status;\r
572 }\r
573\r
dc7b4a5c 574 CheckBox.Header.OpCode = FRAMEWORK_EFI_IFR_CHECKBOX_OP;\r
575 CheckBox.Header.Length = sizeof (FRAMEWORK_EFI_IFR_CHECKBOX);\r
5d01b0f7 576 CheckBox.QuestionId = QuestionId;\r
577 CheckBox.Width = DataWidth;\r
578 CheckBox.Prompt = StringToken;\r
579\r
580 //\r
409f118c 581 // Add Help string to the StringBuffer, get Help string's token\r
5d01b0f7 582 //\r
583 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
5d01b0f7 584 if (EFI_ERROR (Status)) {\r
585 return Status;\r
586 }\r
587\r
588 CheckBox.Help = StringToken;\r
dc7b4a5c 589 CheckBox.Flags = (UINT8) (Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 590\r
591 Status = AddOpCode (FormBuffer, &CheckBox);\r
2ec4d269 592 \r
593 return Status;\r
5d01b0f7 594}\r
595\r
2ec4d269 596/**\r
409f118c 597 Create a numeric.\r
2ec4d269 598 \r
49a049e6 599 @param QuestionId Question ID of the numeric\r
600 @param DataWidth DataWidth of the numeric\r
601 @param Prompt Prompt of the numeric\r
602 @param Help Help of the numeric\r
603 @param Minimum Minumun boundary of the numeric\r
604 @param Maximum Maximum boundary of the numeric\r
605 @param Step Step of the numeric\r
606 @param Default Default value\r
607 @param Flags Flags of the numeric\r
608 @param Key Key of the numeric\r
609 @param FormBuffer The form where this numeric adds to\r
610 @param StringBuffer String buffer created for Prompt and Help.\r
611\r
612 @retval EFI_DEVICE_ERROR DataWidth > 2\r
613 @retval EFI_SUCCESS Numeric is successfully created \r
2ec4d269 614**/\r
5d01b0f7 615EFI_STATUS\r
409f118c 616EFIAPI\r
5d01b0f7 617CreateNumeric (\r
49a049e6 618 IN UINT16 QuestionId,\r
619 IN UINT8 DataWidth,\r
620 IN CHAR16 *Prompt,\r
621 IN CHAR16 *Help,\r
622 IN UINT16 Minimum,\r
623 IN UINT16 Maximum,\r
624 IN UINT16 Step,\r
625 IN UINT16 Default,\r
626 IN UINT8 Flags,\r
627 IN UINT16 Key,\r
628 IN OUT VOID *FormBuffer,\r
629 IN OUT VOID *StringBuffer\r
5d01b0f7 630 )\r
5d01b0f7 631{\r
49a049e6 632 EFI_STATUS Status;\r
633 FRAMEWORK_EFI_IFR_NUMERIC Numeric;\r
634 CHAR16 CurrentLanguage[4];\r
635 STRING_REF StringToken;\r
5d01b0f7 636\r
637 //\r
638 // We do not create op-code storage widths for numerics in excess of 16 bits for now\r
639 //\r
640 if (DataWidth > 2) {\r
641 return EFI_DEVICE_ERROR;\r
642 }\r
643\r
644 //\r
409f118c 645 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 646 //\r
647 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 648 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 649 if (EFI_ERROR (Status)) {\r
650 return Status;\r
651 }\r
652\r
dc7b4a5c 653 Numeric.Header.OpCode = FRAMEWORK_EFI_IFR_NUMERIC_OP;\r
654 Numeric.Header.Length = sizeof (FRAMEWORK_EFI_IFR_NUMERIC);\r
5d01b0f7 655 Numeric.QuestionId = QuestionId;\r
656 Numeric.Width = DataWidth;\r
657 Numeric.Prompt = StringToken;\r
658\r
659 //\r
409f118c 660 // Add Help string to the StringBuffer, get Help string's token\r
5d01b0f7 661 //\r
662 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
5d01b0f7 663 if (EFI_ERROR (Status)) {\r
664 return Status;\r
665 }\r
666\r
667 Numeric.Help = StringToken;\r
668 Numeric.Minimum = Minimum;\r
669 Numeric.Maximum = Maximum;\r
670 Numeric.Step = Step;\r
671 Numeric.Default = Default;\r
dc7b4a5c 672 Numeric.Flags = (UINT8) (Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 673 Numeric.Key = Key;\r
674\r
675 Status = AddOpCode (FormBuffer, &Numeric);\r
676\r
2ec4d269 677 return Status;\r
5d01b0f7 678}\r
679\r
2ec4d269 680/**\r
49a049e6 681 Create a string.\r
2ec4d269 682 \r
49a049e6 683 @param QuestionId Question ID of the string\r
684 @param DataWidth DataWidth of the string\r
685 @param Prompt Prompt of the string\r
686 @param Help Help of the string\r
687 @param MinSize Min size boundary of the string\r
688 @param MaxSize Max size boundary of the string\r
689 @param Flags Flags of the string\r
690 @param Key Key of the string\r
691 @param FormBuffer The form where this string adds to\r
692 @param StringBuffer String buffer created for Prompt and Help.\r
693 \r
694 @retval EFI_SUCCESS String successfully created. \r
2ec4d269 695**/\r
5d01b0f7 696EFI_STATUS\r
409f118c 697EFIAPI\r
5d01b0f7 698CreateString (\r
49a049e6 699 IN UINT16 QuestionId,\r
700 IN UINT8 DataWidth,\r
701 IN CHAR16 *Prompt,\r
702 IN CHAR16 *Help,\r
703 IN UINT8 MinSize,\r
704 IN UINT8 MaxSize,\r
705 IN UINT8 Flags,\r
706 IN UINT16 Key,\r
707 IN OUT VOID *FormBuffer,\r
708 IN OUT VOID *StringBuffer\r
5d01b0f7 709 )\r
5d01b0f7 710{\r
49a049e6 711 EFI_STATUS Status;\r
712 FRAMEWORK_EFI_IFR_STRING String;\r
713 CHAR16 CurrentLanguage[4];\r
714 STRING_REF StringToken;\r
5d01b0f7 715\r
716 //\r
409f118c 717 // Add Prompt string to the StringBuffer, get Prompt string's token\r
5d01b0f7 718 //\r
719 GetCurrentLanguage (CurrentLanguage);\r
5d01b0f7 720 Status = AddString (StringBuffer, CurrentLanguage, Prompt, &StringToken);\r
5d01b0f7 721 if (EFI_ERROR (Status)) {\r
722 return Status;\r
723 }\r
724\r
dc7b4a5c 725 String.Header.OpCode = FRAMEWORK_EFI_IFR_STRING_OP;\r
726 String.Header.Length = sizeof (FRAMEWORK_EFI_IFR_STRING);\r
5d01b0f7 727 String.QuestionId = QuestionId;\r
728 String.Width = DataWidth;\r
729 String.Prompt = StringToken;\r
730\r
731 //\r
409f118c 732 // Add Help string to the StringBuffer, get Help string's token\r
5d01b0f7 733 //\r
734 Status = AddString (StringBuffer, CurrentLanguage, Help, &StringToken);\r
5d01b0f7 735 if (EFI_ERROR (Status)) {\r
736 return Status;\r
737 }\r
738\r
739 String.Help = StringToken;\r
740 String.MinSize = MinSize;\r
741 String.MaxSize = MaxSize;\r
dc7b4a5c 742 String.Flags = (UINT8) (Flags | FRAMEWORK_EFI_IFR_FLAG_CREATED);\r
5d01b0f7 743 String.Key = Key;\r
744\r
745 Status = AddOpCode (FormBuffer, &String);\r
746\r
2ec4d269 747 return Status;\r
5d01b0f7 748}\r
2ec4d269 749\r