/** @file\r
Parser for IFR binary encoding.\r
\r
-Copyright (c) 2007 - 2008, Intel Corporation\r
+Copyright (c) 2007 - 2009, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
are licensed and made available under the terms and conditions of the BSD License\r
which accompanies this distribution. The full text of the license may be found at\r
BOOLEAN mInScopeSubtitle;\r
BOOLEAN mInScopeSuppress;\r
BOOLEAN mInScopeGrayOut;\r
+BOOLEAN mInScopeDisable;\r
FORM_EXPRESSION *mSuppressExpression;\r
FORM_EXPRESSION *mGrayOutExpression;\r
-\r
-EFI_GUID gTianoHiiIfrGuid = EFI_IFR_TIANO_GUID;\r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_GUID mFrameworkHiiCompatibilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
-\r
+FORM_EXPRESSION *mDisableExpression;\r
\r
/**\r
Initialize Statement header members.\r
Statement->GrayOutExpression = mGrayOutExpression;\r
}\r
\r
+\r
+ if (mInScopeDisable) {\r
+ Statement->DisableExpression = mDisableExpression;\r
+ }\r
+\r
Statement->InSubtitle = mInScopeSubtitle;\r
\r
//\r
{\r
CHAR16 Str[MAXIMUM_VALUE_CHARACTERS];\r
EFI_STRING_ID Id;\r
- EFI_STATUS Status;\r
\r
ASSERT (Statement != NULL);\r
ASSERT (Statement->Operand == EFI_IFR_NUMERIC_OP);\r
\r
UnicodeValueToString (Str, 0, Statement->VarStoreInfo.VarName, MAXIMUM_VALUE_CHARACTERS - 1);\r
- \r
- Status = HiiLibNewString (FormSet->HiiHandle, &Id, Str);\r
\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ Id = HiiSetString (FormSet->HiiHandle, 0, Str, NULL);\r
+ if (Id == 0) {\r
+ return EFI_OUT_OF_RESOURCES;\r
}\r
\r
Statement->VarStoreInfo.VarName = Id;\r
//\r
OpCodeData += ((EFI_IFR_OP_HEADER *) OpCodeData)->Length;\r
if (*OpCodeData == EFI_IFR_GUID_OP) {\r
- if (CompareGuid (&mFrameworkHiiCompatibilityGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
+ if (CompareGuid (&gEfiIfrFrameworkGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
//\r
// Specific GUIDed opcodes to support IFR generated from Framework HII VFR \r
//\r
// Take a look at next OpCode to see whether it is a GUIDed opcode to support\r
// Framework Compatibility\r
//\r
- if (FeaturePcdGet (PcdFrameworkHiiCompatibilitySupport)) {\r
+ if (FeaturePcdGet (PcdFrameworkCompatibilitySupport)) {\r
if ((*OpCodeData == EFI_IFR_NUMERIC_OP) && IsNextOpCodeGuidedVarEqName (OpCodeData)) {\r
Status = UpdateCheckBoxStringToken (FormSet, Statement);\r
if (EFI_ERROR (Status)) {\r
FORM_EXPRESSION *Expression;\r
\r
Expression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
+ ASSERT (Expression != NULL);\r
Expression->Signature = FORM_EXPRESSION_SIGNATURE;\r
InitializeListHead (&Expression->OpCodeListHead);\r
\r
FORMSET_STORAGE *Storage;\r
\r
Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
+ ASSERT (Storage != NULL);\r
Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
InitializeListHead (&Storage->NameValueListHead);\r
InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
IN OUT FORMSET_STORAGE *Storage\r
)\r
{\r
- EFI_STATUS Status;\r
- UINTN StrBufferLen;\r
CHAR16 *Name;\r
-\r
+ \r
if (Storage->Type == EFI_HII_VARSTORE_BUFFER) {\r
Name = Storage->Name;\r
} else {\r
Name = NULL;\r
}\r
-\r
- StrBufferLen = 0;\r
- Status = ConstructConfigHdr (\r
- Storage->ConfigHdr,\r
- &StrBufferLen,\r
- &Storage->Guid,\r
- Name,\r
- FormSet->DriverHandle\r
- );\r
- if (Status == EFI_BUFFER_TOO_SMALL) {\r
- Storage->ConfigHdr = AllocateZeroPool (StrBufferLen);\r
- Status = ConstructConfigHdr (\r
- Storage->ConfigHdr,\r
- &StrBufferLen,\r
- &Storage->Guid,\r
- Name,\r
- FormSet->DriverHandle\r
- );\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
+ \r
+ Storage->ConfigHdr = HiiConstructConfigHdr (\r
+ &Storage->Guid,\r
+ Name,\r
+ FormSet->DriverHandle\r
+ );\r
+ \r
+ if (Storage->ConfigHdr == NULL) {\r
+ return EFI_NOT_FOUND;\r
}\r
\r
- Storage->ConfigRequest = AllocateCopyPool (StrBufferLen, Storage->ConfigHdr);\r
+ Storage->ConfigRequest = AllocateCopyPool (StrSize (Storage->ConfigHdr), Storage->ConfigHdr);\r
Storage->SpareStrLen = 0;\r
\r
return EFI_SUCCESS;\r
//\r
StringSize = (Storage->ConfigRequest != NULL) ? StrSize (Storage->ConfigRequest) : sizeof (CHAR16);\r
NewStr = AllocateZeroPool (StringSize + CONFIG_REQUEST_STRING_INCREMENTAL * sizeof (CHAR16));\r
+ ASSERT (NewStr != NULL);\r
if (Storage->ConfigRequest != NULL) {\r
CopyMem (NewStr, Storage->ConfigRequest, StringSize);\r
- gBS->FreePool (Storage->ConfigRequest);\r
+ FreePool (Storage->ConfigRequest);\r
}\r
Storage->ConfigRequest = NewStr;\r
Storage->SpareStrLen = CONFIG_REQUEST_STRING_INCREMENTAL;\r
//\r
// Free this Expression\r
//\r
- gBS->FreePool (Expression);\r
+ FreePool (Expression);\r
}\r
\r
\r
Default = QUESTION_DEFAULT_FROM_LINK (Link);\r
RemoveEntryList (&Default->Link);\r
\r
- gBS->FreePool (Default);\r
+ FreePool (Default);\r
}\r
\r
//\r
Option = QUESTION_OPTION_FROM_LINK (Link);\r
RemoveEntryList (&Option->Link);\r
\r
- gBS->FreePool (Option);\r
+ FreePool (Option);\r
}\r
\r
//\r
//\r
// Free this Form\r
//\r
- gBS->FreePool (Form);\r
+ FreePool (Form);\r
}\r
\r
\r
DefaultStore = FORMSET_DEFAULTSTORE_FROM_LINK (Link);\r
RemoveEntryList (&DefaultStore->Link);\r
\r
- gBS->FreePool (DefaultStore);\r
+ FreePool (DefaultStore);\r
}\r
}\r
\r
BOOLEAN SuppressForOption;\r
BOOLEAN InScopeOptionSuppress;\r
FORM_EXPRESSION *OptionSuppressExpression;\r
- BOOLEAN InScopeDisable;\r
UINT16 DepthOfDisable;\r
BOOLEAN OpCodeDisabled;\r
BOOLEAN SingleOpCodeExpression;\r
mInScopeSuppress = FALSE;\r
InScopeOptionSuppress = FALSE;\r
mInScopeGrayOut = FALSE;\r
- InScopeDisable = FALSE;\r
+ mInScopeDisable = FALSE;\r
DepthOfDisable = 0;\r
OpCodeDisabled = FALSE;\r
SingleOpCodeExpression = FALSE;\r
CurrentDefault = NULL;\r
CurrentOption = NULL;\r
OptionSuppressExpression = NULL;\r
+ ImageId = NULL;\r
\r
//\r
// Get the number of Statements and Expressions\r
\r
if (ScopeOpCode == EFI_IFR_DISABLE_IF_OP) {\r
if (DepthOfDisable == 0) {\r
- InScopeDisable = FALSE;\r
+ mInScopeDisable = FALSE;\r
OpCodeDisabled = FALSE;\r
} else {\r
DepthOfDisable--;\r
break;\r
\r
case EFI_IFR_THIS_OP:\r
+ ASSERT (CurrentStatement != NULL);\r
ExpressionOpCode->QuestionId = CurrentStatement->QuestionId;\r
break;\r
\r
//\r
SingleOpCodeExpression = FALSE;\r
\r
- if (InScopeDisable) {\r
+ if (mInScopeDisable && CurrentForm == NULL) {\r
//\r
- // Evaluate DisableIf expression\r
+ // This is DisableIf expression for Form, it should be a constant expression\r
//\r
Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
+ ASSERT (CurrentExpression != NULL);\r
if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
CopyMem (&FormSet->FormSetTitle, &((EFI_IFR_FORM_SET *) OpCodeData)->FormSetTitle, sizeof (EFI_STRING_ID));\r
CopyMem (&FormSet->Help, &((EFI_IFR_FORM_SET *) OpCodeData)->Help, sizeof (EFI_STRING_ID));\r
+\r
+ //\r
+ // The formset OpCode contains ClassGuid\r
+ //\r
+ FormSet->NumberOfClassGuid = (UINT8) (((EFI_IFR_FORM_SET *) OpCodeData)->Flags & 0x3);\r
+ CopyMem (FormSet->ClassGuid, OpCodeData + sizeof (EFI_IFR_FORM_SET), FormSet->NumberOfClassGuid * sizeof (EFI_GUID));\r
break;\r
\r
case EFI_IFR_FORM_OP:\r
// Create a new Form for this FormSet\r
//\r
CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
+ ASSERT (CurrentForm != NULL);\r
CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
InitializeListHead (&CurrentForm->ExpressionListHead);\r
InitializeListHead (&CurrentForm->StatementListHead);\r
//\r
case EFI_IFR_DEFAULTSTORE_OP:\r
DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
+ ASSERT (DefaultStore != NULL);\r
DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
\r
CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId, sizeof (UINT16));\r
//\r
case EFI_IFR_SUBTITLE_OP:\r
CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
+ \r
CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
\r
if (Scope != 0) {\r
\r
case EFI_IFR_TEXT_OP:\r
CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
break;\r
//\r
case EFI_IFR_ACTION_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
//\r
break;\r
\r
case EFI_IFR_RESET_BUTTON_OP:\r
- CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+ //\r
+ // Create Statement\r
+ //\r
+ CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
break;\r
\r
// A Question may have more than one Default value which have different default types.\r
//\r
CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
+ ASSERT (CurrentDefault != NULL);\r
CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
\r
CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
// It create a selection for use in current Question.\r
//\r
CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
+ ASSERT (CurrentOption != NULL);\r
CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
\r
CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
// evaluated at initialization and it will not be queued\r
//\r
CurrentExpression = AllocateZeroPool (sizeof (FORM_EXPRESSION));\r
+ ASSERT (CurrentExpression != NULL);\r
CurrentExpression->Signature = FORM_EXPRESSION_SIGNATURE;\r
CurrentExpression->Type = EFI_HII_EXPRESSION_DISABLE_IF;\r
InitializeListHead (&CurrentExpression->OpCodeListHead);\r
\r
- InScopeDisable = TRUE;\r
- OpCodeDisabled = FALSE;\r
+ if (CurrentForm != NULL) {\r
+ //\r
+ // This is DisableIf for Question, enqueue it to Form expression list\r
+ //\r
+ InsertTailList (&CurrentForm->ExpressionListHead, &CurrentExpression->Link);\r
+ }\r
+\r
+ mDisableExpression = CurrentExpression;\r
+ mInScopeDisable = TRUE;\r
+ OpCodeDisabled = FALSE;\r
\r
//\r
// Take a look at next OpCode to see whether current expression consists\r
//\r
// If used for a question, then the question will be read-only\r
//\r
+ //\r
+ // Make sure CurrentStatement is not NULL.\r
+ // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
+ // file is wrongly generated by tools such as VFR Compiler. There may be a bug in VFR Compiler.\r
+ //\r
+ ASSERT (CurrentStatement != NULL);\r
CurrentStatement->ValueExpression = CurrentExpression;\r
}\r
break;\r
break;\r
\r
case EFI_IFR_FORM_OP:\r
+ ASSERT (CurrentForm != NULL);\r
ImageId = &CurrentForm->ImageId;\r
break;\r
\r
break;\r
\r
default:\r
+ //\r
+ // Make sure CurrentStatement is not NULL.\r
+ // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
+ // file is wrongly generated by tools such as VFR Compiler.\r
+ //\r
+ ASSERT (CurrentStatement != NULL);\r
ImageId = &CurrentStatement->ImageId;\r
break;\r
}\r
\r
+ ASSERT (ImageId != NULL);\r
CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
break;\r
\r
// Refresh\r
//\r
case EFI_IFR_REFRESH_OP:\r
+ ASSERT (CurrentStatement != NULL);\r
CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
break;\r
\r
// Vendor specific\r
//\r
case EFI_IFR_GUID_OP:\r
- if (CompareGuid (&gTianoHiiIfrGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
+ if (CompareGuid (&gEfiIfrTianoGuid, (EFI_GUID *)(OpCodeData + sizeof (EFI_IFR_OP_HEADER)))) {\r
//\r
// Tiano specific GUIDed opcodes\r
//\r
break;\r
\r
case EFI_IFR_EXTEND_OP_BANNER:\r
+ //\r
+ // By SubClass to get Banner Data from Front Page\r
+ //\r
if (FormSet->SubClass == EFI_FRONT_PAGE_SUBCLASS) {\r
CopyMem (\r
- &BannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
+ &gBannerData->Banner[((EFI_IFR_GUID_BANNER *) OpCodeData)->LineNumber][\r
((EFI_IFR_GUID_BANNER *) OpCodeData)->Alignment],\r
&((EFI_IFR_GUID_BANNER *) OpCodeData)->Title,\r
sizeof (EFI_STRING_ID)\r
break;\r
\r
case EFI_IFR_DISABLE_IF_OP:\r
- InScopeDisable = FALSE;\r
+ mInScopeDisable = FALSE;\r
OpCodeDisabled = FALSE;\r
break;\r
\r
\r
default:\r
if (IsExpressionOpCode (ScopeOpCode)) {\r
- if (InScopeDisable) {\r
+ if (mInScopeDisable && CurrentForm == NULL) {\r
//\r
- // Evaluate DisableIf expression\r
+ // This is DisableIf expression for Form, it should be a constant expression\r
//\r
Status = EvaluateExpression (FormSet, CurrentForm, CurrentExpression);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
+\r
+ ASSERT (CurrentExpression != NULL);\r
if (CurrentExpression->Result.Type != EFI_IFR_TYPE_BOOLEAN) {\r
return EFI_INVALID_PARAMETER;\r
}\r