]> git.proxmox.com Git - mirror_edk2.git/blame - EdkCompatibilityPkg/Compatibility/FrameworkHiiOnUefiHiiThunk/UefiIfrParser.c
EdkCompatibilityPkg: Fix the typo in the comment
[mirror_edk2.git] / EdkCompatibilityPkg / Compatibility / FrameworkHiiOnUefiHiiThunk / UefiIfrParser.c
CommitLineData
59336178 1/** @file\r
2Parser for IFR binary encoding.\r
3\r
b5f8b5b0 4Copyright (c) 2008 - 2014, Intel Corporation. All rights reserved.<BR>\r
584d5652 5This program and the accompanying materials\r
59336178 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
6d207823 15#include "HiiDatabase.h"\r
59336178 16\r
a9d85320 17#include "UefiIfrParserExpression.h"\r
59336178 18\r
19UINT16 mStatementIndex;\r
59336178 20\r
21BOOLEAN mInScopeSubtitle;\r
22BOOLEAN mInScopeSuppress;\r
23BOOLEAN mInScopeGrayOut;\r
59336178 24\r
a9d85320 25EFI_GUID mFrameworkHiiCompatibilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
26extern EFI_GUID mTianoHiiIfrGuid;\r
27\r
26a76fbc
LG
28/**\r
29 Find the question's OneOfOptionMap list in FormSet \r
30 based on the input question Id. \r
31 \r
32 @param FormSet FormSet context.\r
33 @param QuestionId Unique ID to specicy the question in FormSet.\r
34 \r
35 @return the found OneOfOptionMap list. If not found, NULL will return.\r
36**/\r
a9d85320 37LIST_ENTRY *\r
38GetOneOfOptionMapEntryListHead (\r
39 IN CONST FORM_BROWSER_FORMSET *FormSet,\r
40 IN UINT16 QuestionId\r
41 )\r
42{\r
43 LIST_ENTRY *Link;\r
44 ONE_OF_OPTION_MAP *Map;\r
45\r
46 Link = GetFirstNode (&FormSet->OneOfOptionMapListHead);\r
47\r
48 while (!IsNull (&FormSet->OneOfOptionMapListHead, Link)) {\r
49 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
50 if (QuestionId == Map->QuestionId) {\r
51 return &Map->OneOfOptionMapEntryListHead;\r
52 }\r
53 Link = GetNextNode (&FormSet->OneOfOptionMapListHead, Link);\r
54 }\r
55 \r
56 return NULL;\r
57}\r
58\r
26a76fbc
LG
59/**\r
60 Free OneOfOption map list.\r
61 \r
62 @param OneOfOptionMapListHead Pointer to list header of OneOfOptionMap list.\r
63\r
64**/\r
a9d85320 65VOID\r
66DestoryOneOfOptionMap (\r
67 IN LIST_ENTRY *OneOfOptionMapListHead\r
68 )\r
69{\r
70 ONE_OF_OPTION_MAP *Map;\r
71 ONE_OF_OPTION_MAP_ENTRY *MapEntry;\r
72 LIST_ENTRY *Link;\r
73 LIST_ENTRY *Link2;\r
74\r
75 while (!IsListEmpty (OneOfOptionMapListHead)) {\r
76 Link = GetFirstNode (OneOfOptionMapListHead);\r
77 \r
78 Map = ONE_OF_OPTION_MAP_FROM_LINK (Link);\r
79\r
80 while (!IsListEmpty (&Map->OneOfOptionMapEntryListHead)) {\r
81 Link2 = GetFirstNode (&Map->OneOfOptionMapEntryListHead);\r
82 \r
83 MapEntry = ONE_OF_OPTION_MAP_ENTRY_FROM_LINK (Link2);\r
84\r
85 RemoveEntryList (Link2);\r
86\r
87 FreePool (MapEntry);\r
88 }\r
89\r
90 RemoveEntryList (Link);\r
91 FreePool (Map);\r
92 }\r
93}\r
94\r
59336178 95\r
96/**\r
97 Initialize Statement header members.\r
98\r
99 @param OpCodeData Pointer of the raw OpCode data.\r
9011cfbe 100 @param FormSet Pointer of the current FormSet.\r
59336178 101 @param Form Pointer of the current Form.\r
102\r
103 @return The Statement.\r
104\r
105**/\r
106FORM_BROWSER_STATEMENT *\r
107CreateStatement (\r
108 IN UINT8 *OpCodeData,\r
109 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
110 IN OUT FORM_BROWSER_FORM *Form\r
111 )\r
112{\r
113 FORM_BROWSER_STATEMENT *Statement;\r
114 EFI_IFR_STATEMENT_HEADER *StatementHdr;\r
115\r
116 if (Form == NULL) {\r
117 //\r
118 // We are currently not in a Form Scope, so just skip this Statement\r
119 //\r
120 return NULL;\r
121 }\r
122\r
123 Statement = &FormSet->StatementBuffer[mStatementIndex];\r
124 mStatementIndex++;\r
125\r
126 InitializeListHead (&Statement->DefaultListHead);\r
127 InitializeListHead (&Statement->OptionListHead);\r
59336178 128\r
129 Statement->Signature = FORM_BROWSER_STATEMENT_SIGNATURE;\r
130\r
131 Statement->Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
132\r
133 StatementHdr = (EFI_IFR_STATEMENT_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
134 CopyMem (&Statement->Prompt, &StatementHdr->Prompt, sizeof (EFI_STRING_ID));\r
135 CopyMem (&Statement->Help, &StatementHdr->Help, sizeof (EFI_STRING_ID));\r
136\r
59336178 137 Statement->InSubtitle = mInScopeSubtitle;\r
138\r
139 //\r
140 // Insert this Statement into current Form\r
141 //\r
142 InsertTailList (&Form->StatementListHead, &Statement->Link);\r
143\r
144 return Statement;\r
145}\r
146\r
59336178 147/**\r
148 Initialize Question's members.\r
149\r
150 @param OpCodeData Pointer of the raw OpCode data.\r
151 @param FormSet Pointer of the current FormSet.\r
152 @param Form Pointer of the current Form.\r
153\r
154 @return The Question.\r
155\r
156**/\r
157FORM_BROWSER_STATEMENT *\r
158CreateQuestion (\r
159 IN UINT8 *OpCodeData,\r
160 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
161 IN OUT FORM_BROWSER_FORM *Form\r
162 )\r
163{\r
164 FORM_BROWSER_STATEMENT *Statement;\r
165 EFI_IFR_QUESTION_HEADER *QuestionHdr;\r
166 LIST_ENTRY *Link;\r
167 FORMSET_STORAGE *Storage;\r
59336178 168\r
169 Statement = CreateStatement (OpCodeData, FormSet, Form);\r
170 if (Statement == NULL) {\r
171 return NULL;\r
172 }\r
173\r
174 QuestionHdr = (EFI_IFR_QUESTION_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
175 CopyMem (&Statement->QuestionId, &QuestionHdr->QuestionId, sizeof (EFI_QUESTION_ID));\r
176 CopyMem (&Statement->VarStoreId, &QuestionHdr->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
177 CopyMem (&Statement->VarStoreInfo.VarOffset, &QuestionHdr->VarStoreInfo.VarOffset, sizeof (UINT16));\r
178\r
a9d85320 179 if (FormSet->MaxQuestionId < QuestionHdr->QuestionId) {\r
180 FormSet->MaxQuestionId = QuestionHdr->QuestionId;\r
181 }\r
182\r
59336178 183 Statement->QuestionFlags = QuestionHdr->Flags;\r
184\r
185 if (Statement->VarStoreId == 0) {\r
186 //\r
187 // VarStoreId of zero indicates no variable storage\r
188 //\r
189 return Statement;\r
190 }\r
191\r
192 //\r
193 // Find Storage for this Question\r
194 //\r
195 Link = GetFirstNode (&FormSet->StorageListHead);\r
196 while (!IsNull (&FormSet->StorageListHead, Link)) {\r
197 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
198\r
199 if (Storage->VarStoreId == Statement->VarStoreId) {\r
200 Statement->Storage = Storage;\r
201 break;\r
202 }\r
203\r
204 Link = GetNextNode (&FormSet->StorageListHead, Link);\r
205 }\r
206 ASSERT (Statement->Storage != NULL);\r
207\r
59336178 208 return Statement;\r
209}\r
210\r
59336178 211/**\r
212 Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
213\r
214 @param FormSet Pointer of the current FormSet\r
215\r
216 @return Pointer to a FORMSET_STORAGE data structure.\r
217\r
218**/\r
219FORMSET_STORAGE *\r
220CreateStorage (\r
221 IN FORM_BROWSER_FORMSET *FormSet\r
222 )\r
223{\r
224 FORMSET_STORAGE *Storage;\r
225\r
226 Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
771ececd 227 ASSERT (Storage != NULL);\r
59336178 228 Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
59336178 229 InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
230\r
231 return Storage;\r
232}\r
233\r
59336178 234/**\r
235 Free resources of a storage\r
236\r
237 @param Storage Pointer of the storage\r
238\r
239 @return None.\r
240\r
241**/\r
242VOID\r
243DestroyStorage (\r
244 IN FORMSET_STORAGE *Storage\r
245 )\r
246{\r
59336178 247 if (Storage == NULL) {\r
248 return;\r
249 }\r
250\r
a9d85320 251 if (Storage->Name!= NULL) {\r
252 FreePool (Storage->Name);\r
59336178 253 }\r
254\r
7001eaf8 255 FreePool (Storage);\r
59336178 256}\r
257\r
258\r
259/**\r
260 Free resources of a Statement\r
261\r
262 @param Statement Pointer of the Statement\r
263\r
264 @return None.\r
265\r
266**/\r
267VOID\r
268DestroyStatement (\r
269 IN OUT FORM_BROWSER_STATEMENT *Statement\r
270 )\r
271{\r
272 LIST_ENTRY *Link;\r
273 QUESTION_DEFAULT *Default;\r
274 QUESTION_OPTION *Option;\r
59336178 275\r
276 //\r
277 // Free Default value List\r
278 //\r
279 while (!IsListEmpty (&Statement->DefaultListHead)) {\r
280 Link = GetFirstNode (&Statement->DefaultListHead);\r
281 Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
282 RemoveEntryList (&Default->Link);\r
283\r
284 gBS->FreePool (Default);\r
285 }\r
286\r
287 //\r
288 // Free Options List\r
289 //\r
290 while (!IsListEmpty (&Statement->OptionListHead)) {\r
291 Link = GetFirstNode (&Statement->OptionListHead);\r
292 Option = QUESTION_OPTION_FROM_LINK (Link);\r
293 RemoveEntryList (&Option->Link);\r
294\r
295 gBS->FreePool (Option);\r
296 }\r
297\r
59336178 298}\r
299\r
300\r
7001eaf8 301\r
59336178 302/**\r
303 Free resources of a Form\r
304\r
305 @param Form Pointer of the Form\r
306\r
307 @return None.\r
308\r
309**/\r
310VOID\r
311DestroyForm (\r
312 IN OUT FORM_BROWSER_FORM *Form\r
313 )\r
314{\r
315 LIST_ENTRY *Link;\r
59336178 316 FORM_BROWSER_STATEMENT *Statement;\r
317\r
59336178 318 //\r
319 // Free Statements/Questions\r
320 //\r
321 while (!IsListEmpty (&Form->StatementListHead)) {\r
322 Link = GetFirstNode (&Form->StatementListHead);\r
323 Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
324 RemoveEntryList (&Statement->Link);\r
325\r
326 DestroyStatement (Statement);\r
327 }\r
328\r
329 //\r
330 // Free this Form\r
331 //\r
332 gBS->FreePool (Form);\r
333}\r
334\r
335\r
336/**\r
337 Free resources allocated for a FormSet\r
338\r
339 @param FormSet Pointer of the FormSet\r
340\r
341 @return None.\r
342\r
343**/\r
344VOID\r
345DestroyFormSet (\r
346 IN OUT FORM_BROWSER_FORMSET *FormSet\r
347 )\r
348{\r
349 LIST_ENTRY *Link;\r
350 FORMSET_STORAGE *Storage;\r
351 FORMSET_DEFAULTSTORE *DefaultStore;\r
352 FORM_BROWSER_FORM *Form;\r
353\r
354 //\r
355 // Free IFR binary buffer\r
356 //\r
7001eaf8 357 FreePool (FormSet->IfrBinaryData);\r
59336178 358\r
359 //\r
360 // Free FormSet Storage\r
361 //\r
362 if (FormSet->StorageListHead.ForwardLink != NULL) {\r
363 while (!IsListEmpty (&FormSet->StorageListHead)) {\r
364 Link = GetFirstNode (&FormSet->StorageListHead);\r
365 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
366 RemoveEntryList (&Storage->Link);\r
367\r
368 DestroyStorage (Storage);\r
369 }\r
370 }\r
371\r
372 //\r
373 // Free FormSet Default Store\r
374 //\r
375 if (FormSet->DefaultStoreListHead.ForwardLink != NULL) {\r
376 while (!IsListEmpty (&FormSet->DefaultStoreListHead)) {\r
377 Link = GetFirstNode (&FormSet->DefaultStoreListHead);\r
378 DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK (Link);\r
379 RemoveEntryList (&DefaultStore->Link);\r
380\r
381 gBS->FreePool (DefaultStore);\r
382 }\r
383 }\r
384\r
385 //\r
386 // Free Forms\r
387 //\r
388 if (FormSet->FormListHead.ForwardLink != NULL) {\r
389 while (!IsListEmpty (&FormSet->FormListHead)) {\r
390 Link = GetFirstNode (&FormSet->FormListHead);\r
391 Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
392 RemoveEntryList (&Form->Link);\r
393\r
394 DestroyForm (Form);\r
395 }\r
396 }\r
397\r
7001eaf8 398 if (FormSet->StatementBuffer != NULL) {\r
399 FreePool (FormSet->StatementBuffer);\r
400 }\r
59336178 401\r
a9d85320 402 DestoryOneOfOptionMap (&FormSet->OneOfOptionMapListHead);\r
dee207ee 403\r
404 if (FormSet->OriginalDefaultVarStoreName != NULL) {\r
405 FreePool (FormSet->OriginalDefaultVarStoreName);\r
406 }\r
a9d85320 407 \r
7001eaf8 408 FreePool (FormSet);\r
59336178 409}\r
410\r
411\r
412/**\r
413 Tell whether this Operand is an Expression OpCode or not\r
414\r
415 @param Operand Operand of an IFR OpCode.\r
416\r
417 @retval TRUE This is an Expression OpCode.\r
418 @retval FALSE Not an Expression OpCode.\r
419\r
420**/\r
421BOOLEAN\r
422IsExpressionOpCode (\r
423 IN UINT8 Operand\r
424 )\r
425{\r
426 if (((Operand >= EFI_IFR_EQ_ID_VAL_OP) && (Operand <= EFI_IFR_NOT_OP)) ||\r
6a824198
LG
427 ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SET_OP)) ||\r
428 ((Operand >= EFI_IFR_EQUAL_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
429 (Operand == EFI_IFR_CATENATE_OP) ||\r
430 (Operand == EFI_IFR_TO_LOWER_OP) ||\r
431 (Operand == EFI_IFR_TO_UPPER_OP) ||\r
432 (Operand == EFI_IFR_MAP_OP) ||\r
433 (Operand == EFI_IFR_VERSION_OP) ||\r
434 (Operand == EFI_IFR_SECURITY_OP)) {\r
59336178 435 return TRUE;\r
436 } else {\r
437 return FALSE;\r
438 }\r
439}\r
440\r
441\r
442/**\r
443 Calculate number of Statemens(Questions) and Expression OpCodes.\r
444\r
445 @param FormSet The FormSet to be counted.\r
446 @param NumberOfStatement Number of Statemens(Questions)\r
447 @param NumberOfExpression Number of Expression OpCodes\r
448\r
449 @return None.\r
450\r
451**/\r
452VOID\r
453CountOpCodes (\r
454 IN FORM_BROWSER_FORMSET *FormSet,\r
455 IN OUT UINT16 *NumberOfStatement,\r
456 IN OUT UINT16 *NumberOfExpression\r
457 )\r
458{\r
459 UINT16 StatementCount;\r
460 UINT16 ExpressionCount;\r
461 UINT8 *OpCodeData;\r
462 UINTN Offset;\r
463 UINTN OpCodeLen;\r
464\r
465 Offset = 0;\r
466 StatementCount = 0;\r
467 ExpressionCount = 0;\r
468\r
469 while (Offset < FormSet->IfrBinaryLength) {\r
470 OpCodeData = FormSet->IfrBinaryData + Offset;\r
471 OpCodeLen = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
472 Offset += OpCodeLen;\r
473\r
474 if (IsExpressionOpCode (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode)) {\r
475 ExpressionCount++;\r
476 } else {\r
477 StatementCount++;\r
478 }\r
479 }\r
480\r
481 *NumberOfStatement = StatementCount;\r
482 *NumberOfExpression = ExpressionCount;\r
483}\r
484\r
485\r
486/**\r
487 Parse opcodes in the formset IFR binary.\r
488\r
489 @param FormSet Pointer of the FormSet data structure.\r
490\r
491 @retval EFI_SUCCESS Opcode parse success.\r
492 @retval Other Opcode parse fail.\r
493\r
494**/\r
495EFI_STATUS\r
496ParseOpCodes (\r
497 IN FORM_BROWSER_FORMSET *FormSet\r
498 )\r
499{\r
500 EFI_STATUS Status;\r
501 UINT16 Index;\r
502 FORM_BROWSER_FORM *CurrentForm;\r
503 FORM_BROWSER_STATEMENT *CurrentStatement;\r
59336178 504 UINT8 Operand;\r
505 UINT8 Scope;\r
506 UINTN OpCodeOffset;\r
507 UINTN OpCodeLength;\r
508 UINT8 *OpCodeData;\r
509 UINT8 ScopeOpCode;\r
510 FORMSET_STORAGE *Storage;\r
511 FORMSET_DEFAULTSTORE *DefaultStore;\r
512 QUESTION_DEFAULT *CurrentDefault;\r
513 QUESTION_OPTION *CurrentOption;\r
514 CHAR8 *AsciiString;\r
515 UINT16 NumberOfStatement;\r
516 UINT16 NumberOfExpression;\r
517 EFI_IMAGE_ID *ImageId;\r
59336178 518 EFI_HII_VALUE *Value;\r
a9d85320 519 LIST_ENTRY *OneOfOptinMapEntryListHead;\r
520 EFI_IFR_GUID_OPTIONKEY *OptionMap;\r
521 ONE_OF_OPTION_MAP *OneOfOptionMap;\r
522 ONE_OF_OPTION_MAP_ENTRY *OneOfOptionMapEntry;\r
523 UINT8 OneOfType;\r
524 EFI_IFR_ONE_OF *OneOfOpcode;\r
6d207823 525 HII_THUNK_CONTEXT *ThunkContext;\r
6a824198 526 EFI_IFR_FORM_MAP_METHOD *MapMethod;\r
59336178 527\r
6d207823
LG
528 mInScopeSubtitle = FALSE;\r
529 mInScopeSuppress = FALSE;\r
530 mInScopeGrayOut = FALSE;\r
531 CurrentDefault = NULL;\r
532 CurrentOption = NULL;\r
6a824198 533 MapMethod = NULL;\r
6d207823 534 ThunkContext = UefiHiiHandleToThunkContext ((CONST HII_THUNK_PRIVATE_DATA*) mHiiThunkPrivateData, FormSet->HiiHandle);\r
a9d85320 535\r
536 //\r
537 // Set to a invalid value.\r
538 //\r
539 OneOfType = (UINT8) -1;\r
59336178 540\r
541 //\r
542 // Get the number of Statements and Expressions\r
543 //\r
544 CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
a9d85320 545 FormSet->NumberOfStatement = NumberOfStatement;\r
59336178 546\r
547 mStatementIndex = 0;\r
548 FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
549 if (FormSet->StatementBuffer == NULL) {\r
550 return EFI_OUT_OF_RESOURCES;\r
551 }\r
552\r
59336178 553 InitializeListHead (&FormSet->StorageListHead);\r
554 InitializeListHead (&FormSet->DefaultStoreListHead);\r
555 InitializeListHead (&FormSet->FormListHead);\r
a9d85320 556 InitializeListHead (&FormSet->OneOfOptionMapListHead);\r
59336178 557\r
558 CurrentForm = NULL;\r
559 CurrentStatement = NULL;\r
560\r
561 ResetScopeStack ();\r
562\r
563 OpCodeOffset = 0;\r
564 while (OpCodeOffset < FormSet->IfrBinaryLength) {\r
565 OpCodeData = FormSet->IfrBinaryData + OpCodeOffset;\r
566\r
567 OpCodeLength = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
568 OpCodeOffset += OpCodeLength;\r
569 Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
570 Scope = ((EFI_IFR_OP_HEADER *) OpCodeData)->Scope;\r
571\r
572 //\r
573 // If scope bit set, push onto scope stack\r
574 //\r
234980f6 575 if (Scope != 0) {\r
59336178 576 PushScope (Operand);\r
577 }\r
578\r
59336178 579 if (IsExpressionOpCode (Operand)) {\r
59336178 580 continue;\r
581 }\r
582\r
583 //\r
584 // Parse the Opcode\r
585 //\r
586 switch (Operand) {\r
587\r
588 case EFI_IFR_FORM_SET_OP:\r
589 //\r
590 // check the formset GUID\r
591 //\r
5a58200d 592 if (!CompareGuid ((EFI_GUID *)(VOID *)&FormSet->Guid, (EFI_GUID *)(VOID *)&((EFI_IFR_FORM_SET *) OpCodeData)->Guid)) {\r
59336178 593 return EFI_INVALID_PARAMETER;\r
594 }\r
595\r
596 CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
597 CopyMem (&FormSet->Help, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
598 break;\r
599\r
600 case EFI_IFR_FORM_OP:\r
601 //\r
602 // Create a new Form for this FormSet\r
603 //\r
604 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
771ececd 605 ASSERT (CurrentForm != NULL);\r
59336178 606 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
a9d85320 607\r
59336178 608 InitializeListHead (&CurrentForm->StatementListHead);\r
609\r
610 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
611 CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
612\r
613 //\r
614 // Insert into Form list of this FormSet\r
615 //\r
616 InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
617 break;\r
618\r
6a824198
LG
619 case EFI_IFR_FORM_MAP_OP:\r
620 //\r
621 // Create a new Form Map for this FormSet\r
622 //\r
623 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
8c5983b7 624 ASSERT (CurrentForm != NULL);\r
6a824198
LG
625 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
626\r
627 InitializeListHead (&CurrentForm->StatementListHead);\r
628\r
629 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
630 MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
631\r
632 //\r
633 // FormMap Form must contain at least one Map Method.\r
634 //\r
635 if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length < ((UINTN) (UINT8 *) (MapMethod + 1) - (UINTN) OpCodeData)) {\r
636 return EFI_INVALID_PARAMETER;\r
637 }\r
638\r
639 //\r
640 // Try to find the standard form map method.\r
641 //\r
642 while (((UINTN) (UINT8 *) MapMethod - (UINTN) OpCodeData) < ((EFI_IFR_OP_HEADER *) OpCodeData)->Length) {\r
643 if (CompareGuid ((EFI_GUID *) (VOID *) &MapMethod->MethodIdentifier, &gEfiHiiStandardFormGuid)) {\r
644 CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
645 break;\r
646 }\r
647 MapMethod ++;\r
648 }\r
649 //\r
650 // If the standard form map method is not found, the first map method title will be used.\r
651 //\r
652 if (CurrentForm->FormTitle == 0) {\r
653 MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
654 CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
655 }\r
656\r
657 //\r
658 // Insert into Form list of this FormSet\r
659 //\r
660 InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
661 break;\r
662\r
59336178 663 //\r
664 // Storage\r
665 //\r
666 case EFI_IFR_VARSTORE_OP:\r
667 //\r
668 // Create a buffer Storage for this FormSet\r
669 //\r
670 Storage = CreateStorage (FormSet);\r
671 Storage->Type = EFI_HII_VARSTORE_BUFFER;\r
672\r
673 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
674 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
675 CopyMem (&Storage->Size, &((EFI_IFR_VARSTORE *) OpCodeData)->Size, sizeof (UINT16));\r
676\r
59336178 677 AsciiString = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
678 Storage->Name = AllocateZeroPool (AsciiStrSize (AsciiString) * 2);\r
679 ASSERT (Storage->Name != NULL);\r
680 for (Index = 0; AsciiString[Index] != 0; Index++) {\r
681 Storage->Name[Index] = (CHAR16) AsciiString[Index];\r
682 }\r
683\r
59336178 684 break;\r
685\r
686 case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
6d207823
LG
687 //\r
688 // Framework IFR doesn't support Name/Value VarStore opcode\r
689 //\r
690 if (ThunkContext != NULL && ThunkContext->ByFrameworkHiiNewPack) {\r
691 ASSERT (FALSE);\r
692 }\r
548dda8f
LG
693\r
694 //\r
695 // Create a name/value Storage for this FormSet\r
696 //\r
697 Storage = CreateStorage (FormSet);\r
698 Storage->Type = EFI_HII_VARSTORE_NAME_VALUE;\r
699\r
700 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
701 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
702\r
59336178 703 break;\r
704\r
705 case EFI_IFR_VARSTORE_EFI_OP:\r
706 //\r
707 // Create a EFI variable Storage for this FormSet\r
708 //\r
709 Storage = CreateStorage (FormSet);\r
710 Storage->Type = EFI_HII_VARSTORE_EFI_VARIABLE;\r
711\r
712 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
713 CopyMem (&Storage->Guid, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
714 CopyMem (&Storage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
715 break;\r
716\r
717 //\r
718 // DefaultStore\r
719 //\r
720 case EFI_IFR_DEFAULTSTORE_OP:\r
721 DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
771ececd 722 ASSERT (DefaultStore != NULL);\r
59336178 723 DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
724\r
725 CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId, sizeof (UINT16));\r
726 CopyMem (&DefaultStore->DefaultName, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultName, sizeof (EFI_STRING_ID));\r
727\r
728 //\r
729 // Insert to DefaultStore list of this Formset\r
730 //\r
731 InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
732 break;\r
733\r
734 //\r
735 // Statements\r
736 //\r
737 case EFI_IFR_SUBTITLE_OP:\r
738 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
234980f6 739 ASSERT (CurrentStatement != NULL);\r
59336178 740 CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
741\r
234980f6 742 if (Scope != 0) {\r
59336178 743 mInScopeSubtitle = TRUE;\r
744 }\r
745 break;\r
746\r
747 case EFI_IFR_TEXT_OP:\r
748 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
234980f6 749 ASSERT (CurrentStatement != NULL);\r
59336178 750\r
751 CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
752 break;\r
753\r
754 //\r
755 // Questions\r
756 //\r
757 case EFI_IFR_ACTION_OP:\r
758 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 759 ASSERT (CurrentStatement != NULL);\r
59336178 760\r
761 if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
762 //\r
763 // No QuestionConfig present, so no configuration string will be processed\r
764 //\r
765 CurrentStatement->QuestionConfig = 0;\r
766 } else {\r
767 CopyMem (&CurrentStatement->QuestionConfig, &((EFI_IFR_ACTION *) OpCodeData)->QuestionConfig, sizeof (EFI_STRING_ID));\r
768 }\r
769 break;\r
770\r
771 case EFI_IFR_RESET_BUTTON_OP:\r
3032f549 772 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
234980f6 773 ASSERT (CurrentStatement != NULL);\r
59336178 774 CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
775 break;\r
776\r
777 case EFI_IFR_REF_OP:\r
778 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 779 ASSERT (CurrentStatement != NULL);\r
59336178 780\r
781 CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
782 if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
783 CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
784\r
785 if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
786 CopyMem (&CurrentStatement->RefFormSetId, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
787\r
788 if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
789 CopyMem (&CurrentStatement->RefDevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
790 }\r
791 }\r
792 }\r
793 break;\r
794\r
795 case EFI_IFR_ONE_OF_OP:\r
796 case EFI_IFR_NUMERIC_OP:\r
797 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 798 ASSERT (CurrentStatement != NULL);\r
59336178 799\r
800 CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
801 Value = &CurrentStatement->HiiValue;\r
802\r
803 switch (CurrentStatement->Flags & EFI_IFR_NUMERIC_SIZE) {\r
804 case EFI_IFR_NUMERIC_SIZE_1:\r
805 CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
806 CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
807 CurrentStatement->Step = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
e0096099 808 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT8);\r
59336178 809 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
810 break;\r
811\r
812 case EFI_IFR_NUMERIC_SIZE_2:\r
813 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
814 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
815 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step, sizeof (UINT16));\r
52fb4d3d 816 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT16);\r
59336178 817 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
818 break;\r
819\r
820 case EFI_IFR_NUMERIC_SIZE_4:\r
821 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
822 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
823 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step, sizeof (UINT32));\r
52fb4d3d 824 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT32);\r
59336178 825 Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
826 break;\r
827\r
828 case EFI_IFR_NUMERIC_SIZE_8:\r
829 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
830 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
831 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step, sizeof (UINT64));\r
52fb4d3d 832 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT64);\r
59336178 833 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
834 break;\r
835\r
836 default:\r
837 break;\r
838 }\r
839\r
a9d85320 840 if (Operand == EFI_IFR_ONE_OF_OP) {\r
841 OneOfOpcode = (EFI_IFR_ONE_OF *) OpCodeData;\r
98b16b9d 842 OneOfType = (UINT8) (OneOfOpcode->Flags & EFI_IFR_NUMERIC_SIZE);\r
a9d85320 843 }\r
59336178 844 break;\r
845\r
846 case EFI_IFR_ORDERED_LIST_OP:\r
847 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 848 ASSERT (CurrentStatement != NULL);\r
59336178 849\r
850 CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
851 CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
852 CurrentStatement->StorageWidth = (UINT16)(CurrentStatement->MaxContainers * sizeof (UINT8));\r
59336178 853\r
854 //\r
855 // No buffer type is defined in EFI_IFR_TYPE_VALUE, so a Configuration Driver\r
856 // has to use FormBrowser2.Callback() to retrieve the uncommited data for\r
857 // an interactive orderedlist (i.e. with EFI_IFR_FLAG_CALLBACK flag set).\r
858 //\r
859 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_OTHER;\r
860 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
861\r
59336178 862 break;\r
863\r
864 case EFI_IFR_CHECKBOX_OP:\r
865 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 866 ASSERT (CurrentStatement != NULL);\r
59336178 867\r
868 CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
52fb4d3d 869 CurrentStatement->StorageWidth = (UINT16) sizeof (BOOLEAN);\r
59336178 870 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
871\r
59336178 872 break;\r
873\r
874 case EFI_IFR_STRING_OP:\r
875 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 876 ASSERT (CurrentStatement != NULL);\r
59336178 877\r
878 //\r
879 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
880 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
881 // The characters are stored as Unicode, so the storage width should multiply 2.\r
882 //\r
883 CurrentStatement->Minimum = ((EFI_IFR_STRING *) OpCodeData)->MinSize;\r
884 CurrentStatement->Maximum = ((EFI_IFR_STRING *) OpCodeData)->MaxSize;\r
885 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
886 CurrentStatement->Flags = ((EFI_IFR_STRING *) OpCodeData)->Flags;\r
887\r
888 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
889 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
890\r
59336178 891 break;\r
892\r
893 case EFI_IFR_PASSWORD_OP:\r
894 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 895 ASSERT (CurrentStatement != NULL);\r
59336178 896\r
897 //\r
898 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
899 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
900 // The characters are stored as Unicode, so the storage width should multiply 2.\r
901 //\r
902 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_PASSWORD *) OpCodeData)->MinSize, sizeof (UINT16));\r
903 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_PASSWORD *) OpCodeData)->MaxSize, sizeof (UINT16));\r
904 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (UINT16));\r
905\r
906 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
907 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
908\r
59336178 909 break;\r
910\r
911 case EFI_IFR_DATE_OP:\r
912 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 913 ASSERT (CurrentStatement != NULL);\r
59336178 914\r
915 CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
916 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
917\r
59336178 918 break;\r
919\r
920 case EFI_IFR_TIME_OP:\r
921 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
234980f6 922 ASSERT (CurrentStatement != NULL);\r
59336178 923\r
924 CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
925 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
926\r
59336178 927 break;\r
928\r
929 //\r
930 // Default\r
931 //\r
932 case EFI_IFR_DEFAULT_OP:\r
933 //\r
934 // EFI_IFR_DEFAULT appear in scope of a Question,\r
935 // It creates a default value for the current question.\r
936 // A Question may have more than one Default value which have different default types.\r
937 //\r
938 CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
771ececd 939 ASSERT (CurrentDefault != NULL);\r
59336178 940 CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
941\r
942 CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
943 CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
944 CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
945 ExtendValueToU64 (&CurrentDefault->Value);\r
946\r
947 //\r
948 // Insert to Default Value list of current Question\r
949 //\r
950 InsertTailList (&CurrentStatement->DefaultListHead, &CurrentDefault->Link);\r
951\r
59336178 952 break;\r
953\r
954 //\r
955 // Option\r
956 //\r
957 case EFI_IFR_ONE_OF_OPTION_OP:\r
958 //\r
959 // EFI_IFR_ONE_OF_OPTION appear in scope of a Question.\r
960 // It create a selection for use in current Question.\r
961 //\r
962 CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
771ececd 963 ASSERT (CurrentOption != NULL);\r
59336178 964 CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
965\r
966 CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
967 CurrentOption->Value.Type = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Type;\r
968 CopyMem (&CurrentOption->Text, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Option, sizeof (EFI_STRING_ID));\r
969 CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, sizeof (EFI_IFR_TYPE_VALUE));\r
970 ExtendValueToU64 (&CurrentOption->Value);\r
971\r
59336178 972 //\r
973 // Insert to Option list of current Question\r
974 //\r
975 InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);\r
976 break;\r
977\r
978 //\r
979 // Conditional\r
980 //\r
981 case EFI_IFR_NO_SUBMIT_IF_OP:\r
982 case EFI_IFR_INCONSISTENT_IF_OP:\r
59336178 983 break;\r
984\r
985 case EFI_IFR_SUPPRESS_IF_OP:\r
59336178 986 break;\r
987\r
988 case EFI_IFR_GRAY_OUT_IF_OP:\r
59336178 989 break;\r
990\r
991 case EFI_IFR_DISABLE_IF_OP:\r
6d207823
LG
992 //\r
993 // Framework IFR doesn't support DisableIf opcode\r
994 //\r
995 if (ThunkContext != NULL && ThunkContext->ByFrameworkHiiNewPack) {\r
996 ASSERT (FALSE);\r
997 }\r
59336178 998\r
999 //\r
1000 // Expression\r
1001 //\r
1002 case EFI_IFR_VALUE_OP:\r
6a824198
LG
1003 case EFI_IFR_READ_OP:\r
1004 case EFI_IFR_WRITE_OP:\r
59336178 1005 break;\r
1006\r
1007 case EFI_IFR_RULE_OP:\r
59336178 1008 break;\r
1009\r
1010 //\r
1011 // Image\r
1012 //\r
1013 case EFI_IFR_IMAGE_OP:\r
1014 //\r
1015 // Get ScopeOpcode from top of stack\r
1016 //\r
1017 PopScope (&ScopeOpCode);\r
1018 PushScope (ScopeOpCode);\r
1019\r
1020 switch (ScopeOpCode) {\r
1021 case EFI_IFR_FORM_SET_OP:\r
1022 ImageId = &FormSet->ImageId;\r
1023 break;\r
1024\r
1025 case EFI_IFR_FORM_OP:\r
6a824198 1026 case EFI_IFR_FORM_MAP_OP:\r
b5f8b5b0 1027 ASSERT (CurrentForm != NULL);\r
59336178 1028 ImageId = &CurrentForm->ImageId;\r
1029 break;\r
1030\r
1031 case EFI_IFR_ONE_OF_OPTION_OP:\r
b5f8b5b0 1032 ASSERT (CurrentOption != NULL);\r
59336178 1033 ImageId = &CurrentOption->ImageId;\r
1034 break;\r
1035\r
1036 default:\r
234980f6
LG
1037 //\r
1038 // Make sure CurrentStatement is not NULL.\r
1039 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
1040 // file is wrongly generated by tools such as VFR Compiler.\r
1041 //\r
1042 ASSERT (CurrentStatement != NULL);\r
59336178 1043 ImageId = &CurrentStatement->ImageId;\r
1044 break;\r
1045 }\r
234980f6
LG
1046 \r
1047 ASSERT (ImageId != NULL);\r
59336178 1048 CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
1049 break;\r
1050\r
1051 //\r
1052 // Refresh\r
1053 //\r
1054 case EFI_IFR_REFRESH_OP:\r
234980f6 1055 ASSERT (CurrentStatement != NULL);\r
59336178 1056 CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
1057 break;\r
1058\r
1059 //\r
1060 // Vendor specific\r
1061 //\r
1062 case EFI_IFR_GUID_OP:\r
a9d85320 1063 OptionMap = (EFI_IFR_GUID_OPTIONKEY *) OpCodeData;\r
1064 \r
1065 if (CompareGuid (&mTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
59336178 1066 //\r
1067 // Tiano specific GUIDed opcodes\r
1068 //\r
1069 switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
1070 case EFI_IFR_EXTEND_OP_LABEL:\r
1071 //\r
1072 // just ignore label\r
1073 //\r
1074 break;\r
1075\r
59336178 1076\r
1077 case EFI_IFR_EXTEND_OP_CLASS:\r
1078 CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
1079 break;\r
1080\r
1081 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
1082 CopyMem (&FormSet->SubClass, &((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass, sizeof (UINT16));\r
1083 break;\r
1084\r
1085 default:\r
1086 break;\r
1087 }\r
3032f549 1088 } else if (CompareGuid ((EFI_GUID *)(VOID *)&OptionMap->Guid, &mFrameworkHiiCompatibilityGuid)) {\r
a9d85320 1089 if (OptionMap->ExtendOpCode == EFI_IFR_EXTEND_OP_OPTIONKEY) {\r
1090 OneOfOptinMapEntryListHead = GetOneOfOptionMapEntryListHead (FormSet, OptionMap->QuestionId);\r
1091 if (OneOfOptinMapEntryListHead == NULL) {\r
1092 OneOfOptionMap = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP));\r
1093 ASSERT (OneOfOptionMap != NULL);\r
1094\r
1095 OneOfOptionMap->Signature = ONE_OF_OPTION_MAP_SIGNATURE;\r
1096 OneOfOptionMap->QuestionId = OptionMap->QuestionId;\r
1097\r
1098 //\r
1099 // Make sure OneOfType is initialized.\r
1100 //\r
1101 ASSERT (OneOfType != (UINT8) -1);\r
1102 OneOfOptionMap->ValueType = OneOfType;\r
1103 InitializeListHead (&OneOfOptionMap->OneOfOptionMapEntryListHead);\r
1104 OneOfOptinMapEntryListHead = &OneOfOptionMap->OneOfOptionMapEntryListHead;\r
1105 InsertTailList (&FormSet->OneOfOptionMapListHead, &OneOfOptionMap->Link);\r
1106 }\r
1107 OneOfOptionMapEntry = AllocateZeroPool (sizeof (ONE_OF_OPTION_MAP_ENTRY));\r
1108 ASSERT (OneOfOptionMapEntry != NULL);\r
1109\r
1110 OneOfOptionMapEntry->Signature = ONE_OF_OPTION_MAP_ENTRY_SIGNATURE;\r
1111 OneOfOptionMapEntry->FwKey = OptionMap->KeyValue;\r
1112 CopyMem (&OneOfOptionMapEntry->Value, &OptionMap->OptionValue, sizeof (EFI_IFR_TYPE_VALUE));\r
1113 \r
1114 InsertTailList (OneOfOptinMapEntryListHead, &OneOfOptionMapEntry->Link);\r
1115 }\r
1116 }\r
59336178 1117 break;\r
1118\r
1119 //\r
1120 // Scope End\r
1121 //\r
1122 case EFI_IFR_END_OP:\r
1123 Status = PopScope (&ScopeOpCode);\r
1124 if (EFI_ERROR (Status)) {\r
1125 ResetScopeStack ();\r
1126 return Status;\r
1127 }\r
1128\r
1129 switch (ScopeOpCode) {\r
1130 case EFI_IFR_FORM_SET_OP:\r
1131 //\r
1132 // End of FormSet, update FormSet IFR binary length\r
1133 // to stop parsing substantial OpCodes\r
1134 //\r
1135 FormSet->IfrBinaryLength = OpCodeOffset;\r
1136 break;\r
1137\r
1138 case EFI_IFR_FORM_OP:\r
6a824198 1139 case EFI_IFR_FORM_MAP_OP:\r
59336178 1140 //\r
1141 // End of Form\r
1142 //\r
1143 CurrentForm = NULL;\r
1144 break;\r
1145\r
1146 case EFI_IFR_ONE_OF_OPTION_OP:\r
1147 //\r
1148 // End of Option\r
1149 //\r
1150 CurrentOption = NULL;\r
1151 break;\r
1152\r
1153 case EFI_IFR_SUBTITLE_OP:\r
1154 mInScopeSubtitle = FALSE;\r
1155 break;\r
1156\r
1157 case EFI_IFR_NO_SUBMIT_IF_OP:\r
1158 case EFI_IFR_INCONSISTENT_IF_OP:\r
1159 //\r
1160 // Ignore end of EFI_IFR_NO_SUBMIT_IF and EFI_IFR_INCONSISTENT_IF\r
1161 //\r
1162 break;\r
1163\r
59336178 1164 case EFI_IFR_GRAY_OUT_IF_OP:\r
1165 mInScopeGrayOut = FALSE;\r
1166 break;\r
1167\r
59336178 1168 default:\r
1169 if (IsExpressionOpCode (ScopeOpCode)) {\r
59336178 1170 }\r
1171 break;\r
1172 }\r
1173 break;\r
1174\r
1175 default:\r
1176 break;\r
1177 }\r
1178 }\r
1179\r
1180 return EFI_SUCCESS;\r
1181}\r
1182\r
1183\r
1184\r
1185\r