\r
Module Name:\r
\r
-VfrFormPkg.h\r
+ VfrFormPkg.h\r
\r
Abstract:\r
\r
#include "VfrError.h"\r
#include "VfrUtilityLib.h"\r
\r
+#define NO_QST_REFED "no question refered"\r
+\r
/*\r
* The functions below are used for flags setting\r
*/\r
UINT32 mLen;\r
ASSIGN_FLAG mFlag;\r
UINT32 mLineNo;\r
+ INT8 *mMsg;\r
struct SPendingAssign *mNext;\r
\r
- SPendingAssign (IN INT8 *, IN VOID *, IN UINT32, IN UINT32);\r
+ SPendingAssign (IN INT8 *, IN VOID *, IN UINT32, IN UINT32, IN INT8 *);\r
~SPendingAssign ();\r
\r
VOID SetAddrAndLen (IN VOID *, IN UINT32);\r
EFI_VFR_RETURN_CODE GenCFile (IN INT8 *, IN FILE *);\r
\r
public:\r
- EFI_VFR_RETURN_CODE AssignPending (IN INT8 *, IN VOID *, IN UINT32, IN UINT32);\r
+ EFI_VFR_RETURN_CODE AssignPending (IN INT8 *, IN VOID *, IN UINT32, IN UINT32, IN INT8 *Msg = NULL);\r
VOID DoPendingAssign (IN INT8 *, IN VOID *, IN UINT32);\r
bool HavePendingUnassigned (VOID);\r
VOID PendingAssignPrintAll (VOID);\r
}\r
};\r
\r
-static CIfrQuestionHeader *gCurrentQuestion = NULL;\r
-\r
/*\r
* The definition of CIfrMinMaxStepData\r
*/\r
class CIfrMinMaxStepData {\r
private:\r
MINMAXSTEP_DATA *mMinMaxStepData;\r
+ BOOLEAN ValueIsSet;\r
+ BOOLEAN IsNumeric;\r
\r
public:\r
- CIfrMinMaxStepData (MINMAXSTEP_DATA *DataAddr) : mMinMaxStepData (DataAddr) {\r
+ CIfrMinMaxStepData (MINMAXSTEP_DATA *DataAddr, BOOLEAN NumericOpcode=FALSE) : mMinMaxStepData (DataAddr) {\r
mMinMaxStepData->u64.MinValue = 0;\r
mMinMaxStepData->u64.MaxValue = 0;\r
mMinMaxStepData->u64.Step = 0;\r
+ ValueIsSet = FALSE;\r
+ IsNumeric = NumericOpcode;\r
}\r
\r
VOID SetMinMaxStepData (IN UINT64 MinValue, IN UINT64 MaxValue, IN UINT64 Step) {\r
- mMinMaxStepData->u64.MinValue = MinValue;\r
- mMinMaxStepData->u64.MaxValue = MaxValue;\r
- mMinMaxStepData->u64.Step = Step;\r
+ if (!ValueIsSet) {\r
+ mMinMaxStepData->u64.MinValue = MinValue;\r
+ mMinMaxStepData->u64.MaxValue = MaxValue;\r
+ ValueIsSet = TRUE;\r
+ } else {\r
+ if (MinValue < mMinMaxStepData->u64.MinValue) {\r
+ mMinMaxStepData->u64.MinValue = MinValue;\r
+ }\r
+ if (MaxValue > mMinMaxStepData->u64.MaxValue) {\r
+ mMinMaxStepData->u64.MaxValue = MaxValue;\r
+ }\r
+ }\r
+ mMinMaxStepData->u64.Step = Step;\r
}\r
\r
VOID SetMinMaxStepData (IN UINT32 MinValue, IN UINT32 MaxValue, IN UINT32 Step) {\r
- mMinMaxStepData->u32.MinValue = MinValue;\r
- mMinMaxStepData->u32.MaxValue = MaxValue;\r
- mMinMaxStepData->u32.Step = Step;\r
+ if (!ValueIsSet) {\r
+ mMinMaxStepData->u32.MinValue = MinValue;\r
+ mMinMaxStepData->u32.MaxValue = MaxValue;\r
+ ValueIsSet = TRUE;\r
+ } else {\r
+ if (MinValue < mMinMaxStepData->u32.MinValue) {\r
+ mMinMaxStepData->u32.MinValue = MinValue;\r
+ }\r
+ if (MaxValue > mMinMaxStepData->u32.MaxValue) {\r
+ mMinMaxStepData->u32.MaxValue = MaxValue;\r
+ }\r
+ }\r
+ mMinMaxStepData->u32.Step = Step;\r
}\r
\r
VOID SetMinMaxStepData (IN UINT16 MinValue, IN UINT16 MaxValue, IN UINT16 Step) {\r
- mMinMaxStepData->u16.MinValue = MinValue;\r
- mMinMaxStepData->u16.MaxValue = MaxValue;\r
- mMinMaxStepData->u16.Step = Step;\r
+ if (!ValueIsSet) {\r
+ mMinMaxStepData->u16.MinValue = MinValue;\r
+ mMinMaxStepData->u16.MaxValue = MaxValue;\r
+ ValueIsSet = TRUE;\r
+ } else {\r
+ if (MinValue < mMinMaxStepData->u16.MinValue) {\r
+ mMinMaxStepData->u16.MinValue = MinValue;\r
+ }\r
+ if (MaxValue > mMinMaxStepData->u16.MaxValue) {\r
+ mMinMaxStepData->u16.MaxValue = MaxValue;\r
+ }\r
+ }\r
+ mMinMaxStepData->u16.Step = Step;\r
}\r
\r
VOID SetMinMaxStepData (IN UINT8 MinValue, IN UINT8 MaxValue, IN UINT8 Step) {\r
- mMinMaxStepData->u8.MinValue = MinValue;\r
- mMinMaxStepData->u8.MaxValue = MaxValue;\r
- mMinMaxStepData->u8.Step = Step;\r
+ if (!ValueIsSet) {\r
+ mMinMaxStepData->u8.MinValue = MinValue;\r
+ mMinMaxStepData->u8.MaxValue = MaxValue;\r
+ ValueIsSet = TRUE;\r
+ } else {\r
+ if (MinValue < mMinMaxStepData->u8.MinValue) {\r
+ mMinMaxStepData->u8.MinValue = MinValue;\r
+ }\r
+ if (MaxValue > mMinMaxStepData->u8.MaxValue) {\r
+ mMinMaxStepData->u8.MaxValue = MaxValue;\r
+ }\r
+ }\r
+ mMinMaxStepData->u8.Step = Step;\r
+ }\r
+\r
+ UINT64 GetMinData (UINT8 VarType) {\r
+ UINT64 MinValue = 0;\r
+ switch (VarType) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ MinValue = mMinMaxStepData->u64.MinValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ MinValue = (UINT64) mMinMaxStepData->u32.MinValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ MinValue = (UINT64) mMinMaxStepData->u16.MinValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ MinValue = (UINT64) mMinMaxStepData->u8.MinValue;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return MinValue;\r
+ }\r
+\r
+ UINT64 GetMaxData (UINT8 VarType) {\r
+ UINT64 MaxValue = 0;\r
+ switch (VarType) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ MaxValue = mMinMaxStepData->u64.MaxValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ MaxValue = (UINT64) mMinMaxStepData->u32.MaxValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ MaxValue = (UINT64) mMinMaxStepData->u16.MaxValue;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ MaxValue = (UINT64) mMinMaxStepData->u8.MaxValue;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return MaxValue;\r
+ }\r
+\r
+ UINT64 GetStepData (UINT8 VarType) {\r
+ UINT64 MaxValue = 0;\r
+ switch (VarType) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_64:\r
+ MaxValue = mMinMaxStepData->u64.Step;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32:\r
+ MaxValue = (UINT64) mMinMaxStepData->u32.Step;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16:\r
+ MaxValue = (UINT64) mMinMaxStepData->u16.Step;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_8:\r
+ MaxValue = (UINT64) mMinMaxStepData->u8.Step;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return MaxValue;\r
}\r
\r
+ BOOLEAN IsNumericOpcode () {\r
+ return IsNumeric;\r
+ }\r
};\r
\r
+static CIfrQuestionHeader *gCurrentQuestion = NULL;\r
+static CIfrMinMaxStepData *gCurrentMinMaxData = NULL;\r
+\r
/*\r
* The definition of all of the UEFI IFR Objects\r
*/\r
EFI_IFR_FORM_SET *mFormSet;\r
\r
public:\r
- CIfrFormSet () : CIfrObj (EFI_IFR_FORM_SET_OP, (CHAR8 **)&mFormSet),\r
- CIfrOpHeader (EFI_IFR_FORM_SET_OP, &mFormSet->Header) {\r
+ CIfrFormSet (UINT8 Size) : CIfrObj (EFI_IFR_FORM_SET_OP, (CHAR8 **)&mFormSet, Size),\r
+ CIfrOpHeader (EFI_IFR_FORM_SET_OP, &mFormSet->Header, Size) {\r
mFormSet->Help = EFI_STRING_ID_INVALID;\r
mFormSet->FormSetTitle = EFI_STRING_ID_INVALID;\r
+ mFormSet->Flags = 0;\r
memset (&mFormSet->Guid, 0, sizeof (EFI_GUID));\r
}\r
\r
VOID SetHelp (IN EFI_STRING_ID Help) {\r
mFormSet->Help = Help;\r
}\r
+\r
+ VOID SetClassGuid (IN EFI_GUID *Guid) {\r
+ if (mFormSet->Flags > 0 && ExpendObjBin(sizeof(EFI_GUID))) {\r
+ IncLength (sizeof (EFI_GUID));\r
+ }\r
+ memcpy (&(mFormSet->ClassGuid[mFormSet->Flags++]), Guid, sizeof (EFI_GUID));\r
+ }\r
+\r
+ UINT8 GetFlags() {\r
+ return mFormSet->Flags;\r
+ }\r
};\r
\r
class CIfrEnd : public CIfrObj, public CIfrOpHeader {\r
public:\r
CIfrResetButton () : CIfrObj (EFI_IFR_RESET_BUTTON_OP, (CHAR8 **)&mResetButton),\r
CIfrOpHeader (EFI_IFR_RESET_BUTTON_OP, &mResetButton->Header), \r
- CIfrStatementHeader (&mResetButton->Question.Header) {\r
+ CIfrStatementHeader (&mResetButton->Statement) {\r
mResetButton->DefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
}\r
\r
CIfrCheckBox () : CIfrObj (EFI_IFR_CHECKBOX_OP, (CHAR8 **)&mCheckBox),\r
CIfrOpHeader (EFI_IFR_CHECKBOX_OP, &mCheckBox->Header), \r
CIfrQuestionHeader (&mCheckBox->Question) {\r
- mCheckBox->Flags = EFI_IFR_CHECKBOX_DEFAULT;\r
+ mCheckBox->Flags = 0;\r
gCurrentQuestion = this;\r
}\r
\r
\r
return _FLAGS_ZERO (LFlags) ? VFR_RETURN_SUCCESS : VFR_RETURN_FLAGS_UNSUPPORTED;\r
}\r
+\r
+ UINT8 GetFlags (VOID) {\r
+ return mCheckBox->Flags;\r
+ }\r
};\r
\r
class CIfrAction : public CIfrObj, public CIfrOpHeader, public CIfrQuestionHeader {\r
CIfrNumeric () : CIfrObj (EFI_IFR_NUMERIC_OP, (CHAR8 **)&mNumeric),\r
CIfrOpHeader (EFI_IFR_NUMERIC_OP, &mNumeric->Header),\r
CIfrQuestionHeader (&mNumeric->Question),\r
- CIfrMinMaxStepData (&mNumeric->data) {\r
+ CIfrMinMaxStepData (&mNumeric->data, TRUE) {\r
mNumeric->Flags = EFI_IFR_NUMERIC_SIZE_1 | EFI_IFR_DISPLAY_UINT_DEC;\r
- gCurrentQuestion = this;\r
+ gCurrentQuestion = this;\r
+ gCurrentMinMaxData = this;\r
}\r
\r
~CIfrNumeric () {\r
- gCurrentQuestion = NULL;\r
+ gCurrentQuestion = NULL;\r
+ gCurrentMinMaxData = NULL;\r
}\r
\r
EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
CIfrQuestionHeader (&mOneOf->Question),\r
CIfrMinMaxStepData (&mOneOf->data) {\r
mOneOf->Flags = 0;\r
- gCurrentQuestion = this;\r
+ gCurrentQuestion = this;\r
+ gCurrentMinMaxData = this;\r
}\r
\r
~CIfrOneOf () {\r
- gCurrentQuestion = NULL;\r
+ gCurrentQuestion = NULL;\r
+ gCurrentMinMaxData = NULL;\r
}\r
\r
EFI_VFR_RETURN_CODE SetFlags (IN UINT8 HFlags, IN UINT8 LFlags) {\r
if (QuestionId != EFI_QUESTION_ID_INVALID) {\r
mEqIdId->QuestionId1 = QuestionId;\r
} else {\r
- gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdId->QuestionId1), sizeof (EFI_QUESTION_ID), LineNo);\r
+ gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdId->QuestionId1), sizeof (EFI_QUESTION_ID), LineNo, NO_QST_REFED);\r
}\r
}\r
\r
if (QuestionId != EFI_QUESTION_ID_INVALID) {\r
mEqIdId->QuestionId2 = QuestionId;\r
} else {\r
- gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdId->QuestionId2), sizeof (EFI_QUESTION_ID), LineNo);\r
+ gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdId->QuestionId2), sizeof (EFI_QUESTION_ID), LineNo, NO_QST_REFED);\r
}\r
}\r
};\r
if (QuestionId != EFI_QUESTION_ID_INVALID) {\r
mEqIdVal->QuestionId = QuestionId;\r
} else {\r
- gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdVal->QuestionId), sizeof (EFI_QUESTION_ID), LineNo);\r
+ gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdVal->QuestionId), sizeof (EFI_QUESTION_ID), LineNo, NO_QST_REFED);\r
}\r
}\r
\r
if (QuestionId != EFI_QUESTION_ID_INVALID) {\r
mEqIdVList->QuestionId = QuestionId;\r
} else {\r
- gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdVList->QuestionId), sizeof (EFI_QUESTION_ID), LineNo);\r
+ gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mEqIdVList->QuestionId), sizeof (EFI_QUESTION_ID), LineNo, NO_QST_REFED);\r
}\r
}\r
\r
if (QuestionId != EFI_QUESTION_ID_INVALID) {\r
mQuestionRef1->QuestionId = QuestionId;\r
} else {\r
- gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mQuestionRef1->QuestionId), sizeof (EFI_QUESTION_ID), LineNo);\r
+ gCFormPkg.AssignPending (VarIdStr, (VOID *)(&mQuestionRef1->QuestionId), sizeof (EFI_QUESTION_ID), LineNo, NO_QST_REFED);\r
}\r
}\r
};\r