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