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