EFI_VFR_RETURN_CODE CFormPkg::DeclarePendingQuestion ( IN CVfrVarDataTypeDB &lCVfrVarDataTypeDB, IN CVfrDataStorage &lCVfrDataStorage, IN CVfrQuestionDB &lCVfrQuestionDB, IN EFI_GUID *LocalFormSetGuid, IN UINT32 LineNo, OUT CHAR8 **InsertOpcodeAddr ) { SPendingAssign *pNode; CHAR8 *VarStr; UINT32 ArrayIdx; CHAR8 FName[MAX_NAME_LEN]; CHAR8 *SName; CHAR8 *NewStr; UINT32 ShrinkSize; EFI_VFR_RETURN_CODE ReturnCode; EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID; EFI_VARSTORE_ID VarStoreId = EFI_VARSTORE_ID_INVALID; // // Declare all questions as Numeric in DisableIf True // // DisableIf CIfrDisableIf DIObj; DIObj.SetLineNo (LineNo); *InsertOpcodeAddr = DIObj.GetObjBinAddr (); //TrueOpcode CIfrTrue TObj (LineNo); // Declare Numeric qeustion for each undefined question. for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) { if (pNode->mFlag == PENDING) { CIfrNumeric CNObj; EFI_VARSTORE_INFO Info; EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID; CNObj.SetLineNo (LineNo); CNObj.SetPrompt (0x0); CNObj.SetHelp (0x0); // // Register this question, assume it is normal question, not date or time question // VarStr = pNode->mKey; ReturnCode = lCVfrQuestionDB.RegisterQuestion (NULL, VarStr, QId); if (ReturnCode != VFR_RETURN_SUCCESS) { gCVfrErrorHandle.HandleError (ReturnCode, pNode->mLineNo, pNode->mKey); return ReturnCode; } #ifdef VFREXP_DEBUG printf ("Undefined Question name is %s and Id is 0x%x\n", VarStr, QId); #endif // // Get Question Info, framework vfr VarName == StructName // ReturnCode = lCVfrVarDataTypeDB.ExtractFieldNameAndArrary (VarStr, FName, ArrayIdx); if (ReturnCode != VFR_RETURN_SUCCESS) { gCVfrErrorHandle.PrintMsg (pNode->mLineNo, pNode->mKey, "Error", "Var string is not the valid C variable"); return ReturnCode; } // // Get VarStoreType // ReturnCode = lCVfrDataStorage.GetVarStoreId (FName, &Info.mVarStoreId); if (ReturnCode != VFR_RETURN_SUCCESS) { gCVfrErrorHandle.PrintMsg (pNode->mLineNo, FName, "Error", "Var Store Type is not defined"); return ReturnCode; } VarStoreType = lCVfrDataStorage.GetVarStoreType (Info.mVarStoreId); if (*VarStr == '\0' && ArrayIdx != INVALID_ARRAY_INDEX) { ReturnCode = lCVfrDataStorage.GetNameVarStoreInfo (&Info, ArrayIdx); } else { if (VarStoreType == EFI_VFR_VARSTORE_EFI) { ReturnCode = lCVfrDataStorage.GetEfiVarStoreInfo (&Info); } else if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) { VarStr = pNode->mKey; //convert VarStr with store name to VarStr with structure name ReturnCode = lCVfrDataStorage.GetBufferVarStoreDataTypeName (Info.mVarStoreId, &SName); if (ReturnCode == VFR_RETURN_SUCCESS) { NewStr = new CHAR8[strlen (VarStr) + strlen (SName) + 1]; NewStr[0] = '\0'; strcpy (NewStr, SName); strcat (NewStr, VarStr + strlen (FName)); ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (NewStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize); delete NewStr; } } else { ReturnCode = VFR_RETURN_UNSUPPORTED; } } if (ReturnCode != VFR_RETURN_SUCCESS) { gCVfrErrorHandle.HandleError (ReturnCode, pNode->mLineNo, pNode->mKey); return ReturnCode; } CNObj.SetQuestionId (QId); CNObj.SetVarStoreInfo (&Info); // // Numeric doesn't support BOOLEAN data type. // BOOLEAN type has the same data size to UINT8. // if (Info.mVarType == EFI_IFR_TYPE_BOOLEAN) { Info.mVarType = EFI_IFR_TYPE_NUM_SIZE_8; } CNObj.SetFlags (0, Info.mVarType); // // Use maximum value not to limit the vaild value for the undefined question. // switch (Info.mVarType) { case EFI_IFR_TYPE_NUM_SIZE_64: CNObj.SetMinMaxStepData ((UINT64) 0, (UINT64) -1 , (UINT64) 0); ShrinkSize = 0; break; case EFI_IFR_TYPE_NUM_SIZE_32: CNObj.SetMinMaxStepData ((UINT32) 0, (UINT32) -1 , (UINT32) 0); ShrinkSize = 12; break; case EFI_IFR_TYPE_NUM_SIZE_16: CNObj.SetMinMaxStepData ((UINT16) 0, (UINT16) -1 , (UINT16) 0); ShrinkSize = 18; break; case EFI_IFR_TYPE_NUM_SIZE_8: CNObj.SetMinMaxStepData ((UINT8) 0, (UINT8) -1 , (UINT8) 0); ShrinkSize = 21; break; default: break; } CNObj.ShrinkBinSize (ShrinkSize); // // For undefined Efi VarStore type question // Append the extended guided opcode to contain VarName // if (VarStoreType == EFI_VFR_VARSTORE_EFI || VfrCompatibleMode) { CIfrVarEqName CVNObj (QId, Info.mInfo.mVarName); CVNObj.SetLineNo (LineNo); } // // End for Numeric // CIfrEnd CEObj; CEObj.SetLineNo (LineNo); } } // // End for DisableIf // CIfrEnd SEObj; SEObj.SetLineNo (LineNo); return VFR_RETURN_SUCCESS; }
EFI_VFR_RETURN_CODE CFormPkg::DeclarePendingQuestion ( IN CVfrVarDataTypeDB &lCVfrVarDataTypeDB, IN CVfrDataStorage &lCVfrDataStorage, IN CVfrQuestionDB &lCVfrQuestionDB, IN EFI_GUID *LocalFormSetGuid, IN UINT32 LineNo ) { SPendingAssign *pNode; CHAR8 *VarStr; UINT32 ArrayIdx; CHAR8 FName[MAX_NAME_LEN]; EFI_VFR_RETURN_CODE ReturnCode; EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID; for (pNode = PendingAssignList; pNode != NULL; pNode = pNode->mNext) { if (pNode->mFlag == PENDING) { // // declare this question as Numeric in SuppressIf True // // SuppressIf CIfrSuppressIf SIObj; SIObj.SetLineNo (LineNo); //TrueOpcode CIfrTrue TObj (LineNo); //Numeric qeustion CIfrNumeric CNObj; EFI_VARSTORE_INFO Info; EFI_QUESTION_ID QId = EFI_QUESTION_ID_INVALID; CNObj.SetLineNo (LineNo); CNObj.SetPrompt (0x0); CNObj.SetHelp (0x0); // // Register this question, assume it is normal question, not date or time question // VarStr = pNode->mKey; ReturnCode = lCVfrQuestionDB.RegisterQuestion (NULL, VarStr, QId); if (ReturnCode != VFR_RETURN_SUCCESS) { gCVfrErrorHandle.HandleError (ReturnCode, pNode->mLineNo, pNode->mKey); return ReturnCode; } #ifdef VFREXP_DEBUG printf ("Undefined Question name is %s and Id is 0x%x\n", VarStr, QId); #endif // // Get Question Info, framework vfr VarName == StructName // ReturnCode = lCVfrVarDataTypeDB.ExtractFieldNameAndArrary (VarStr, FName, ArrayIdx); if (ReturnCode != VFR_RETURN_SUCCESS) { gCVfrErrorHandle.PrintMsg (pNode->mLineNo, pNode->mKey, "Error", "Var string is not the valid C variable"); return ReturnCode; } // // Get VarStoreType // ReturnCode = lCVfrDataStorage.GetVarStoreType (FName, VarStoreType); if (ReturnCode == VFR_RETURN_UNDEFINED) { lCVfrDataStorage.DeclareBufferVarStore ( FName, LocalFormSetGuid, &lCVfrVarDataTypeDB, FName, EFI_VARSTORE_ID_INVALID, FALSE ); ReturnCode = lCVfrDataStorage.GetVarStoreType (FName, VarStoreType); } if (ReturnCode != VFR_RETURN_SUCCESS) { gCVfrErrorHandle.PrintMsg (pNode->mLineNo, FName, "Error", "Var Store Type is not defined"); return ReturnCode; } ReturnCode = lCVfrDataStorage.GetVarStoreId (FName, &Info.mVarStoreId); if (ReturnCode != VFR_RETURN_SUCCESS) { gCVfrErrorHandle.PrintMsg (pNode->mLineNo, FName, "Error", "Var Store Type is not defined"); return ReturnCode; } if (*VarStr == '\0' && ArrayIdx != INVALID_ARRAY_INDEX) { ReturnCode = lCVfrDataStorage.GetNameVarStoreInfo (&Info, ArrayIdx); } else { if (VarStoreType == EFI_VFR_VARSTORE_EFI) { ReturnCode = lCVfrDataStorage.GetEfiVarStoreInfo (&Info); } else if (VarStoreType == EFI_VFR_VARSTORE_BUFFER) { VarStr = pNode->mKey; ReturnCode = lCVfrVarDataTypeDB.GetDataFieldInfo (VarStr, Info.mInfo.mVarOffset, Info.mVarType, Info.mVarTotalSize); } else { ReturnCode = VFR_RETURN_UNSUPPORTED; } } if (ReturnCode != VFR_RETURN_SUCCESS) { gCVfrErrorHandle.HandleError (ReturnCode, pNode->mLineNo, pNode->mKey); return ReturnCode; } CNObj.SetQuestionId (QId); CNObj.SetVarStoreInfo (&Info); CNObj.SetFlags (0, Info.mVarType); // // For undefined Efi VarStore type question // Append the extended guided opcode to contain VarName // if (VarStoreType == EFI_VFR_VARSTORE_EFI) { CIfrVarEqName CVNObj (QId, Info.mInfo.mVarName); CVNObj.SetLineNo (LineNo); } // // End for Numeric // CIfrEnd CEObj; CEObj.SetLineNo (LineNo); // // End for SuppressIf // CIfrEnd SEObj; SEObj.SetLineNo (LineNo); } } return VFR_RETURN_SUCCESS; }