--- /dev/null
+#include "stdio.h"\r
+#include "stdlib.h"\r
+#include "VfrUtilityLib.h"\r
+#include "VfrFormPkg.h"\r
+\r
+VOID\r
+CVfrBinaryOutput::WriteLine (\r
+ IN FILE *pFile,\r
+ IN UINT32 LineBytes,\r
+ IN INT8 *LineHeader,\r
+ IN INT8 *BlkBuf,\r
+ IN UINT32 BlkSize\r
+ )\r
+{\r
+ UINT32 Index;\r
+\r
+ if ((pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {\r
+ return;\r
+ }\r
+\r
+ for (Index = 0; Index < BlkSize; Index++) {\r
+ if ((Index % LineBytes) == 0) {\r
+ fprintf (pFile, "\n%s", LineHeader);\r
+ }\r
+ fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);\r
+ }\r
+}\r
+\r
+VOID\r
+CVfrBinaryOutput::WriteEnd (\r
+ IN FILE *pFile,\r
+ IN UINT32 LineBytes,\r
+ IN INT8 *LineHeader,\r
+ IN INT8 *BlkBuf,\r
+ IN UINT32 BlkSize\r
+ )\r
+{\r
+ UINT32 Index;\r
+\r
+ if ((BlkSize == 0) || (pFile == NULL) || (LineHeader == NULL) || (BlkBuf == NULL)) {\r
+ return;\r
+ }\r
+\r
+ for (Index = 0; Index < BlkSize - 1; Index++) {\r
+ if ((Index % LineBytes) == 0) {\r
+ fprintf (pFile, "\n%s", LineHeader);\r
+ }\r
+ fprintf (pFile, "0x%02X, ", (UINT8)BlkBuf[Index]);\r
+ }\r
+\r
+ if ((Index % LineBytes) == 0) {\r
+ fprintf (pFile, "\n%s", LineHeader);\r
+ }\r
+ fprintf (pFile, "0x%02X\n", (UINT8)BlkBuf[Index]);\r
+}\r
+\r
+SConfigInfo::SConfigInfo (\r
+ IN UINT8 Type, \r
+ IN UINT16 Offset, \r
+ IN UINT32 Width, \r
+ IN EFI_IFR_TYPE_VALUE Value\r
+ )\r
+{\r
+ mOffset = Offset;\r
+ mWidth = (UINT16)Width;\r
+ mValue = new UINT8[mWidth];\r
+ if (mValue == NULL) {\r
+ return;\r
+ }\r
+\r
+ switch (Type) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ memcpy (mValue, &Value.u8, mWidth);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ memcpy (mValue, &Value.u16, mWidth);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ memcpy (mValue, &Value.u32, mWidth);\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ memcpy (mValue, &Value.u64, mWidth);\r
+ break;\r
+ case EFI_IFR_TYPE_BOOLEAN :\r
+ memcpy (mValue, &Value.b, mWidth);\r
+ break;\r
+ case EFI_IFR_TYPE_TIME :\r
+ memcpy (mValue, &Value.time, mWidth);\r
+ break;\r
+ case EFI_IFR_TYPE_DATE :\r
+ memcpy (mValue, &Value.date, mWidth);\r
+ break;\r
+ case EFI_IFR_TYPE_STRING :\r
+ memcpy (mValue, &Value.string, mWidth);\r
+ break;\r
+ case EFI_IFR_TYPE_OTHER :\r
+ return;\r
+ }\r
+}\r
+\r
+SConfigInfo::~SConfigInfo (\r
+ VOID\r
+ )\r
+{\r
+ BUFFER_SAFE_FREE (mValue);\r
+}\r
+\r
+SConfigItem::SConfigItem (\r
+ IN INT8 *Id, \r
+ IN INT8 *Info\r
+ )\r
+{\r
+ mId = NULL;\r
+ mInfo = NULL;\r
+ mInfoStrList = NULL;\r
+ mNext = NULL;\r
+\r
+ if (Id != NULL) {\r
+ if ((mId = new INT8[strlen (Id) + 1]) != NULL) {\r
+ strcpy (mId, Id);\r
+ }\r
+ }\r
+\r
+ if (Info != NULL) {\r
+ if ((mInfo = new INT8[strlen (Info) + 1]) != NULL) {\r
+ strcpy (mInfo, Info);\r
+ }\r
+ }\r
+}\r
+\r
+SConfigItem::SConfigItem (\r
+ IN INT8 *Id, \r
+ IN INT8 *Info,\r
+ IN UINT8 Type,\r
+ IN UINT16 Offset,\r
+ IN UINT16 Width,\r
+ IN EFI_IFR_TYPE_VALUE Value\r
+ )\r
+{\r
+ mId = NULL;\r
+ mInfo = NULL;\r
+ mInfoStrList = NULL;\r
+ mNext = NULL;\r
+\r
+ if (Id != NULL) {\r
+ if ((mId = new INT8[strlen (Id) + 1]) != NULL) {\r
+ strcpy (mId, Id);\r
+ }\r
+ }\r
+\r
+ if (Info != NULL) {\r
+ if ((mInfo = new INT8[strlen (Info) + 1]) != NULL) {\r
+ strcpy (mInfo, Info);\r
+ }\r
+ }\r
+\r
+ mInfoStrList = new SConfigInfo(Type, Offset, Width, Value);\r
+}\r
+\r
+SConfigItem::~SConfigItem (\r
+ VOID\r
+ )\r
+{\r
+ SConfigInfo *Info;\r
+\r
+ BUFFER_SAFE_FREE (mId);\r
+ BUFFER_SAFE_FREE (mInfo);\r
+ while (mInfoStrList != NULL) {\r
+ Info = mInfoStrList;\r
+ mInfoStrList = mInfoStrList->mNext;\r
+\r
+ BUFFER_SAFE_FREE (Info);\r
+ }\r
+}\r
+\r
+UINT8\r
+CVfrBufferConfig::Register (\r
+ IN INT8 *Id, \r
+ IN INT8 *Info\r
+ )\r
+{\r
+ SConfigItem *pNew;\r
+\r
+ if (Select (Id) == 0) {\r
+ return 1;\r
+ }\r
+\r
+ if ((pNew = new SConfigItem (Id, Info)) == NULL) {\r
+ return 2;\r
+ }\r
+ if (mItemListHead == NULL) {\r
+ mItemListHead = pNew;\r
+ mItemListTail = pNew;\r
+ } else {\r
+ mItemListTail->mNext = pNew;\r
+ mItemListTail = pNew;\r
+ }\r
+ mItemListPos = pNew;\r
+\r
+ return 0;\r
+}\r
+\r
+VOID\r
+CVfrBufferConfig::Open (\r
+ VOID\r
+ )\r
+{\r
+ mItemListPos = mItemListHead;\r
+}\r
+\r
+BOOLEAN\r
+CVfrBufferConfig::Eof(\r
+ VOID\r
+ )\r
+{\r
+ return (mItemListPos == NULL) ? TRUE : FALSE;\r
+}\r
+\r
+UINT8\r
+CVfrBufferConfig::Select (\r
+ IN INT8 *Id,\r
+ IN INT8 *Info\r
+ )\r
+{\r
+ SConfigItem *p;\r
+\r
+ if (Id == NULL) {\r
+ mItemListPos = mItemListHead;\r
+ return 0;\r
+ } else {\r
+ for (p = mItemListHead; p != NULL; p = p->mNext) {\r
+ if (strcmp (p->mId, Id) != 0) {\r
+ continue;\r
+ }\r
+\r
+ if ((p->mInfo != NULL) && (Info != NULL)) {\r
+ if (strcmp (p->mInfo, Info) != 0) {\r
+ continue;\r
+ }\r
+ }\r
+\r
+ mItemListPos = p;\r
+ return 0;\r
+ }\r
+ }\r
+\r
+ return 1;\r
+}\r
+\r
+UINT8\r
+CVfrBufferConfig::Write (\r
+ IN CONST CHAR8 Mode,\r
+ IN INT8 *Id, \r
+ IN INT8 *Info,\r
+ IN UINT8 Type,\r
+ IN UINT16 Offset,\r
+ IN UINT32 Width,\r
+ IN EFI_IFR_TYPE_VALUE Value\r
+ )\r
+{\r
+ UINT8 Ret;\r
+ SConfigItem *pItem;\r
+ SConfigInfo *pInfo;\r
+\r
+ switch (Mode) {\r
+ case 'a' : // add\r
+ if (Select (Id) == 0) {\r
+ if((pInfo = new SConfigInfo (Type, Offset, Width, Value)) == NULL) {\r
+ return 2;\r
+ }\r
+ pInfo->mNext = mItemListPos->mInfoStrList;\r
+ mItemListPos->mInfoStrList = pInfo;\r
+ } else {\r
+ if ((pItem = new SConfigItem (Id, Info, Type, Offset, Width, Value)) == NULL) {\r
+ return 2;\r
+ }\r
+ if (mItemListHead == NULL) {\r
+ mItemListHead = pItem;\r
+ mItemListTail = pItem;\r
+ } else {\r
+ mItemListTail->mNext = pItem;\r
+ mItemListTail = pItem;\r
+ }\r
+ mItemListPos = pItem;\r
+ }\r
+ break;\r
+\r
+ case 'd' : // delete\r
+ if ((Ret = Select (Id)) != 0) {\r
+ return Ret;\r
+ }\r
+\r
+ if (mItemListHead == mItemListPos) {\r
+ mItemListHead = mItemListPos->mNext;\r
+ delete mItemListPos;\r
+ break;\r
+ }\r
+\r
+ for (pItem = mItemListHead; pItem->mNext != mItemListPos; pItem = pItem->mNext)\r
+ ;\r
+\r
+ pItem->mNext = mItemListPos->mNext;\r
+ if (mItemListTail == mItemListPos) {\r
+ mItemListTail = pItem;\r
+ }\r
+ delete mItemListPos;\r
+ mItemListPos = pItem->mNext;\r
+ break;\r
+\r
+ case 'i' : // set info\r
+ if ((Ret = Select (Id)) != 0) {\r
+ return Ret;\r
+ }\r
+ if (mItemListPos->mInfo != NULL) {\r
+ delete mItemListPos->mInfo;\r
+ }\r
+ mItemListPos->mInfo = NULL;\r
+ if (Info != NULL) {\r
+ if ((mItemListPos->mInfo = new INT8[strlen (Info) + 1]) == NULL) {\r
+ return 2;\r
+ }\r
+ strcpy (mItemListPos->mInfo, Info);\r
+ }\r
+ break;\r
+\r
+ default :\r
+ return 1;\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+#if 0\r
+UINT8\r
+CVfrBufferConfig::ReadId (\r
+ OUT INT8 **Id, \r
+ OUT INT8 **Info\r
+ )\r
+{\r
+ if (mInfoStrItemListPos == NULL) {\r
+ return 1; // end read or some error occur\r
+ }\r
+\r
+ if (Id != NULL) {\r
+ *Id = new INT8 (strlen (mInfoStrItemListPos->mId + 1));\r
+ strcpy (*Id, mInfoStrItemListPos->mId);\r
+ }\r
+ if (Info != NULL) {\r
+ *Info = new INT8 (strlen (mInfoStrItemListPos->mInfo + 1));\r
+ strcpy (*Info, mInfoStrItemListPos->mInfo);\r
+ }\r
+\r
+ return 0;\r
+}\r
+\r
+UINT8\r
+CVfrBufferConfig::ReadInfo (\r
+ IN INT8 *Id, \r
+ IN UINT32 Index,\r
+ IN OUT UINT32 &Number,\r
+ OUT INT8 *Offset,\r
+ OUT INT8 *Width,\r
+ OUT INT8 *Value\r
+ )\r
+{\r
+ UINT8 ret;\r
+ SConfigInfo *p;\r
+ UINT32 idx;\r
+ UINT32 num;\r
+\r
+ if (Id != NULL) {\r
+ if ((ret = Select (Id)) != 0) {\r
+ return ret;\r
+ }\r
+ }\r
+\r
+ if (mInfoStrItemListPos == NULL) {\r
+ return 1; // end read or some error occur\r
+ }\r
+\r
+ p = mInfoStrItemListPos->mInfoStrList;\r
+ for (idx = 0; (idx < Index) && (p != NULL); idx++) {\r
+ p = p->mNext;\r
+ }\r
+ if (p == NULL) {\r
+ return 1;\r
+ }\r
+\r
+ if (Offset != NULL) {\r
+ Offset[0] = '\0';\r
+ }\r
+ if (Width != NULL) {\r
+ Width[0] = '\0';\r
+ }\r
+ if (Value != NULL) {\r
+ Value[0] = '\0';\r
+ }\r
+\r
+ while (num < Number) {\r
+ if (Offset != NULL) {\r
+ strcat (Offset, p->mOffset);\r
+ }\r
+ if (Width != NULL) {\r
+ strcat (Width, p->mWidth);\r
+ }\r
+ if (Value != NULL) {\r
+ strcat (Value, p->mValue);\r
+ }\r
+\r
+ num++;\r
+ if ((p = p->mNext) == NULL) {\r
+ break;\r
+ }\r
+ }\r
+ Number = num;\r
+\r
+ return 0;\r
+}\r
+\r
+VOID\r
+CVfrBufferConfig::ReadNext (\r
+ VOID\r
+ )\r
+{\r
+ if (mItemListPos != NULL) {\r
+ mItemListPos = mItemListPos->mNext;\r
+ }\r
+}\r
+#endif\r
+\r
+VOID\r
+CVfrBufferConfig::Close (\r
+ VOID\r
+ )\r
+{\r
+ mItemListPos = NULL;\r
+}\r
+\r
+#define BYTES_PRE_LINE 0x10\r
+\r
+VOID\r
+CVfrBufferConfig::OutputCFile (\r
+ IN FILE *pFile,\r
+ IN INT8 *BaseName\r
+ )\r
+{\r
+ CVfrBinaryOutput Output;\r
+ SConfigItem *Item;\r
+ SConfigInfo *Info;\r
+ UINT32 TotalLen;\r
+\r
+ if (pFile == NULL) {\r
+ return;\r
+ }\r
+\r
+ for (Item = mItemListHead; Item != NULL; Item = Item->mNext) {\r
+ if (Item->mInfoStrList != NULL) {\r
+ fprintf (pFile, "\nunsigned char %s%sDefault%04x[] = {", BaseName, Item->mId, Item->mInfo);\r
+\r
+ TotalLen = sizeof (UINT32);\r
+ for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
+ TotalLen += Info->mWidth + sizeof (UINT16) * 2;\r
+ }\r
+ Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&TotalLen, sizeof (UINT32));\r
+\r
+ for (Info = Item->mInfoStrList; Info != NULL; Info = Info->mNext) {\r
+ Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&Info->mOffset, sizeof (UINT16));\r
+ Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)&Info->mWidth, sizeof (UINT16));\r
+ if (Info->mNext == NULL) {\r
+ Output.WriteEnd (pFile, BYTES_PRE_LINE, " ", (INT8 *)Info->mValue, Info->mWidth);\r
+ } else {\r
+ Output.WriteLine (pFile, BYTES_PRE_LINE, " ", (INT8 *)Info->mValue, Info->mWidth);\r
+ }\r
+ fprintf (pFile, "\n"); \r
+ }\r
+ fprintf (pFile, "};\n"); \r
+ }\r
+ }\r
+}\r
+\r
+CVfrBufferConfig::CVfrBufferConfig (\r
+ VOID\r
+ )\r
+{\r
+ mItemListHead = NULL;\r
+ mItemListTail = NULL;\r
+ mItemListPos = NULL;\r
+}\r
+\r
+CVfrBufferConfig::~CVfrBufferConfig (\r
+ VOID\r
+ )\r
+{\r
+ SConfigItem *p;\r
+\r
+ while (mItemListHead != NULL) {\r
+ p = mItemListHead;\r
+ mItemListHead = mItemListHead->mNext;\r
+ delete p;\r
+ }\r
+\r
+ mItemListHead = NULL;\r
+ mItemListTail = NULL;\r
+ mItemListPos = NULL;\r
+}\r
+\r
+CVfrBufferConfig gCVfrBufferConfig;\r
+\r
+static struct {\r
+ INT8 *mTypeName;\r
+ UINT8 mType;\r
+ UINT32 mSize;\r
+ UINT32 mAlign;\r
+} gInternalTypesTable [] = {\r
+ {"UINT64", EFI_IFR_TYPE_NUM_SIZE_64, sizeof (UINT64), sizeof (UINT64)},\r
+ {"UINT32", EFI_IFR_TYPE_NUM_SIZE_32, sizeof (UINT32), sizeof (UINT32)},\r
+ {"UINT16", EFI_IFR_TYPE_NUM_SIZE_16, sizeof (UINT16), sizeof (UINT16)},\r
+ {"UINT8", EFI_IFR_TYPE_NUM_SIZE_8, sizeof (UINT8), sizeof (UINT8)},\r
+ {"BOOLEAN", EFI_IFR_TYPE_BOOLEAN, sizeof (BOOLEAN), sizeof (BOOLEAN)},\r
+ {"EFI_HII_DATE", EFI_IFR_TYPE_DATE, sizeof (EFI_HII_DATE), sizeof (UINT8)},\r
+ {"EFI_STRING_ID", EFI_IFR_TYPE_STRING, sizeof (EFI_STRING_ID),sizeof (EFI_STRING_ID)},\r
+ {"EFI_HII_TIME", EFI_IFR_TYPE_TIME, sizeof (EFI_HII_TIME), sizeof (UINT8)},\r
+ {NULL, EFI_IFR_TYPE_OTHER, 0, 0}\r
+};\r
+\r
+STATIC\r
+BOOLEAN\r
+_IS_INTERNAL_TYPE (\r
+ IN INT8 *TypeName\r
+ )\r
+{\r
+ UINT32 Index;\r
+\r
+ if (TypeName == NULL) {\r
+ return FALSE;\r
+ }\r
+\r
+ for (Index = 0; gInternalTypesTable[Index].mTypeName != NULL; Index++) {\r
+ if (strcmp (TypeName, gInternalTypesTable[Index].mTypeName) == 0) {\r
+ return TRUE;\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+STATIC\r
+INT8 *\r
+TrimHex (\r
+ IN INT8 *Str,\r
+ OUT bool *IsHex\r
+ )\r
+{\r
+ *IsHex = FALSE;\r
+\r
+ while (*Str && *Str == ' ') {\r
+ Str++;\r
+ }\r
+ while (*Str && *Str == '0') {\r
+ Str++;\r
+ }\r
+ if (*Str && (*Str == 'x' || *Str == 'X')) {\r
+ Str++;\r
+ *IsHex = TRUE;\r
+ }\r
+\r
+ return Str;\r
+}\r
+\r
+UINT32\r
+_STR2U32 (\r
+ IN INT8 *Str\r
+ )\r
+{\r
+ bool IsHex;\r
+ UINT32 Value;\r
+ INT8 c;\r
+\r
+ Str = TrimHex (Str, &IsHex);\r
+ for (Value = 0; (c = *Str) != '\0'; Str++) {\r
+ //\r
+ // BUG: does not handle overflow here\r
+ //\r
+ (IsHex == TRUE) ? (Value <<= 4) : (Value *= 10);\r
+\r
+ if ((IsHex == TRUE) && (c >= 'a') && (c <= 'f')) {\r
+ Value += (c - 'a' + 10);\r
+ }\r
+ if ((IsHex == TRUE) && (c >= 'A') && (c <= 'F')) {\r
+ Value += (c - 'A' + 10);\r
+ }\r
+ if (c >= '0' && c <= '9') {\r
+ Value += (c - '0');\r
+ } \r
+ }\r
+\r
+ return Value;\r
+}\r
+\r
+VOID\r
+CVfrVarDataTypeDB::RegisterNewType (\r
+ IN SVfrDataType *New\r
+ )\r
+{\r
+ New->mNext = mDataTypeList;\r
+ mDataTypeList = New;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::ExtractStructTypeName (\r
+ IN INT8 *&VarStr, \r
+ OUT INT8 *TName\r
+ )\r
+{\r
+ if (TName == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ while((*VarStr != '\0') && (*VarStr != '.')) {\r
+ *TName = *VarStr;\r
+ VarStr++;\r
+ TName++;\r
+ }\r
+ *TName = '\0';\r
+ if (*VarStr == '.') {\r
+ VarStr++;\r
+ }\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::ExtractFieldNameAndArrary (\r
+ IN INT8 *&VarStr, \r
+ IN INT8 *FName,\r
+ OUT UINT32 &ArrayIdx\r
+ )\r
+{\r
+ UINT32 Idx;\r
+ INT8 ArrayStr[MAX_NAME_LEN + 1];\r
+\r
+ ArrayIdx = INVALID_ARRAY_INDEX; \r
+\r
+ if (FName == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ while((*VarStr != '\0') &&\r
+ (*VarStr != '.') && \r
+ (*VarStr != '[') && \r
+ (*VarStr != ']')) {\r
+ *FName = *VarStr;\r
+ VarStr++;\r
+ FName++;\r
+ }\r
+ *FName = '\0';\r
+\r
+ switch (*VarStr) {\r
+ case '.' :\r
+ VarStr++;\r
+ case '\0':\r
+ return VFR_RETURN_SUCCESS;\r
+ case '[' :\r
+ VarStr++;\r
+ for (Idx = 0; (Idx < MAX_NAME_LEN) && (*VarStr != '\0') && (*VarStr != ']'); VarStr++, Idx++) {\r
+ ArrayStr[Idx] = *VarStr;\r
+ }\r
+ ArrayStr[Idx] = '\0';\r
+\r
+ if ((*VarStr != ']') && (ArrayStr[0] == '\0')) {\r
+ return VFR_RETURN_DATA_STRING_ERROR;\r
+ }\r
+ ArrayIdx = _STR2U32 (ArrayStr);\r
+ if (*VarStr == ']') {\r
+ VarStr++;\r
+ }\r
+ return VFR_RETURN_SUCCESS;\r
+ case ']':\r
+ return VFR_RETURN_DATA_STRING_ERROR;\r
+ }\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::GetTypeField (\r
+ IN INT8 *FName, \r
+ IN SVfrDataType *Type, \r
+ OUT SVfrDataField *&Field\r
+ )\r
+{\r
+ SVfrDataField *pField = NULL;\r
+\r
+ if ((FName == NULL) && (Type == NULL)) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ for (pField = Type->mMembers; pField != NULL; pField = pField->mNext) {\r
+ if (strcmp (pField->mFieldName, FName) == 0) {\r
+ Field = pField;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ return VFR_RETURN_UNDEFINED;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::GetFieldOffset (\r
+ IN SVfrDataField *Field, \r
+ IN UINT32 ArrayIdx,\r
+ OUT UINT32 &Offset\r
+ )\r
+{\r
+ if (Field == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ if ((ArrayIdx != INVALID_ARRAY_INDEX) && ((Field->mArrayNum == 0) || (Field->mArrayNum <= ArrayIdx))) {\r
+ return VFR_RETURN_ERROR_ARRARY_NUM;\r
+ }\r
+\r
+ Offset = Field->mOffset + Field->mFieldType->mTotalSize * ((ArrayIdx == INVALID_ARRAY_INDEX) ? 0 : ArrayIdx);\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+UINT8\r
+CVfrVarDataTypeDB::GetFieldWidth (\r
+ IN SVfrDataField *Field\r
+ )\r
+{\r
+ if (Field == NULL) {\r
+ return 0;\r
+ }\r
+\r
+ return Field->mFieldType->mType;\r
+}\r
+\r
+UINT32\r
+CVfrVarDataTypeDB::GetFieldSize (\r
+ IN SVfrDataField *Field,\r
+ IN UINT32 ArrayIdx\r
+ )\r
+{\r
+ if (Field == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ if ((ArrayIdx == INVALID_ARRAY_INDEX) && (Field->mArrayNum != 0)) {\r
+ return Field->mFieldType->mTotalSize * Field->mArrayNum;\r
+ } else {\r
+ return Field->mFieldType->mTotalSize;\r
+ }\r
+}\r
+\r
+VOID\r
+CVfrVarDataTypeDB::InternalTypesListInit (\r
+ VOID\r
+ )\r
+{\r
+ SVfrDataType *New = NULL;\r
+ UINT32 Index;\r
+\r
+ for (Index = 0; gInternalTypesTable[Index].mTypeName != NULL; Index++) {\r
+ New = new SVfrDataType;\r
+ if (New != NULL) {\r
+ strcpy (New->mTypeName, gInternalTypesTable[Index].mTypeName);\r
+ New->mType = gInternalTypesTable[Index].mType;\r
+ New->mAlign = gInternalTypesTable[Index].mAlign;\r
+ New->mTotalSize = gInternalTypesTable[Index].mSize;\r
+ if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_DATE") == 0) {\r
+ SVfrDataField *pYearField = new SVfrDataField;\r
+ SVfrDataField *pMonthField = new SVfrDataField;\r
+ SVfrDataField *pDayField = new SVfrDataField;\r
+\r
+ strcpy (pYearField->mFieldName, "Year");\r
+ GetDataType ("UINT8", &pYearField->mFieldType);\r
+ pYearField->mOffset = 0;\r
+ pYearField->mNext = pMonthField;\r
+ pYearField->mArrayNum = 0;\r
+\r
+ strcpy (pMonthField->mFieldName, "Month");\r
+ GetDataType ("UINT8", &pMonthField->mFieldType);\r
+ pMonthField->mOffset = 1;\r
+ pMonthField->mNext = pDayField;\r
+ pMonthField->mArrayNum = 0;\r
+\r
+ strcpy (pDayField->mFieldName, "Day");\r
+ GetDataType ("UINT8", &pDayField->mFieldType);\r
+ pDayField->mOffset = 2;\r
+ pDayField->mNext = NULL;\r
+ pDayField->mArrayNum = 0;\r
+\r
+ New->mMembers = pYearField;\r
+ } else if (strcmp (gInternalTypesTable[Index].mTypeName, "EFI_HII_TIME") == 0) {\r
+ SVfrDataField *pHoursField = new SVfrDataField;\r
+ SVfrDataField *pMinutesField = new SVfrDataField;\r
+ SVfrDataField *pSecondsField = new SVfrDataField;\r
+\r
+ strcpy (pHoursField->mFieldName, "Hours");\r
+ GetDataType ("UINT8", &pHoursField->mFieldType);\r
+ pHoursField->mOffset = 0;\r
+ pHoursField->mNext = pMinutesField;\r
+ pHoursField->mArrayNum = 0;\r
+\r
+ strcpy (pMinutesField->mFieldName, "Minutes");\r
+ GetDataType ("UINT8", &pMinutesField->mFieldType);\r
+ pMinutesField->mOffset = 1;\r
+ pMinutesField->mNext = pSecondsField;\r
+ pMinutesField->mArrayNum = 0;\r
+\r
+ strcpy (pSecondsField->mFieldName, "Seconds");\r
+ GetDataType ("UINT8", &pSecondsField->mFieldType);\r
+ pSecondsField->mOffset = 2;\r
+ pSecondsField->mNext = NULL;\r
+ pSecondsField->mArrayNum = 0;\r
+\r
+ New->mMembers = pHoursField; \r
+ } else {\r
+ New->mMembers = NULL;\r
+ }\r
+ New->mNext = NULL;\r
+ RegisterNewType (New);\r
+ New = NULL;\r
+ }\r
+ }\r
+}\r
+\r
+CVfrVarDataTypeDB::CVfrVarDataTypeDB (\r
+ VOID\r
+ )\r
+{\r
+ mDataTypeList = NULL;\r
+ mNewDataType = NULL;\r
+ mCurrDataField = NULL;\r
+ mPackAlign = DEFAULT_PACK_ALIGN;\r
+\r
+ InternalTypesListInit ();\r
+}\r
+\r
+CVfrVarDataTypeDB::~CVfrVarDataTypeDB (\r
+ VOID\r
+ )\r
+{\r
+ SVfrDataType *pType;\r
+ SVfrDataField *pField;\r
+\r
+ if (mNewDataType != NULL) {\r
+ delete mNewDataType;\r
+ }\r
+\r
+ while (mDataTypeList != NULL) {\r
+ pType = mDataTypeList;\r
+ mDataTypeList = mDataTypeList->mNext;\r
+ while(pType->mMembers != NULL) {\r
+ pField = pType->mMembers;\r
+ pType->mMembers = pType->mMembers->mNext;\r
+ delete pField;\r
+ }\r
+ delete pType;\r
+ }\r
+\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::Pack (\r
+ IN UINT32 Align\r
+ )\r
+{\r
+ if (Align == 0) {\r
+ return VFR_RETURN_INVALID_PARAMETER;\r
+ } else if (Align > 1) {\r
+ mPackAlign = Align + Align % 2;\r
+ } else {\r
+ mPackAlign = Align;\r
+ }\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+VOID\r
+CVfrVarDataTypeDB::UnPack (\r
+ VOID\r
+ )\r
+{\r
+ mPackAlign = DEFAULT_PACK_ALIGN;\r
+}\r
+\r
+VOID\r
+CVfrVarDataTypeDB::DeclareDataTypeBegin (\r
+ VOID\r
+ )\r
+{\r
+ SVfrDataType *pNewType = NULL;\r
+\r
+ pNewType = new SVfrDataType;\r
+ pNewType->mTypeName[0] = '\0';\r
+ pNewType->mType = EFI_IFR_TYPE_OTHER;\r
+ pNewType->mAlign = DEFAULT_ALIGN;\r
+ pNewType->mTotalSize = 0;\r
+ pNewType->mMembers = NULL;\r
+ pNewType->mNext = NULL;\r
+\r
+ mNewDataType = pNewType;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::SetNewTypeName (\r
+ IN INT8 *TypeName\r
+ )\r
+{\r
+ SVfrDataType *pType;\r
+\r
+ if (mNewDataType == NULL) {\r
+ return VFR_RETURN_ERROR_SKIPED;\r
+ }\r
+ if (TypeName == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+ if (strlen(TypeName) >= MAX_NAME_LEN) {\r
+ return VFR_RETURN_INVALID_PARAMETER;\r
+ }\r
+\r
+ for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {\r
+ if (strcmp(pType->mTypeName, TypeName) == 0) {\r
+ return VFR_RETURN_REDEFINED;\r
+ }\r
+ }\r
+\r
+ strcpy(mNewDataType->mTypeName, TypeName);\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::DataTypeAddField (\r
+ IN INT8 *FieldName, \r
+ IN INT8 *TypeName, \r
+ IN UINT32 ArrayNum\r
+ )\r
+{\r
+ SVfrDataField *pNewField = NULL;\r
+ SVfrDataType *pFieldType = NULL;\r
+ SVfrDataField *pTmp;\r
+ UINT32 Align;\r
+\r
+ CHECK_ERROR_RETURN (GetDataType (TypeName, &pFieldType), VFR_RETURN_SUCCESS);\r
+\r
+ if (strlen (FieldName) >= MAX_NAME_LEN) {\r
+ return VFR_RETURN_INVALID_PARAMETER;\r
+ }\r
+\r
+ for (pTmp = mNewDataType->mMembers; pTmp != NULL; pTmp = pTmp->mNext) {\r
+ if (strcmp (pTmp->mFieldName, FieldName) == 0) {\r
+ return VFR_RETURN_REDEFINED;\r
+ }\r
+ }\r
+\r
+ Align = MIN (mPackAlign, pFieldType->mAlign);\r
+\r
+ if ((pNewField = new SVfrDataField) == NULL) {\r
+ return VFR_RETURN_OUT_FOR_RESOURCES;\r
+ }\r
+ strcpy (pNewField->mFieldName, FieldName);\r
+ pNewField->mFieldType = pFieldType;\r
+ pNewField->mArrayNum = ArrayNum;\r
+ if ((mNewDataType->mTotalSize % Align) == 0) {\r
+ pNewField->mOffset = mNewDataType->mTotalSize;\r
+ } else {\r
+ pNewField->mOffset = mNewDataType->mTotalSize + ALIGN_STUFF(mNewDataType->mTotalSize, Align);\r
+ }\r
+ if (mNewDataType->mMembers == NULL) {\r
+ mNewDataType->mMembers = pNewField;\r
+ pNewField->mNext = NULL;\r
+ } else {\r
+ for (pTmp = mNewDataType->mMembers; pTmp->mNext != NULL; pTmp = pTmp->mNext) \r
+ ;\r
+ pTmp->mNext = pNewField;\r
+ pNewField->mNext = NULL;\r
+ }\r
+\r
+ mNewDataType->mAlign = MIN (mPackAlign, MAX (pFieldType->mAlign, mNewDataType->mAlign));\r
+ mNewDataType->mTotalSize = pNewField->mOffset + (pNewField->mFieldType->mTotalSize) * ((ArrayNum == 0) ? 1 : ArrayNum);\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+VOID\r
+CVfrVarDataTypeDB::DeclareDataTypeEnd (\r
+ VOID\r
+ )\r
+{\r
+ if (mNewDataType->mTypeName[0] == '\0') {\r
+ return;\r
+ }\r
+\r
+ if ((mNewDataType->mTotalSize % mNewDataType->mAlign) !=0) {\r
+ mNewDataType->mTotalSize += ALIGN_STUFF (mNewDataType->mTotalSize, mNewDataType->mAlign);\r
+ }\r
+\r
+ RegisterNewType (mNewDataType);\r
+ mNewDataType = NULL;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::GetDataType (\r
+ IN INT8 *TypeName,\r
+ OUT SVfrDataType **DataType\r
+\r
+ )\r
+{\r
+ SVfrDataType *pDataType = NULL;\r
+\r
+ if (TypeName == NULL) {\r
+ return VFR_RETURN_ERROR_SKIPED;\r
+ }\r
+\r
+ if (DataType == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ *DataType = NULL;\r
+\r
+ for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {\r
+ if (strcmp (TypeName, pDataType->mTypeName) == 0) {\r
+ *DataType = pDataType;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ return VFR_RETURN_UNDEFINED;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::GetDataTypeSize (\r
+ IN INT8 *TypeName,\r
+ OUT UINT32 *Size\r
+ )\r
+{\r
+ SVfrDataType *pDataType = NULL;\r
+\r
+ if (Size == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ *Size = 0;\r
+\r
+ for (pDataType = mDataTypeList; pDataType != NULL; pDataType = pDataType->mNext) {\r
+ if (strcmp (TypeName, pDataType->mTypeName) == 0) {\r
+ *Size = pDataType->mTotalSize;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ return VFR_RETURN_UNDEFINED;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::GetDataFieldInfo (\r
+ IN INT8 *VarStr, \r
+ OUT UINT16 &Offset, \r
+ OUT UINT8 &Type, \r
+ OUT UINT32 &Size\r
+ )\r
+{\r
+ INT8 TName[MAX_NAME_LEN], FName[MAX_NAME_LEN];\r
+ UINT32 ArrayIdx, Tmp;\r
+ SVfrDataType *pType = NULL;\r
+ SVfrDataField *pField = NULL;\r
+\r
+ Offset = 0;\r
+ Type = EFI_IFR_TYPE_OTHER;\r
+ Size = 0;\r
+\r
+ CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr, TName), VFR_RETURN_SUCCESS);\r
+ CHECK_ERROR_RETURN (GetDataType (TName, &pType), VFR_RETURN_SUCCESS);\r
+\r
+ //\r
+ // if it is not struct data type\r
+ //\r
+ Type = pType->mType;\r
+ Size = pType->mTotalSize;\r
+\r
+ while (*VarStr != '\0') {\r
+ CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr, FName, ArrayIdx), VFR_RETURN_SUCCESS);\r
+ CHECK_ERROR_RETURN(GetTypeField (FName, pType, pField), VFR_RETURN_SUCCESS);\r
+ pType = pField->mFieldType;\r
+ CHECK_ERROR_RETURN(GetFieldOffset (pField, ArrayIdx, Tmp), VFR_RETURN_SUCCESS);\r
+ Offset += Tmp;\r
+ Type = GetFieldWidth (pField);\r
+ Size = GetFieldSize (pField, ArrayIdx);\r
+ }\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrVarDataTypeDB::GetUserDefinedTypeNameList (\r
+ OUT INT8 ***NameList, \r
+ OUT UINT32 *ListSize\r
+ )\r
+{\r
+ UINT32 Index;\r
+ SVfrDataType *pType;\r
+\r
+ if ((NameList == NULL) || (ListSize == NULL)) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ *NameList = NULL;\r
+ *ListSize = 0;\r
+\r
+ for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {\r
+ if (_IS_INTERNAL_TYPE(pType->mTypeName) == FALSE) {\r
+ (*ListSize)++;\r
+ }\r
+ }\r
+\r
+ if (*ListSize == 0) {\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+\r
+ if ((*NameList = new INT8*[*ListSize]) == NULL) {\r
+ *ListSize = 0;\r
+ return VFR_RETURN_OUT_FOR_RESOURCES;\r
+ }\r
+\r
+ for (Index = 0, pType = mDataTypeList; pType != NULL; pType = pType->mNext, Index++) {\r
+ if (_IS_INTERNAL_TYPE(pType->mTypeName) == FALSE) {\r
+ (*NameList)[Index] = pType->mTypeName;\r
+ }\r
+ }\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+BOOLEAN\r
+CVfrVarDataTypeDB::IsTypeNameDefined (\r
+ IN INT8 *TypeName\r
+ )\r
+{\r
+ SVfrDataType *pType;\r
+\r
+ if (TypeName == NULL) {\r
+ return FALSE;\r
+ }\r
+\r
+ for (pType = mDataTypeList; pType != NULL; pType = pType->mNext) {\r
+ if (strcmp (pType->mTypeName, TypeName) == 0) {\r
+ return TRUE;\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+#ifdef CVFR_VARDATATYPEDB_DEBUG\r
+VOID\r
+CVfrVarDataTypeDB::ParserDB (\r
+ VOID\r
+ )\r
+{\r
+ SVfrDataType *pTNode;\r
+ SVfrDataField *pFNode;\r
+\r
+ printf ("***************************************************************\n");\r
+ printf ("\t\tmPackAlign = %x\n", mPackAlign);\r
+ for (pTNode = mDataTypeList; pTNode != NULL; pTNode = pTNode->mNext) {\r
+ printf ("\t\tstruct %s : mAlign [%x] mTotalSize [%x]\n\n", pTNode->mTypeName, pTNode->mAlign, pTNode->mTotalSize);\r
+ printf ("\t\tstruct %s {\n", pTNode->mTypeName);\r
+ for (pFNode = pTNode->mMembers; pFNode != NULL; pFNode = pFNode->mNext) {\r
+ printf ("\t\t\t%s\t%s\n", pFNode->mFieldType->mTypeName, pFNode->mFieldName);\r
+ }\r
+ printf ("\t\t};\n");\r
+ printf ("---------------------------------------------------------------\n");\r
+ }\r
+ printf ("***************************************************************\n");\r
+}\r
+#endif\r
+\r
+SVfrVarStorageNode::SVfrVarStorageNode (\r
+ IN EFI_GUID *Guid,\r
+ IN INT8 *StoreName,\r
+ IN EFI_VARSTORE_ID VarStoreId,\r
+ IN EFI_STRING_ID VarName,\r
+ IN UINT32 VarSize\r
+ )\r
+{\r
+ if (Guid != NULL) {\r
+ mGuid = *Guid;\r
+ } else {\r
+ memset (&Guid, 0, sizeof (EFI_GUID));\r
+ }\r
+ if (StoreName != NULL) {\r
+ mVarStoreName = new INT8[strlen(StoreName) + 1];\r
+ strcpy (mVarStoreName, StoreName);\r
+ } else {\r
+ mVarStoreName = NULL;\r
+ }\r
+ mNext = NULL;\r
+ mVarStoreId = VarStoreId;\r
+ mVarStoreType = EFI_VFR_VARSTORE_EFI;\r
+ mStorageInfo.mEfiVar.mEfiVarName = VarName;\r
+ mStorageInfo.mEfiVar.mEfiVarSize = VarSize;\r
+}\r
+\r
+SVfrVarStorageNode::SVfrVarStorageNode (\r
+ IN EFI_GUID *Guid,\r
+ IN INT8 *StoreName,\r
+ IN EFI_VARSTORE_ID VarStoreId,\r
+ IN SVfrDataType *DataType\r
+ )\r
+{\r
+ if (Guid != NULL) {\r
+ mGuid = *Guid;\r
+ } else {\r
+ memset (&Guid, 0, sizeof (EFI_GUID));\r
+ }\r
+ if (StoreName != NULL) {\r
+ mVarStoreName = new INT8[strlen(StoreName) + 1];\r
+ strcpy (mVarStoreName, StoreName);\r
+ } else {\r
+ mVarStoreName = NULL;\r
+ }\r
+ mNext = NULL;\r
+ mVarStoreId = VarStoreId;\r
+ mVarStoreType = EFI_VFR_VARSTORE_BUFFER;\r
+ mStorageInfo.mDataType = DataType;\r
+}\r
+\r
+SVfrVarStorageNode::SVfrVarStorageNode (\r
+ IN INT8 *StoreName,\r
+ IN EFI_VARSTORE_ID VarStoreId\r
+ )\r
+{\r
+ if (StoreName != NULL) {\r
+ mVarStoreName = new INT8[strlen(StoreName) + 1];\r
+ strcpy (mVarStoreName, StoreName);\r
+ } else {\r
+ mVarStoreName = NULL;\r
+ }\r
+ mNext = NULL;\r
+ mVarStoreId = VarStoreId;\r
+ mVarStoreType = EFI_VFR_VARSTORE_NAME;\r
+ mStorageInfo.mNameSpace.mNameTable = new EFI_VARSTORE_ID[DEFAULT_NAME_TABLE_ITEMS];\r
+ mStorageInfo.mNameSpace.mTableSize = 0;\r
+}\r
+\r
+SVfrVarStorageNode::~SVfrVarStorageNode (\r
+ VOID\r
+ )\r
+{\r
+ if (mVarStoreName != NULL) {\r
+ delete mVarStoreName;\r
+ }\r
+\r
+ if (mVarStoreType == EFI_VFR_VARSTORE_NAME) {\r
+ delete mStorageInfo.mNameSpace.mNameTable;\r
+ }\r
+}\r
+\r
+CVfrDataStorage::CVfrDataStorage (\r
+ VOID\r
+ )\r
+{\r
+ UINT32 Index;\r
+\r
+ for (Index = 0; Index < EFI_FREE_VARSTORE_ID_BITMAP_SIZE; Index++) {\r
+ mFreeVarStoreIdBitMap[Index] = 0;\r
+ }\r
+\r
+ // Question ID 0 is reserved.\r
+ mFreeVarStoreIdBitMap[0] = 0x80000000;\r
+\r
+ mBufferVarStoreList = NULL;\r
+ mEfiVarStoreList = NULL;\r
+ mNameVarStoreList = NULL;\r
+ mCurrVarStorageNode = NULL;\r
+ mNewVarStorageNode = NULL;\r
+}\r
+\r
+CVfrDataStorage::~CVfrDataStorage (\r
+ VOID\r
+ )\r
+{\r
+ SVfrVarStorageNode *pNode;\r
+\r
+ while (mBufferVarStoreList != NULL) {\r
+ pNode = mBufferVarStoreList;\r
+ mBufferVarStoreList = mBufferVarStoreList->mNext;\r
+ delete pNode;\r
+ }\r
+ while (mEfiVarStoreList != NULL) {\r
+ pNode = mEfiVarStoreList;\r
+ mEfiVarStoreList = mEfiVarStoreList->mNext;\r
+ delete pNode;\r
+ }\r
+ while (mNameVarStoreList != NULL) {\r
+ pNode = mNameVarStoreList;\r
+ mNameVarStoreList = mNameVarStoreList->mNext;\r
+ delete pNode;\r
+ }\r
+ if (mNewVarStorageNode != NULL) {\r
+ delete mNewVarStorageNode;\r
+ }\r
+}\r
+\r
+EFI_VARSTORE_ID\r
+CVfrDataStorage::GetFreeVarStoreId (\r
+ VOID\r
+ )\r
+{\r
+ UINT32 Index, Mask, Offset;\r
+\r
+ for (Index = 0; Index < EFI_FREE_VARSTORE_ID_BITMAP_SIZE; Index++) {\r
+ if (mFreeVarStoreIdBitMap[Index] != 0xFFFFFFFF) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ for (Offset = 0, Mask = 0x80000000; Mask != 0; Mask >>= 1, Offset++) {\r
+ if ((mFreeVarStoreIdBitMap[Index] & Mask) == 0) {\r
+ mFreeVarStoreIdBitMap[Index] |= Mask;\r
+ return (EFI_VARSTORE_ID)((Index << EFI_BITS_SHIFT_PER_UINT32) + Offset);\r
+ }\r
+ }\r
+\r
+ return EFI_VARSTORE_ID_INVALID;\r
+}\r
+\r
+BOOLEAN\r
+CVfrDataStorage::ChekVarStoreIdFree (\r
+ IN EFI_VARSTORE_ID VarStoreId\r
+ )\r
+{\r
+ UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);\r
+ UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);\r
+\r
+ return (mFreeVarStoreIdBitMap[Index] & (0x80000000 >> Offset)) == 0;\r
+}\r
+\r
+VOID\r
+CVfrDataStorage::MarkVarStoreIdUsed (\r
+ IN EFI_VARSTORE_ID VarStoreId\r
+ )\r
+{\r
+ UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);\r
+ UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);\r
+\r
+ mFreeVarStoreIdBitMap[Index] |= (0x80000000 >> Offset);\r
+}\r
+\r
+VOID\r
+CVfrDataStorage::MarkVarStoreIdUnused (\r
+ IN EFI_VARSTORE_ID VarStoreId\r
+ )\r
+{\r
+ UINT32 Index = (VarStoreId / EFI_BITS_PER_UINT32);\r
+ UINT32 Offset = (VarStoreId % EFI_BITS_PER_UINT32);\r
+\r
+ mFreeVarStoreIdBitMap[Index] &= ~(0x80000000 >> Offset);\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::DeclareNameVarStoreBegin (\r
+ IN INT8 *StoreName\r
+ )\r
+{\r
+ SVfrVarStorageNode *pNode = NULL;\r
+ EFI_VARSTORE_ID VarStoreId;\r
+\r
+ if (StoreName == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
+ return VFR_RETURN_REDEFINED;\r
+ }\r
+ }\r
+\r
+ VarStoreId = GetFreeVarStoreId ();\r
+ if ((pNode = new SVfrVarStorageNode (StoreName, VarStoreId)) == NULL) {\r
+ return VFR_RETURN_UNDEFINED;\r
+ }\r
+\r
+ mNewVarStorageNode = pNode;\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::NameTableAddItem (\r
+ IN EFI_STRING_ID Item\r
+ )\r
+{\r
+ EFI_VARSTORE_ID *NewTable, *OldTable;\r
+ UINT32 TableSize;\r
+\r
+ OldTable = mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable;\r
+ TableSize = mNewVarStorageNode->mStorageInfo.mNameSpace.mTableSize;\r
+\r
+ if ((TableSize != 0) && ((TableSize % DEFAULT_NAME_TABLE_ITEMS) == 0)) {\r
+ if ((NewTable = new EFI_VARSTORE_ID[TableSize + DEFAULT_NAME_TABLE_ITEMS]) == NULL) {\r
+ return VFR_RETURN_OUT_FOR_RESOURCES;\r
+ }\r
+ memcpy (NewTable, OldTable, TableSize);\r
+ mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable = NewTable;\r
+ }\r
+\r
+ mNewVarStorageNode->mStorageInfo.mNameSpace.mNameTable[TableSize++] = Item;\r
+ mNewVarStorageNode->mStorageInfo.mNameSpace.mTableSize = TableSize;\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::DeclareNameVarStoreEnd (\r
+ IN EFI_GUID *Guid\r
+ )\r
+{\r
+ mNewVarStorageNode->mGuid = *Guid;\r
+ mNewVarStorageNode->mNext = mNameVarStoreList;\r
+ mNameVarStoreList = mNewVarStorageNode;\r
+\r
+ mNewVarStorageNode = NULL;\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE \r
+CVfrDataStorage::DeclareEfiVarStore (\r
+ IN INT8 *StoreName, \r
+ IN EFI_GUID *Guid, \r
+ IN EFI_STRING_ID NameStrId,\r
+ IN UINT32 VarSize\r
+ )\r
+{\r
+ SVfrVarStorageNode *pNode;\r
+ EFI_VARSTORE_ID VarStoreId;\r
+\r
+ if ((StoreName == NULL) || (Guid == NULL)) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ if (VarSize > sizeof (UINT64)) {\r
+ return VFR_RETURN_EFIVARSTORE_SIZE_ERROR;\r
+ }\r
+\r
+ for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
+ return VFR_RETURN_REDEFINED;\r
+ }\r
+ }\r
+\r
+ VarStoreId = GetFreeVarStoreId ();\r
+ if ((pNode = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, NameStrId, VarSize)) == NULL) {\r
+ return VFR_RETURN_OUT_FOR_RESOURCES;\r
+ }\r
+\r
+ pNode->mNext = mNameVarStoreList;\r
+ mNameVarStoreList = pNode;\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE \r
+CVfrDataStorage::DeclareBufferVarStore (\r
+ IN INT8 *StoreName, \r
+ IN EFI_GUID *Guid, \r
+ IN CVfrVarDataTypeDB *DataTypeDB,\r
+ IN INT8 *TypeName,\r
+ IN EFI_VARSTORE_ID VarStoreId\r
+ )\r
+{\r
+ SVfrVarStorageNode *pNew = NULL;\r
+ SVfrDataType *pDataType = NULL;\r
+\r
+ if ((StoreName == NULL) || (Guid == NULL) || (DataTypeDB == NULL)) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ CHECK_ERROR_RETURN(DataTypeDB->GetDataType (TypeName, &pDataType), VFR_RETURN_SUCCESS);\r
+\r
+ if (VarStoreId == EFI_VARSTORE_ID_INVALID) {\r
+ VarStoreId = GetFreeVarStoreId ();\r
+ } else {\r
+ if (ChekVarStoreIdFree (VarStoreId) == FALSE) {\r
+ return VFR_RETURN_VARSTOREID_REDEFINED;\r
+ }\r
+ MarkVarStoreIdUsed (VarStoreId);\r
+ }\r
+\r
+ if ((pNew = new SVfrVarStorageNode (Guid, StoreName, VarStoreId, pDataType)) == NULL) {\r
+ return VFR_RETURN_OUT_FOR_RESOURCES;\r
+ }\r
+\r
+ pNew->mNext = mBufferVarStoreList;\r
+ mBufferVarStoreList = pNew;\r
+\r
+ if (gCVfrBufferConfig.Register(StoreName) != 0) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE \r
+CVfrDataStorage::GetVarStoreId (\r
+ IN INT8 *StoreName,\r
+ OUT EFI_VARSTORE_ID *VarStoreId\r
+ )\r
+{\r
+ SVfrVarStorageNode *pNode;\r
+\r
+ for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
+ mCurrVarStorageNode = pNode;\r
+ *VarStoreId = pNode->mVarStoreId;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
+ mCurrVarStorageNode = pNode;\r
+ *VarStoreId = pNode->mVarStoreId;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
+ mCurrVarStorageNode = pNode;\r
+ *VarStoreId = pNode->mVarStoreId;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ mCurrVarStorageNode = NULL;\r
+ *VarStoreId = EFI_VARSTORE_ID_INVALID;\r
+ return VFR_RETURN_UNDEFINED;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::GetBufferVarStoreDataTypeName (\r
+ IN INT8 *StoreName,\r
+ OUT INT8 **DataTypeName\r
+ )\r
+{\r
+ SVfrVarStorageNode *pNode;\r
+\r
+ if ((StoreName == NULL) || (DataTypeName == NULL)) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mVarStoreName, StoreName) == 0) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (pNode == NULL) {\r
+ return VFR_RETURN_UNDEFINED;\r
+ }\r
+\r
+ if (pNode->mStorageInfo.mDataType == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ *DataTypeName = pNode->mStorageInfo.mDataType->mTypeName;\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::GetVarStoreType (\r
+ IN INT8 *StoreName,\r
+ OUT EFI_VFR_VARSTORE_TYPE &VarStoreType\r
+ )\r
+{\r
+ SVfrVarStorageNode *pNode;\r
+\r
+ if (StoreName == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
+ VarStoreType = pNode->mVarStoreType;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
+ VarStoreType = pNode->mVarStoreType;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
+ VarStoreType = pNode->mVarStoreType;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ VarStoreType = EFI_VFR_VARSTORE_INVALID;\r
+ return VFR_RETURN_UNDEFINED;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::GetVarStoreName (\r
+ IN EFI_VARSTORE_ID VarStoreId, \r
+ OUT INT8 **VarStoreName\r
+ )\r
+{\r
+ SVfrVarStorageNode *pNode;\r
+\r
+ if (VarStoreName == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (pNode->mVarStoreId == VarStoreId) {\r
+ *VarStoreName = pNode->mVarStoreName;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ for (pNode = mEfiVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (pNode->mVarStoreId == VarStoreId) {\r
+ *VarStoreName = pNode->mVarStoreName;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ for (pNode = mNameVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (pNode->mVarStoreId == VarStoreId) {\r
+ *VarStoreName = pNode->mVarStoreName;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ *VarStoreName = NULL;\r
+ return VFR_RETURN_UNDEFINED;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::GetEfiVarStoreInfo (\r
+ IN OUT EFI_VARSTORE_INFO *Info\r
+ )\r
+{\r
+ if (Info == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ if (mCurrVarStorageNode == NULL) {\r
+ return VFR_RETURN_GET_EFIVARSTORE_ERROR;\r
+ }\r
+\r
+ Info->mInfo.mVarName = mCurrVarStorageNode->mStorageInfo.mEfiVar.mEfiVarName;\r
+ Info->mVarTotalSize = mCurrVarStorageNode->mStorageInfo.mEfiVar.mEfiVarSize;\r
+ switch (Info->mVarTotalSize) {\r
+ case 1:\r
+ Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_8;\r
+ break;\r
+ case 2:\r
+ Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_16;\r
+ break;\r
+ case 4:\r
+ Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_32;\r
+ break;\r
+ case 8:\r
+ Info->mVarType = EFI_IFR_TYPE_NUM_SIZE_64;\r
+ break;\r
+ default :\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::GetNameVarStoreInfo (\r
+ OUT EFI_VARSTORE_INFO *Info,\r
+ IN UINT32 Index\r
+ )\r
+{\r
+ if (Info == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ if (mCurrVarStorageNode == NULL) {\r
+ return VFR_RETURN_GET_NVVARSTORE_ERROR;\r
+ }\r
+\r
+ Info->mInfo.mVarName = mCurrVarStorageNode->mStorageInfo.mNameSpace.mNameTable[Index];\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDataStorage::BufferVarStoreRequestElementAdd (\r
+ IN INT8 *StoreName,\r
+ IN EFI_VARSTORE_INFO &Info\r
+ )\r
+{\r
+ INT8 NewReqElt[128] = {'\0',};\r
+ INT8 *OldReqElt = NULL;\r
+ SVfrVarStorageNode *pNode = NULL;\r
+ EFI_IFR_TYPE_VALUE Value;\r
+\r
+ for (pNode = mBufferVarStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mVarStoreName, StoreName) == NULL) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (pNode == NULL) {\r
+ return VFR_RETURN_UNDEFINED;\r
+ }\r
+\r
+ gCVfrBufferConfig.Open ();\r
+ Value.u8 = 0;\r
+ if (gCVfrBufferConfig.Write ('a', StoreName, NULL, EFI_IFR_TYPE_NUM_SIZE_8, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+ gCVfrBufferConfig.Close ();\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+SVfrDefaultStoreNode::SVfrDefaultStoreNode (\r
+ IN EFI_IFR_DEFAULTSTORE *ObjBinAddr,\r
+ IN INT8 *RefName, \r
+ IN EFI_STRING_ID DefaultStoreNameId, \r
+ IN UINT16 DefaultId\r
+ )\r
+{\r
+ mObjBinAddr = ObjBinAddr;\r
+\r
+ if (RefName != NULL) {\r
+ mRefName = new INT8[strlen (RefName) + 1];\r
+ strcpy (mRefName, RefName);\r
+ } else {\r
+ mRefName = NULL;\r
+ }\r
+\r
+ mNext = NULL;\r
+ mDefaultId = DefaultId;\r
+ mDefaultStoreNameId = DefaultStoreNameId;\r
+}\r
+\r
+SVfrDefaultStoreNode::~SVfrDefaultStoreNode (\r
+ VOID\r
+ )\r
+{\r
+ if (mRefName != NULL) {\r
+ delete mRefName;\r
+ }\r
+}\r
+\r
+CVfrDefaultStore::CVfrDefaultStore (\r
+ VOID\r
+ )\r
+{\r
+ mDefaultStoreList = NULL;\r
+}\r
+\r
+CVfrDefaultStore::~CVfrDefaultStore (\r
+ VOID\r
+ )\r
+{\r
+ SVfrDefaultStoreNode *pTmp = NULL;\r
+\r
+ while (mDefaultStoreList != NULL) {\r
+ pTmp = mDefaultStoreList;\r
+ mDefaultStoreList = mDefaultStoreList->mNext;\r
+ delete pTmp;\r
+ }\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDefaultStore::RegisterDefaultStore (\r
+ IN CHAR8 *ObjBinAddr,\r
+ IN INT8 *RefName,\r
+ IN EFI_STRING_ID DefaultStoreNameId,\r
+ IN UINT16 DefaultId\r
+ )\r
+{\r
+ SVfrDefaultStoreNode *pNode = NULL;\r
+\r
+ if (RefName == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mRefName, RefName) == 0) {\r
+ return VFR_RETURN_REDEFINED;\r
+ }\r
+ }\r
+\r
+ if ((pNode = new SVfrDefaultStoreNode ((EFI_IFR_DEFAULTSTORE *)ObjBinAddr, RefName, DefaultStoreNameId, DefaultId)) == NULL) {\r
+ return VFR_RETURN_OUT_FOR_RESOURCES;\r
+ }\r
+\r
+ pNode->mNext = mDefaultStoreList;\r
+ mDefaultStoreList = pNode;\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+/*\r
+ * assign new reference name or new default store name id only if \r
+ * the original is invalid\r
+ */\r
+EFI_VFR_RETURN_CODE\r
+CVfrDefaultStore::ReRegisterDefaultStoreById (\r
+ IN UINT16 DefaultId,\r
+ IN INT8 *RefName,\r
+ IN EFI_STRING_ID DefaultStoreNameId\r
+ )\r
+{\r
+ SVfrDefaultStoreNode *pNode = NULL;\r
+\r
+ for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (pNode->mDefaultId == DefaultId) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (pNode == NULL) {\r
+ return VFR_RETURN_UNDEFINED;\r
+ } else {\r
+ if (pNode->mDefaultStoreNameId == EFI_STRING_ID_INVALID) {\r
+ pNode->mDefaultStoreNameId = DefaultStoreNameId;\r
+ if (pNode->mObjBinAddr != NULL) {\r
+ pNode->mObjBinAddr->DefaultName = DefaultStoreNameId;\r
+ }\r
+ } else {\r
+ return VFR_RETURN_REDEFINED;\r
+ }\r
+\r
+ if (RefName != NULL) {\r
+ delete pNode->mRefName;\r
+ pNode->mRefName = new INT8[strlen (RefName) + 1];\r
+ if (pNode->mRefName != NULL) {\r
+ strcpy (pNode->mRefName, RefName);\r
+ }\r
+ }\r
+ }\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+BOOLEAN\r
+CVfrDefaultStore::DefaultIdRegistered (\r
+ IN UINT16 DefaultId\r
+ )\r
+{\r
+ SVfrDefaultStoreNode *pNode = NULL;\r
+\r
+ for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (pNode->mDefaultId == DefaultId) {\r
+ return TRUE;\r
+ }\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDefaultStore::GetDefaultId (\r
+ IN INT8 *RefName,\r
+ OUT UINT16 *DefaultId\r
+ )\r
+{\r
+ SVfrDefaultStoreNode *pTmp = NULL;\r
+\r
+ if (DefaultId == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ for (pTmp = mDefaultStoreList; pTmp != NULL; pTmp = pTmp->mNext) {\r
+ if (strcmp (pTmp->mRefName, RefName) == 0) {\r
+ *DefaultId = pTmp->mDefaultId;\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ return VFR_RETURN_UNDEFINED;\r
+}\r
+\r
+STATIC\r
+EFI_VFR_RETURN_CODE\r
+AltCfgItemPrintToBuffer (\r
+ IN INT8 *NewAltCfg, \r
+ IN EFI_VARSTORE_INFO Info, \r
+ IN UINT8 Type,\r
+ IN EFI_IFR_TYPE_VALUE Value\r
+ )\r
+{\r
+ UINT32 Index;\r
+ UINT8 *BufChar = NULL;\r
+ UINT32 Count = 0;\r
+\r
+ if (NewAltCfg != NULL) {\r
+ Count = sprintf (\r
+ NewAltCfg, \r
+ "&OFFSET=%x&WIDTH=%x&VALUE=", \r
+ Info.mInfo.mVarOffset, \r
+ Info.mVarTotalSize\r
+ );\r
+ NewAltCfg += Count;\r
+\r
+ switch (Type) {\r
+ case EFI_IFR_TYPE_NUM_SIZE_8 :\r
+ Count = sprintf (NewAltCfg, "%x", Value.u8);\r
+ NewAltCfg += Count;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_16 :\r
+ Count = sprintf (NewAltCfg, "%x", Value.u16);\r
+ NewAltCfg += Count;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_32 :\r
+ Count = sprintf (NewAltCfg, "%x", Value.u32);\r
+ NewAltCfg += Count;\r
+ break;\r
+ case EFI_IFR_TYPE_NUM_SIZE_64 :\r
+ Count = sprintf (NewAltCfg, "%x", Value.u64);\r
+ NewAltCfg += Count;\r
+ break;\r
+ case EFI_IFR_TYPE_BOOLEAN :\r
+ Count = sprintf (NewAltCfg, "%x", Value.b);\r
+ NewAltCfg += Count;\r
+ break;\r
+ case EFI_IFR_TYPE_TIME :\r
+#if 1\r
+ Count = sprintf (NewAltCfg, "%x", *((UINT32 *)(&Value.time)));\r
+ NewAltCfg += Count;\r
+#else\r
+ BufChar = (UINT8 *)&Value.time;\r
+ for (Index = 0; Index < sizeof(EFI_HII_TIME); Index++) {\r
+ Count = sprintf (NewAltCfg, "%02x", (UINT8)BufChar[Index]);\r
+ NewAltCfg += Count;\r
+ }\r
+#endif\r
+ break;\r
+ case EFI_IFR_TYPE_DATE :\r
+#if 1\r
+ Count = sprintf (NewAltCfg, "%x", *((UINT32 *)(&Value.date)));\r
+ NewAltCfg += Count;\r
+#else\r
+ BufChar = (UINT8 *)&Value.date;\r
+ for (Index = 0; Index < sizeof(EFI_HII_DATE); Index++) {\r
+ Count = sprintf (NewAltCfg, "%02x", (UINT8)BufChar[Index]);\r
+ NewAltCfg += Count;\r
+ }\r
+#endif\r
+ break;\r
+ case EFI_IFR_TYPE_STRING :\r
+ Count = sprintf (NewAltCfg, "%x", Value.string);\r
+ NewAltCfg += Count;\r
+ break;\r
+ case EFI_IFR_TYPE_OTHER :\r
+ return VFR_RETURN_UNSUPPORTED;\r
+ }\r
+ }\r
+\r
+ return VFR_RETURN_FATAL_ERROR; \r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrDefaultStore::BufferVarStoreAltConfigAdd (\r
+ IN EFI_VARSTORE_ID DefaultId,\r
+ IN EFI_VARSTORE_INFO &Info,\r
+ IN INT8 *VarStoreName,\r
+ IN UINT8 Type,\r
+ IN EFI_IFR_TYPE_VALUE Value\r
+ )\r
+{\r
+ SVfrDefaultStoreNode *pNode = NULL;\r
+ INT8 NewAltCfg[2 * 2 * sizeof (UINT16) + 1] = {0,};\r
+\r
+ if (VarStoreName == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ for (pNode = mDefaultStoreList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (pNode->mDefaultId == DefaultId) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (pNode == NULL) {\r
+ return VFR_RETURN_UNDEFINED;\r
+ }\r
+\r
+ gCVfrBufferConfig.Open ();\r
+\r
+ sprintf (NewAltCfg, "%04x", pNode->mDefaultId);\r
+ if ((gCVfrBufferConfig.Select(VarStoreName) == 0) && \r
+ (gCVfrBufferConfig.Select(VarStoreName, NewAltCfg) != 0)) {\r
+ if (gCVfrBufferConfig.Write ('i', VarStoreName, NewAltCfg, Type, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {\r
+ goto WriteError;\r
+ }\r
+ }\r
+\r
+ if (gCVfrBufferConfig.Write ('a', VarStoreName, NULL, Type, Info.mInfo.mVarOffset, Info.mVarTotalSize, Value) != 0) {\r
+ goto WriteError;\r
+ }\r
+\r
+ gCVfrBufferConfig.Close ();\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+\r
+WriteError:\r
+ gCVfrBufferConfig.Close ();\r
+ return VFR_RETURN_FATAL_ERROR;\r
+}\r
+\r
+SVfrRuleNode::SVfrRuleNode (\r
+ IN INT8 *RuleName, \r
+ IN UINT8 RuleId\r
+ )\r
+{\r
+ if (RuleName != NULL) {\r
+ mRuleName = new INT8[strlen (RuleName) + 1];\r
+ strcpy (mRuleName, RuleName);\r
+ } else {\r
+ mRuleName = NULL;\r
+ }\r
+\r
+ mNext = NULL;\r
+ mRuleId = RuleId;\r
+}\r
+\r
+SVfrRuleNode::~SVfrRuleNode (\r
+ VOID\r
+ )\r
+{\r
+ if (mRuleName != NULL) {\r
+ delete mRuleName;\r
+ }\r
+}\r
+\r
+CVfrRulesDB::CVfrRulesDB ()\r
+{\r
+ mRuleList = NULL;\r
+ mFreeRuleId = EFI_VARSTORE_ID_START;\r
+}\r
+\r
+CVfrRulesDB::~CVfrRulesDB ()\r
+{\r
+ SVfrRuleNode *pNode;\r
+\r
+ while(mRuleList != NULL) {\r
+ pNode = mRuleList;\r
+ mRuleList = mRuleList->mNext;\r
+ delete pNode;\r
+ }\r
+}\r
+\r
+VOID\r
+CVfrRulesDB::RegisterRule (\r
+ IN INT8 *RuleName\r
+ )\r
+{\r
+ SVfrRuleNode *pNew;\r
+\r
+ if (RuleName == NULL) {\r
+ return ;\r
+ }\r
+\r
+ if ((pNew = new SVfrRuleNode (RuleName, mFreeRuleId)) == NULL) {\r
+ return ;\r
+ }\r
+\r
+ mFreeRuleId++;\r
+\r
+ pNew->mNext = mRuleList;\r
+ mRuleList = pNew;\r
+}\r
+\r
+UINT8\r
+CVfrRulesDB::GetRuleId (\r
+ IN INT8 *RuleName\r
+ )\r
+{\r
+ SVfrRuleNode *pNode;\r
+\r
+ if (RuleName == NULL) {\r
+ return EFI_RULE_ID_INVALID;\r
+ }\r
+\r
+ for (pNode = mRuleList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mRuleName, RuleName) == 0) {\r
+ return pNode->mRuleId;\r
+ }\r
+ }\r
+\r
+ return EFI_RULE_ID_INVALID;\r
+}\r
+\r
+CVfrRulesDB gCVfrRulesDB;\r
+\r
+EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (\r
+ VOID\r
+ )\r
+{\r
+ mVarStoreId = EFI_VARSTORE_ID_INVALID;\r
+ mInfo.mVarName = EFI_STRING_ID_INVALID;\r
+ mInfo.mVarOffset = EFI_VAROFFSET_INVALID;\r
+ mVarType = EFI_IFR_TYPE_OTHER;\r
+ mVarTotalSize = 0;\r
+}\r
+\r
+EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (\r
+ IN EFI_VARSTORE_INFO &Info\r
+ )\r
+{\r
+ mVarStoreId = Info.mVarStoreId;\r
+ mInfo.mVarName = Info.mInfo.mVarName;\r
+ mInfo.mVarOffset = Info.mInfo.mVarOffset;\r
+ mVarType = Info.mVarType;\r
+ mVarTotalSize = Info.mVarTotalSize;\r
+}\r
+\r
+BOOLEAN \r
+EFI_VARSTORE_INFO::operator == (\r
+ IN EFI_VARSTORE_INFO *Info\r
+ )\r
+{\r
+ if ((mVarStoreId == Info->mVarStoreId) &&\r
+ (mInfo.mVarName == Info->mInfo.mVarName) &&\r
+ (mInfo.mVarOffset == Info->mInfo.mVarOffset) &&\r
+ (mVarType == Info->mVarType) &&\r
+ (mVarTotalSize == Info->mVarTotalSize)) {\r
+ return TRUE;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo;\r
+\r
+EFI_QUESTION_ID\r
+CVfrQuestionDB::GetFreeQuestionId (\r
+ VOID\r
+ )\r
+{\r
+ UINT32 Index, Mask, Offset;\r
+\r
+ for (Index = 0; Index < EFI_FREE_QUESTION_ID_BITMAP_SIZE; Index++) {\r
+ if (mFreeQIdBitMap[Index] != 0xFFFFFFFF) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ for (Offset = 0, Mask = 0x80000000; Mask != 0; Mask >>= 1, Offset++) {\r
+ if ((mFreeQIdBitMap[Index] & Mask) == 0) {\r
+ mFreeQIdBitMap[Index] |= Mask;\r
+ return (EFI_QUESTION_ID)((Index << EFI_BITS_SHIFT_PER_UINT32) + Offset);\r
+ }\r
+ }\r
+\r
+ return EFI_QUESTION_ID_INVALID;\r
+}\r
+\r
+BOOLEAN\r
+CVfrQuestionDB::ChekQuestionIdFree (\r
+ IN EFI_QUESTION_ID QId\r
+ )\r
+{\r
+ UINT32 Index = (QId / EFI_BITS_PER_UINT32);\r
+ UINT32 Offset = (QId % EFI_BITS_PER_UINT32);\r
+\r
+ return (mFreeQIdBitMap[Index] & (0x80000000 >> Offset)) == 0;\r
+}\r
+\r
+VOID \r
+CVfrQuestionDB::MarkQuestionIdUsed (\r
+ IN EFI_QUESTION_ID QId\r
+ )\r
+{\r
+ UINT32 Index = (QId / EFI_BITS_PER_UINT32);\r
+ UINT32 Offset = (QId % EFI_BITS_PER_UINT32);\r
+\r
+ mFreeQIdBitMap[Index] |= (0x80000000 >> Offset);\r
+}\r
+\r
+VOID \r
+CVfrQuestionDB::MarkQuestionIdUnused (\r
+ IN EFI_QUESTION_ID QId\r
+ )\r
+{\r
+ UINT32 Index = (QId / EFI_BITS_PER_UINT32);\r
+ UINT32 Offset = (QId % EFI_BITS_PER_UINT32);\r
+\r
+ mFreeQIdBitMap[Index] &= ~(0x80000000 >> Offset);\r
+}\r
+\r
+SVfrQuestionNode::SVfrQuestionNode (\r
+ IN INT8 *Name,\r
+ IN INT8 *VarIdStr,\r
+ IN UINT32 BitMask\r
+ )\r
+{\r
+ mName = NULL;\r
+ mVarIdStr = NULL;\r
+ mQuestionId = EFI_QUESTION_ID_INVALID;\r
+ mBitMask = BitMask;\r
+ mNext = NULL;\r
+\r
+ if (Name == NULL) {\r
+ mName = new INT8[strlen ("$DEFAULT") + 1];\r
+ strcpy (mName, "$DEFAULT");\r
+ } else {\r
+ mName = new INT8[strlen (Name) + 1];\r
+ strcpy (mName, Name);\r
+ }\r
+\r
+ if (VarIdStr != NULL) {\r
+ mVarIdStr = new INT8[strlen (VarIdStr) + 1];\r
+ strcpy (mVarIdStr, VarIdStr);\r
+ } else {\r
+ mVarIdStr = new INT8[strlen ("$") + 1];\r
+ strcpy (mVarIdStr, "$");\r
+ }\r
+}\r
+\r
+SVfrQuestionNode::~SVfrQuestionNode (\r
+ VOID\r
+ )\r
+{\r
+ if (mName != NULL) {\r
+ delete mName;\r
+ }\r
+\r
+ if (mVarIdStr != NULL) {\r
+ delete mVarIdStr;\r
+ }\r
+}\r
+\r
+CVfrQuestionDB::CVfrQuestionDB ()\r
+{\r
+ UINT32 Index;\r
+\r
+ for (Index = 0; Index < EFI_FREE_QUESTION_ID_BITMAP_SIZE; Index++) {\r
+ mFreeQIdBitMap[Index] = 0;\r
+ }\r
+\r
+ // Question ID 0 is reserved.\r
+ mFreeQIdBitMap[0] = 0x80000000;\r
+ mQuestionList = NULL;\r
+}\r
+\r
+CVfrQuestionDB::~CVfrQuestionDB ()\r
+{\r
+ SVfrQuestionNode *pNode;\r
+\r
+ while (mQuestionList != NULL) {\r
+ pNode = mQuestionList;\r
+ mQuestionList = mQuestionList->mNext;\r
+ delete pNode;\r
+ }\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrQuestionDB::RegisterQuestion (\r
+ IN INT8 *Name,\r
+ IN INT8 *VarIdStr,\r
+ IN OUT EFI_QUESTION_ID &QuestionId\r
+ )\r
+{\r
+ SVfrQuestionNode *pNode = NULL;\r
+\r
+ if ((Name != NULL) && (FindQuestion(Name) == VFR_RETURN_SUCCESS)) {\r
+ return VFR_RETURN_REDEFINED;\r
+ }\r
+\r
+ if ((pNode = new SVfrQuestionNode (Name, VarIdStr)) == NULL) {\r
+ return VFR_RETURN_OUT_FOR_RESOURCES;\r
+ }\r
+\r
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
+ QuestionId = GetFreeQuestionId ();\r
+ } else {\r
+ if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
+ delete pNode;\r
+ return VFR_RETURN_QUESTIONID_REDEFINED;\r
+ }\r
+ MarkQuestionIdUsed (QuestionId);\r
+ }\r
+ pNode->mQuestionId = QuestionId;\r
+\r
+ pNode->mNext = mQuestionList;\r
+ mQuestionList = pNode;\r
+\r
+ gCFormPkg.DoPendingAssign (VarIdStr, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+VOID\r
+CVfrQuestionDB::RegisterOldDateQuestion (\r
+ IN INT8 *YearVarId, \r
+ IN INT8 *MonthVarId, \r
+ IN INT8 *DayVarId, \r
+ IN OUT EFI_QUESTION_ID &QuestionId\r
+ )\r
+{\r
+ SVfrQuestionNode *pNode[3] = {NULL, };\r
+ UINT32 Index;\r
+\r
+ if ((YearVarId == NULL) || (MonthVarId == NULL) || (DayVarId == NULL)) {\r
+ return;\r
+ }\r
+\r
+ if ((pNode[0] = new SVfrQuestionNode (NULL, YearVarId, DATE_YEAR_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+ if ((pNode[1] = new SVfrQuestionNode (NULL, MonthVarId, DATE_MONTH_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+ if ((pNode[2] = new SVfrQuestionNode (NULL, DayVarId, DATE_DAY_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+\r
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
+ QuestionId = GetFreeQuestionId ();\r
+ } else {\r
+ if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
+ goto Err;\r
+ }\r
+ MarkQuestionIdUsed (QuestionId);\r
+ }\r
+\r
+ pNode[0]->mQuestionId = QuestionId;\r
+ pNode[1]->mQuestionId = QuestionId;\r
+ pNode[2]->mQuestionId = QuestionId;\r
+ pNode[0]->mNext = pNode[1];\r
+ pNode[1]->mNext = pNode[2];\r
+ pNode[2]->mNext = mQuestionList;\r
+ mQuestionList = pNode[0];\r
+\r
+ gCFormPkg.DoPendingAssign (YearVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+ gCFormPkg.DoPendingAssign (MonthVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+ gCFormPkg.DoPendingAssign (DayVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+\r
+ return;\r
+\r
+Err:\r
+ for (Index = 0; Index < 3; Index++) {\r
+ if (pNode[Index] != NULL) {\r
+ delete pNode[Index];\r
+ }\r
+ }\r
+ QuestionId = EFI_QUESTION_ID_INVALID;\r
+}\r
+\r
+VOID\r
+CVfrQuestionDB::RegisterNewDateQuestion (\r
+ IN INT8 *Name,\r
+ IN INT8 *BaseVarId, \r
+ IN OUT EFI_QUESTION_ID &QuestionId\r
+ )\r
+{\r
+ SVfrQuestionNode *pNode[3] = {NULL, };\r
+ UINT32 Len;\r
+ INT8 *VarIdStr[3] = {NULL, };\r
+ INT8 Index;\r
+\r
+ if (BaseVarId == NULL) {\r
+ return;\r
+ }\r
+\r
+ Len = strlen (BaseVarId);\r
+\r
+ VarIdStr[0] = new INT8[Len + strlen (".Year") + 1];\r
+ if (VarIdStr[0] != NULL) {\r
+ strcpy (VarIdStr[0], BaseVarId);\r
+ strcat (VarIdStr[0], ".Year");\r
+ }\r
+ VarIdStr[1] = new INT8[Len + strlen (".Month") + 1];\r
+ if (VarIdStr[1] != NULL) {\r
+ strcpy (VarIdStr[1], BaseVarId);\r
+ strcat (VarIdStr[1], ".Month");\r
+ }\r
+ VarIdStr[2] = new INT8[Len + strlen (".Day") + 1];\r
+ if (VarIdStr[2] != NULL) {\r
+ strcpy (VarIdStr[2], BaseVarId);\r
+ strcat (VarIdStr[2], ".Day");\r
+ }\r
+\r
+ if ((pNode[0] = new SVfrQuestionNode (Name, VarIdStr[0], DATE_YEAR_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+ if ((pNode[1] = new SVfrQuestionNode (Name, VarIdStr[1], DATE_MONTH_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+ if ((pNode[2] = new SVfrQuestionNode (Name, VarIdStr[2], DATE_DAY_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+\r
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
+ QuestionId = GetFreeQuestionId ();\r
+ } else {\r
+ if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
+ goto Err;\r
+ }\r
+ MarkQuestionIdUsed (QuestionId);\r
+ }\r
+\r
+ pNode[0]->mQuestionId = QuestionId;\r
+ pNode[1]->mQuestionId = QuestionId;\r
+ pNode[2]->mQuestionId = QuestionId;\r
+ pNode[0]->mNext = pNode[1];\r
+ pNode[1]->mNext = pNode[2];\r
+ pNode[2]->mNext = mQuestionList;\r
+ mQuestionList = pNode[0];\r
+\r
+ for (Index = 0; Index < 3; Index++) {\r
+ if (VarIdStr[Index] != NULL) {\r
+ delete VarIdStr[Index];\r
+ }\r
+ }\r
+\r
+ gCFormPkg.DoPendingAssign (VarIdStr[0], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+ gCFormPkg.DoPendingAssign (VarIdStr[1], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+ gCFormPkg.DoPendingAssign (VarIdStr[2], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+\r
+ return;\r
+\r
+Err:\r
+ for (Index = 0; Index < 3; Index++) {\r
+ if (pNode[Index] != NULL) {\r
+ delete pNode[Index];\r
+ }\r
+\r
+ if (VarIdStr[Index] != NULL) {\r
+ delete VarIdStr[Index];\r
+ }\r
+ }\r
+}\r
+\r
+VOID\r
+CVfrQuestionDB::RegisterOldTimeQuestion (\r
+ IN INT8 *HourVarId, \r
+ IN INT8 *MinuteVarId, \r
+ IN INT8 *SecondVarId, \r
+ IN OUT EFI_QUESTION_ID &QuestionId\r
+ )\r
+{\r
+ SVfrQuestionNode *pNode[3] = {NULL, };\r
+ UINT32 Index;\r
+\r
+ if ((HourVarId == NULL) || (MinuteVarId == NULL) || (SecondVarId == NULL)) {\r
+ return;\r
+ }\r
+\r
+ if ((pNode[0] = new SVfrQuestionNode (NULL, HourVarId, TIME_HOUR_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+ if ((pNode[1] = new SVfrQuestionNode (NULL, MinuteVarId, TIME_MINUTE_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+ if ((pNode[2] = new SVfrQuestionNode (NULL, SecondVarId, TIME_SECOND_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+\r
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
+ QuestionId = GetFreeQuestionId ();\r
+ } else {\r
+ if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
+ goto Err;\r
+ }\r
+ MarkQuestionIdUsed (QuestionId);\r
+ }\r
+\r
+ pNode[0]->mQuestionId = QuestionId;\r
+ pNode[1]->mQuestionId = QuestionId;\r
+ pNode[2]->mQuestionId = QuestionId;\r
+ pNode[0]->mNext = pNode[1];\r
+ pNode[1]->mNext = pNode[2];\r
+ pNode[2]->mNext = mQuestionList;\r
+ mQuestionList = pNode[0];\r
+\r
+ gCFormPkg.DoPendingAssign (HourVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+ gCFormPkg.DoPendingAssign (MinuteVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+ gCFormPkg.DoPendingAssign (SecondVarId, (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+\r
+ return;\r
+\r
+Err:\r
+ for (Index = 0; Index < 3; Index++) {\r
+ if (pNode[Index] != NULL) {\r
+ delete pNode[Index];\r
+ }\r
+ }\r
+ QuestionId = EFI_QUESTION_ID_INVALID;\r
+}\r
+\r
+VOID\r
+CVfrQuestionDB::RegisterNewTimeQuestion (\r
+ IN INT8 *Name,\r
+ IN INT8 *BaseVarId,\r
+ IN OUT EFI_QUESTION_ID &QuestionId\r
+ )\r
+{\r
+ SVfrQuestionNode *pNode[3] = {NULL, };\r
+ UINT32 Len;\r
+ INT8 *VarIdStr[3] = {NULL, };\r
+ INT8 Index;\r
+\r
+ if (BaseVarId == NULL) {\r
+ return;\r
+ }\r
+\r
+ Len = strlen (BaseVarId);\r
+\r
+ VarIdStr[0] = new INT8[Len + strlen (".Hour") + 1];\r
+ if (VarIdStr[0] != NULL) {\r
+ strcpy (VarIdStr[0], BaseVarId);\r
+ strcat (VarIdStr[0], ".Hour");\r
+ }\r
+ VarIdStr[1] = new INT8[Len + strlen (".Minute") + 1];\r
+ if (VarIdStr[1] != NULL) {\r
+ strcpy (VarIdStr[1], BaseVarId);\r
+ strcat (VarIdStr[1], ".Minute");\r
+ }\r
+ VarIdStr[2] = new INT8[Len + strlen (".Second") + 1];\r
+ if (VarIdStr[2] != NULL) {\r
+ strcpy (VarIdStr[2], BaseVarId);\r
+ strcat (VarIdStr[2], ".Second");\r
+ }\r
+\r
+ if ((pNode[0] = new SVfrQuestionNode (Name, VarIdStr[0], TIME_HOUR_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+ if ((pNode[1] = new SVfrQuestionNode (Name, VarIdStr[1], TIME_MINUTE_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+ if ((pNode[2] = new SVfrQuestionNode (Name, VarIdStr[2], TIME_SECOND_BITMASK)) == NULL) {\r
+ goto Err;\r
+ }\r
+\r
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
+ QuestionId = GetFreeQuestionId ();\r
+ } else {\r
+ if (ChekQuestionIdFree (QuestionId) == FALSE) {\r
+ goto Err;\r
+ }\r
+ MarkQuestionIdUsed (QuestionId);\r
+ }\r
+\r
+ pNode[0]->mQuestionId = QuestionId;\r
+ pNode[1]->mQuestionId = QuestionId;\r
+ pNode[2]->mQuestionId = QuestionId;\r
+ pNode[0]->mNext = pNode[1];\r
+ pNode[1]->mNext = pNode[2];\r
+ pNode[2]->mNext = mQuestionList;\r
+ mQuestionList = pNode[0];\r
+\r
+ for (Index = 0; Index < 3; Index++) {\r
+ if (VarIdStr[Index] != NULL) {\r
+ delete VarIdStr[Index];\r
+ }\r
+ }\r
+\r
+ gCFormPkg.DoPendingAssign (VarIdStr[0], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+ gCFormPkg.DoPendingAssign (VarIdStr[1], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+ gCFormPkg.DoPendingAssign (VarIdStr[2], (VOID *)&QuestionId, sizeof(EFI_QUESTION_ID));\r
+\r
+ return;\r
+\r
+Err:\r
+ for (Index = 0; Index < 3; Index++) {\r
+ if (pNode[Index] != NULL) {\r
+ delete pNode[Index];\r
+ }\r
+\r
+ if (VarIdStr[Index] != NULL) {\r
+ delete VarIdStr[Index];\r
+ }\r
+ }\r
+}\r
+\r
+EFI_VFR_RETURN_CODE\r
+CVfrQuestionDB::UpdateQuestionId (\r
+ IN EFI_QUESTION_ID QId,\r
+ IN EFI_QUESTION_ID NewQId\r
+ )\r
+{\r
+ SVfrQuestionNode *pNode = NULL;\r
+\r
+ if (ChekQuestionIdFree (NewQId) == FALSE) {\r
+ return VFR_RETURN_REDEFINED;\r
+ }\r
+\r
+ for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (pNode->mQuestionId == QId) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (pNode == NULL) {\r
+ return VFR_RETURN_UNDEFINED;\r
+ }\r
+\r
+ MarkQuestionIdUnused (QId);\r
+ pNode->mQuestionId = NewQId;\r
+ MarkQuestionIdUsed (NewQId);\r
+\r
+ gCFormPkg.DoPendingAssign (pNode->mVarIdStr, (VOID *)&NewQId, sizeof(EFI_QUESTION_ID));\r
+\r
+ return VFR_RETURN_SUCCESS;\r
+}\r
+\r
+VOID \r
+CVfrQuestionDB::GetQuestionId (\r
+ IN INT8 *Name,\r
+ IN INT8 *VarIdStr,\r
+ OUT EFI_QUESTION_ID &QuestionId,\r
+ OUT UINT32 &BitMask\r
+ )\r
+{\r
+ SVfrQuestionNode *pNode;\r
+\r
+ QuestionId = EFI_QUESTION_ID_INVALID;\r
+ BitMask = 0x00000000;\r
+\r
+ if ((Name == NULL) && (VarIdStr == NULL)) {\r
+ return ;\r
+ }\r
+\r
+ for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (Name != NULL) {\r
+ if (strcmp (pNode->mName, Name) != 0) {\r
+ continue;\r
+ }\r
+ }\r
+\r
+ if (VarIdStr != NULL) {\r
+ if (strcmp (pNode->mVarIdStr, VarIdStr) != 0) {\r
+ continue;\r
+ }\r
+ }\r
+\r
+ QuestionId = pNode->mQuestionId;\r
+ BitMask = pNode->mBitMask;\r
+ break;\r
+ }\r
+\r
+ return ;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE \r
+CVfrQuestionDB::FindQuestion (\r
+ IN EFI_QUESTION_ID QuestionId\r
+ )\r
+{\r
+ SVfrQuestionNode *pNode;\r
+\r
+ if (QuestionId == EFI_QUESTION_ID_INVALID) {\r
+ return VFR_RETURN_INVALID_PARAMETER;\r
+ }\r
+\r
+ for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (pNode->mQuestionId == QuestionId) {\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ return VFR_RETURN_UNDEFINED;\r
+}\r
+\r
+EFI_VFR_RETURN_CODE \r
+CVfrQuestionDB::FindQuestion (\r
+ IN INT8 *Name\r
+ )\r
+{\r
+ SVfrQuestionNode *pNode;\r
+\r
+ if (Name == NULL) {\r
+ return VFR_RETURN_FATAL_ERROR;\r
+ }\r
+\r
+ for (pNode = mQuestionList; pNode != NULL; pNode = pNode->mNext) {\r
+ if (strcmp (pNode->mName, Name) == 0) {\r
+ return VFR_RETURN_SUCCESS;\r
+ }\r
+ }\r
+\r
+ return VFR_RETURN_UNDEFINED;\r
+}\r
+\r