]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Universal/SetupBrowserDxe/IfrParse.c
Rollback patch 14537 & 14538, because patch 14537 is not tested by Laszlo Ersek,...
[mirror_edk2.git] / MdeModulePkg / Universal / SetupBrowserDxe / IfrParse.c
CommitLineData
c60a0616 1/** @file\r
2Parser for IFR binary encoding.\r
3\r
a7f87053 4Copyright (c) 2007 - 2013, Intel Corporation. All rights reserved.<BR>\r
e5eed7d3 5This program and the accompanying materials\r
c60a0616 6are licensed and made available under the terms and conditions of the BSD License\r
7which accompanies this distribution. The full text of the license may be found at\r
8http://opensource.org/licenses/bsd-license.php\r
9\r
10THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "Setup.h"\r
c60a0616 16\r
17UINT16 mStatementIndex;\r
18UINT16 mExpressionOpCodeIndex;\r
25361615 19\r
c60a0616 20BOOLEAN mInScopeSubtitle;\r
94f3aae7 21extern LIST_ENTRY gBrowserStorageList;\r
c60a0616 22/**\r
23 Initialize Statement header members.\r
24\r
25 @param OpCodeData Pointer of the raw OpCode data.\r
26 @param FormSet Pointer of the current FormSe.\r
27 @param Form Pointer of the current Form.\r
28\r
29 @return The Statement.\r
30\r
31**/\r
32FORM_BROWSER_STATEMENT *\r
33CreateStatement (\r
34 IN UINT8 *OpCodeData,\r
35 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
36 IN OUT FORM_BROWSER_FORM *Form\r
37 )\r
38{\r
39 FORM_BROWSER_STATEMENT *Statement;\r
40 EFI_IFR_STATEMENT_HEADER *StatementHdr;\r
31585af4 41 INTN ConditionalExprCount; \r
c60a0616 42\r
43 if (Form == NULL) {\r
44 //\r
25361615 45 // We are currently not in a Form Scope, so just skip this Statement\r
c60a0616 46 //\r
25361615 47 return NULL;\r
c60a0616 48 }\r
49\r
50 Statement = &FormSet->StatementBuffer[mStatementIndex];\r
51 mStatementIndex++;\r
52\r
53 InitializeListHead (&Statement->DefaultListHead);\r
54 InitializeListHead (&Statement->OptionListHead);\r
55 InitializeListHead (&Statement->InconsistentListHead);\r
56 InitializeListHead (&Statement->NoSubmitListHead);\r
57\r
58 Statement->Signature = FORM_BROWSER_STATEMENT_SIGNATURE;\r
59\r
60 Statement->Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
61\r
62 StatementHdr = (EFI_IFR_STATEMENT_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
63 CopyMem (&Statement->Prompt, &StatementHdr->Prompt, sizeof (EFI_STRING_ID));\r
64 CopyMem (&Statement->Help, &StatementHdr->Help, sizeof (EFI_STRING_ID));\r
65\r
31585af4
ED
66 ConditionalExprCount = GetConditionalExpressionCount(ExpressStatement);\r
67 if (ConditionalExprCount > 0) {\r
68 //\r
69 // Form is inside of suppressif\r
70 //\r
71 \r
72 Statement->Expression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
73 (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
74 ASSERT (Statement->Expression != NULL);\r
75 Statement->Expression->Count = (UINTN) ConditionalExprCount;\r
76 Statement->Expression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
77 CopyMem (Statement->Expression->Expression, GetConditionalExpressionList(ExpressStatement), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
0a1147ed
LG
78 }\r
79\r
c60a0616 80 Statement->InSubtitle = mInScopeSubtitle;\r
81\r
82 //\r
83 // Insert this Statement into current Form\r
84 //\r
25361615
ED
85 InsertTailList (&Form->StatementListHead, &Statement->Link);\r
86\r
c60a0616 87 return Statement;\r
88}\r
89\r
7064c0a5 90/**\r
91 Convert a numeric value to a Unicode String and insert it to String Package.\r
92 This string is used as the Unicode Name for the EFI Variable. This is to support\r
93 the deprecated vareqval opcode.\r
8b0fc5c1 94\r
7064c0a5 95 @param FormSet The FormSet.\r
96 @param Statement The numeric question whose VarStoreInfo.VarName is the\r
97 numeric value which is used to produce the Unicode Name\r
98 for the EFI Variable.\r
8b0fc5c1 99\r
7064c0a5 100 If the Statement is NULL, the ASSERT.\r
101 If the opcode is not Numeric, then ASSERT.\r
8b0fc5c1 102\r
7064c0a5 103 @retval EFI_SUCCESS The funtion always succeeds.\r
104**/\r
c60a0616 105EFI_STATUS\r
106UpdateCheckBoxStringToken (\r
107 IN CONST FORM_BROWSER_FORMSET *FormSet,\r
108 IN FORM_BROWSER_STATEMENT *Statement\r
109 )\r
110{\r
111 CHAR16 Str[MAXIMUM_VALUE_CHARACTERS];\r
112 EFI_STRING_ID Id;\r
c60a0616 113\r
114 ASSERT (Statement != NULL);\r
115 ASSERT (Statement->Operand == EFI_IFR_NUMERIC_OP);\r
8b0fc5c1 116\r
c60a0616 117 UnicodeValueToString (Str, 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
c60a0616 118\r
cb7d01c0 119 Id = HiiSetString (FormSet->HiiHandle, 0, Str, NULL);\r
120 if (Id == 0) {\r
121 return EFI_OUT_OF_RESOURCES;\r
c60a0616 122 }\r
123\r
124 Statement->VarStoreInfo.VarName = Id;\r
8b0fc5c1 125\r
c60a0616 126 return EFI_SUCCESS;\r
127}\r
128\r
7064c0a5 129/**\r
130 Check if the next opcode is the EFI_IFR_EXTEND_OP_VAREQNAME.\r
8b0fc5c1 131\r
7064c0a5 132 @param OpCodeData The current opcode.\r
8b0fc5c1 133\r
7064c0a5 134 @retval TRUE Yes.\r
135 @retval FALSE No.\r
136**/\r
c60a0616 137BOOLEAN\r
138IsNextOpCodeGuidedVarEqName (\r
8b0fc5c1 139 IN UINT8 *OpCodeData\r
c60a0616 140 )\r
141{\r
142 //\r
143 // Get next opcode\r
144 //\r
145 OpCodeData += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
146 if (*OpCodeData == EFI_IFR_GUID_OP) {\r
5c526736 147 if (CompareGuid (&gEfiIfrFrameworkGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
c60a0616 148 //\r
8b0fc5c1 149 // Specific GUIDed opcodes to support IFR generated from Framework HII VFR\r
c60a0616 150 //\r
151 if ((((EFI_IFR_GUID_VAREQNAME *) OpCodeData)->ExtendOpCode) == EFI_IFR_EXTEND_OP_VAREQNAME) {\r
152 return TRUE;\r
153 }\r
154 }\r
155 }\r
156\r
157 return FALSE;\r
158}\r
159\r
160/**\r
161 Initialize Question's members.\r
162\r
163 @param OpCodeData Pointer of the raw OpCode data.\r
164 @param FormSet Pointer of the current FormSet.\r
165 @param Form Pointer of the current Form.\r
166\r
167 @return The Question.\r
168\r
169**/\r
170FORM_BROWSER_STATEMENT *\r
171CreateQuestion (\r
172 IN UINT8 *OpCodeData,\r
173 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
174 IN OUT FORM_BROWSER_FORM *Form\r
175 )\r
176{\r
177 FORM_BROWSER_STATEMENT *Statement;\r
178 EFI_IFR_QUESTION_HEADER *QuestionHdr;\r
179 LIST_ENTRY *Link;\r
180 FORMSET_STORAGE *Storage;\r
181 NAME_VALUE_NODE *NameValueNode;\r
182 EFI_STATUS Status;\r
94f3aae7 183 BOOLEAN Find;\r
c60a0616 184\r
185 Statement = CreateStatement (OpCodeData, FormSet, Form);\r
186 if (Statement == NULL) {\r
187 return NULL;\r
188 }\r
189\r
190 QuestionHdr = (EFI_IFR_QUESTION_HEADER *) (OpCodeData + sizeof (EFI_IFR_OP_HEADER));\r
191 CopyMem (&Statement->QuestionId, &QuestionHdr->QuestionId, sizeof (EFI_QUESTION_ID));\r
192 CopyMem (&Statement->VarStoreId, &QuestionHdr->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
193 CopyMem (&Statement->VarStoreInfo.VarOffset, &QuestionHdr->VarStoreInfo.VarOffset, sizeof (UINT16));\r
194\r
195 Statement->QuestionFlags = QuestionHdr->Flags;\r
196\r
197 if (Statement->VarStoreId == 0) {\r
198 //\r
199 // VarStoreId of zero indicates no variable storage\r
200 //\r
201 return Statement;\r
202 }\r
203\r
204 //\r
205 // Take a look at next OpCode to see whether it is a GUIDed opcode to support\r
206 // Framework Compatibility\r
207 //\r
f806dd27 208 if (FeaturePcdGet (PcdFrameworkCompatibilitySupport)) {\r
c60a0616 209 if ((*OpCodeData == EFI_IFR_NUMERIC_OP) && IsNextOpCodeGuidedVarEqName (OpCodeData)) {\r
210 Status = UpdateCheckBoxStringToken (FormSet, Statement);\r
211 if (EFI_ERROR (Status)) {\r
212 return NULL;\r
213 }\r
214 }\r
215 }\r
216\r
217 //\r
218 // Find Storage for this Question\r
219 //\r
220 Link = GetFirstNode (&FormSet->StorageListHead);\r
221 while (!IsNull (&FormSet->StorageListHead, Link)) {\r
222 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
223\r
224 if (Storage->VarStoreId == Statement->VarStoreId) {\r
94f3aae7 225 Statement->Storage = Storage->BrowserStorage;\r
c60a0616 226 break;\r
227 }\r
228\r
229 Link = GetNextNode (&FormSet->StorageListHead, Link);\r
230 }\r
231 ASSERT (Statement->Storage != NULL);\r
232\r
233 //\r
234 // Initialilze varname for Name/Value or EFI Variable\r
235 //\r
236 if ((Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) ||\r
237 (Statement->Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
238 Statement->VariableName = GetToken (Statement->VarStoreInfo.VarName, FormSet->HiiHandle);\r
239 ASSERT (Statement->VariableName != NULL);\r
240\r
241 if (Statement->Storage->Type == EFI_HII_VARSTORE_NAME_VALUE) {\r
242 //\r
94f3aae7 243 // Check whether old string node already exist.\r
c60a0616 244 //\r
94f3aae7
ED
245 Find = FALSE;\r
246 if (!IsListEmpty(&Statement->Storage->NameValueListHead)) { \r
247 Link = GetFirstNode (&Statement->Storage->NameValueListHead);\r
248 while (!IsNull (&Statement->Storage->NameValueListHead, Link)) {\r
249 NameValueNode = NAME_VALUE_NODE_FROM_LINK (Link);\r
250\r
251 if (StrCmp (Statement->VariableName, NameValueNode->Name) == 0) {\r
252 Find = TRUE;\r
253 break;\r
254 }\r
255\r
256 Link = GetNextNode (&Statement->Storage->NameValueListHead, Link);\r
257 }\r
258 }\r
259\r
260 if (!Find) {\r
261 //\r
262 // Insert to Name/Value varstore list\r
263 //\r
264 NameValueNode = AllocateZeroPool (sizeof (NAME_VALUE_NODE));\r
265 ASSERT (NameValueNode != NULL);\r
266 NameValueNode->Signature = NAME_VALUE_NODE_SIGNATURE;\r
267 NameValueNode->Name = AllocateCopyPool (StrSize (Statement->VariableName), Statement->VariableName);\r
268 ASSERT (NameValueNode->Name != NULL);\r
269 NameValueNode->Value = AllocateZeroPool (0x10);\r
270 ASSERT (NameValueNode->Value != NULL);\r
271 NameValueNode->EditValue = AllocateZeroPool (0x10);\r
272 ASSERT (NameValueNode->EditValue != NULL);\r
273\r
274 InsertTailList (&Statement->Storage->NameValueListHead, &NameValueNode->Link);\r
275 }\r
c60a0616 276 }\r
277 }\r
278\r
279 return Statement;\r
280}\r
281\r
282\r
283/**\r
284 Allocate a FORM_EXPRESSION node.\r
285\r
286 @param Form The Form associated with this Expression\r
287\r
288 @return Pointer to a FORM_EXPRESSION data structure.\r
289\r
290**/\r
291FORM_EXPRESSION *\r
292CreateExpression (\r
293 IN OUT FORM_BROWSER_FORM *Form\r
294 )\r
295{\r
296 FORM_EXPRESSION *Expression;\r
297\r
298 Expression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
1ac628ee 299 ASSERT (Expression != NULL);\r
c60a0616 300 Expression->Signature = FORM_EXPRESSION_SIGNATURE;\r
301 InitializeListHead (&Expression->OpCodeListHead);\r
302\r
303 return Expression;\r
304}\r
305\r
c60a0616 306/**\r
307 Create ConfigHdr string for a storage.\r
308\r
309 @param FormSet Pointer of the current FormSet\r
310 @param Storage Pointer of the storage\r
311\r
312 @retval EFI_SUCCESS Initialize ConfigHdr success\r
313\r
314**/\r
315EFI_STATUS\r
316InitializeConfigHdr (\r
317 IN FORM_BROWSER_FORMSET *FormSet,\r
94f3aae7 318 IN OUT BROWSER_STORAGE *Storage\r
c60a0616 319 )\r
320{\r
c60a0616 321 CHAR16 *Name;\r
8b0fc5c1 322\r
cce6230f
ED
323 if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
324 Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
c60a0616 325 Name = Storage->Name;\r
326 } else {\r
327 Name = NULL;\r
328 }\r
8b0fc5c1 329\r
7e3bcccb
LG
330 Storage->ConfigHdr = HiiConstructConfigHdr (\r
331 &Storage->Guid,\r
332 Name,\r
333 FormSet->DriverHandle\r
334 );\r
8b0fc5c1 335\r
7e3bcccb
LG
336 if (Storage->ConfigHdr == NULL) {\r
337 return EFI_NOT_FOUND;\r
c60a0616 338 }\r
339\r
c60a0616 340 return EFI_SUCCESS;\r
341}\r
342\r
94f3aae7
ED
343/**\r
344 Find the global storage link base on the input storate type, name and guid.\r
345\r
346 @param StorageType Storage type.\r
347 @param StorageGuid Storage guid.\r
348 @param StorageName Storage Name.\r
349\r
350 @return Pointer to a GLOBAL_STORAGE data structure.\r
351\r
352**/\r
353BROWSER_STORAGE *\r
354FindStorageInList (\r
355 IN UINT8 StorageType,\r
356 IN EFI_GUID *StorageGuid,\r
357 IN CHAR16 *StorageName\r
358 )\r
359{\r
360 LIST_ENTRY *Link;\r
361 BROWSER_STORAGE *BrowserStorage;\r
362\r
363 Link = GetFirstNode (&gBrowserStorageList);\r
364 while (!IsNull (&gBrowserStorageList, Link)) {\r
365 BrowserStorage = BROWSER_STORAGE_FROM_LINK (Link);\r
366\r
367 if ((BrowserStorage->Type == StorageType) && CompareGuid (&BrowserStorage->Guid, StorageGuid)) {\r
368 if (StorageType == EFI_HII_VARSTORE_NAME_VALUE) {\r
369 return BrowserStorage;\r
370 }\r
371\r
372 if (StrCmp (BrowserStorage->Name, StorageName) == 0) {\r
373 return BrowserStorage;\r
374 }\r
375 }\r
376\r
377 //\r
378 // Get Next Storage.\r
379 //\r
380 Link = GetNextNode (&gBrowserStorageList, Link);\r
381 }\r
382\r
383 return NULL;\r
384}\r
385\r
386/**\r
387 Intialize the Global Storage.\r
388\r
389 @param BrowserStorage Pointer to the global storage.\r
390 @param StorageType Storage type.\r
391 @param OpCodeData Binary data for this opcode.\r
392\r
393**/\r
394VOID\r
395IntializeBrowserStorage (\r
396 IN BROWSER_STORAGE *BrowserStorage,\r
397 IN UINT8 StorageType,\r
398 IN UINT8 *OpCodeData\r
399 )\r
400{\r
401 switch (StorageType) {\r
402 case EFI_HII_VARSTORE_BUFFER:\r
403 CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
404 CopyMem (&BrowserStorage->Size, &((EFI_IFR_VARSTORE *) OpCodeData)->Size, sizeof (UINT16));\r
405\r
406 BrowserStorage->Buffer = AllocateZeroPool (BrowserStorage->Size);\r
407 BrowserStorage->EditBuffer = AllocateZeroPool (BrowserStorage->Size);\r
408 break;\r
409\r
410 case EFI_HII_VARSTORE_EFI_VARIABLE:\r
411 case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
412 CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
413 CopyMem (&BrowserStorage->Attributes, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Attributes, sizeof (UINT32));\r
414 CopyMem (&BrowserStorage->Size, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Size, sizeof (UINT16));\r
415\r
416 if (StorageType == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
417 BrowserStorage->Buffer = AllocateZeroPool (BrowserStorage->Size);\r
418 BrowserStorage->EditBuffer = AllocateZeroPool (BrowserStorage->Size);\r
419 }\r
420 break;\r
421\r
422 case EFI_HII_VARSTORE_NAME_VALUE:\r
423 CopyMem (&BrowserStorage->Guid, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
424\r
425 InitializeListHead (&BrowserStorage->NameValueListHead);\r
426 break;\r
427\r
428 default:\r
429 break;\r
430 }\r
431}\r
432\r
433/**\r
434 Allocate a FORMSET_STORAGE data structure and insert to FormSet Storage List.\r
435\r
436 @param FormSet Pointer of the current FormSet\r
437 @param StorageType Storage type.\r
438 @param OpCodeData Binary data for this opcode.\r
439\r
440 @return Pointer to a FORMSET_STORAGE data structure.\r
441\r
442**/\r
443FORMSET_STORAGE *\r
444CreateStorage (\r
445 IN FORM_BROWSER_FORMSET *FormSet,\r
446 IN UINT8 StorageType,\r
447 IN UINT8 *OpCodeData\r
448 )\r
449{\r
450 FORMSET_STORAGE *Storage;\r
451 CHAR16 *UnicodeString;\r
452 UINT16 Index;\r
453 BROWSER_STORAGE *BrowserStorage;\r
454 EFI_GUID *StorageGuid;\r
455 CHAR8 *StorageName;\r
456\r
457 UnicodeString = NULL;\r
458 StorageName = NULL;\r
459 switch (StorageType) {\r
460 case EFI_HII_VARSTORE_BUFFER:\r
461 StorageGuid = (EFI_GUID *) (CHAR8*) &((EFI_IFR_VARSTORE *) OpCodeData)->Guid;\r
462 StorageName = (CHAR8 *) ((EFI_IFR_VARSTORE *) OpCodeData)->Name;\r
463 break;\r
464\r
465 case EFI_HII_VARSTORE_EFI_VARIABLE:\r
466 case EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER:\r
467 StorageGuid = (EFI_GUID *) (CHAR8*) &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Guid;\r
468 StorageName = (CHAR8 *) ((EFI_IFR_VARSTORE_EFI *) OpCodeData)->Name;\r
469 break;\r
470\r
471 default:\r
472 ASSERT (StorageType == EFI_HII_VARSTORE_NAME_VALUE);\r
473 StorageGuid = &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->Guid;\r
474 break;\r
475 }\r
476\r
477 if (StorageType != EFI_HII_VARSTORE_NAME_VALUE) {\r
478 ASSERT (StorageName != NULL);\r
479\r
480 UnicodeString = AllocateZeroPool (AsciiStrSize (StorageName) * 2);\r
481 ASSERT (UnicodeString != NULL);\r
482 for (Index = 0; StorageName[Index] != 0; Index++) {\r
483 UnicodeString[Index] = (CHAR16) StorageName[Index];\r
484 }\r
485 }\r
486\r
487 Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
488 ASSERT (Storage != NULL);\r
489 Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
490 InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
491\r
492 BrowserStorage = FindStorageInList(StorageType, StorageGuid, UnicodeString);\r
493 if (BrowserStorage == NULL) {\r
494 BrowserStorage = AllocateZeroPool (sizeof (BROWSER_STORAGE));\r
495 ASSERT (BrowserStorage != NULL);\r
496\r
497 BrowserStorage->Signature = BROWSER_STORAGE_SIGNATURE;\r
498 InsertTailList (&gBrowserStorageList, &BrowserStorage->Link);\r
499\r
500 IntializeBrowserStorage (BrowserStorage, StorageType, OpCodeData);\r
501 BrowserStorage->Type = StorageType;\r
502 if (StorageType != EFI_HII_VARSTORE_NAME_VALUE) {\r
503 BrowserStorage->Name = UnicodeString;\r
504 }\r
505\r
506 InitializeConfigHdr (FormSet, BrowserStorage);\r
507 }\r
508 //\r
509 // Add count because one formset storage use this global storage.\r
510 //\r
511 BrowserStorage->ReferenceCount++;\r
512\r
513 Storage->BrowserStorage = BrowserStorage;\r
514 Storage->ConfigRequest = AllocateCopyPool (StrSize (BrowserStorage->ConfigHdr), BrowserStorage->ConfigHdr);\r
515 Storage->SpareStrLen = 0;\r
516\r
517 return Storage;\r
518}\r
c60a0616 519\r
520/**\r
521 Initialize Request Element of a Question. <RequestElement> ::= '&'<BlockName> | '&'<Label>\r
522\r
523 @param FormSet Pointer of the current FormSet.\r
524 @param Question The Question to be initialized.\r
b18e7050 525 @param Form Pointer of the current form.\r
c60a0616 526\r
527 @retval EFI_SUCCESS Function success.\r
528 @retval EFI_INVALID_PARAMETER No storage associated with the Question.\r
529\r
530**/\r
531EFI_STATUS\r
532InitializeRequestElement (\r
533 IN OUT FORM_BROWSER_FORMSET *FormSet,\r
b18e7050
ED
534 IN OUT FORM_BROWSER_STATEMENT *Question,\r
535 IN OUT FORM_BROWSER_FORM *Form\r
c60a0616 536 )\r
537{\r
94f3aae7
ED
538 BROWSER_STORAGE *Storage;\r
539 FORMSET_STORAGE *FormsetStorage;\r
c60a0616 540 UINTN StrLen;\r
541 UINTN StringSize;\r
542 CHAR16 *NewStr;\r
543 CHAR16 RequestElement[30];\r
b18e7050
ED
544 LIST_ENTRY *Link;\r
545 BOOLEAN Find;\r
546 FORM_BROWSER_CONFIG_REQUEST *ConfigInfo;\r
c60a0616 547\r
548 Storage = Question->Storage;\r
549 if (Storage == NULL) {\r
550 return EFI_INVALID_PARAMETER;\r
551 }\r
552\r
553 if (Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE) {\r
554 //\r
555 // <ConfigRequest> is unnecessary for EFI variable storage,\r
556 // GetVariable()/SetVariable() will be used to retrieve/save values\r
557 //\r
558 return EFI_SUCCESS;\r
559 }\r
560\r
561 //\r
562 // Prepare <RequestElement>\r
563 //\r
cce6230f
ED
564 if (Storage->Type == EFI_HII_VARSTORE_BUFFER || \r
565 Storage->Type == EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER) {\r
c60a0616 566 StrLen = UnicodeSPrint (\r
567 RequestElement,\r
568 30 * sizeof (CHAR16),\r
569 L"&OFFSET=%x&WIDTH=%x",\r
570 Question->VarStoreInfo.VarOffset,\r
571 Question->StorageWidth\r
572 );\r
573 Question->BlockName = AllocateCopyPool ((StrLen + 1) * sizeof (CHAR16), RequestElement);\r
574 } else {\r
575 StrLen = UnicodeSPrint (RequestElement, 30 * sizeof (CHAR16), L"&%s", Question->VariableName);\r
576 }\r
577\r
578 if ((Question->Operand == EFI_IFR_PASSWORD_OP) && ((Question->QuestionFlags & EFI_IFR_FLAG_CALLBACK) == EFI_IFR_FLAG_CALLBACK)) {\r
579 //\r
580 // Password with CALLBACK flag is stored in encoded format,\r
581 // so don't need to append it to <ConfigRequest>\r
582 //\r
583 return EFI_SUCCESS;\r
584 }\r
585\r
94f3aae7
ED
586 //\r
587 // Find Formset Storage for this Question\r
588 //\r
589 FormsetStorage = NULL;\r
590 Link = GetFirstNode (&FormSet->StorageListHead);\r
591 while (!IsNull (&FormSet->StorageListHead, Link)) {\r
592 FormsetStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
593\r
594 if (FormsetStorage->VarStoreId == Question->VarStoreId) {\r
595 break;\r
596 }\r
597\r
598 Link = GetNextNode (&FormSet->StorageListHead, Link);\r
599 }\r
600 ASSERT (FormsetStorage != NULL);\r
601\r
c60a0616 602 //\r
603 // Append <RequestElement> to <ConfigRequest>\r
604 //\r
94f3aae7 605 if (StrLen > FormsetStorage->SpareStrLen) {\r
c60a0616 606 //\r
607 // Old String buffer is not sufficient for RequestElement, allocate a new one\r
608 //\r
94f3aae7 609 StringSize = (FormsetStorage->ConfigRequest != NULL) ? StrSize (FormsetStorage->ConfigRequest) : sizeof (CHAR16);\r
c60a0616 610 NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
1ac628ee 611 ASSERT (NewStr != NULL);\r
94f3aae7
ED
612 if (FormsetStorage->ConfigRequest != NULL) {\r
613 CopyMem (NewStr, FormsetStorage->ConfigRequest, StringSize);\r
614 FreePool (FormsetStorage->ConfigRequest);\r
c60a0616 615 }\r
94f3aae7
ED
616 FormsetStorage->ConfigRequest = NewStr;\r
617 FormsetStorage->SpareStrLen = CONFIG_REQUEST_STRING_INCREMENTAL;\r
c60a0616 618 }\r
619\r
94f3aae7
ED
620 StrCat (FormsetStorage->ConfigRequest, RequestElement);\r
621 FormsetStorage->ElementCount++;\r
622 FormsetStorage->SpareStrLen -= StrLen;\r
c60a0616 623\r
b18e7050
ED
624 //\r
625 // Update the Config Request info saved in the form.\r
626 //\r
627 ConfigInfo = NULL;\r
628 Find = FALSE;\r
629 Link = GetFirstNode (&Form->ConfigRequestHead);\r
630 while (!IsNull (&Form->ConfigRequestHead, Link)) {\r
631 ConfigInfo = FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link);\r
632\r
94f3aae7 633 if (ConfigInfo != NULL && ConfigInfo->Storage == Storage) {\r
b18e7050
ED
634 Find = TRUE;\r
635 break;\r
636 }\r
637\r
638 Link = GetNextNode (&Form->ConfigRequestHead, Link);\r
639 }\r
640\r
641 if (!Find) {\r
642 ConfigInfo = AllocateZeroPool(sizeof (FORM_BROWSER_CONFIG_REQUEST));\r
0194d26c 643 ASSERT (ConfigInfo != NULL);\r
b18e7050
ED
644 ConfigInfo->Signature = FORM_BROWSER_CONFIG_REQUEST_SIGNATURE;\r
645 ConfigInfo->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);\r
646 ConfigInfo->SpareStrLen = 0;\r
647 ConfigInfo->Storage = Storage;\r
648 InsertTailList(&Form->ConfigRequestHead, &ConfigInfo->Link);\r
649 }\r
650\r
651 //\r
652 // Append <RequestElement> to <ConfigRequest>\r
653 //\r
654 if (StrLen > ConfigInfo->SpareStrLen) {\r
655 //\r
656 // Old String buffer is not sufficient for RequestElement, allocate a new one\r
657 //\r
658 StringSize = (ConfigInfo->ConfigRequest != NULL) ? StrSize (ConfigInfo->ConfigRequest) : sizeof (CHAR16);\r
659 NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
660 ASSERT (NewStr != NULL);\r
661 if (ConfigInfo->ConfigRequest != NULL) {\r
662 CopyMem (NewStr, ConfigInfo->ConfigRequest, StringSize);\r
663 FreePool (ConfigInfo->ConfigRequest);\r
664 }\r
665 ConfigInfo->ConfigRequest = NewStr;\r
666 ConfigInfo->SpareStrLen = CONFIG_REQUEST_STRING_INCREMENTAL;\r
667 }\r
668\r
669 StrCat (ConfigInfo->ConfigRequest, RequestElement);\r
670 ConfigInfo->ElementCount++;\r
671 ConfigInfo->SpareStrLen -= StrLen;\r
c60a0616 672 return EFI_SUCCESS;\r
673}\r
674\r
675\r
676/**\r
677 Free resources of a Expression.\r
678\r
679 @param FormSet Pointer of the Expression\r
680\r
681**/\r
682VOID\r
683DestroyExpression (\r
684 IN FORM_EXPRESSION *Expression\r
685 )\r
686{\r
687 LIST_ENTRY *Link;\r
688 EXPRESSION_OPCODE *OpCode;\r
2573712e
LG
689 LIST_ENTRY *SubExpressionLink;\r
690 FORM_EXPRESSION *SubExpression;\r
c60a0616 691\r
692 while (!IsListEmpty (&Expression->OpCodeListHead)) {\r
693 Link = GetFirstNode (&Expression->OpCodeListHead);\r
694 OpCode = EXPRESSION_OPCODE_FROM_LINK (Link);\r
695 RemoveEntryList (&OpCode->Link);\r
696\r
697 if (OpCode->ValueList != NULL) {\r
698 FreePool (OpCode->ValueList);\r
699 }\r
2573712e
LG
700\r
701 if (OpCode->ValueName != NULL) {\r
702 FreePool (OpCode->ValueName);\r
703 }\r
704\r
705 if (OpCode->MapExpressionList.ForwardLink != NULL) {\r
706 while (!IsListEmpty (&OpCode->MapExpressionList)) {\r
707 SubExpressionLink = GetFirstNode(&OpCode->MapExpressionList);\r
708 SubExpression = FORM_EXPRESSION_FROM_LINK (SubExpressionLink);\r
709 RemoveEntryList(&SubExpression->Link);\r
710 DestroyExpression (SubExpression);\r
711 }\r
712 }\r
c60a0616 713 }\r
714\r
715 //\r
716 // Free this Expression\r
717 //\r
f4113e1f 718 FreePool (Expression);\r
c60a0616 719}\r
720\r
c60a0616 721/**\r
722 Free resources of a storage.\r
723\r
724 @param Storage Pointer of the storage\r
725\r
726**/\r
727VOID\r
728DestroyStorage (\r
729 IN FORMSET_STORAGE *Storage\r
730 )\r
731{\r
c60a0616 732 if (Storage == NULL) {\r
733 return;\r
734 }\r
735\r
c60a0616 736 if (Storage->ConfigRequest != NULL) {\r
737 FreePool (Storage->ConfigRequest);\r
738 }\r
739\r
94f3aae7
ED
740 //\r
741 // Minus the reference to the global storage.\r
742 //\r
743 ASSERT (Storage->BrowserStorage->ReferenceCount > 0);\r
744 Storage->BrowserStorage->ReferenceCount--; \r
745\r
c60a0616 746 FreePool (Storage);\r
747}\r
748\r
749\r
750/**\r
751 Free resources of a Statement.\r
752\r
e2100bfa 753 @param FormSet Pointer of the FormSet\r
c60a0616 754 @param Statement Pointer of the Statement\r
755\r
756**/\r
757VOID\r
758DestroyStatement (\r
e2100bfa 759 IN FORM_BROWSER_FORMSET *FormSet,\r
c60a0616 760 IN OUT FORM_BROWSER_STATEMENT *Statement\r
761 )\r
762{\r
763 LIST_ENTRY *Link;\r
764 QUESTION_DEFAULT *Default;\r
765 QUESTION_OPTION *Option;\r
766 FORM_EXPRESSION *Expression;\r
767\r
768 //\r
769 // Free Default value List\r
770 //\r
771 while (!IsListEmpty (&Statement->DefaultListHead)) {\r
772 Link = GetFirstNode (&Statement->DefaultListHead);\r
773 Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
774 RemoveEntryList (&Default->Link);\r
775\r
f4113e1f 776 FreePool (Default);\r
c60a0616 777 }\r
778\r
779 //\r
780 // Free Options List\r
781 //\r
782 while (!IsListEmpty (&Statement->OptionListHead)) {\r
783 Link = GetFirstNode (&Statement->OptionListHead);\r
784 Option = QUESTION_OPTION_FROM_LINK (Link);\r
31585af4
ED
785 if (Option->SuppressExpression != NULL) {\r
786 FreePool (Option->SuppressExpression);\r
787 }\r
c60a0616 788 RemoveEntryList (&Option->Link);\r
789\r
f4113e1f 790 FreePool (Option);\r
c60a0616 791 }\r
792\r
793 //\r
794 // Free Inconsistent List\r
795 //\r
796 while (!IsListEmpty (&Statement->InconsistentListHead)) {\r
797 Link = GetFirstNode (&Statement->InconsistentListHead);\r
798 Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
799 RemoveEntryList (&Expression->Link);\r
800\r
801 DestroyExpression (Expression);\r
802 }\r
803\r
804 //\r
805 // Free NoSubmit List\r
806 //\r
807 while (!IsListEmpty (&Statement->NoSubmitListHead)) {\r
808 Link = GetFirstNode (&Statement->NoSubmitListHead);\r
809 Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
810 RemoveEntryList (&Expression->Link);\r
811\r
812 DestroyExpression (Expression);\r
813 }\r
814\r
31585af4
ED
815 if (Statement->Expression != NULL) {\r
816 FreePool (Statement->Expression);\r
817 }\r
818\r
c60a0616 819 if (Statement->VariableName != NULL) {\r
820 FreePool (Statement->VariableName);\r
821 }\r
822 if (Statement->BlockName != NULL) {\r
823 FreePool (Statement->BlockName);\r
824 }\r
b86b413a
LG
825 if (Statement->BufferValue != NULL) {\r
826 FreePool (Statement->BufferValue);\r
827 }\r
e2100bfa
ED
828 if (Statement->Operand == EFI_IFR_STRING_OP || Statement->Operand == EFI_IFR_PASSWORD_OP) {\r
829 DeleteString(Statement->HiiValue.Value.string, FormSet->HiiHandle);\r
830 }\r
c60a0616 831}\r
832\r
833\r
834/**\r
835 Free resources of a Form.\r
836\r
e2100bfa 837 @param FormSet Pointer of the FormSet\r
c60a0616 838 @param Form Pointer of the Form.\r
839\r
840**/\r
841VOID\r
842DestroyForm (\r
e2100bfa
ED
843 IN FORM_BROWSER_FORMSET *FormSet,\r
844 IN OUT FORM_BROWSER_FORM *Form\r
c60a0616 845 )\r
846{\r
847 LIST_ENTRY *Link;\r
848 FORM_EXPRESSION *Expression;\r
849 FORM_BROWSER_STATEMENT *Statement;\r
b18e7050 850 FORM_BROWSER_CONFIG_REQUEST *ConfigInfo;\r
c60a0616 851\r
852 //\r
853 // Free Form Expressions\r
854 //\r
855 while (!IsListEmpty (&Form->ExpressionListHead)) {\r
856 Link = GetFirstNode (&Form->ExpressionListHead);\r
857 Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
858 RemoveEntryList (&Expression->Link);\r
859\r
860 DestroyExpression (Expression);\r
861 }\r
862\r
863 //\r
864 // Free Statements/Questions\r
865 //\r
866 while (!IsListEmpty (&Form->StatementListHead)) {\r
867 Link = GetFirstNode (&Form->StatementListHead);\r
868 Statement = FORM_BROWSER_STATEMENT_FROM_LINK (Link);\r
869 RemoveEntryList (&Statement->Link);\r
870\r
e2100bfa 871 DestroyStatement (FormSet, Statement);\r
c60a0616 872 }\r
873\r
b18e7050
ED
874 //\r
875 // Free ConfigRequest string.\r
876 //\r
877 while (!IsListEmpty (&Form->ConfigRequestHead)) {\r
878 Link = GetFirstNode (&Form->ConfigRequestHead);\r
879 ConfigInfo = FORM_BROWSER_CONFIG_REQUEST_FROM_LINK (Link);\r
880 RemoveEntryList (&ConfigInfo->Link);\r
881\r
882 FreePool (ConfigInfo->ConfigRequest);\r
883 FreePool (ConfigInfo);\r
884 }\r
885\r
31585af4
ED
886 if (Form->SuppressExpression != NULL) {\r
887 FreePool (Form->SuppressExpression);\r
888 }\r
889\r
c60a0616 890 //\r
891 // Free this Form\r
892 //\r
f4113e1f 893 FreePool (Form);\r
c60a0616 894}\r
895\r
896\r
897/**\r
898 Free resources allocated for a FormSet.\r
899\r
900 @param FormSet Pointer of the FormSet\r
901\r
902**/\r
903VOID\r
904DestroyFormSet (\r
905 IN OUT FORM_BROWSER_FORMSET *FormSet\r
906 )\r
907{\r
908 LIST_ENTRY *Link;\r
909 FORMSET_STORAGE *Storage;\r
910 FORMSET_DEFAULTSTORE *DefaultStore;\r
0c66bc76 911 FORM_EXPRESSION *Expression;\r
c60a0616 912 FORM_BROWSER_FORM *Form;\r
913\r
4c8358c7 914 if (FormSet->IfrBinaryData == NULL) {\r
915 //\r
916 // Uninitialized FormSet\r
917 //\r
918 FreePool (FormSet);\r
919 return;\r
920 }\r
921\r
c60a0616 922 //\r
923 // Free IFR binary buffer\r
924 //\r
925 FreePool (FormSet->IfrBinaryData);\r
926\r
927 //\r
928 // Free FormSet Storage\r
929 //\r
930 if (FormSet->StorageListHead.ForwardLink != NULL) {\r
931 while (!IsListEmpty (&FormSet->StorageListHead)) {\r
932 Link = GetFirstNode (&FormSet->StorageListHead);\r
933 Storage = FORMSET_STORAGE_FROM_LINK (Link);\r
934 RemoveEntryList (&Storage->Link);\r
935\r
936 DestroyStorage (Storage);\r
937 }\r
938 }\r
939\r
940 //\r
941 // Free FormSet Default Store\r
942 //\r
943 if (FormSet->DefaultStoreListHead.ForwardLink != NULL) {\r
944 while (!IsListEmpty (&FormSet->DefaultStoreListHead)) {\r
945 Link = GetFirstNode (&FormSet->DefaultStoreListHead);\r
946 DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK (Link);\r
947 RemoveEntryList (&DefaultStore->Link);\r
948\r
f4113e1f 949 FreePool (DefaultStore);\r
c60a0616 950 }\r
951 }\r
952\r
0c66bc76
LG
953 //\r
954 // Free Formset Expressions\r
955 //\r
956 while (!IsListEmpty (&FormSet->ExpressionListHead)) {\r
957 Link = GetFirstNode (&FormSet->ExpressionListHead);\r
958 Expression = FORM_EXPRESSION_FROM_LINK (Link);\r
959 RemoveEntryList (&Expression->Link);\r
960\r
961 DestroyExpression (Expression);\r
962 }\r
963\r
c60a0616 964 //\r
965 // Free Forms\r
966 //\r
967 if (FormSet->FormListHead.ForwardLink != NULL) {\r
968 while (!IsListEmpty (&FormSet->FormListHead)) {\r
969 Link = GetFirstNode (&FormSet->FormListHead);\r
970 Form = FORM_BROWSER_FORM_FROM_LINK (Link);\r
971 RemoveEntryList (&Form->Link);\r
972\r
e2100bfa 973 DestroyForm (FormSet, Form);\r
c60a0616 974 }\r
975 }\r
976\r
977 if (FormSet->StatementBuffer != NULL) {\r
978 FreePool (FormSet->StatementBuffer);\r
979 }\r
980 if (FormSet->ExpressionBuffer != NULL) {\r
981 FreePool (FormSet->ExpressionBuffer);\r
982 }\r
983\r
984 FreePool (FormSet);\r
985}\r
986\r
987\r
988/**\r
989 Tell whether this Operand is an Expression OpCode or not\r
990\r
991 @param Operand Operand of an IFR OpCode.\r
992\r
993 @retval TRUE This is an Expression OpCode.\r
994 @retval FALSE Not an Expression OpCode.\r
995\r
996**/\r
997BOOLEAN\r
998IsExpressionOpCode (\r
999 IN UINT8 Operand\r
1000 )\r
1001{\r
1002 if (((Operand >= EFI_IFR_EQ_ID_VAL_OP) && (Operand <= EFI_IFR_NOT_OP)) ||\r
2573712e
LG
1003 ((Operand >= EFI_IFR_MATCH_OP) && (Operand <= EFI_IFR_SET_OP)) ||\r
1004 ((Operand >= EFI_IFR_EQUAL_OP) && (Operand <= EFI_IFR_SPAN_OP)) ||\r
c60a0616 1005 (Operand == EFI_IFR_CATENATE_OP) ||\r
1006 (Operand == EFI_IFR_TO_LOWER_OP) ||\r
1007 (Operand == EFI_IFR_TO_UPPER_OP) ||\r
2573712e 1008 (Operand == EFI_IFR_MAP_OP) ||\r
cbf73e50 1009 (Operand == EFI_IFR_VERSION_OP) ||\r
1010 (Operand == EFI_IFR_SECURITY_OP)) {\r
c60a0616 1011 return TRUE;\r
1012 } else {\r
1013 return FALSE;\r
1014 }\r
1015}\r
1016\r
1017\r
1018/**\r
1019 Calculate number of Statemens(Questions) and Expression OpCodes.\r
1020\r
1021 @param FormSet The FormSet to be counted.\r
1022 @param NumberOfStatement Number of Statemens(Questions)\r
1023 @param NumberOfExpression Number of Expression OpCodes\r
1024\r
1025**/\r
1026VOID\r
1027CountOpCodes (\r
1028 IN FORM_BROWSER_FORMSET *FormSet,\r
1029 IN OUT UINT16 *NumberOfStatement,\r
1030 IN OUT UINT16 *NumberOfExpression\r
1031 )\r
1032{\r
1033 UINT16 StatementCount;\r
1034 UINT16 ExpressionCount;\r
1035 UINT8 *OpCodeData;\r
1036 UINTN Offset;\r
1037 UINTN OpCodeLen;\r
1038\r
1039 Offset = 0;\r
1040 StatementCount = 0;\r
1041 ExpressionCount = 0;\r
1042\r
1043 while (Offset < FormSet->IfrBinaryLength) {\r
1044 OpCodeData = FormSet->IfrBinaryData + Offset;\r
1045 OpCodeLen = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
1046 Offset += OpCodeLen;\r
1047\r
1048 if (IsExpressionOpCode (((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode)) {\r
1049 ExpressionCount++;\r
1050 } else {\r
1051 StatementCount++;\r
1052 }\r
1053 }\r
1054\r
1055 *NumberOfStatement = StatementCount;\r
1056 *NumberOfExpression = ExpressionCount;\r
1057}\r
1058\r
1059\r
1060\r
1061/**\r
1062 Parse opcodes in the formset IFR binary.\r
1063\r
1064 @param FormSet Pointer of the FormSet data structure.\r
1065\r
1066 @retval EFI_SUCCESS Opcode parse success.\r
1067 @retval Other Opcode parse fail.\r
1068\r
1069**/\r
1070EFI_STATUS\r
1071ParseOpCodes (\r
1072 IN FORM_BROWSER_FORMSET *FormSet\r
1073 )\r
1074{\r
1075 EFI_STATUS Status;\r
c60a0616 1076 FORM_BROWSER_FORM *CurrentForm;\r
1077 FORM_BROWSER_STATEMENT *CurrentStatement;\r
1078 EXPRESSION_OPCODE *ExpressionOpCode;\r
1079 FORM_EXPRESSION *CurrentExpression;\r
1080 UINT8 Operand;\r
1081 UINT8 Scope;\r
1082 UINTN OpCodeOffset;\r
1083 UINTN OpCodeLength;\r
1084 UINT8 *OpCodeData;\r
1085 UINT8 ScopeOpCode;\r
1086 FORMSET_STORAGE *Storage;\r
1087 FORMSET_DEFAULTSTORE *DefaultStore;\r
1088 QUESTION_DEFAULT *CurrentDefault;\r
1089 QUESTION_OPTION *CurrentOption;\r
d02847d3 1090 UINT8 Width;\r
c60a0616 1091 UINT16 NumberOfStatement;\r
1092 UINT16 NumberOfExpression;\r
1093 EFI_IMAGE_ID *ImageId;\r
0c66bc76 1094 BOOLEAN SuppressForQuestion;\r
c60a0616 1095 BOOLEAN SuppressForOption;\r
c60a0616 1096 UINT16 DepthOfDisable;\r
1097 BOOLEAN OpCodeDisabled;\r
1098 BOOLEAN SingleOpCodeExpression;\r
1099 BOOLEAN InScopeDefault;\r
1100 EFI_HII_VALUE *Value;\r
2573712e
LG
1101 EFI_IFR_FORM_MAP_METHOD *MapMethod;\r
1102 UINT8 MapScopeDepth;\r
1103 LIST_ENTRY *Link;\r
1104 FORMSET_STORAGE *VarStorage;\r
1105 LIST_ENTRY *MapExpressionList;\r
1106 EFI_VARSTORE_ID TempVarstoreId;\r
31585af4
ED
1107 BOOLEAN InScopeDisable;\r
1108 INTN ConditionalExprCount;\r
c60a0616 1109\r
1110 mInScopeSubtitle = FALSE;\r
0c66bc76 1111 SuppressForQuestion = FALSE;\r
c60a0616 1112 SuppressForOption = FALSE;\r
31585af4 1113 InScopeDisable = FALSE;\r
c60a0616 1114 DepthOfDisable = 0;\r
1115 OpCodeDisabled = FALSE;\r
1116 SingleOpCodeExpression = FALSE;\r
1117 InScopeDefault = FALSE;\r
1118 CurrentExpression = NULL;\r
1119 CurrentDefault = NULL;\r
1120 CurrentOption = NULL;\r
c410589e 1121 ImageId = NULL;\r
2573712e
LG
1122 MapMethod = NULL;\r
1123 MapScopeDepth = 0;\r
1124 Link = NULL;\r
1125 VarStorage = NULL;\r
1126 MapExpressionList = NULL;\r
1127 TempVarstoreId = 0;\r
31585af4 1128 ConditionalExprCount = 0;\r
c60a0616 1129\r
1130 //\r
1131 // Get the number of Statements and Expressions\r
1132 //\r
1133 CountOpCodes (FormSet, &NumberOfStatement, &NumberOfExpression);\r
1134\r
1135 mStatementIndex = 0;\r
1136 FormSet->StatementBuffer = AllocateZeroPool (NumberOfStatement * sizeof (FORM_BROWSER_STATEMENT));\r
1137 if (FormSet->StatementBuffer == NULL) {\r
1138 return EFI_OUT_OF_RESOURCES;\r
1139 }\r
1140\r
1141 mExpressionOpCodeIndex = 0;\r
1142 FormSet->ExpressionBuffer = AllocateZeroPool (NumberOfExpression * sizeof (EXPRESSION_OPCODE));\r
1143 if (FormSet->ExpressionBuffer == NULL) {\r
1144 return EFI_OUT_OF_RESOURCES;\r
1145 }\r
1146\r
1147 InitializeListHead (&FormSet->StorageListHead);\r
1148 InitializeListHead (&FormSet->DefaultStoreListHead);\r
1149 InitializeListHead (&FormSet->FormListHead);\r
48a9d5f7 1150 InitializeListHead (&FormSet->ExpressionListHead);\r
2573712e
LG
1151 ResetCurrentExpressionStack ();\r
1152 ResetMapExpressionListStack ();\r
c60a0616 1153\r
1154 CurrentForm = NULL;\r
1155 CurrentStatement = NULL;\r
1156\r
1157 ResetScopeStack ();\r
1158\r
1159 OpCodeOffset = 0;\r
1160 while (OpCodeOffset < FormSet->IfrBinaryLength) {\r
1161 OpCodeData = FormSet->IfrBinaryData + OpCodeOffset;\r
1162\r
1163 OpCodeLength = ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
1164 OpCodeOffset += OpCodeLength;\r
1165 Operand = ((EFI_IFR_OP_HEADER *) OpCodeData)->OpCode;\r
1166 Scope = ((EFI_IFR_OP_HEADER *) OpCodeData)->Scope;\r
1167\r
1168 //\r
1169 // If scope bit set, push onto scope stack\r
1170 //\r
1171 if (Scope != 0) {\r
1172 PushScope (Operand);\r
1173 }\r
1174\r
1175 if (OpCodeDisabled) {\r
1176 //\r
1177 // DisableIf Expression is evaluated to be TRUE, try to find its end.\r
1178 // Here only cares the EFI_IFR_DISABLE_IF and EFI_IFR_END\r
1179 //\r
1180 if (Operand == EFI_IFR_DISABLE_IF_OP) {\r
1181 DepthOfDisable++;\r
1182 } else if (Operand == EFI_IFR_END_OP) {\r
1183 Status = PopScope (&ScopeOpCode);\r
1184 if (EFI_ERROR (Status)) {\r
1185 return Status;\r
1186 }\r
1187\r
1188 if (ScopeOpCode == EFI_IFR_DISABLE_IF_OP) {\r
1189 if (DepthOfDisable == 0) {\r
31585af4 1190 InScopeDisable = FALSE;\r
c60a0616 1191 OpCodeDisabled = FALSE;\r
1192 } else {\r
1193 DepthOfDisable--;\r
1194 }\r
1195 }\r
1196 }\r
1197 continue;\r
1198 }\r
1199\r
1200 if (IsExpressionOpCode (Operand)) {\r
1201 ExpressionOpCode = &FormSet->ExpressionBuffer[mExpressionOpCodeIndex];\r
1202 mExpressionOpCodeIndex++;\r
1203\r
1204 ExpressionOpCode->Signature = EXPRESSION_OPCODE_SIGNATURE;\r
1205 ExpressionOpCode->Operand = Operand;\r
1206 Value = &ExpressionOpCode->Value;\r
1207\r
1208 switch (Operand) {\r
1209 case EFI_IFR_EQ_ID_VAL_OP:\r
1210 CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
1211\r
1212 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
1213 CopyMem (&Value->Value.u16, &((EFI_IFR_EQ_ID_VAL *) OpCodeData)->Value, sizeof (UINT16));\r
1214 break;\r
1215\r
1216 case EFI_IFR_EQ_ID_ID_OP:\r
1217 CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_ID *) OpCodeData)->QuestionId1, sizeof (EFI_QUESTION_ID));\r
1218 CopyMem (&ExpressionOpCode->QuestionId2, &((EFI_IFR_EQ_ID_ID *) OpCodeData)->QuestionId2, sizeof (EFI_QUESTION_ID));\r
1219 break;\r
1220\r
e8ef4283 1221 case EFI_IFR_EQ_ID_VAL_LIST_OP:\r
2654f642 1222 CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
1223 CopyMem (&ExpressionOpCode->ListLength, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->ListLength, sizeof (UINT16));\r
1224 ExpressionOpCode->ValueList = AllocateCopyPool (ExpressionOpCode->ListLength * sizeof (UINT16), &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->ValueList);\r
c60a0616 1225 break;\r
1226\r
1227 case EFI_IFR_TO_STRING_OP:\r
1228 case EFI_IFR_FIND_OP:\r
1229 ExpressionOpCode->Format = (( EFI_IFR_TO_STRING *) OpCodeData)->Format;\r
1230 break;\r
1231\r
1232 case EFI_IFR_STRING_REF1_OP:\r
1233 Value->Type = EFI_IFR_TYPE_STRING;\r
1234 CopyMem (&Value->Value.string, &(( EFI_IFR_STRING_REF1 *) OpCodeData)->StringId, sizeof (EFI_STRING_ID));\r
1235 break;\r
1236\r
1237 case EFI_IFR_RULE_REF_OP:\r
1238 ExpressionOpCode->RuleId = (( EFI_IFR_RULE_REF *) OpCodeData)->RuleId;\r
1239 break;\r
1240\r
1241 case EFI_IFR_SPAN_OP:\r
1242 ExpressionOpCode->Flags = (( EFI_IFR_SPAN *) OpCodeData)->Flags;\r
1243 break;\r
1244\r
1245 case EFI_IFR_THIS_OP:\r
d0720b57 1246 ASSERT (CurrentStatement != NULL);\r
c60a0616 1247 ExpressionOpCode->QuestionId = CurrentStatement->QuestionId;\r
1248 break;\r
1249\r
cbf73e50 1250 case EFI_IFR_SECURITY_OP:\r
1251 CopyMem (&ExpressionOpCode->Guid, &((EFI_IFR_SECURITY *) OpCodeData)->Permissions, sizeof (EFI_GUID));\r
1252 break;\r
1253\r
2573712e
LG
1254 case EFI_IFR_GET_OP:\r
1255 case EFI_IFR_SET_OP:\r
1256 CopyMem (&TempVarstoreId, &((EFI_IFR_GET *) OpCodeData)->VarStoreId, sizeof (TempVarstoreId));\r
1257 if (TempVarstoreId != 0) {\r
1258 if (FormSet->StorageListHead.ForwardLink != NULL) {\r
1259 Link = GetFirstNode (&FormSet->StorageListHead);\r
1260 while (!IsNull (&FormSet->StorageListHead, Link)) {\r
1261 VarStorage = FORMSET_STORAGE_FROM_LINK (Link);\r
1262 if (VarStorage->VarStoreId == ((EFI_IFR_GET *) OpCodeData)->VarStoreId) {\r
94f3aae7 1263 ExpressionOpCode->VarStorage = VarStorage->BrowserStorage;\r
2573712e
LG
1264 break;\r
1265 }\r
1266 Link = GetNextNode (&FormSet->StorageListHead, Link);\r
1267 }\r
1268 }\r
1269 if (ExpressionOpCode->VarStorage == NULL) {\r
1270 //\r
1271 // VarStorage is not found.\r
1272 //\r
1273 return EFI_INVALID_PARAMETER;\r
1274 }\r
1275 }\r
1276 ExpressionOpCode->ValueType = ((EFI_IFR_GET *) OpCodeData)->VarStoreType;\r
1277 switch (ExpressionOpCode->ValueType) {\r
1278 case EFI_IFR_TYPE_BOOLEAN:\r
1279 case EFI_IFR_TYPE_NUM_SIZE_8: \r
1280 ExpressionOpCode->ValueWidth = 1;\r
1281 break;\r
1282\r
1283 case EFI_IFR_TYPE_NUM_SIZE_16:\r
1284 case EFI_IFR_TYPE_STRING:\r
1285 ExpressionOpCode->ValueWidth = 2;\r
1286 break;\r
1287\r
1288 case EFI_IFR_TYPE_NUM_SIZE_32:\r
1289 ExpressionOpCode->ValueWidth = 4;\r
1290 break;\r
1291\r
1292 case EFI_IFR_TYPE_NUM_SIZE_64:\r
1293 ExpressionOpCode->ValueWidth = 8;\r
1294 break;\r
1295\r
1296 case EFI_IFR_TYPE_DATE:\r
c9325700 1297 ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_DATE);\r
2573712e
LG
1298 break;\r
1299\r
1300 case EFI_IFR_TYPE_TIME:\r
c9325700 1301 ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_TIME);\r
2573712e
LG
1302 break;\r
1303\r
8ca6180f
ED
1304 case EFI_IFR_TYPE_REF:\r
1305 ExpressionOpCode->ValueWidth = (UINT8) sizeof (EFI_IFR_REF);\r
1306 break;\r
1307\r
2573712e
LG
1308 case EFI_IFR_TYPE_OTHER:\r
1309 case EFI_IFR_TYPE_UNDEFINED:\r
1310 case EFI_IFR_TYPE_ACTION:\r
1311 case EFI_IFR_TYPE_BUFFER:\r
1312 default:\r
1313 //\r
1314 // Invalid value type for Get/Set opcode.\r
1315 //\r
1316 return EFI_INVALID_PARAMETER;\r
1317 }\r
1318 CopyMem (&ExpressionOpCode->VarStoreInfo.VarName, &((EFI_IFR_GET *) OpCodeData)->VarStoreInfo.VarName, sizeof (EFI_STRING_ID));\r
1319 CopyMem (&ExpressionOpCode->VarStoreInfo.VarOffset, &((EFI_IFR_GET *) OpCodeData)->VarStoreInfo.VarOffset, sizeof (UINT16));\r
1320 if ((ExpressionOpCode->VarStorage != NULL) && \r
1321 (ExpressionOpCode->VarStorage->Type == EFI_HII_VARSTORE_NAME_VALUE || \r
1322 ExpressionOpCode->VarStorage->Type == EFI_HII_VARSTORE_EFI_VARIABLE)) {\r
1323 ExpressionOpCode->ValueName = GetToken (ExpressionOpCode->VarStoreInfo.VarName, FormSet->HiiHandle);\r
1324 if (ExpressionOpCode->ValueName == NULL) {\r
1325 //\r
1326 // String ID is invalid.\r
1327 //\r
1328 return EFI_INVALID_PARAMETER;\r
1329 }\r
1330 }\r
1331 break;\r
1332\r
c60a0616 1333 case EFI_IFR_QUESTION_REF1_OP:\r
2654f642 1334 CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
c60a0616 1335 break;\r
1336\r
1337 case EFI_IFR_QUESTION_REF3_OP:\r
1338 if (OpCodeLength >= sizeof (EFI_IFR_QUESTION_REF3_2)) {\r
1339 CopyMem (&ExpressionOpCode->DevicePath, &(( EFI_IFR_QUESTION_REF3_2 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
1340\r
1341 if (OpCodeLength >= sizeof (EFI_IFR_QUESTION_REF3_3)) {\r
1342 CopyMem (&ExpressionOpCode->Guid, &(( EFI_IFR_QUESTION_REF3_3 *) OpCodeData)->Guid, sizeof (EFI_GUID));\r
1343 }\r
1344 }\r
1345 break;\r
1346\r
1347 //\r
1348 // constant\r
1349 //\r
1350 case EFI_IFR_TRUE_OP:\r
1351 Value->Type = EFI_IFR_TYPE_BOOLEAN;\r
1352 Value->Value.b = TRUE;\r
1353 break;\r
1354\r
1355 case EFI_IFR_FALSE_OP:\r
1356 Value->Type = EFI_IFR_TYPE_BOOLEAN;\r
1357 Value->Value.b = FALSE;\r
1358 break;\r
1359\r
1360 case EFI_IFR_ONE_OP:\r
1361 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
1362 Value->Value.u8 = 1;\r
1363 break;\r
1364\r
1365 case EFI_IFR_ZERO_OP:\r
1366 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
1367 Value->Value.u8 = 0;\r
1368 break;\r
1369\r
1370 case EFI_IFR_ONES_OP:\r
1371 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
1372 Value->Value.u64 = 0xffffffffffffffffULL;\r
1373 break;\r
1374\r
1375 case EFI_IFR_UINT8_OP:\r
1376 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
1377 Value->Value.u8 = (( EFI_IFR_UINT8 *) OpCodeData)->Value;\r
1378 break;\r
1379\r
1380 case EFI_IFR_UINT16_OP:\r
1381 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
1382 CopyMem (&Value->Value.u16, &(( EFI_IFR_UINT16 *) OpCodeData)->Value, sizeof (UINT16));\r
1383 break;\r
1384\r
1385 case EFI_IFR_UINT32_OP:\r
1386 Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
1387 CopyMem (&Value->Value.u32, &(( EFI_IFR_UINT32 *) OpCodeData)->Value, sizeof (UINT32));\r
1388 break;\r
1389\r
1390 case EFI_IFR_UINT64_OP:\r
1391 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
1392 CopyMem (&Value->Value.u64, &(( EFI_IFR_UINT64 *) OpCodeData)->Value, sizeof (UINT64));\r
1393 break;\r
1394\r
1395 case EFI_IFR_UNDEFINED_OP:\r
d02847d3 1396 Value->Type = EFI_IFR_TYPE_UNDEFINED;\r
c60a0616 1397 break;\r
1398\r
1399 case EFI_IFR_VERSION_OP:\r
1400 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
1401 Value->Value.u16 = EFI_IFR_SPECIFICATION_VERSION;\r
1402 break;\r
1403\r
1404 default:\r
1405 break;\r
1406 }\r
2573712e
LG
1407 //\r
1408 // Create sub expression nested in MAP opcode\r
1409 //\r
1410 if (CurrentExpression == NULL && MapScopeDepth > 0) {\r
1411 CurrentExpression = CreateExpression (CurrentForm);\r
771ececd 1412 ASSERT (MapExpressionList != NULL);\r
2573712e
LG
1413 InsertTailList (MapExpressionList, &CurrentExpression->Link);\r
1414 if (Scope == 0) {\r
1415 SingleOpCodeExpression = TRUE;\r
1416 }\r
1417 }\r
f8a1c229 1418 ASSERT (CurrentExpression != NULL);\r
c60a0616 1419 InsertTailList (&CurrentExpression->OpCodeListHead, &ExpressionOpCode->Link);\r
2573712e
LG
1420 if (Operand == EFI_IFR_MAP_OP) {\r
1421 //\r
1422 // Store current Map Expression List.\r
1423 //\r
1424 if (MapExpressionList != NULL) {\r
1425 PushMapExpressionList (MapExpressionList);\r
1426 }\r
1427 //\r
1428 // Initialize new Map Expression List.\r
1429 //\r
1430 MapExpressionList = &ExpressionOpCode->MapExpressionList;\r
1431 InitializeListHead (MapExpressionList);\r
1432 //\r
1433 // Store current expression.\r
1434 //\r
1435 PushCurrentExpression (CurrentExpression);\r
1436 CurrentExpression = NULL;\r
1437 MapScopeDepth ++;\r
1438 } else if (SingleOpCodeExpression) {\r
c60a0616 1439 //\r
1440 // There are two cases to indicate the end of an Expression:\r
1441 // for single OpCode expression: one Expression OpCode\r
1442 // for expression consists of more than one OpCode: EFI_IFR_END\r
1443 //\r
1444 SingleOpCodeExpression = FALSE;\r
1445\r
31585af4 1446 if (InScopeDisable && CurrentForm == NULL) {\r
c60a0616 1447 //\r
0a1147ed 1448 // This is DisableIf expression for Form, it should be a constant expression\r
c60a0616 1449 //\r
1450 Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
1451 if (EFI_ERROR (Status)) {\r
1452 return Status;\r
1453 }\r
c410589e 1454\r
c60a0616 1455 if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
1456 return EFI_INVALID_PARAMETER;\r
1457 }\r
1458\r
1459 OpCodeDisabled = CurrentExpression->Result.Value.b;\r
1460 }\r
1461\r
1462 CurrentExpression = NULL;\r
1463 }\r
1464\r
1465 continue;\r
1466 }\r
1467\r
1468 //\r
1469 // Parse the Opcode\r
1470 //\r
1471 switch (Operand) {\r
1472\r
1473 case EFI_IFR_FORM_SET_OP:\r
1474 //\r
f8a1c229 1475 // Check the formset GUID\r
c60a0616 1476 //\r
1477 if (CompareMem (&FormSet->Guid, &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID)) != 0) {\r
1478 return EFI_INVALID_PARAMETER;\r
1479 }\r
1480\r
1481 CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
1482 CopyMem (&FormSet->Help, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
0a1147ed 1483\r
d228526f
LG
1484 if (OpCodeLength > OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {\r
1485 //\r
1486 // The formset OpCode contains ClassGuid\r
1487 //\r
1488 FormSet->NumberOfClassGuid = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);\r
1489 CopyMem (FormSet->ClassGuid, OpCodeData + sizeof (EFI_IFR_FORM_SET), FormSet->NumberOfClassGuid * sizeof (EFI_GUID));\r
1490 }\r
c60a0616 1491 break;\r
1492\r
1493 case EFI_IFR_FORM_OP:\r
1494 //\r
1495 // Create a new Form for this FormSet\r
1496 //\r
1497 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
1ac628ee 1498 ASSERT (CurrentForm != NULL);\r
c60a0616 1499 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
1500 InitializeListHead (&CurrentForm->ExpressionListHead);\r
1501 InitializeListHead (&CurrentForm->StatementListHead);\r
b18e7050 1502 InitializeListHead (&CurrentForm->ConfigRequestHead);\r
c60a0616 1503\r
2573712e 1504 CurrentForm->FormType = STANDARD_MAP_FORM_TYPE;\r
25361615 1505 CurrentForm->NvUpdateRequired = FALSE;\r
c60a0616 1506 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
1507 CopyMem (&CurrentForm->FormTitle, &((EFI_IFR_FORM *) OpCodeData)->FormTitle, sizeof (EFI_STRING_ID));\r
1508\r
31585af4
ED
1509 ConditionalExprCount = GetConditionalExpressionCount(ExpressForm);\r
1510 if ( ConditionalExprCount > 0) {\r
0c66bc76
LG
1511 //\r
1512 // Form is inside of suppressif\r
1513 //\r
31585af4
ED
1514 CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
1515 (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
1516 ASSERT (CurrentForm->SuppressExpression != NULL);\r
1517 CurrentForm->SuppressExpression->Count = (UINTN) ConditionalExprCount;\r
1518 CurrentForm->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
1519 CopyMem (CurrentForm->SuppressExpression->Expression, GetConditionalExpressionList(ExpressForm), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
0c66bc76
LG
1520 }\r
1521\r
1522 if (Scope != 0) {\r
1523 //\r
1524 // Enter scope of a Form, suppressif will be used for Question or Option\r
1525 //\r
1526 SuppressForQuestion = TRUE;\r
1527 }\r
1528\r
c60a0616 1529 //\r
1530 // Insert into Form list of this FormSet\r
1531 //\r
1532 InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
1533 break;\r
1534\r
2573712e
LG
1535 case EFI_IFR_FORM_MAP_OP:\r
1536 //\r
1537 // Create a new Form for this FormSet\r
1538 //\r
1539 CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
1540 ASSERT (CurrentForm != NULL);\r
1541 CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
25361615 1542 CurrentForm->NvUpdateRequired = FALSE;\r
2573712e
LG
1543 InitializeListHead (&CurrentForm->ExpressionListHead);\r
1544 InitializeListHead (&CurrentForm->StatementListHead);\r
b18e7050 1545 InitializeListHead (&CurrentForm->ConfigRequestHead);\r
2573712e
LG
1546 CopyMem (&CurrentForm->FormId, &((EFI_IFR_FORM *) OpCodeData)->FormId, sizeof (UINT16));\r
1547\r
1548 MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
1549 //\r
1550 // FormMap Form must contain at least one Map Method.\r
1551 //\r
1552 if (((EFI_IFR_OP_HEADER *) OpCodeData)->Length < ((UINTN) (UINT8 *) (MapMethod + 1) - (UINTN) OpCodeData)) {\r
1553 return EFI_INVALID_PARAMETER;\r
1554 }\r
1555 //\r
1556 // Try to find the standard form map method.\r
1557 //\r
1558 while (((UINTN) (UINT8 *) MapMethod - (UINTN) OpCodeData) < ((EFI_IFR_OP_HEADER *) OpCodeData)->Length) {\r
1559 if (CompareGuid ((EFI_GUID *) (VOID *) &MapMethod->MethodIdentifier, &gEfiHiiStandardFormGuid)) {\r
1560 CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
1561 CurrentForm->FormType = STANDARD_MAP_FORM_TYPE;\r
1562 break;\r
1563 }\r
1564 MapMethod ++;\r
1565 }\r
1566 //\r
1567 // If the standard form map method is not found, the first map method title will be used.\r
1568 //\r
1569 if (CurrentForm->FormTitle == 0) {\r
1570 MapMethod = (EFI_IFR_FORM_MAP_METHOD *) (OpCodeData + sizeof (EFI_IFR_FORM_MAP));\r
1571 CopyMem (&CurrentForm->FormTitle, &MapMethod->MethodTitle, sizeof (EFI_STRING_ID));\r
1572 }\r
1573\r
31585af4
ED
1574 ConditionalExprCount = GetConditionalExpressionCount(ExpressForm);\r
1575 if ( ConditionalExprCount > 0) {\r
2573712e
LG
1576 //\r
1577 // Form is inside of suppressif\r
1578 //\r
31585af4
ED
1579 CurrentForm->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
1580 (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
1581 ASSERT (CurrentForm->SuppressExpression != NULL);\r
1582 CurrentForm->SuppressExpression->Count = (UINTN) ConditionalExprCount;\r
1583 CurrentForm->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
1584 CopyMem (CurrentForm->SuppressExpression->Expression, GetConditionalExpressionList(ExpressForm), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
2573712e
LG
1585 }\r
1586\r
1587 if (Scope != 0) {\r
1588 //\r
1589 // Enter scope of a Form, suppressif will be used for Question or Option\r
1590 //\r
1591 SuppressForQuestion = TRUE;\r
1592 }\r
1593\r
1594 //\r
1595 // Insert into Form list of this FormSet\r
1596 //\r
1597 InsertTailList (&FormSet->FormListHead, &CurrentForm->Link);\r
1598 break;\r
1599\r
c60a0616 1600 //\r
1601 // Storage\r
1602 //\r
1603 case EFI_IFR_VARSTORE_OP:\r
1604 //\r
1605 // Create a buffer Storage for this FormSet\r
1606 //\r
94f3aae7 1607 Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_BUFFER, OpCodeData);\r
c60a0616 1608 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
c60a0616 1609 break;\r
1610\r
1611 case EFI_IFR_VARSTORE_NAME_VALUE_OP:\r
1612 //\r
1613 // Create a name/value Storage for this FormSet\r
1614 //\r
94f3aae7 1615 Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_NAME_VALUE, OpCodeData);\r
c60a0616 1616 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_NAME_VALUE *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
c60a0616 1617 break;\r
1618\r
1619 case EFI_IFR_VARSTORE_EFI_OP:\r
1620 //\r
1621 // Create a EFI variable Storage for this FormSet\r
1622 //\r
cce6230f 1623 if (OpCodeLength < sizeof (EFI_IFR_VARSTORE_EFI)) {\r
94f3aae7
ED
1624 Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_EFI_VARIABLE, OpCodeData);\r
1625 } else {\r
1626 Storage = CreateStorage (FormSet, EFI_HII_VARSTORE_EFI_VARIABLE_BUFFER, OpCodeData);\r
cce6230f 1627 }\r
94f3aae7 1628 CopyMem (&Storage->VarStoreId, &((EFI_IFR_VARSTORE_EFI *) OpCodeData)->VarStoreId, sizeof (EFI_VARSTORE_ID));\r
c60a0616 1629 break;\r
1630\r
1631 //\r
1632 // DefaultStore\r
1633 //\r
1634 case EFI_IFR_DEFAULTSTORE_OP:\r
1635 DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
1ac628ee 1636 ASSERT (DefaultStore != NULL);\r
c60a0616 1637 DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
1638\r
1639 CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId, sizeof (UINT16));\r
1640 CopyMem (&DefaultStore->DefaultName, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultName, sizeof (EFI_STRING_ID));\r
1641\r
1642 //\r
1643 // Insert to DefaultStore list of this Formset\r
1644 //\r
1645 InsertTailList (&FormSet->DefaultStoreListHead, &DefaultStore->Link);\r
1646 break;\r
1647\r
1648 //\r
1649 // Statements\r
1650 //\r
1651 case EFI_IFR_SUBTITLE_OP:\r
1652 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
bc166db3 1653 ASSERT (CurrentStatement != NULL);\r
8b0fc5c1 1654\r
c60a0616 1655 CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
25361615 1656\r
c60a0616 1657 if (Scope != 0) {\r
1658 mInScopeSubtitle = TRUE;\r
1659 }\r
1660 break;\r
1661\r
1662 case EFI_IFR_TEXT_OP:\r
1663 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
bc166db3 1664 ASSERT (CurrentStatement != NULL);\r
25361615 1665\r
c60a0616 1666 CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
1667 break;\r
1668\r
f8a1c229 1669 case EFI_IFR_RESET_BUTTON_OP:\r
1670 CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
1671 ASSERT (CurrentStatement != NULL);\r
1672 CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
1673 break;\r
1674\r
c60a0616 1675 //\r
1676 // Questions\r
1677 //\r
1678 case EFI_IFR_ACTION_OP:\r
1679 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
bc166db3 1680 ASSERT (CurrentStatement != NULL);\r
d02847d3 1681 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_ACTION;\r
c60a0616 1682\r
1683 if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
1684 //\r
1685 // No QuestionConfig present, so no configuration string will be processed\r
1686 //\r
1687 CurrentStatement->QuestionConfig = 0;\r
1688 } else {\r
1689 CopyMem (&CurrentStatement->QuestionConfig, &((EFI_IFR_ACTION *) OpCodeData)->QuestionConfig, sizeof (EFI_STRING_ID));\r
1690 }\r
1691 break;\r
1692\r
c60a0616 1693 case EFI_IFR_REF_OP:\r
1694 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1695 ASSERT (CurrentStatement != NULL);\r
8ca6180f
ED
1696 Value = &CurrentStatement->HiiValue;\r
1697 Value->Type = EFI_IFR_TYPE_REF;\r
1698 if (OpCodeLength >= sizeof (EFI_IFR_REF)) {\r
1699 CopyMem (&Value->Value.ref.FormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
c60a0616 1700\r
8ca6180f
ED
1701 if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
1702 CopyMem (&Value->Value.ref.QuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
c60a0616 1703\r
8ca6180f
ED
1704 if (OpCodeLength >= sizeof (EFI_IFR_REF3)) {\r
1705 CopyMem (&Value->Value.ref.FormSetGuid, &((EFI_IFR_REF3 *) OpCodeData)->FormSetId, sizeof (EFI_GUID));\r
1706\r
1707 if (OpCodeLength >= sizeof (EFI_IFR_REF4)) {\r
1708 CopyMem (&Value->Value.ref.DevicePath, &((EFI_IFR_REF4 *) OpCodeData)->DevicePath, sizeof (EFI_STRING_ID));\r
1709 }\r
c60a0616 1710 }\r
1711 }\r
1712 }\r
8ca6180f
ED
1713 CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_REF); \r
1714 InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
c60a0616 1715 break;\r
1716\r
1717 case EFI_IFR_ONE_OF_OP:\r
1718 case EFI_IFR_NUMERIC_OP:\r
1719 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
945e3aed 1720 ASSERT(CurrentStatement != NULL);\r
8b0fc5c1 1721\r
c60a0616 1722 CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
1723 Value = &CurrentStatement->HiiValue;\r
1724\r
1725 switch (CurrentStatement->Flags & EFI_IFR_NUMERIC_SIZE) {\r
1726 case EFI_IFR_NUMERIC_SIZE_1:\r
1727 CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
1728 CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
1729 CurrentStatement->Step = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
cd7bfc2c 1730 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT8);\r
c60a0616 1731 Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
1732 break;\r
1733\r
1734 case EFI_IFR_NUMERIC_SIZE_2:\r
1735 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
1736 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
1737 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step, sizeof (UINT16));\r
cd7bfc2c 1738 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT16);\r
c60a0616 1739 Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
1740 break;\r
1741\r
1742 case EFI_IFR_NUMERIC_SIZE_4:\r
1743 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
1744 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
1745 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step, sizeof (UINT32));\r
cd7bfc2c 1746 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT32);\r
c60a0616 1747 Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
1748 break;\r
1749\r
1750 case EFI_IFR_NUMERIC_SIZE_8:\r
1751 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
1752 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
1753 CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step, sizeof (UINT64));\r
cd7bfc2c 1754 CurrentStatement->StorageWidth = (UINT16) sizeof (UINT64);\r
c60a0616 1755 Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
1756 break;\r
1757\r
1758 default:\r
1759 break;\r
1760 }\r
1761\r
b18e7050 1762 InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
c60a0616 1763\r
1764 if ((Operand == EFI_IFR_ONE_OF_OP) && Scope != 0) {\r
1765 SuppressForOption = TRUE;\r
1766 }\r
1767 break;\r
1768\r
1769 case EFI_IFR_ORDERED_LIST_OP:\r
1770 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1771 ASSERT(CurrentStatement != NULL);\r
8b0fc5c1 1772\r
c60a0616 1773 CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
1774 CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
c60a0616 1775\r
d02847d3 1776 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BUFFER;\r
b86b413a 1777 CurrentStatement->BufferValue = NULL;\r
c60a0616 1778\r
1779 if (Scope != 0) {\r
1780 SuppressForOption = TRUE;\r
1781 }\r
1782 break;\r
1783\r
1784 case EFI_IFR_CHECKBOX_OP:\r
1785 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1786 ASSERT(CurrentStatement != NULL);\r
8b0fc5c1 1787\r
c60a0616 1788 CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
cd7bfc2c 1789 CurrentStatement->StorageWidth = (UINT16) sizeof (BOOLEAN);\r
c60a0616 1790 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
1791\r
b18e7050 1792 InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
c60a0616 1793\r
1794 break;\r
1795\r
1796 case EFI_IFR_STRING_OP:\r
1797 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1798 ASSERT (CurrentStatement != NULL);\r
c60a0616 1799 //\r
1800 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
1801 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
1802 // The characters are stored as Unicode, so the storage width should multiply 2.\r
1803 //\r
1804 CurrentStatement->Minimum = ((EFI_IFR_STRING *) OpCodeData)->MinSize;\r
1805 CurrentStatement->Maximum = ((EFI_IFR_STRING *) OpCodeData)->MaxSize;\r
1806 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (CHAR16));\r
1807 CurrentStatement->Flags = ((EFI_IFR_STRING *) OpCodeData)->Flags;\r
1808\r
1809 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
1810 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth + sizeof (CHAR16));\r
e2100bfa 1811 CurrentStatement->HiiValue.Value.string = NewString ((CHAR16*) CurrentStatement->BufferValue, FormSet->HiiHandle);\r
c60a0616 1812\r
b18e7050 1813 InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
c60a0616 1814 break;\r
1815\r
1816 case EFI_IFR_PASSWORD_OP:\r
1817 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1818 ASSERT (CurrentStatement != NULL);\r
c60a0616 1819 //\r
1820 // MinSize is the minimum number of characters that can be accepted for this opcode,\r
1821 // MaxSize is the maximum number of characters that can be accepted for this opcode.\r
1822 // The characters are stored as Unicode, so the storage width should multiply 2.\r
1823 //\r
1824 CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_PASSWORD *) OpCodeData)->MinSize, sizeof (UINT16));\r
1825 CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_PASSWORD *) OpCodeData)->MaxSize, sizeof (UINT16));\r
1826 CurrentStatement->StorageWidth = (UINT16)((UINTN) CurrentStatement->Maximum * sizeof (CHAR16));\r
1827\r
1828 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_STRING;\r
1829 CurrentStatement->BufferValue = AllocateZeroPool ((CurrentStatement->StorageWidth + sizeof (CHAR16)));\r
e2100bfa 1830 CurrentStatement->HiiValue.Value.string = NewString ((CHAR16*) CurrentStatement->BufferValue, FormSet->HiiHandle);\r
c60a0616 1831\r
b18e7050 1832 InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
c60a0616 1833 break;\r
1834\r
1835 case EFI_IFR_DATE_OP:\r
1836 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1837 ASSERT(CurrentStatement != NULL);\r
8b0fc5c1 1838\r
c60a0616 1839 CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
1840 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
1841\r
1842 if ((CurrentStatement->Flags & EFI_QF_DATE_STORAGE) == QF_DATE_STORAGE_NORMAL) {\r
cd7bfc2c 1843 CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_DATE);\r
c60a0616 1844\r
b18e7050 1845 InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
c60a0616 1846 } else {\r
1847 //\r
1848 // Don't assign storage for RTC type of date/time\r
1849 //\r
1850 CurrentStatement->Storage = NULL;\r
1851 CurrentStatement->StorageWidth = 0;\r
1852 }\r
1853 break;\r
1854\r
1855 case EFI_IFR_TIME_OP:\r
1856 CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
b347c1bc 1857 ASSERT(CurrentStatement != NULL);\r
8b0fc5c1 1858\r
c60a0616 1859 CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
1860 CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
1861\r
1862 if ((CurrentStatement->Flags & QF_TIME_STORAGE) == QF_TIME_STORAGE_NORMAL) {\r
5ec56d19 1863 CurrentStatement->StorageWidth = (UINT16) sizeof (EFI_HII_TIME);\r
c60a0616 1864\r
b18e7050 1865 InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
c60a0616 1866 } else {\r
1867 //\r
1868 // Don't assign storage for RTC type of date/time\r
1869 //\r
1870 CurrentStatement->Storage = NULL;\r
1871 CurrentStatement->StorageWidth = 0;\r
1872 }\r
1873 break;\r
1874\r
1875 //\r
1876 // Default\r
1877 //\r
1878 case EFI_IFR_DEFAULT_OP:\r
1879 //\r
1880 // EFI_IFR_DEFAULT appear in scope of a Question,\r
1881 // It creates a default value for the current question.\r
1882 // A Question may have more than one Default value which have different default types.\r
1883 //\r
1884 CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
1ac628ee 1885 ASSERT (CurrentDefault != NULL);\r
c60a0616 1886 CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
1887\r
1888 CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
1889 CopyMem (&CurrentDefault->DefaultId, &((EFI_IFR_DEFAULT *) OpCodeData)->DefaultId, sizeof (UINT16));\r
23fe74dc
ED
1890 if (OpCodeLength > OFFSET_OF (EFI_IFR_DEFAULT, Value)) {\r
1891 CopyMem (&CurrentDefault->Value.Value, &((EFI_IFR_DEFAULT *) OpCodeData)->Value, OpCodeLength - OFFSET_OF (EFI_IFR_DEFAULT, Value));\r
4706ff4f
ED
1892 ExtendValueToU64 (&CurrentDefault->Value);\r
1893 }\r
c60a0616 1894\r
1895 //\r
1896 // Insert to Default Value list of current Question\r
1897 //\r
1898 InsertTailList (&CurrentStatement->DefaultListHead, &CurrentDefault->Link);\r
1899\r
1900 if (Scope != 0) {\r
1901 InScopeDefault = TRUE;\r
1902 }\r
1903 break;\r
1904\r
1905 //\r
1906 // Option\r
1907 //\r
1908 case EFI_IFR_ONE_OF_OPTION_OP:\r
1909 //\r
1910 // EFI_IFR_ONE_OF_OPTION appear in scope of a Question.\r
1911 // It create a selection for use in current Question.\r
1912 //\r
1913 CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
1ac628ee 1914 ASSERT (CurrentOption != NULL);\r
c60a0616 1915 CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
1916\r
1917 CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
1918 CurrentOption->Value.Type = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Type;\r
1919 CopyMem (&CurrentOption->Text, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Option, sizeof (EFI_STRING_ID));\r
a7f87053 1920 CopyMem (&CurrentOption->Value.Value, &((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Value, OpCodeLength - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value));\r
c60a0616 1921 ExtendValueToU64 (&CurrentOption->Value);\r
1922\r
31585af4
ED
1923 ConditionalExprCount = GetConditionalExpressionCount(ExpressOption);\r
1924 if ( ConditionalExprCount > 0) {\r
1925 //\r
1926 // Form is inside of suppressif\r
1927 //\r
1928 CurrentOption->SuppressExpression = (FORM_EXPRESSION_LIST *) AllocatePool( \r
1929 (UINTN) (sizeof(FORM_EXPRESSION_LIST) + ((ConditionalExprCount -1) * sizeof(FORM_EXPRESSION *))));\r
1930 ASSERT (CurrentOption->SuppressExpression != NULL);\r
1931 CurrentOption->SuppressExpression->Count = (UINTN) ConditionalExprCount;\r
1932 CurrentOption->SuppressExpression->Signature = FORM_EXPRESSION_LIST_SIGNATURE;\r
1933 CopyMem (CurrentOption->SuppressExpression->Expression, GetConditionalExpressionList(ExpressOption), (UINTN) (sizeof (FORM_EXPRESSION *) * ConditionalExprCount));\r
c60a0616 1934 }\r
1935\r
1936 //\r
1937 // Insert to Option list of current Question\r
1938 //\r
1939 InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);\r
d02847d3 1940\r
1941 //\r
1942 // Now we know the Storage width of nested Ordered List\r
1943 //\r
1b2bf3ca 1944 ASSERT (CurrentStatement != NULL);\r
d02847d3 1945 if ((CurrentStatement->Operand == EFI_IFR_ORDERED_LIST_OP) && (CurrentStatement->BufferValue == NULL)) {\r
1946 Width = 1;\r
1947 switch (CurrentOption->Value.Type) {\r
1948 case EFI_IFR_TYPE_NUM_SIZE_8:\r
1949 Width = 1;\r
1950 break;\r
1951\r
1952 case EFI_IFR_TYPE_NUM_SIZE_16:\r
1953 Width = 2;\r
1954 break;\r
1955\r
1956 case EFI_IFR_TYPE_NUM_SIZE_32:\r
1957 Width = 4;\r
1958 break;\r
1959\r
1960 case EFI_IFR_TYPE_NUM_SIZE_64:\r
1961 Width = 8;\r
1962 break;\r
1963\r
1964 default:\r
1965 //\r
1966 // Invalid type for Ordered List\r
1967 //\r
1968 break;\r
1969 }\r
1970\r
1971 CurrentStatement->StorageWidth = (UINT16) (CurrentStatement->MaxContainers * Width);\r
1972 CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
1973 CurrentStatement->ValueType = CurrentOption->Value.Type;\r
901ba0e7
ED
1974 if (CurrentStatement->HiiValue.Type == EFI_IFR_TYPE_BUFFER) {\r
1975 CurrentStatement->HiiValue.Buffer = CurrentStatement->BufferValue;\r
1976 CurrentStatement->HiiValue.BufferLen = CurrentStatement->StorageWidth;\r
1977 }\r
d02847d3 1978\r
b18e7050 1979 InitializeRequestElement (FormSet, CurrentStatement, CurrentForm);\r
d02847d3 1980 }\r
c60a0616 1981 break;\r
1982\r
1983 //\r
1984 // Conditional\r
1985 //\r
1986 case EFI_IFR_NO_SUBMIT_IF_OP:\r
1987 case EFI_IFR_INCONSISTENT_IF_OP:\r
1988 //\r
1989 // Create an Expression node\r
1990 //\r
1991 CurrentExpression = CreateExpression (CurrentForm);\r
1992 CopyMem (&CurrentExpression->Error, &((EFI_IFR_INCONSISTENT_IF *) OpCodeData)->Error, sizeof (EFI_STRING_ID));\r
1993\r
1994 if (Operand == EFI_IFR_NO_SUBMIT_IF_OP) {\r
1995 CurrentExpression->Type = EFI_HII_EXPRESSION_NO_SUBMIT_IF;\r
1996 InsertTailList (&CurrentStatement->NoSubmitListHead, &CurrentExpression->Link);\r
1997 } else {\r
1998 CurrentExpression->Type = EFI_HII_EXPRESSION_INCONSISTENT_IF;\r
1999 InsertTailList (&CurrentStatement->InconsistentListHead, &CurrentExpression->Link);\r
2000 }\r
0c66bc76
LG
2001\r
2002 //\r
2003 // Take a look at next OpCode to see whether current expression consists\r
2004 // of single OpCode\r
2005 //\r
2006 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
2007 SingleOpCodeExpression = TRUE;\r
2008 }\r
c60a0616 2009 break;\r
2010\r
2011 case EFI_IFR_SUPPRESS_IF_OP:\r
2012 //\r
2013 // Question and Option will appear in scope of this OpCode\r
2014 //\r
2015 CurrentExpression = CreateExpression (CurrentForm);\r
2016 CurrentExpression->Type = EFI_HII_EXPRESSION_SUPPRESS_IF;\r
0c66bc76
LG
2017\r
2018 if (CurrentForm == NULL) {\r
2019 InsertTailList (&FormSet->ExpressionListHead, &CurrentExpression->Link);\r
2020 } else {\r
2021 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
2022 }\r
c60a0616 2023\r
2024 if (SuppressForOption) {\r
31585af4 2025 PushConditionalExpression(CurrentExpression, ExpressOption); \r
0c66bc76 2026 } else if (SuppressForQuestion) {\r
31585af4 2027 PushConditionalExpression(CurrentExpression, ExpressStatement); \r
0c66bc76 2028 } else {\r
31585af4 2029 PushConditionalExpression(CurrentExpression, ExpressForm); \r
0c66bc76
LG
2030 }\r
2031\r
2032 //\r
2033 // Take a look at next OpCode to see whether current expression consists\r
2034 // of single OpCode\r
2035 //\r
2036 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
2037 SingleOpCodeExpression = TRUE;\r
c60a0616 2038 }\r
2039 break;\r
2040\r
2041 case EFI_IFR_GRAY_OUT_IF_OP:\r
2042 //\r
2043 // Questions will appear in scope of this OpCode\r
2044 //\r
2045 CurrentExpression = CreateExpression (CurrentForm);\r
2046 CurrentExpression->Type = EFI_HII_EXPRESSION_GRAY_OUT_IF;\r
2047 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
31585af4 2048 PushConditionalExpression(CurrentExpression, ExpressStatement);\r
0c66bc76
LG
2049\r
2050 //\r
2051 // Take a look at next OpCode to see whether current expression consists\r
2052 // of single OpCode\r
2053 //\r
2054 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
2055 SingleOpCodeExpression = TRUE;\r
2056 }\r
c60a0616 2057 break;\r
2058\r
2059 case EFI_IFR_DISABLE_IF_OP:\r
2060 //\r
2061 // The DisableIf expression should only rely on constant, so it could be\r
2062 // evaluated at initialization and it will not be queued\r
2063 //\r
2064 CurrentExpression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
1ac628ee 2065 ASSERT (CurrentExpression != NULL);\r
c60a0616 2066 CurrentExpression->Signature = FORM_EXPRESSION_SIGNATURE;\r
2067 CurrentExpression->Type = EFI_HII_EXPRESSION_DISABLE_IF;\r
2068 InitializeListHead (&CurrentExpression->OpCodeListHead);\r
2069\r
0a1147ed
LG
2070 if (CurrentForm != NULL) {\r
2071 //\r
2072 // This is DisableIf for Question, enqueue it to Form expression list\r
2073 //\r
2074 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
31585af4 2075 PushConditionalExpression(CurrentExpression, ExpressStatement);\r
0a1147ed
LG
2076 }\r
2077\r
31585af4
ED
2078 OpCodeDisabled = FALSE;\r
2079 InScopeDisable = TRUE;\r
c60a0616 2080 //\r
2081 // Take a look at next OpCode to see whether current expression consists\r
2082 // of single OpCode\r
2083 //\r
2084 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
2085 SingleOpCodeExpression = TRUE;\r
2086 }\r
2087 break;\r
2088\r
2089 //\r
2090 // Expression\r
2091 //\r
2092 case EFI_IFR_VALUE_OP:\r
2093 CurrentExpression = CreateExpression (CurrentForm);\r
2094 CurrentExpression->Type = EFI_HII_EXPRESSION_VALUE;\r
2095 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
2096\r
2097 if (InScopeDefault) {\r
2098 //\r
2099 // Used for default (EFI_IFR_DEFAULT)\r
2100 //\r
2101 CurrentDefault->ValueExpression = CurrentExpression;\r
2102 } else {\r
2103 //\r
2104 // If used for a question, then the question will be read-only\r
2105 //\r
bc166db3 2106 //\r
2107 // Make sure CurrentStatement is not NULL.\r
2108 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
2109 // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
2110 //\r
2111 ASSERT (CurrentStatement != NULL);\r
c60a0616 2112 CurrentStatement->ValueExpression = CurrentExpression;\r
2113 }\r
0c66bc76
LG
2114\r
2115 //\r
2116 // Take a look at next OpCode to see whether current expression consists\r
2117 // of single OpCode\r
2118 //\r
2119 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
2120 SingleOpCodeExpression = TRUE;\r
2121 }\r
c60a0616 2122 break;\r
2123\r
2124 case EFI_IFR_RULE_OP:\r
2125 CurrentExpression = CreateExpression (CurrentForm);\r
2126 CurrentExpression->Type = EFI_HII_EXPRESSION_RULE;\r
2127\r
2128 CurrentExpression->RuleId = ((EFI_IFR_RULE *) OpCodeData)->RuleId;\r
2129 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
0c66bc76
LG
2130\r
2131 //\r
2132 // Take a look at next OpCode to see whether current expression consists\r
2133 // of single OpCode\r
2134 //\r
2135 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
2136 SingleOpCodeExpression = TRUE;\r
2137 }\r
c60a0616 2138 break;\r
2139\r
2573712e
LG
2140 case EFI_IFR_READ_OP:\r
2141 CurrentExpression = CreateExpression (CurrentForm);\r
2142 CurrentExpression->Type = EFI_HII_EXPRESSION_READ;\r
2143 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
2144\r
2145 //\r
2146 // Make sure CurrentStatement is not NULL.\r
2147 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
2148 // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
2149 //\r
2150 ASSERT (CurrentStatement != NULL);\r
2151 CurrentStatement->ReadExpression = CurrentExpression;\r
2152\r
2153 //\r
2154 // Take a look at next OpCode to see whether current expression consists\r
2155 // of single OpCode\r
2156 //\r
2157 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
2158 SingleOpCodeExpression = TRUE;\r
2159 }\r
2160 break;\r
2161\r
2162 case EFI_IFR_WRITE_OP:\r
2163 CurrentExpression = CreateExpression (CurrentForm);\r
2164 CurrentExpression->Type = EFI_HII_EXPRESSION_WRITE;\r
2165 InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
2166\r
2167 //\r
2168 // Make sure CurrentStatement is not NULL.\r
2169 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
2170 // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
2171 //\r
2172 ASSERT (CurrentStatement != NULL);\r
2173 CurrentStatement->WriteExpression = CurrentExpression;\r
2174\r
2175 //\r
2176 // Take a look at next OpCode to see whether current expression consists\r
2177 // of single OpCode\r
2178 //\r
2179 if (((EFI_IFR_OP_HEADER *) (OpCodeData + OpCodeLength))->Scope == 0) {\r
2180 SingleOpCodeExpression = TRUE;\r
2181 }\r
2182 break;\r
2183\r
c60a0616 2184 //\r
2185 // Image\r
2186 //\r
2187 case EFI_IFR_IMAGE_OP:\r
2188 //\r
2189 // Get ScopeOpcode from top of stack\r
2190 //\r
2191 PopScope (&ScopeOpCode);\r
2192 PushScope (ScopeOpCode);\r
2193\r
2194 switch (ScopeOpCode) {\r
2195 case EFI_IFR_FORM_SET_OP:\r
2196 ImageId = &FormSet->ImageId;\r
2197 break;\r
2198\r
2199 case EFI_IFR_FORM_OP:\r
2573712e 2200 case EFI_IFR_FORM_MAP_OP:\r
d0720b57 2201 ASSERT (CurrentForm != NULL);\r
c60a0616 2202 ImageId = &CurrentForm->ImageId;\r
2203 break;\r
2204\r
2205 case EFI_IFR_ONE_OF_OPTION_OP:\r
2206 ImageId = &CurrentOption->ImageId;\r
2207 break;\r
2208\r
2209 default:\r
bc166db3 2210 //\r
2211 // Make sure CurrentStatement is not NULL.\r
2212 // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
2213 // file is wrongly generated by tools such as VFR Compiler.\r
2214 //\r
2215 ASSERT (CurrentStatement != NULL);\r
c60a0616 2216 ImageId = &CurrentStatement->ImageId;\r
2217 break;\r
2218 }\r
2219\r
c410589e 2220 ASSERT (ImageId != NULL);\r
c60a0616 2221 CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
2222 break;\r
2223\r
2224 //\r
2225 // Refresh\r
2226 //\r
2227 case EFI_IFR_REFRESH_OP:\r
c410589e 2228 ASSERT (CurrentStatement != NULL);\r
c60a0616 2229 CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
2230 break;\r
2231\r
211cc6e5
ED
2232 //\r
2233 // Refresh guid.\r
2234 //\r
2235 case EFI_IFR_REFRESH_ID_OP:\r
2236 ASSERT (CurrentStatement != NULL);\r
2237 CopyMem (&CurrentStatement->RefreshGuid, &((EFI_IFR_REFRESH_ID *) OpCodeData)->RefreshEventGroupId, sizeof (EFI_GUID));\r
2238 break;\r
2239\r
b00964a9
ED
2240 //\r
2241 // Modal tag\r
2242 //\r
2243 case EFI_IFR_MODAL_TAG_OP:\r
2244 ASSERT (CurrentForm != NULL);\r
2245 CurrentForm->ModalForm = TRUE;\r
2246 break;\r
2247\r
f67c4382
ED
2248 //\r
2249 // Lock tag, used by form and statement.\r
2250 //\r
2251 case EFI_IFR_LOCKED_OP:\r
2252 //\r
2253 // Get ScopeOpcode from top of stack\r
2254 //\r
2255 PopScope (&ScopeOpCode);\r
2256 PushScope (ScopeOpCode);\r
2257 switch (ScopeOpCode) {\r
2258 case EFI_IFR_FORM_OP:\r
2259 case EFI_IFR_FORM_MAP_OP:\r
2260 ASSERT (CurrentForm != NULL);\r
2261 CurrentForm->Locked = TRUE;\r
2262 break;\r
2263\r
2264 default:\r
2265 ASSERT (CurrentStatement != NULL);\r
2266 CurrentStatement->Locked = TRUE;\r
2267 } \r
2268 break;\r
2269\r
c60a0616 2270 //\r
2271 // Vendor specific\r
2272 //\r
25361615
ED
2273 case EFI_IFR_GUID_OP:\r
2274 if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
2275 //\r
2276 // Tiano specific GUIDed opcodes\r
2277 //\r
2278 switch (((EFI_IFR_GUID_LABEL *) OpCodeData)->ExtendOpCode) {\r
2279 case EFI_IFR_EXTEND_OP_LABEL:\r
2280 //\r
2281 // just ignore label\r
2282 //\r
2283 break;\r
2284\r
2285 case EFI_IFR_EXTEND_OP_BANNER:\r
2286 //\r
2287 // By SubClass to get Banner Data from Front Page\r
2288 //\r
2289 if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
2290 CopyMem (\r
2291 &gBannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
2292 ((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
2293 &((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
2294 sizeof (EFI_STRING_ID)\r
2295 );\r
2296 }\r
2297 break;\r
2298\r
2299 case EFI_IFR_EXTEND_OP_CLASS:\r
2300 CopyMem (&FormSet->Class, &((EFI_IFR_GUID_CLASS *) OpCodeData)->Class, sizeof (UINT16));\r
2301 break;\r
2302\r
2303 case EFI_IFR_EXTEND_OP_SUBCLASS:\r
2304 CopyMem (&FormSet->SubClass, &((EFI_IFR_GUID_SUBCLASS *) OpCodeData)->SubClass, sizeof (UINT16));\r
2305 break;\r
2306\r
2307 default:\r
2308 break;\r
2309 }\r
2310 }\r
2311\r
c60a0616 2312 break;\r
2313\r
2314 //\r
2315 // Scope End\r
2316 //\r
2317 case EFI_IFR_END_OP:\r
2318 Status = PopScope (&ScopeOpCode);\r
2319 if (EFI_ERROR (Status)) {\r
2320 ResetScopeStack ();\r
2321 return Status;\r
2322 }\r
2323\r
2324 switch (ScopeOpCode) {\r
2325 case EFI_IFR_FORM_SET_OP:\r
2326 //\r
2327 // End of FormSet, update FormSet IFR binary length\r
2328 // to stop parsing substantial OpCodes\r
2329 //\r
2330 FormSet->IfrBinaryLength = OpCodeOffset;\r
2331 break;\r
2332\r
2333 case EFI_IFR_FORM_OP:\r
2573712e 2334 case EFI_IFR_FORM_MAP_OP:\r
c60a0616 2335 //\r
2336 // End of Form\r
2337 //\r
2338 CurrentForm = NULL;\r
0c66bc76 2339 SuppressForQuestion = FALSE;\r
c60a0616 2340 break;\r
2341\r
2342 case EFI_IFR_ONE_OF_OPTION_OP:\r
2343 //\r
2344 // End of Option\r
2345 //\r
2346 CurrentOption = NULL;\r
2347 break;\r
2348\r
2349 case EFI_IFR_SUBTITLE_OP:\r
2350 mInScopeSubtitle = FALSE;\r
2351 break;\r
2352\r
2353 case EFI_IFR_NO_SUBMIT_IF_OP:\r
2354 case EFI_IFR_INCONSISTENT_IF_OP:\r
2355 //\r
2356 // Ignore end of EFI_IFR_NO_SUBMIT_IF and EFI_IFR_INCONSISTENT_IF\r
2357 //\r
2358 break;\r
2359\r
2360 case EFI_IFR_SUPPRESS_IF_OP:\r
2361 if (SuppressForOption) {\r
31585af4 2362 PopConditionalExpression(ExpressOption); \r
0c66bc76 2363 } else if (SuppressForQuestion) {\r
31585af4 2364 PopConditionalExpression(ExpressStatement);\r
0c66bc76 2365 } else {\r
31585af4 2366 PopConditionalExpression(ExpressForm);\r
c60a0616 2367 }\r
2368 break;\r
2369\r
2370 case EFI_IFR_GRAY_OUT_IF_OP:\r
31585af4 2371 PopConditionalExpression(ExpressStatement);\r
c60a0616 2372 break;\r
2373\r
2374 case EFI_IFR_DISABLE_IF_OP:\r
31585af4
ED
2375 if (CurrentForm != NULL) {\r
2376 PopConditionalExpression(ExpressStatement);\r
2377 }\r
2378 InScopeDisable = FALSE;\r
c60a0616 2379 OpCodeDisabled = FALSE;\r
2380 break;\r
2381\r
2382 case EFI_IFR_ONE_OF_OP:\r
2383 case EFI_IFR_ORDERED_LIST_OP:\r
2384 SuppressForOption = FALSE;\r
2385 break;\r
2386\r
2387 case EFI_IFR_DEFAULT_OP:\r
2388 InScopeDefault = FALSE;\r
2389 break;\r
2390\r
2573712e
LG
2391 case EFI_IFR_MAP_OP:\r
2392 //\r
2393 // Get current Map Expression List.\r
2394 //\r
2395 Status = PopMapExpressionList ((VOID **) &MapExpressionList);\r
2396 if (Status == EFI_ACCESS_DENIED) {\r
2397 MapExpressionList = NULL;\r
2398 }\r
2399 //\r
2400 // Get current expression.\r
2401 //\r
2402 Status = PopCurrentExpression ((VOID **) &CurrentExpression);\r
2403 ASSERT_EFI_ERROR (Status);\r
771ececd 2404 ASSERT (MapScopeDepth > 0);\r
2573712e
LG
2405 MapScopeDepth --;\r
2406 break;\r
2407\r
c60a0616 2408 default:\r
2409 if (IsExpressionOpCode (ScopeOpCode)) {\r
31585af4 2410 if (InScopeDisable && CurrentForm == NULL) {\r
c60a0616 2411 //\r
0a1147ed 2412 // This is DisableIf expression for Form, it should be a constant expression\r
c60a0616 2413 //\r
f8a1c229 2414 ASSERT (CurrentExpression != NULL);\r
c60a0616 2415 Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
2416 if (EFI_ERROR (Status)) {\r
2417 return Status;\r
2418 }\r
a935a0d8 2419\r
c60a0616 2420 if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
2421 return EFI_INVALID_PARAMETER;\r
2422 }\r
2423\r
2424 OpCodeDisabled = CurrentExpression->Result.Value.b;\r
2425 //\r
2573712e 2426 // DisableIf Expression is only used once and not queued, free it\r
c60a0616 2427 //\r
2428 DestroyExpression (CurrentExpression);\r
2429 }\r
2430\r
2431 //\r
2432 // End of current Expression\r
2433 //\r
2434 CurrentExpression = NULL;\r
2435 }\r
2436 break;\r
2437 }\r
2438 break;\r
2439\r
2440 default:\r
2441 break;\r
2442 }\r
2443 }\r
2444\r
2445 return EFI_SUCCESS;\r
2446}\r