/*++\r
\r
-Copyright (c) 2004 - 2010, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+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
http://opensource.org/licenses/bsd-license.php\r
\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