BOOLEAN mInScopeSubtitle;\r
BOOLEAN mInScopeSuppress;\r
BOOLEAN mInScopeGrayOut;\r
+BOOLEAN mInScopeDisable;\r
FORM_EXPRESSION *mSuppressExpression;\r
FORM_EXPRESSION *mGrayOutExpression;\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
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
FORMSET_DEFAULTSTORE *DefaultStore;\r
QUESTION_DEFAULT *CurrentDefault;\r
QUESTION_OPTION *CurrentOption;\r
+ UINT8 Width;\r
CHAR8 *AsciiString;\r
UINT16 NumberOfStatement;\r
UINT16 NumberOfExpression;\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
\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_EQ_ID_LIST_OP:\r
- CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
- CopyMem (&ExpressionOpCode->ListLength, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->ListLength, sizeof (UINT16));\r
- ExpressionOpCode->ValueList = AllocateCopyPool (ExpressionOpCode->ListLength * sizeof (UINT16), &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->ValueList);\r
+ CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
+ CopyMem (&ExpressionOpCode->ListLength, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->ListLength, sizeof (UINT16));\r
+ ExpressionOpCode->ValueList = AllocateCopyPool (ExpressionOpCode->ListLength * sizeof (UINT16), &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->ValueList);\r
break;\r
\r
case EFI_IFR_TO_STRING_OP:\r
break;\r
\r
case EFI_IFR_QUESTION_REF1_OP:\r
- CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
+ CopyMem (&ExpressionOpCode->QuestionId, &((EFI_IFR_EQ_ID_VAL_LIST *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
break;\r
\r
case EFI_IFR_QUESTION_REF3_OP:\r
break;\r
\r
case EFI_IFR_UNDEFINED_OP:\r
- Value->Type = EFI_IFR_TYPE_OTHER;\r
+ Value->Type = EFI_IFR_TYPE_UNDEFINED;\r
break;\r
\r
case EFI_IFR_VERSION_OP:\r
break;\r
}\r
\r
+ ASSERT (CurrentExpression != NULL);\r
InsertTailList (&CurrentExpression->OpCodeListHead, &ExpressionOpCode->Link);\r
\r
if (SingleOpCodeExpression) {\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
case EFI_IFR_FORM_SET_OP:\r
//\r
- // check the formset GUID\r
+ // Check the formset GUID\r
//\r
if (CompareMem (&FormSet->Guid, &((EFI_IFR_FORM_SET *) OpCodeData)->Guid, sizeof (EFI_GUID)) != 0) {\r
return EFI_INVALID_PARAMETER;\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
CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
break;\r
\r
+ case EFI_IFR_RESET_BUTTON_OP:\r
+ CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
+ CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
+ break;\r
+\r
//\r
// Questions\r
//\r
case EFI_IFR_ACTION_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
ASSERT (CurrentStatement != NULL);\r
+ CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_ACTION;\r
\r
if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
//\r
}\r
break;\r
\r
- case EFI_IFR_RESET_BUTTON_OP:\r
- CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
- CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
- break;\r
-\r
case EFI_IFR_REF_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+ ASSERT (CurrentStatement != NULL);\r
+ CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_UNDEFINED;\r
CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
CopyMem (&CurrentStatement->RefQuestionId, &((EFI_IFR_REF2 *) OpCodeData)->QuestionId, sizeof (EFI_QUESTION_ID));\r
case EFI_IFR_ONE_OF_OP:\r
case EFI_IFR_NUMERIC_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+ ASSERT(CurrentStatement != NULL);\r
+ \r
CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
Value = &CurrentStatement->HiiValue;\r
\r
\r
case EFI_IFR_ORDERED_LIST_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+ ASSERT(CurrentStatement != NULL);\r
+ \r
CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
- CurrentStatement->StorageWidth = (UINT16)(CurrentStatement->MaxContainers * sizeof (UINT8));\r
- InitializeRequestElement (FormSet, CurrentStatement);\r
\r
- //\r
- // No buffer type is defined in EFI_IFR_TYPE_VALUE, so a Configuration Driver\r
- // has to use FormBrowser2.Callback() to retrieve the uncommited data for\r
- // an interactive orderedlist (i.e. with EFI_IFR_FLAG_CALLBACK flag set).\r
- //\r
- CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_OTHER;\r
- CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
+ CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BUFFER;\r
\r
if (Scope != 0) {\r
SuppressForOption = TRUE;\r
\r
case EFI_IFR_CHECKBOX_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+ ASSERT(CurrentStatement != NULL);\r
+ \r
CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
\r
case EFI_IFR_STRING_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+ ASSERT (CurrentStatement != NULL);\r
//\r
// MinSize is the minimum number of characters that can be accepted for this opcode,\r
// MaxSize is the maximum number of characters that can be accepted for this opcode.\r
\r
case EFI_IFR_PASSWORD_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+ ASSERT (CurrentStatement != NULL);\r
//\r
// MinSize is the minimum number of characters that can be accepted for this opcode,\r
// MaxSize is the maximum number of characters that can be accepted for this opcode.\r
\r
case EFI_IFR_DATE_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+ ASSERT(CurrentStatement != NULL);\r
+ \r
CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
\r
\r
case EFI_IFR_TIME_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
-\r
+ ASSERT(CurrentStatement != NULL);\r
+ \r
CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
\r
// Insert to Option list of current Question\r
//\r
InsertTailList (&CurrentStatement->OptionListHead, &CurrentOption->Link);\r
+\r
+ //\r
+ // Now we know the Storage width of nested Ordered List\r
+ //\r
+ if ((CurrentStatement->Operand == EFI_IFR_ORDERED_LIST_OP) && (CurrentStatement->BufferValue == NULL)) {\r
+ Width = 1;\r
+ switch (CurrentOption->Value.Type) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ Width = 1;\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ Width = 2;\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ Width = 4;\r
+ break;\r
+\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ Width = 8;\r
+ break;\r
+\r
+ default:\r
+ //\r
+ // Invalid type for Ordered List\r
+ //\r
+ break;\r
+ }\r
+\r
+ CurrentStatement->StorageWidth = (UINT16) (CurrentStatement->MaxContainers * Width);\r
+ CurrentStatement->BufferValue = AllocateZeroPool (CurrentStatement->StorageWidth);\r
+ CurrentStatement->ValueType = CurrentOption->Value.Type;\r
+\r
+ InitializeRequestElement (FormSet, CurrentStatement);\r
+ }\r
break;\r
\r
//\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
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
+ ASSERT (CurrentExpression != NULL);\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