+/**\r
+ When the Varstore of the question is EFI_VFR_VARSTORE_BUFFER and the default value is not\r
+ given by expression, should save the default info for the Buffer VarStore.\r
+\r
+ @param DefaultId The default id.\r
+ @param pQuestionNode Point to the question opcode node.\r
+ @param Value The default value.\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrAddDefaultToBufferConfig (\r
+ IN UINT16 DefaultId,\r
+ IN SIfrRecord *pQuestionNode,\r
+ IN EFI_IFR_TYPE_VALUE Value\r
+ )\r
+{\r
+ CHAR8 *VarStoreName = NULL;\r
+ EFI_VFR_VARSTORE_TYPE VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
+ EFI_GUID *VarGuid = NULL;\r
+ EFI_VARSTORE_INFO VarInfo;\r
+ EFI_IFR_QUESTION_HEADER *QuestionHead;\r
+ EFI_IFR_OP_HEADER *pQuestionOpHead;\r
+\r
+ pQuestionOpHead = (EFI_IFR_OP_HEADER *) pQuestionNode->mIfrBinBuf;\r
+ QuestionHead = (EFI_IFR_QUESTION_HEADER *) (pQuestionOpHead + 1);\r
+\r
+ //\r
+ // Get the Var Store name and type.\r
+ //\r
+ gCVfrDataStorage.GetVarStoreName (QuestionHead->VarStoreId, &VarStoreName);\r
+ VarGuid= gCVfrDataStorage.GetVarStoreGuid (QuestionHead->VarStoreId);\r
+ VarStoreType = gCVfrDataStorage.GetVarStoreType (QuestionHead->VarStoreId);\r
+\r
+ //\r
+ // Only for Buffer storage need to save the default info in the storage.\r
+ // Other type storage, just return.\r
+ //\r
+ if (VarStoreType != EFI_VFR_VARSTORE_BUFFER) {\r
+ return;\r
+ } else {\r
+ VarInfo.mInfo.mVarOffset = QuestionHead->VarStoreInfo.VarOffset;\r
+ VarInfo.mVarStoreId = QuestionHead->VarStoreId;\r
+ }\r
+\r
+ //\r
+ // Get the buffer storage info about this question.\r
+ //\r
+ gCVfrDataStorage.GetBufferVarStoreFieldInfo (&VarInfo);\r
+\r
+ //\r
+ // Add action.\r
+ //\r
+ gCVfrDefaultStore.BufferVarStoreAltConfigAdd (\r
+ DefaultId,\r
+ VarInfo,\r
+ VarStoreName,\r
+ VarGuid,\r
+ VarInfo.mVarType,\r
+ Value\r
+ );\r
+}\r
+\r
+/**\r
+ Record the number and default id of all defaultstore opcode.\r
+\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrGetDefaultStoreInfo (\r
+ VOID\r
+ )\r
+{\r
+ SIfrRecord *pNode;\r
+ EFI_IFR_OP_HEADER *pOpHead;\r
+ EFI_IFR_DEFAULTSTORE *DefaultStore;\r
+\r
+ pNode = mIfrRecordListHead;\r
+ mAllDefaultTypeCount = 0;\r
+\r
+ while (pNode != NULL) {\r
+ pOpHead = (EFI_IFR_OP_HEADER *) pNode->mIfrBinBuf;\r
+\r
+ if (pOpHead->OpCode == EFI_IFR_DEFAULTSTORE_OP){\r
+ DefaultStore = (EFI_IFR_DEFAULTSTORE *) pNode->mIfrBinBuf;\r
+ mAllDefaultIdArray[mAllDefaultTypeCount++] = DefaultStore->DefaultId;\r
+ }\r
+ pNode = pNode->mNext;\r
+ }\r
+}\r
+\r
+/**\r
+ Create new default opcode record.\r
+\r
+ @param Size The new default opcode size.\r
+ @param DefaultId The new default id.\r
+ @param Type The new default type.\r
+ @param LineNo The line number of the new record.\r
+ @param Value The new default value.\r
+\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrCreateDefaultRecord(\r
+ IN UINT8 Size,\r
+ IN UINT16 DefaultId,\r
+ IN UINT8 Type,\r
+ IN UINT32 LineNo,\r
+ IN EFI_IFR_TYPE_VALUE Value\r
+ )\r
+{\r
+ CIfrDefault *DObj;\r
+ CIfrDefault2 *DObj2;\r
+\r
+ DObj = NULL;\r
+ DObj2 = NULL;\r
+\r
+ if (Type == EFI_IFR_TYPE_OTHER) {\r
+ DObj2 = new CIfrDefault2 (Size);\r
+ DObj2->SetDefaultId(DefaultId);\r
+ DObj2->SetType(Type);\r
+ DObj2->SetLineNo(LineNo);\r
+ DObj2->SetScope (1);\r
+ delete DObj2;\r
+ } else {\r
+ DObj = new CIfrDefault (Size);\r
+ DObj->SetDefaultId(DefaultId);\r
+ DObj->SetType(Type);\r
+ DObj->SetLineNo(LineNo);\r
+ DObj->SetValue (Value);\r
+ delete DObj;\r
+ }\r
+}\r
+\r
+/**\r
+ Create new default opcode for question base on the QuestionDefaultInfo.\r
+\r
+ @param pQuestionNode Point to the question opcode Node.\r
+ @param QuestionDefaultInfo Point to the QuestionDefaultInfo for current question.\r
+\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrCreateDefaultForQuestion (\r
+ IN SIfrRecord *pQuestionNode,\r
+ IN QuestionDefaultRecord *QuestionDefaultInfo\r
+ )\r
+{\r
+ EFI_IFR_OP_HEADER *pOpHead;\r
+ EFI_IFR_DEFAULT *Default;\r
+ SIfrRecord *pSNode;\r
+ SIfrRecord *pENode;\r
+ SIfrRecord *pDefaultNode;\r
+ CIfrObj *Obj;\r
+ CHAR8 *ObjBinBuf;\r
+ UINT8 ScopeCount;\r
+ UINT8 OpcodeNumber;\r
+ UINT8 OpcodeCount;\r
+ UINT8 DefaultSize;\r
+ EFI_IFR_ONE_OF_OPTION *DefaultOptionOpcode;\r
+ EFI_IFR_TYPE_VALUE CheckBoxDefaultValue;\r
+\r
+ CheckBoxDefaultValue.b = 1;\r
+ pOpHead = (EFI_IFR_OP_HEADER *) pQuestionNode->mIfrBinBuf;\r
+ ScopeCount = 0;\r
+ OpcodeCount = 0;\r
+ Obj = NULL;\r
+\r
+ //\r
+ // Record the offset of node which need to be adjust, will move the new created default opcode to this offset.\r
+ //\r
+ gAdjustOpcodeOffset = pQuestionNode->mNext->mOffset;\r
+ //\r
+ // Case 1:\r
+ // For oneof, the default with smallest default id is given by the option flag.\r
+ // So create the missing defaults base on the oneof option value(mDefaultValueRecord).\r
+ //\r
+ if (pOpHead->OpCode == EFI_IFR_ONE_OF_OP && !QuestionDefaultInfo->mIsDefaultOpcode) {\r
+ DefaultOptionOpcode = (EFI_IFR_ONE_OF_OPTION *)QuestionDefaultInfo->mDefaultValueRecord->mIfrBinBuf;\r
+ DefaultSize = QuestionDefaultInfo->mDefaultValueRecord->mBinBufLen - OFFSET_OF (EFI_IFR_ONE_OF_OPTION, Value);\r
+ DefaultSize += OFFSET_OF (EFI_IFR_DEFAULT, Value);\r
+ for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+ if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+ IfrCreateDefaultRecord (DefaultSize, mAllDefaultIdArray[i], DefaultOptionOpcode->Type, pQuestionNode->mLineNo, DefaultOptionOpcode->Value);\r
+ //\r
+ // Save the new created default in the buffer storage.\r
+ //\r
+ IfrAddDefaultToBufferConfig (mAllDefaultIdArray[i], pQuestionNode, DefaultOptionOpcode->Value);\r
+ }\r
+ }\r
+ return;\r
+ }\r
+\r
+ //\r
+ // Case2:\r
+ // For checkbox, the default with smallest default id is given by the question flag.\r
+ // And create the missing defaults with true value.\r
+ //\r
+ if (pOpHead-> OpCode == EFI_IFR_CHECKBOX_OP && !QuestionDefaultInfo->mIsDefaultOpcode) {\r
+ DefaultSize = OFFSET_OF (EFI_IFR_DEFAULT, Value) + sizeof (BOOLEAN);\r
+ for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+ if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+ IfrCreateDefaultRecord (DefaultSize, mAllDefaultIdArray[i], EFI_IFR_TYPE_BOOLEAN, pQuestionNode->mLineNo, CheckBoxDefaultValue);\r
+ //\r
+ // Save the new created default.\r
+ //\r
+ IfrAddDefaultToBufferConfig (mAllDefaultIdArray[i], pQuestionNode, CheckBoxDefaultValue);\r
+ }\r
+ }\r
+ return;\r
+ }\r
+\r
+ //\r
+ // Case3:\r
+ // The default with smallest default id is given by the default opcode.\r
+ // So create the missing defaults base on the value in the default opcode.\r
+ //\r
+\r
+ //\r
+ // pDefaultNode point to the mDefaultValueRecord in QuestionDefaultInfo.\r
+ //\r
+ pDefaultNode = QuestionDefaultInfo->mDefaultValueRecord;\r
+ Default = (EFI_IFR_DEFAULT *)pDefaultNode->mIfrBinBuf;\r
+ //\r
+ // Record the offset of node which need to be adjust, will move the new created default opcode to this offset.\r
+ //\r
+ gAdjustOpcodeOffset = pDefaultNode->mNext->mOffset;\r
+\r
+ if (Default->Type == EFI_IFR_TYPE_OTHER) {\r
+ //\r
+ // EFI_IFR_DEFAULT_2 opcode.\r
+ //\r
+ // Point to the first expression opcode.\r
+ //\r
+ pSNode = pDefaultNode->mNext;\r
+ pENode = NULL;\r
+ ScopeCount++;\r
+ //\r
+ // Get opcode number behind the EFI_IFR_DEFAULT_2 until reach its END opcode (including the END opcode of EFI_IFR_DEFAULT_2)\r
+ //\r
+ while (pSNode != NULL && pSNode->mNext != NULL && ScopeCount != 0) {\r
+ pOpHead = (EFI_IFR_OP_HEADER *) pSNode->mIfrBinBuf;\r
+ if (pOpHead->Scope == 1) {\r
+ ScopeCount++;\r
+ }\r
+ if (pOpHead->OpCode == EFI_IFR_END_OP) {\r
+ ScopeCount--;\r
+ }\r
+ pENode = pSNode;\r
+ pSNode = pSNode->mNext;\r
+ OpcodeCount++;\r
+ }\r
+\r
+ assert (pSNode);\r
+ assert (pENode);\r
+\r
+ //\r
+ // Record the offset of node which need to be adjust, will move the new created default opcode to this offset.\r
+ //\r
+ gAdjustOpcodeOffset = pSNode->mOffset;\r
+ //\r
+ // Create new default opcode node for missing default.\r
+ //\r
+ for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+ OpcodeNumber = OpcodeCount;\r
+ if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+ IfrCreateDefaultRecord (Default->Header.Length, mAllDefaultIdArray[i], Default->Type, pENode->mLineNo, Default->Value);\r
+ //\r
+ // Point to the first expression opcode node.\r
+ //\r
+ pSNode = pDefaultNode->mNext;\r
+ //\r
+ // Create the expression opcode and end opcode for the new created EFI_IFR_DEFAULT_2 opcode.\r
+ //\r
+ while (pSNode != NULL && pSNode->mNext != NULL && OpcodeNumber-- != 0) {\r
+ pOpHead = (EFI_IFR_OP_HEADER *) pSNode->mIfrBinBuf;\r
+ Obj = new CIfrObj (pOpHead->OpCode, NULL, pSNode->mBinBufLen, FALSE);\r
+ assert (Obj != NULL);\r
+ Obj->SetLineNo (pSNode->mLineNo);\r
+ ObjBinBuf = Obj->GetObjBinAddr();\r
+ memcpy (ObjBinBuf, pSNode->mIfrBinBuf, (UINTN)pSNode->mBinBufLen);\r
+ delete Obj;\r
+ pSNode = pSNode->mNext;\r
+ }\r
+ }\r
+ }\r
+ } else {\r
+ //\r
+ // EFI_IFR_DEFAULT opcode.\r
+ //\r
+ // Create new default opcode node for missing default.\r
+ //\r
+ for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+ if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+ IfrCreateDefaultRecord (Default->Header.Length, mAllDefaultIdArray[i], Default->Type, pDefaultNode->mLineNo, Default->Value);\r
+ //\r
+ // Save the new created default in the buffer storage..\r
+ //\r
+ IfrAddDefaultToBufferConfig (mAllDefaultIdArray[i], pQuestionNode, Default->Value);\r
+ }\r
+ }\r
+ }\r
+}\r
+\r
+/**\r
+ Parse the default information in a question, get the QuestionDefaultInfo.\r
+\r
+ @param pQuestionNode Point to the question record Node.\r
+ @param QuestionDefaultInfo On return, point to the QuestionDefaultInfo.\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrParseDefaulInfoInQuestion(\r
+ IN SIfrRecord *pQuestionNode,\r
+ OUT QuestionDefaultRecord *QuestionDefaultInfo\r
+ )\r
+{\r
+ SIfrRecord *pSNode;\r
+ EFI_IFR_ONE_OF_OPTION *OneofOptionOpcode;\r
+ EFI_IFR_OP_HEADER *pSOpHead;\r
+ EFI_IFR_CHECKBOX *CheckBoxOpcode;\r
+ EFI_IFR_DEFAULT *DefaultOpcode;\r
+ BOOLEAN IsOneOfOpcode;\r
+ UINT16 SmallestDefaultId;\r
+ UINT8 ScopeCount;\r
+\r
+ SmallestDefaultId = 0xffff;\r
+ IsOneOfOpcode = FALSE;\r
+ ScopeCount = 0;\r
+ pSNode = pQuestionNode;\r
+\r
+ //\r
+ // Parse all the opcodes in the Question.\r
+ //\r
+ while (pSNode != NULL) {\r
+ pSOpHead = (EFI_IFR_OP_HEADER *) pSNode->mIfrBinBuf;\r
+ //\r
+ // For a question, its scope bit must be set, the scope exists until it reaches a corresponding EFI_IFR_END_OP.\r
+ // Scopes may be nested within other scopes.\r
+ // When finishing parsing a question, the scope count must be zero.\r
+ //\r
+ if (pSOpHead->Scope == 1) {\r
+ ScopeCount++;\r
+ }\r
+ if (pSOpHead->OpCode == EFI_IFR_END_OP) {\r
+ ScopeCount--;\r
+ }\r
+ //\r
+ // Check whether finishing parsing a question.\r
+ //\r
+ if (ScopeCount == 0) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Record the default information in the question.\r
+ //\r
+ switch (pSOpHead->OpCode) {\r
+ case EFI_IFR_ONE_OF_OP:\r
+ IsOneOfOpcode = TRUE;\r
+ break;\r
+ case EFI_IFR_CHECKBOX_OP:\r
+ //\r
+ // The default info of check box may be given by flag.\r
+ // So need to check the flag of check box.\r
+ //\r
+ CheckBoxOpcode = (EFI_IFR_CHECKBOX *)pSNode->mIfrBinBuf;\r
+ if ((CheckBoxOpcode->Flags & EFI_IFR_CHECKBOX_DEFAULT) != 0) {\r
+ //\r
+ // Check whether need to update the smallest default id.\r
+ //\r
+ if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_STANDARD) {\r
+ SmallestDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
+ }\r
+ //\r
+ // Update the QuestionDefaultInfo.\r
+ //\r
+ for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+ if (mAllDefaultIdArray[i] == EFI_HII_DEFAULT_CLASS_STANDARD) {\r
+ if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+ QuestionDefaultInfo->mDefaultNumber ++;\r
+ QuestionDefaultInfo->mIsDefaultIdExist[i] = TRUE;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if ((CheckBoxOpcode->Flags & EFI_IFR_CHECKBOX_DEFAULT_MFG) != 0) {\r
+ //\r
+ // Check whether need to update the smallest default id.\r
+ //\r
+ if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
+ SmallestDefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;\r
+ }\r
+ //\r
+ // Update the QuestionDefaultInfo.\r
+ //\r
+ for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+ if (mAllDefaultIdArray[i] == EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
+ if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+ QuestionDefaultInfo->mDefaultNumber ++;\r
+ QuestionDefaultInfo->mIsDefaultIdExist[i] = TRUE;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ case EFI_IFR_ONE_OF_OPTION_OP:\r
+ if (!IsOneOfOpcode) {\r
+ //\r
+ // Only check the option in oneof.\r
+ //\r
+ break;\r
+ }\r
+ OneofOptionOpcode = (EFI_IFR_ONE_OF_OPTION *)pSNode->mIfrBinBuf;\r
+ if ((OneofOptionOpcode->Flags & EFI_IFR_OPTION_DEFAULT) != 0) {\r
+ //\r
+ // The option is used as the standard default.\r
+ // Check whether need to update the smallest default id and QuestionDefaultInfo.\r
+ //\r
+ if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_STANDARD) {\r
+ SmallestDefaultId = EFI_HII_DEFAULT_CLASS_STANDARD;\r
+ QuestionDefaultInfo->mDefaultValueRecord = pSNode;\r
+ }\r
+ //\r
+ // Update the IsDefaultIdExist array in QuestionDefaultInfo.\r
+ //\r
+ for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+ if (mAllDefaultIdArray[i] == EFI_HII_DEFAULT_CLASS_STANDARD) {\r
+ if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+ QuestionDefaultInfo->mDefaultNumber ++;\r
+ QuestionDefaultInfo->mIsDefaultIdExist[i] = TRUE;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ if ((OneofOptionOpcode->Flags & EFI_IFR_OPTION_DEFAULT_MFG) != 0) {\r
+ //\r
+ // This option is used as the manufacture default.\r
+ // Check whether need to update the smallest default id and QuestionDefaultInfo.\r
+ //\r
+ if (SmallestDefaultId > EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
+ SmallestDefaultId = EFI_HII_DEFAULT_CLASS_MANUFACTURING;\r
+ QuestionDefaultInfo->mDefaultValueRecord = pSNode;\r
+ }\r
+ //\r
+ // Update the QuestionDefaultInfo.\r
+ //\r
+ for (UINT8 i = 0; i < mAllDefaultTypeCount; i++) {\r
+ if (mAllDefaultIdArray[i] == EFI_HII_DEFAULT_CLASS_MANUFACTURING) {\r
+ if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+ QuestionDefaultInfo->mDefaultNumber ++;\r
+ QuestionDefaultInfo->mIsDefaultIdExist[i] = TRUE;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ break;\r
+ case EFI_IFR_DEFAULT_OP:\r
+ DefaultOpcode = (EFI_IFR_DEFAULT *) pSNode->mIfrBinBuf;\r
+ //\r
+ // Check whether need to update the smallest default id and QuestionDefaultInfo.\r
+ //\r
+ if (SmallestDefaultId >= DefaultOpcode->DefaultId ) {\r
+ SmallestDefaultId = DefaultOpcode->DefaultId;\r
+ QuestionDefaultInfo->mDefaultValueRecord= pSNode;\r
+ QuestionDefaultInfo->mIsDefaultOpcode= TRUE;\r
+ }\r
+ //\r
+ // Update the QuestionDefaultInfo.\r
+ //\r
+ for (UINT8 i = 0; i < mAllDefaultTypeCount; i++){\r
+ if (mAllDefaultIdArray[i] == ((EFI_IFR_DEFAULT *)pSNode->mIfrBinBuf)->DefaultId) {\r
+ if (!QuestionDefaultInfo->mIsDefaultIdExist[i]) {\r
+ QuestionDefaultInfo->mDefaultNumber ++;\r
+ QuestionDefaultInfo->mIsDefaultIdExist[i] = TRUE;\r
+ }\r
+ break;\r
+ }\r
+ }\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ //\r
+ // Parse next opcode in this question.\r
+ //\r
+ pSNode = pSNode->mNext;\r
+ }\r
+}\r
+\r
+/**\r
+ Check or add default for question if need.\r
+\r
+ This function will check the default info for question.\r
+ If the question has default, but the default number < defaultstore opcode number.\r
+ will do following two action :\r
+\r
+ 1. if (AutoDefault) will add default for question to support all kinds of defaults.\r
+ 2. if (CheckDefault) will generate an error to tell user the question misses some default value.\r
+\r
+ We assume that the two options can not be TRUE at same time.\r
+ If they are TRUE at same time, only do the action corresponding to AutoDefault option.\r
+\r
+ @param AutoDefault Add default for question if needed\r
+ @param CheckDefault Check the default info, if missing default, generates an error.\r
+\r
+**/\r
+VOID\r
+CIfrRecordInfoDB::IfrCheckAddDefaultRecord (\r
+ BOOLEAN AutoDefault,\r
+ BOOLEAN CheckDefault\r
+ )\r
+{\r
+ SIfrRecord *pNode;\r
+ SIfrRecord *pTailNode;\r
+ SIfrRecord *pStartAdjustNode;\r
+ EFI_IFR_OP_HEADER *pOpHead;\r
+ QuestionDefaultRecord QuestionDefaultInfo;\r
+ UINT8 MissingDefaultCount;\r
+ CHAR8 Msg[MAX_STRING_LEN] = {0, };\r
+\r
+ pNode = mIfrRecordListHead;\r
+\r
+ //\r
+ // Record the number and default id of all defaultstore opcode.\r
+ //\r
+ IfrGetDefaultStoreInfo ();\r
+\r
+ while (pNode != NULL) {\r
+ pOpHead = (EFI_IFR_OP_HEADER *) pNode->mIfrBinBuf;\r
+ //\r
+ // Check whether is question opcode.\r
+ //\r
+ if (CheckQuestionOpCode (pOpHead->OpCode)) {\r
+ //\r
+ // Initialize some local variables here, because they vary with question.\r
+ // Record the mIfrRecordListTail for each question, because may create default node for question after mIfrRecordListTail.\r
+ //\r
+ memset (&QuestionDefaultInfo, 0, sizeof (QuestionDefaultRecord));\r
+ pTailNode = mIfrRecordListTail;\r
+ //\r
+ // Get the QuestionDefaultInfo for current question.\r
+ //\r
+ IfrParseDefaulInfoInQuestion (pNode, &QuestionDefaultInfo);\r
+\r
+ if (QuestionDefaultInfo.mDefaultNumber != mAllDefaultTypeCount && QuestionDefaultInfo.mDefaultNumber != 0) {\r
+ if (AutoDefault) {\r
+ //\r
+ // Create default for question which misses default.\r
+ //\r
+ IfrCreateDefaultForQuestion (pNode, &QuestionDefaultInfo);\r
+\r
+ //\r
+ // Adjust the buffer content.\r
+ // pStartAdjustNode->mIfrBinBuf points to the insert position.\r
+ // pTailNode->mNext->mIfrBinBuf points to the inset opcodes.\r
+ //\r
+ pStartAdjustNode =GetRecordInfoFromOffset (gAdjustOpcodeOffset);\r
+ gCFormPkg.AdjustDynamicInsertOpcode (pStartAdjustNode->mIfrBinBuf, pTailNode->mNext->mIfrBinBuf, TRUE);\r
+\r
+ //\r
+ // Update the record info.\r
+ //\r
+ IfrUpdateRecordInfoForDynamicOpcode (TRUE);\r
+ } else if (CheckDefault) {\r
+ //\r
+ // Generate an error for question which misses default.\r
+ //\r
+ MissingDefaultCount = mAllDefaultTypeCount - QuestionDefaultInfo.mDefaultNumber;\r
+ sprintf (Msg, "The question misses %d default, the question's opcode is %d", MissingDefaultCount, pOpHead->OpCode);\r
+ gCVfrErrorHandle.PrintMsg (pNode->mLineNo, NULL, "Error", Msg);\r
+ }\r
+ }\r
+ }\r
+ //\r
+ // parse next opcode.\r
+ //\r
+ pNode = pNode->mNext;\r
+ }\r
+}\r
+\r