CHAR8 *VarStr;\r
UINT32 ArrayIdx;\r
CHAR8 FName[MAX_NAME_LEN];\r
+ CHAR8 *SName;\r
+ CHAR8 *NewStr;\r
EFI_VFR_RETURN_CODE ReturnCode;\r
EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
\r
+ //\r
+ // Declare all questions as Numeric in DisableIf True\r
+ //\r
+ // DisableIf\r
+ CIfrDisableIf DIObj;\r
+ DIObj.SetLineNo (LineNo);\r
+ \r
+ //TrueOpcode\r
+ CIfrTrue TObj (LineNo);\r
+\r
+ // Declare Numeric qeustion for each undefined question.\r
for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) {\r
if (pNode->mFlag == PENDING) {\r
- //\r
- // declare this question as Numeric in SuppressIf True\r
- //\r
- // SuppressIf\r
- CIfrSuppressIf SIObj;\r
- SIObj.SetLineNo (LineNo);\r
- \r
- //TrueOpcode\r
- CIfrTrue TObj (LineNo);\r
- \r
- //Numeric qeustion\r
CIfrNumeric CNObj;\r
EFI_VARSTORE_INFO Info; \r
EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID;\r
ReturnCode = lCVfrDataStorage.GetEfiVarStoreInfo (&Info);\r
} else if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) {\r
VarStr = pNode->mKey;\r
- ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize);\r
+ //convert VarStr with store name to VarStr with structure name\r
+ ReturnCode = lCVfrDataStorage.GetBufferVarStoreDataTypeName (FName, &SName);\r
+ if (ReturnCode == VFR_RETURN_SUCCESS) {\r
+ NewStr = new CHAR8[strlen (VarStr) + strlen (SName) + 1];\r
+ NewStr[0] = '\0';\r
+ strcpy (NewStr, SName);\r
+ strcat (NewStr, VarStr + strlen (FName));\r
+ ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize);\r
+ delete NewStr;\r
+ }\r
} else {\r
ReturnCode = VFR_RETURN_UNSUPPORTED;\r
}\r
\r
CNObj.SetQuestionId (QId);\r
CNObj.SetVarStoreInfo (&Info);\r
+ //\r
+ // Numeric doesn't support BOOLEAN data type. \r
+ // BOOLEAN type has the same data size to UINT8. \r
+ //\r
+ if (Info.mVarType == EFI_IFR_TYPE_BOOLEAN) {\r
+ Info.mVarType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ }\r
CNObj.SetFlags (0, Info.mVarType);\r
\r
//\r
// For undefined Efi VarStore type question\r
// Append the extended guided opcode to contain VarName\r
//\r
- if (VarStoreType == EFI_VFR_VARSTORE_EFI) {\r
+ if (VarStoreType == EFI_VFR_VARSTORE_EFI || VfrCompatibleMode) {\r
CIfrVarEqName CVNObj (QId, Info.mInfo.mVarName);\r
CVNObj.SetLineNo (LineNo);\r
}\r
//\r
CIfrEnd CEObj; \r
CEObj.SetLineNo (LineNo);\r
- //\r
- // End for SuppressIf\r
- //\r
- CIfrEnd SEObj;\r
- SEObj.SetLineNo (LineNo);\r
}\r
}\r
+\r
+ //\r
+ // End for DisableIf\r
+ //\r
+ CIfrEnd SEObj;\r
+ SEObj.SetLineNo (LineNo);\r
+\r
return VFR_RETURN_SUCCESS;\r
}\r
\r
{ sizeof (EFI_IFR_CATENATE), 0 }, // EFI_IFR_CATENATE_OP\r
{ sizeof (EFI_IFR_GUID), 0 }, // EFI_IFR_GUID_OP\r
{ sizeof (EFI_IFR_SECURITY), 0 }, // EFI_IFR_SECURITY_OP - 0x60\r
+ { sizeof (EFI_IFR_MODAL), 0}, // EFI_IFR_MODAL_OP - 0x61\r
+ { sizeof (EFI_IFR_REFRESH_ID), 0}, // EFI_IFR_REFRESH_ID_OP - 0x62\r
};\r
\r
#ifdef CIFROBJ_DEUBG\r
"EFI_IFR_STRING_REF1","EFI_IFR_STRING_REF2", "EFI_IFR_CONDITIONAL", "EFI_IFR_QUESTION_REF3", "EFI_IFR_ZERO", "EFI_IFR_ONE",\r
"EFI_IFR_ONES", "EFI_IFR_UNDEFINED", "EFI_IFR_LENGTH", "EFI_IFR_DUP", "EFI_IFR_THIS", "EFI_IFR_SPAN",\r
"EFI_IFR_VALUE", "EFI_IFR_DEFAULT", "EFI_IFR_DEFAULTSTORE", "EFI_IFR_FORM_MAP", "EFI_IFR_CATENATE", "EFI_IFR_GUID",\r
- "EFI_IFR_SECURITY",\r
+ "EFI_IFR_SECURITY", "EFI_IFR_MODAL", "EFI_IFR_REFRESH_ID",\r
};\r
\r
VOID\r