3 #include "VfrUtilityLib.h"
4 #include "VfrFormPkg.h"
7 CVfrBinaryOutput::WriteLine (
17 if ((pFile
== NULL
) || (LineHeader
== NULL
) || (BlkBuf
== NULL
)) {
21 for (Index
= 0; Index
< BlkSize
; Index
++) {
22 if ((Index
% LineBytes
) == 0) {
23 fprintf (pFile
, "\n%s", LineHeader
);
25 fprintf (pFile
, "0x%02X, ", (UINT8
)BlkBuf
[Index
]);
30 CVfrBinaryOutput::WriteEnd (
40 if ((BlkSize
== 0) || (pFile
== NULL
) || (LineHeader
== NULL
) || (BlkBuf
== NULL
)) {
44 for (Index
= 0; Index
< BlkSize
- 1; Index
++) {
45 if ((Index
% LineBytes
) == 0) {
46 fprintf (pFile
, "\n%s", LineHeader
);
48 fprintf (pFile
, "0x%02X, ", (UINT8
)BlkBuf
[Index
]);
51 if ((Index
% LineBytes
) == 0) {
52 fprintf (pFile
, "\n%s", LineHeader
);
54 fprintf (pFile
, "0x%02X\n", (UINT8
)BlkBuf
[Index
]);
57 SConfigInfo::SConfigInfo (
61 IN EFI_IFR_TYPE_VALUE Value
65 mWidth
= (UINT16
)Width
;
66 mValue
= new UINT8
[mWidth
];
72 case EFI_IFR_TYPE_NUM_SIZE_8
:
73 memcpy (mValue
, &Value
.u8
, mWidth
);
75 case EFI_IFR_TYPE_NUM_SIZE_16
:
76 memcpy (mValue
, &Value
.u16
, mWidth
);
78 case EFI_IFR_TYPE_NUM_SIZE_32
:
79 memcpy (mValue
, &Value
.u32
, mWidth
);
81 case EFI_IFR_TYPE_NUM_SIZE_64
:
82 memcpy (mValue
, &Value
.u64
, mWidth
);
84 case EFI_IFR_TYPE_BOOLEAN
:
85 memcpy (mValue
, &Value
.b
, mWidth
);
87 case EFI_IFR_TYPE_TIME
:
88 memcpy (mValue
, &Value
.time
, mWidth
);
90 case EFI_IFR_TYPE_DATE
:
91 memcpy (mValue
, &Value
.date
, mWidth
);
93 case EFI_IFR_TYPE_STRING
:
94 memcpy (mValue
, &Value
.string
, mWidth
);
96 case EFI_IFR_TYPE_OTHER
:
101 SConfigInfo::~SConfigInfo (
105 BUFFER_SAFE_FREE (mValue
);
108 SConfigItem::SConfigItem (
119 if ((mId
= new INT8
[strlen (Id
) + 1]) != NULL
) {
125 if ((mInfo
= new INT8
[strlen (Info
) + 1]) != NULL
) {
126 strcpy (mInfo
, Info
);
131 SConfigItem::SConfigItem (
137 IN EFI_IFR_TYPE_VALUE Value
146 if ((mId
= new INT8
[strlen (Id
) + 1]) != NULL
) {
152 if ((mInfo
= new INT8
[strlen (Info
) + 1]) != NULL
) {
153 strcpy (mInfo
, Info
);
157 mInfoStrList
= new SConfigInfo(Type
, Offset
, Width
, Value
);
160 SConfigItem::~SConfigItem (
166 BUFFER_SAFE_FREE (mId
);
167 BUFFER_SAFE_FREE (mInfo
);
168 while (mInfoStrList
!= NULL
) {
170 mInfoStrList
= mInfoStrList
->mNext
;
172 BUFFER_SAFE_FREE (Info
);
177 CVfrBufferConfig::Register (
184 if (Select (Id
) == 0) {
188 if ((pNew
= new SConfigItem (Id
, Info
)) == NULL
) {
191 if (mItemListHead
== NULL
) {
192 mItemListHead
= pNew
;
193 mItemListTail
= pNew
;
195 mItemListTail
->mNext
= pNew
;
196 mItemListTail
= pNew
;
204 CVfrBufferConfig::Open (
208 mItemListPos
= mItemListHead
;
212 CVfrBufferConfig::Eof(
216 return (mItemListPos
== NULL
) ? TRUE
: FALSE
;
220 CVfrBufferConfig::Select (
228 mItemListPos
= mItemListHead
;
231 for (p
= mItemListHead
; p
!= NULL
; p
= p
->mNext
) {
232 if (strcmp (p
->mId
, Id
) != 0) {
236 if ((p
->mInfo
!= NULL
) && (Info
!= NULL
)) {
237 if (strcmp (p
->mInfo
, Info
) != 0) {
251 CVfrBufferConfig::Write (
258 IN EFI_IFR_TYPE_VALUE Value
267 if (Select (Id
) == 0) {
268 if((pInfo
= new SConfigInfo (Type
, Offset
, Width
, Value
)) == NULL
) {
271 pInfo
->mNext
= mItemListPos
->mInfoStrList
;
272 mItemListPos
->mInfoStrList
= pInfo
;
274 if ((pItem
= new SConfigItem (Id
, Info
, Type
, Offset
, Width
, Value
)) == NULL
) {
277 if (mItemListHead
== NULL
) {
278 mItemListHead
= pItem
;
279 mItemListTail
= pItem
;
281 mItemListTail
->mNext
= pItem
;
282 mItemListTail
= pItem
;
284 mItemListPos
= pItem
;
289 if ((Ret
= Select (Id
)) != 0) {
293 if (mItemListHead
== mItemListPos
) {
294 mItemListHead
= mItemListPos
->mNext
;
299 for (pItem
= mItemListHead
; pItem
->mNext
!= mItemListPos
; pItem
= pItem
->mNext
)
302 pItem
->mNext
= mItemListPos
->mNext
;
303 if (mItemListTail
== mItemListPos
) {
304 mItemListTail
= pItem
;
307 mItemListPos
= pItem
->mNext
;
310 case 'i' : // set info
311 if ((Ret
= Select (Id
)) != 0) {
314 if (mItemListPos
->mInfo
!= NULL
) {
315 delete mItemListPos
->mInfo
;
317 mItemListPos
->mInfo
= NULL
;
319 if ((mItemListPos
->mInfo
= new INT8
[strlen (Info
) + 1]) == NULL
) {
322 strcpy (mItemListPos
->mInfo
, Info
);
335 CVfrBufferConfig::ReadId (
340 if (mInfoStrItemListPos
== NULL
) {
341 return 1; // end read or some error occur
345 *Id
= new INT8 (strlen (mInfoStrItemListPos
->mId
+ 1));
346 strcpy (*Id
, mInfoStrItemListPos
->mId
);
349 *Info
= new INT8 (strlen (mInfoStrItemListPos
->mInfo
+ 1));
350 strcpy (*Info
, mInfoStrItemListPos
->mInfo
);
357 CVfrBufferConfig::ReadInfo (
360 IN OUT UINT32
&Number
,
372 if ((ret
= Select (Id
)) != 0) {
377 if (mInfoStrItemListPos
== NULL
) {
378 return 1; // end read or some error occur
381 p
= mInfoStrItemListPos
->mInfoStrList
;
382 for (idx
= 0; (idx
< Index
) && (p
!= NULL
); idx
++) {
389 if (Offset
!= NULL
) {
399 while (num
< Number
) {
400 if (Offset
!= NULL
) {
401 strcat (Offset
, p
->mOffset
);
404 strcat (Width
, p
->mWidth
);
407 strcat (Value
, p
->mValue
);
411 if ((p
= p
->mNext
) == NULL
) {
421 CVfrBufferConfig::ReadNext (
425 if (mItemListPos
!= NULL
) {
426 mItemListPos
= mItemListPos
->mNext
;
432 CVfrBufferConfig::Close (
439 #define BYTES_PRE_LINE 0x10
442 CVfrBufferConfig::OutputCFile (
447 CVfrBinaryOutput Output
;
456 for (Item
= mItemListHead
; Item
!= NULL
; Item
= Item
->mNext
) {
457 if (Item
->mInfoStrList
!= NULL
) {
458 fprintf (pFile
, "\nunsigned char %s%sDefault%04x[] = {", BaseName
, Item
->mId
, Item
->mInfo
);
460 TotalLen
= sizeof (UINT32
);
461 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
462 TotalLen
+= Info
->mWidth
+ sizeof (UINT16
) * 2;
464 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&TotalLen
, sizeof (UINT32
));
466 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
467 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&Info
->mOffset
, sizeof (UINT16
));
468 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&Info
->mWidth
, sizeof (UINT16
));
469 if (Info
->mNext
== NULL
) {
470 Output
.WriteEnd (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)Info
->mValue
, Info
->mWidth
);
472 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)Info
->mValue
, Info
->mWidth
);
474 fprintf (pFile
, "\n");
476 fprintf (pFile
, "};\n");
481 CVfrBufferConfig::CVfrBufferConfig (
485 mItemListHead
= NULL
;
486 mItemListTail
= NULL
;
490 CVfrBufferConfig::~CVfrBufferConfig (
496 while (mItemListHead
!= NULL
) {
498 mItemListHead
= mItemListHead
->mNext
;
502 mItemListHead
= NULL
;
503 mItemListTail
= NULL
;
507 CVfrBufferConfig gCVfrBufferConfig
;
514 } gInternalTypesTable
[] = {
515 {"UINT64", EFI_IFR_TYPE_NUM_SIZE_64
, sizeof (UINT64
), sizeof (UINT64
)},
516 {"UINT32", EFI_IFR_TYPE_NUM_SIZE_32
, sizeof (UINT32
), sizeof (UINT32
)},
517 {"UINT16", EFI_IFR_TYPE_NUM_SIZE_16
, sizeof (UINT16
), sizeof (UINT16
)},
518 {"UINT8", EFI_IFR_TYPE_NUM_SIZE_8
, sizeof (UINT8
), sizeof (UINT8
)},
519 {"BOOLEAN", EFI_IFR_TYPE_BOOLEAN
, sizeof (BOOLEAN
), sizeof (BOOLEAN
)},
520 {"EFI_HII_DATE", EFI_IFR_TYPE_DATE
, sizeof (EFI_HII_DATE
), sizeof (UINT8
)},
521 {"EFI_STRING_ID", EFI_IFR_TYPE_STRING
, sizeof (EFI_STRING_ID
),sizeof (EFI_STRING_ID
)},
522 {"EFI_HII_TIME", EFI_IFR_TYPE_TIME
, sizeof (EFI_HII_TIME
), sizeof (UINT8
)},
523 {NULL
, EFI_IFR_TYPE_OTHER
, 0, 0}
534 if (TypeName
== NULL
) {
538 for (Index
= 0; gInternalTypesTable
[Index
].mTypeName
!= NULL
; Index
++) {
539 if (strcmp (TypeName
, gInternalTypesTable
[Index
].mTypeName
) == 0) {
556 while (*Str
&& *Str
== ' ') {
559 while (*Str
&& *Str
== '0') {
562 if (*Str
&& (*Str
== 'x' || *Str
== 'X')) {
579 Str
= TrimHex (Str
, &IsHex
);
580 for (Value
= 0; (c
= *Str
) != '\0'; Str
++) {
582 // BUG: does not handle overflow here
584 (IsHex
== TRUE
) ? (Value
<<= 4) : (Value
*= 10);
586 if ((IsHex
== TRUE
) && (c
>= 'a') && (c
<= 'f')) {
587 Value
+= (c
- 'a' + 10);
589 if ((IsHex
== TRUE
) && (c
>= 'A') && (c
<= 'F')) {
590 Value
+= (c
- 'A' + 10);
592 if (c
>= '0' && c
<= '9') {
601 CVfrVarDataTypeDB::RegisterNewType (
605 New
->mNext
= mDataTypeList
;
610 CVfrVarDataTypeDB::ExtractStructTypeName (
616 return VFR_RETURN_FATAL_ERROR
;
619 while((*VarStr
!= '\0') && (*VarStr
!= '.')) {
625 if (*VarStr
== '.') {
629 return VFR_RETURN_SUCCESS
;
633 CVfrVarDataTypeDB::ExtractFieldNameAndArrary (
640 INT8 ArrayStr
[MAX_NAME_LEN
+ 1];
642 ArrayIdx
= INVALID_ARRAY_INDEX
;
645 return VFR_RETURN_FATAL_ERROR
;
648 while((*VarStr
!= '\0') &&
662 return VFR_RETURN_SUCCESS
;
665 for (Idx
= 0; (Idx
< MAX_NAME_LEN
) && (*VarStr
!= '\0') && (*VarStr
!= ']'); VarStr
++, Idx
++) {
666 ArrayStr
[Idx
] = *VarStr
;
668 ArrayStr
[Idx
] = '\0';
670 if ((*VarStr
!= ']') && (ArrayStr
[0] == '\0')) {
671 return VFR_RETURN_DATA_STRING_ERROR
;
673 ArrayIdx
= _STR2U32 (ArrayStr
);
674 if (*VarStr
== ']') {
677 return VFR_RETURN_SUCCESS
;
679 return VFR_RETURN_DATA_STRING_ERROR
;
682 return VFR_RETURN_SUCCESS
;
686 CVfrVarDataTypeDB::GetTypeField (
688 IN SVfrDataType
*Type
,
689 OUT SVfrDataField
*&Field
692 SVfrDataField
*pField
= NULL
;
694 if ((FName
== NULL
) && (Type
== NULL
)) {
695 return VFR_RETURN_FATAL_ERROR
;
698 for (pField
= Type
->mMembers
; pField
!= NULL
; pField
= pField
->mNext
) {
699 if (strcmp (pField
->mFieldName
, FName
) == 0) {
701 return VFR_RETURN_SUCCESS
;
705 return VFR_RETURN_UNDEFINED
;
709 CVfrVarDataTypeDB::GetFieldOffset (
710 IN SVfrDataField
*Field
,
716 return VFR_RETURN_FATAL_ERROR
;
719 if ((ArrayIdx
!= INVALID_ARRAY_INDEX
) && ((Field
->mArrayNum
== 0) || (Field
->mArrayNum
<= ArrayIdx
))) {
720 return VFR_RETURN_ERROR_ARRARY_NUM
;
723 Offset
= Field
->mOffset
+ Field
->mFieldType
->mTotalSize
* ((ArrayIdx
== INVALID_ARRAY_INDEX
) ? 0 : ArrayIdx
);
724 return VFR_RETURN_SUCCESS
;
728 CVfrVarDataTypeDB::GetFieldWidth (
729 IN SVfrDataField
*Field
736 return Field
->mFieldType
->mType
;
740 CVfrVarDataTypeDB::GetFieldSize (
741 IN SVfrDataField
*Field
,
746 return VFR_RETURN_FATAL_ERROR
;
749 if ((ArrayIdx
== INVALID_ARRAY_INDEX
) && (Field
->mArrayNum
!= 0)) {
750 return Field
->mFieldType
->mTotalSize
* Field
->mArrayNum
;
752 return Field
->mFieldType
->mTotalSize
;
757 CVfrVarDataTypeDB::InternalTypesListInit (
761 SVfrDataType
*New
= NULL
;
764 for (Index
= 0; gInternalTypesTable
[Index
].mTypeName
!= NULL
; Index
++) {
765 New
= new SVfrDataType
;
767 strcpy (New
->mTypeName
, gInternalTypesTable
[Index
].mTypeName
);
768 New
->mType
= gInternalTypesTable
[Index
].mType
;
769 New
->mAlign
= gInternalTypesTable
[Index
].mAlign
;
770 New
->mTotalSize
= gInternalTypesTable
[Index
].mSize
;
771 if (strcmp (gInternalTypesTable
[Index
].mTypeName
, "EFI_HII_DATE") == 0) {
772 SVfrDataField
*pYearField
= new SVfrDataField
;
773 SVfrDataField
*pMonthField
= new SVfrDataField
;
774 SVfrDataField
*pDayField
= new SVfrDataField
;
776 strcpy (pYearField
->mFieldName
, "Year");
777 GetDataType ("UINT8", &pYearField
->mFieldType
);
778 pYearField
->mOffset
= 0;
779 pYearField
->mNext
= pMonthField
;
780 pYearField
->mArrayNum
= 0;
782 strcpy (pMonthField
->mFieldName
, "Month");
783 GetDataType ("UINT8", &pMonthField
->mFieldType
);
784 pMonthField
->mOffset
= 1;
785 pMonthField
->mNext
= pDayField
;
786 pMonthField
->mArrayNum
= 0;
788 strcpy (pDayField
->mFieldName
, "Day");
789 GetDataType ("UINT8", &pDayField
->mFieldType
);
790 pDayField
->mOffset
= 2;
791 pDayField
->mNext
= NULL
;
792 pDayField
->mArrayNum
= 0;
794 New
->mMembers
= pYearField
;
795 } else if (strcmp (gInternalTypesTable
[Index
].mTypeName
, "EFI_HII_TIME") == 0) {
796 SVfrDataField
*pHoursField
= new SVfrDataField
;
797 SVfrDataField
*pMinutesField
= new SVfrDataField
;
798 SVfrDataField
*pSecondsField
= new SVfrDataField
;
800 strcpy (pHoursField
->mFieldName
, "Hours");
801 GetDataType ("UINT8", &pHoursField
->mFieldType
);
802 pHoursField
->mOffset
= 0;
803 pHoursField
->mNext
= pMinutesField
;
804 pHoursField
->mArrayNum
= 0;
806 strcpy (pMinutesField
->mFieldName
, "Minutes");
807 GetDataType ("UINT8", &pMinutesField
->mFieldType
);
808 pMinutesField
->mOffset
= 1;
809 pMinutesField
->mNext
= pSecondsField
;
810 pMinutesField
->mArrayNum
= 0;
812 strcpy (pSecondsField
->mFieldName
, "Seconds");
813 GetDataType ("UINT8", &pSecondsField
->mFieldType
);
814 pSecondsField
->mOffset
= 2;
815 pSecondsField
->mNext
= NULL
;
816 pSecondsField
->mArrayNum
= 0;
818 New
->mMembers
= pHoursField
;
820 New
->mMembers
= NULL
;
823 RegisterNewType (New
);
829 CVfrVarDataTypeDB::CVfrVarDataTypeDB (
833 mDataTypeList
= NULL
;
835 mCurrDataField
= NULL
;
836 mPackAlign
= DEFAULT_PACK_ALIGN
;
838 InternalTypesListInit ();
841 CVfrVarDataTypeDB::~CVfrVarDataTypeDB (
846 SVfrDataField
*pField
;
848 if (mNewDataType
!= NULL
) {
852 while (mDataTypeList
!= NULL
) {
853 pType
= mDataTypeList
;
854 mDataTypeList
= mDataTypeList
->mNext
;
855 while(pType
->mMembers
!= NULL
) {
856 pField
= pType
->mMembers
;
857 pType
->mMembers
= pType
->mMembers
->mNext
;
866 CVfrVarDataTypeDB::Pack (
871 return VFR_RETURN_INVALID_PARAMETER
;
872 } else if (Align
> 1) {
873 mPackAlign
= Align
+ Align
% 2;
878 return VFR_RETURN_SUCCESS
;
882 CVfrVarDataTypeDB::UnPack (
886 mPackAlign
= DEFAULT_PACK_ALIGN
;
890 CVfrVarDataTypeDB::DeclareDataTypeBegin (
894 SVfrDataType
*pNewType
= NULL
;
896 pNewType
= new SVfrDataType
;
897 pNewType
->mTypeName
[0] = '\0';
898 pNewType
->mType
= EFI_IFR_TYPE_OTHER
;
899 pNewType
->mAlign
= DEFAULT_ALIGN
;
900 pNewType
->mTotalSize
= 0;
901 pNewType
->mMembers
= NULL
;
902 pNewType
->mNext
= NULL
;
904 mNewDataType
= pNewType
;
908 CVfrVarDataTypeDB::SetNewTypeName (
914 if (mNewDataType
== NULL
) {
915 return VFR_RETURN_ERROR_SKIPED
;
917 if (TypeName
== NULL
) {
918 return VFR_RETURN_FATAL_ERROR
;
920 if (strlen(TypeName
) >= MAX_NAME_LEN
) {
921 return VFR_RETURN_INVALID_PARAMETER
;
924 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
925 if (strcmp(pType
->mTypeName
, TypeName
) == 0) {
926 return VFR_RETURN_REDEFINED
;
930 strcpy(mNewDataType
->mTypeName
, TypeName
);
931 return VFR_RETURN_SUCCESS
;
935 CVfrVarDataTypeDB::DataTypeAddField (
941 SVfrDataField
*pNewField
= NULL
;
942 SVfrDataType
*pFieldType
= NULL
;
946 CHECK_ERROR_RETURN (GetDataType (TypeName
, &pFieldType
), VFR_RETURN_SUCCESS
);
948 if (strlen (FieldName
) >= MAX_NAME_LEN
) {
949 return VFR_RETURN_INVALID_PARAMETER
;
952 for (pTmp
= mNewDataType
->mMembers
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
953 if (strcmp (pTmp
->mFieldName
, FieldName
) == 0) {
954 return VFR_RETURN_REDEFINED
;
958 Align
= MIN (mPackAlign
, pFieldType
->mAlign
);
960 if ((pNewField
= new SVfrDataField
) == NULL
) {
961 return VFR_RETURN_OUT_FOR_RESOURCES
;
963 strcpy (pNewField
->mFieldName
, FieldName
);
964 pNewField
->mFieldType
= pFieldType
;
965 pNewField
->mArrayNum
= ArrayNum
;
966 if ((mNewDataType
->mTotalSize
% Align
) == 0) {
967 pNewField
->mOffset
= mNewDataType
->mTotalSize
;
969 pNewField
->mOffset
= mNewDataType
->mTotalSize
+ ALIGN_STUFF(mNewDataType
->mTotalSize
, Align
);
971 if (mNewDataType
->mMembers
== NULL
) {
972 mNewDataType
->mMembers
= pNewField
;
973 pNewField
->mNext
= NULL
;
975 for (pTmp
= mNewDataType
->mMembers
; pTmp
->mNext
!= NULL
; pTmp
= pTmp
->mNext
)
977 pTmp
->mNext
= pNewField
;
978 pNewField
->mNext
= NULL
;
981 mNewDataType
->mAlign
= MIN (mPackAlign
, MAX (pFieldType
->mAlign
, mNewDataType
->mAlign
));
982 mNewDataType
->mTotalSize
= pNewField
->mOffset
+ (pNewField
->mFieldType
->mTotalSize
) * ((ArrayNum
== 0) ? 1 : ArrayNum
);
984 return VFR_RETURN_SUCCESS
;
988 CVfrVarDataTypeDB::DeclareDataTypeEnd (
992 if (mNewDataType
->mTypeName
[0] == '\0') {
996 if ((mNewDataType
->mTotalSize
% mNewDataType
->mAlign
) !=0) {
997 mNewDataType
->mTotalSize
+= ALIGN_STUFF (mNewDataType
->mTotalSize
, mNewDataType
->mAlign
);
1000 RegisterNewType (mNewDataType
);
1001 mNewDataType
= NULL
;
1005 CVfrVarDataTypeDB::GetDataType (
1007 OUT SVfrDataType
**DataType
1011 SVfrDataType
*pDataType
= NULL
;
1013 if (TypeName
== NULL
) {
1014 return VFR_RETURN_ERROR_SKIPED
;
1017 if (DataType
== NULL
) {
1018 return VFR_RETURN_FATAL_ERROR
;
1023 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1024 if (strcmp (TypeName
, pDataType
->mTypeName
) == 0) {
1025 *DataType
= pDataType
;
1026 return VFR_RETURN_SUCCESS
;
1030 return VFR_RETURN_UNDEFINED
;
1034 CVfrVarDataTypeDB::GetDataTypeSize (
1039 SVfrDataType
*pDataType
= NULL
;
1042 return VFR_RETURN_FATAL_ERROR
;
1047 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1048 if (strcmp (TypeName
, pDataType
->mTypeName
) == 0) {
1049 *Size
= pDataType
->mTotalSize
;
1050 return VFR_RETURN_SUCCESS
;
1054 return VFR_RETURN_UNDEFINED
;
1058 CVfrVarDataTypeDB::GetDataFieldInfo (
1065 INT8 TName
[MAX_NAME_LEN
], FName
[MAX_NAME_LEN
];
1066 UINT32 ArrayIdx
, Tmp
;
1067 SVfrDataType
*pType
= NULL
;
1068 SVfrDataField
*pField
= NULL
;
1071 Type
= EFI_IFR_TYPE_OTHER
;
1074 CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr
, TName
), VFR_RETURN_SUCCESS
);
1075 CHECK_ERROR_RETURN (GetDataType (TName
, &pType
), VFR_RETURN_SUCCESS
);
1078 // if it is not struct data type
1080 Type
= pType
->mType
;
1081 Size
= pType
->mTotalSize
;
1083 while (*VarStr
!= '\0') {
1084 CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr
, FName
, ArrayIdx
), VFR_RETURN_SUCCESS
);
1085 CHECK_ERROR_RETURN(GetTypeField (FName
, pType
, pField
), VFR_RETURN_SUCCESS
);
1086 pType
= pField
->mFieldType
;
1087 CHECK_ERROR_RETURN(GetFieldOffset (pField
, ArrayIdx
, Tmp
), VFR_RETURN_SUCCESS
);
1089 Type
= GetFieldWidth (pField
);
1090 Size
= GetFieldSize (pField
, ArrayIdx
);
1092 return VFR_RETURN_SUCCESS
;
1096 CVfrVarDataTypeDB::GetUserDefinedTypeNameList (
1097 OUT INT8
***NameList
,
1098 OUT UINT32
*ListSize
1102 SVfrDataType
*pType
;
1104 if ((NameList
== NULL
) || (ListSize
== NULL
)) {
1105 return VFR_RETURN_FATAL_ERROR
;
1111 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1112 if (_IS_INTERNAL_TYPE(pType
->mTypeName
) == FALSE
) {
1117 if (*ListSize
== 0) {
1118 return VFR_RETURN_SUCCESS
;
1121 if ((*NameList
= new INT8
*[*ListSize
]) == NULL
) {
1123 return VFR_RETURN_OUT_FOR_RESOURCES
;
1126 for (Index
= 0, pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
, Index
++) {
1127 if (_IS_INTERNAL_TYPE(pType
->mTypeName
) == FALSE
) {
1128 (*NameList
)[Index
] = pType
->mTypeName
;
1131 return VFR_RETURN_SUCCESS
;
1135 CVfrVarDataTypeDB::IsTypeNameDefined (
1139 SVfrDataType
*pType
;
1141 if (TypeName
== NULL
) {
1145 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1146 if (strcmp (pType
->mTypeName
, TypeName
) == 0) {
1154 #ifdef CVFR_VARDATATYPEDB_DEBUG
1156 CVfrVarDataTypeDB::ParserDB (
1160 SVfrDataType
*pTNode
;
1161 SVfrDataField
*pFNode
;
1163 printf ("***************************************************************\n");
1164 printf ("\t\tmPackAlign = %x\n", mPackAlign
);
1165 for (pTNode
= mDataTypeList
; pTNode
!= NULL
; pTNode
= pTNode
->mNext
) {
1166 printf ("\t\tstruct %s : mAlign [%x] mTotalSize [%x]\n\n", pTNode
->mTypeName
, pTNode
->mAlign
, pTNode
->mTotalSize
);
1167 printf ("\t\tstruct %s {\n", pTNode
->mTypeName
);
1168 for (pFNode
= pTNode
->mMembers
; pFNode
!= NULL
; pFNode
= pFNode
->mNext
) {
1169 printf ("\t\t\t%s\t%s\n", pFNode
->mFieldType
->mTypeName
, pFNode
->mFieldName
);
1171 printf ("\t\t};\n");
1172 printf ("---------------------------------------------------------------\n");
1174 printf ("***************************************************************\n");
1178 SVfrVarStorageNode::SVfrVarStorageNode (
1181 IN EFI_VARSTORE_ID VarStoreId
,
1182 IN EFI_STRING_ID VarName
,
1189 memset (&Guid
, 0, sizeof (EFI_GUID
));
1191 if (StoreName
!= NULL
) {
1192 mVarStoreName
= new INT8
[strlen(StoreName
) + 1];
1193 strcpy (mVarStoreName
, StoreName
);
1195 mVarStoreName
= NULL
;
1198 mVarStoreId
= VarStoreId
;
1199 mVarStoreType
= EFI_VFR_VARSTORE_EFI
;
1200 mStorageInfo
.mEfiVar
.mEfiVarName
= VarName
;
1201 mStorageInfo
.mEfiVar
.mEfiVarSize
= VarSize
;
1204 SVfrVarStorageNode::SVfrVarStorageNode (
1207 IN EFI_VARSTORE_ID VarStoreId
,
1208 IN SVfrDataType
*DataType
1214 memset (&Guid
, 0, sizeof (EFI_GUID
));
1216 if (StoreName
!= NULL
) {
1217 mVarStoreName
= new INT8
[strlen(StoreName
) + 1];
1218 strcpy (mVarStoreName
, StoreName
);
1220 mVarStoreName
= NULL
;
1223 mVarStoreId
= VarStoreId
;
1224 mVarStoreType
= EFI_VFR_VARSTORE_BUFFER
;
1225 mStorageInfo
.mDataType
= DataType
;
1228 SVfrVarStorageNode::SVfrVarStorageNode (
1230 IN EFI_VARSTORE_ID VarStoreId
1233 if (StoreName
!= NULL
) {
1234 mVarStoreName
= new INT8
[strlen(StoreName
) + 1];
1235 strcpy (mVarStoreName
, StoreName
);
1237 mVarStoreName
= NULL
;
1240 mVarStoreId
= VarStoreId
;
1241 mVarStoreType
= EFI_VFR_VARSTORE_NAME
;
1242 mStorageInfo
.mNameSpace
.mNameTable
= new EFI_VARSTORE_ID
[DEFAULT_NAME_TABLE_ITEMS
];
1243 mStorageInfo
.mNameSpace
.mTableSize
= 0;
1246 SVfrVarStorageNode::~SVfrVarStorageNode (
1250 if (mVarStoreName
!= NULL
) {
1251 delete mVarStoreName
;
1254 if (mVarStoreType
== EFI_VFR_VARSTORE_NAME
) {
1255 delete mStorageInfo
.mNameSpace
.mNameTable
;
1259 CVfrDataStorage::CVfrDataStorage (
1265 for (Index
= 0; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1266 mFreeVarStoreIdBitMap
[Index
] = 0;
1269 // Question ID 0 is reserved.
1270 mFreeVarStoreIdBitMap
[0] = 0x80000000;
1272 mBufferVarStoreList
= NULL
;
1273 mEfiVarStoreList
= NULL
;
1274 mNameVarStoreList
= NULL
;
1275 mCurrVarStorageNode
= NULL
;
1276 mNewVarStorageNode
= NULL
;
1279 CVfrDataStorage::~CVfrDataStorage (
1283 SVfrVarStorageNode
*pNode
;
1285 while (mBufferVarStoreList
!= NULL
) {
1286 pNode
= mBufferVarStoreList
;
1287 mBufferVarStoreList
= mBufferVarStoreList
->mNext
;
1290 while (mEfiVarStoreList
!= NULL
) {
1291 pNode
= mEfiVarStoreList
;
1292 mEfiVarStoreList
= mEfiVarStoreList
->mNext
;
1295 while (mNameVarStoreList
!= NULL
) {
1296 pNode
= mNameVarStoreList
;
1297 mNameVarStoreList
= mNameVarStoreList
->mNext
;
1300 if (mNewVarStorageNode
!= NULL
) {
1301 delete mNewVarStorageNode
;
1306 CVfrDataStorage::GetFreeVarStoreId (
1310 UINT32 Index
, Mask
, Offset
;
1312 for (Index
= 0; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1313 if (mFreeVarStoreIdBitMap
[Index
] != 0xFFFFFFFF) {
1318 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
1319 if ((mFreeVarStoreIdBitMap
[Index
] & Mask
) == 0) {
1320 mFreeVarStoreIdBitMap
[Index
] |= Mask
;
1321 return (EFI_VARSTORE_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
1325 return EFI_VARSTORE_ID_INVALID
;
1329 CVfrDataStorage::ChekVarStoreIdFree (
1330 IN EFI_VARSTORE_ID VarStoreId
1333 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1334 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1336 return (mFreeVarStoreIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
1340 CVfrDataStorage::MarkVarStoreIdUsed (
1341 IN EFI_VARSTORE_ID VarStoreId
1344 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1345 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1347 mFreeVarStoreIdBitMap
[Index
] |= (0x80000000 >> Offset
);
1351 CVfrDataStorage::MarkVarStoreIdUnused (
1352 IN EFI_VARSTORE_ID VarStoreId
1355 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1356 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1358 mFreeVarStoreIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
1362 CVfrDataStorage::DeclareNameVarStoreBegin (
1366 SVfrVarStorageNode
*pNode
= NULL
;
1367 EFI_VARSTORE_ID VarStoreId
;
1369 if (StoreName
== NULL
) {
1370 return VFR_RETURN_FATAL_ERROR
;
1373 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1374 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1375 return VFR_RETURN_REDEFINED
;
1379 VarStoreId
= GetFreeVarStoreId ();
1380 if ((pNode
= new SVfrVarStorageNode (StoreName
, VarStoreId
)) == NULL
) {
1381 return VFR_RETURN_UNDEFINED
;
1384 mNewVarStorageNode
= pNode
;
1386 return VFR_RETURN_SUCCESS
;
1390 CVfrDataStorage::NameTableAddItem (
1391 IN EFI_STRING_ID Item
1394 EFI_VARSTORE_ID
*NewTable
, *OldTable
;
1397 OldTable
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
;
1398 TableSize
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
;
1400 if ((TableSize
!= 0) && ((TableSize
% DEFAULT_NAME_TABLE_ITEMS
) == 0)) {
1401 if ((NewTable
= new EFI_VARSTORE_ID
[TableSize
+ DEFAULT_NAME_TABLE_ITEMS
]) == NULL
) {
1402 return VFR_RETURN_OUT_FOR_RESOURCES
;
1404 memcpy (NewTable
, OldTable
, TableSize
);
1405 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
= NewTable
;
1408 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[TableSize
++] = Item
;
1409 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
= TableSize
;
1411 return VFR_RETURN_SUCCESS
;
1415 CVfrDataStorage::DeclareNameVarStoreEnd (
1419 mNewVarStorageNode
->mGuid
= *Guid
;
1420 mNewVarStorageNode
->mNext
= mNameVarStoreList
;
1421 mNameVarStoreList
= mNewVarStorageNode
;
1423 mNewVarStorageNode
= NULL
;
1425 return VFR_RETURN_SUCCESS
;
1429 CVfrDataStorage::DeclareEfiVarStore (
1432 IN EFI_STRING_ID NameStrId
,
1436 SVfrVarStorageNode
*pNode
;
1437 EFI_VARSTORE_ID VarStoreId
;
1439 if ((StoreName
== NULL
) || (Guid
== NULL
)) {
1440 return VFR_RETURN_FATAL_ERROR
;
1443 if (VarSize
> sizeof (UINT64
)) {
1444 return VFR_RETURN_EFIVARSTORE_SIZE_ERROR
;
1447 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1448 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1449 return VFR_RETURN_REDEFINED
;
1453 VarStoreId
= GetFreeVarStoreId ();
1454 if ((pNode
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, NameStrId
, VarSize
)) == NULL
) {
1455 return VFR_RETURN_OUT_FOR_RESOURCES
;
1458 pNode
->mNext
= mNameVarStoreList
;
1459 mNameVarStoreList
= pNode
;
1461 return VFR_RETURN_SUCCESS
;
1465 CVfrDataStorage::DeclareBufferVarStore (
1468 IN CVfrVarDataTypeDB
*DataTypeDB
,
1470 IN EFI_VARSTORE_ID VarStoreId
1473 SVfrVarStorageNode
*pNew
= NULL
;
1474 SVfrDataType
*pDataType
= NULL
;
1476 if ((StoreName
== NULL
) || (Guid
== NULL
) || (DataTypeDB
== NULL
)) {
1477 return VFR_RETURN_FATAL_ERROR
;
1480 CHECK_ERROR_RETURN(DataTypeDB
->GetDataType (TypeName
, &pDataType
), VFR_RETURN_SUCCESS
);
1482 if (VarStoreId
== EFI_VARSTORE_ID_INVALID
) {
1483 VarStoreId
= GetFreeVarStoreId ();
1485 if (ChekVarStoreIdFree (VarStoreId
) == FALSE
) {
1486 return VFR_RETURN_VARSTOREID_REDEFINED
;
1488 MarkVarStoreIdUsed (VarStoreId
);
1491 if ((pNew
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, pDataType
)) == NULL
) {
1492 return VFR_RETURN_OUT_FOR_RESOURCES
;
1495 pNew
->mNext
= mBufferVarStoreList
;
1496 mBufferVarStoreList
= pNew
;
1498 if (gCVfrBufferConfig
.Register(StoreName
) != 0) {
1499 return VFR_RETURN_FATAL_ERROR
;
1502 return VFR_RETURN_SUCCESS
;
1506 CVfrDataStorage::GetVarStoreId (
1508 OUT EFI_VARSTORE_ID
*VarStoreId
1511 SVfrVarStorageNode
*pNode
;
1513 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1514 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1515 mCurrVarStorageNode
= pNode
;
1516 *VarStoreId
= pNode
->mVarStoreId
;
1517 return VFR_RETURN_SUCCESS
;
1521 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1522 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1523 mCurrVarStorageNode
= pNode
;
1524 *VarStoreId
= pNode
->mVarStoreId
;
1525 return VFR_RETURN_SUCCESS
;
1529 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1530 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1531 mCurrVarStorageNode
= pNode
;
1532 *VarStoreId
= pNode
->mVarStoreId
;
1533 return VFR_RETURN_SUCCESS
;
1537 mCurrVarStorageNode
= NULL
;
1538 *VarStoreId
= EFI_VARSTORE_ID_INVALID
;
1539 return VFR_RETURN_UNDEFINED
;
1543 CVfrDataStorage::GetBufferVarStoreDataTypeName (
1545 OUT INT8
**DataTypeName
1548 SVfrVarStorageNode
*pNode
;
1550 if ((StoreName
== NULL
) || (DataTypeName
== NULL
)) {
1551 return VFR_RETURN_FATAL_ERROR
;
1554 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1555 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1560 if (pNode
== NULL
) {
1561 return VFR_RETURN_UNDEFINED
;
1564 if (pNode
->mStorageInfo
.mDataType
== NULL
) {
1565 return VFR_RETURN_FATAL_ERROR
;
1568 *DataTypeName
= pNode
->mStorageInfo
.mDataType
->mTypeName
;
1569 return VFR_RETURN_SUCCESS
;
1573 CVfrDataStorage::GetVarStoreType (
1575 OUT EFI_VFR_VARSTORE_TYPE
&VarStoreType
1578 SVfrVarStorageNode
*pNode
;
1580 if (StoreName
== NULL
) {
1581 return VFR_RETURN_FATAL_ERROR
;
1584 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1585 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1586 VarStoreType
= pNode
->mVarStoreType
;
1587 return VFR_RETURN_SUCCESS
;
1591 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1592 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1593 VarStoreType
= pNode
->mVarStoreType
;
1594 return VFR_RETURN_SUCCESS
;
1598 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1599 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1600 VarStoreType
= pNode
->mVarStoreType
;
1601 return VFR_RETURN_SUCCESS
;
1605 VarStoreType
= EFI_VFR_VARSTORE_INVALID
;
1606 return VFR_RETURN_UNDEFINED
;
1610 CVfrDataStorage::GetVarStoreName (
1611 IN EFI_VARSTORE_ID VarStoreId
,
1612 OUT INT8
**VarStoreName
1615 SVfrVarStorageNode
*pNode
;
1617 if (VarStoreName
== NULL
) {
1618 return VFR_RETURN_FATAL_ERROR
;
1621 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1622 if (pNode
->mVarStoreId
== VarStoreId
) {
1623 *VarStoreName
= pNode
->mVarStoreName
;
1624 return VFR_RETURN_SUCCESS
;
1628 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1629 if (pNode
->mVarStoreId
== VarStoreId
) {
1630 *VarStoreName
= pNode
->mVarStoreName
;
1631 return VFR_RETURN_SUCCESS
;
1635 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1636 if (pNode
->mVarStoreId
== VarStoreId
) {
1637 *VarStoreName
= pNode
->mVarStoreName
;
1638 return VFR_RETURN_SUCCESS
;
1642 *VarStoreName
= NULL
;
1643 return VFR_RETURN_UNDEFINED
;
1647 CVfrDataStorage::GetEfiVarStoreInfo (
1648 IN OUT EFI_VARSTORE_INFO
*Info
1652 return VFR_RETURN_FATAL_ERROR
;
1655 if (mCurrVarStorageNode
== NULL
) {
1656 return VFR_RETURN_GET_EFIVARSTORE_ERROR
;
1659 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarName
;
1660 Info
->mVarTotalSize
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarSize
;
1661 switch (Info
->mVarTotalSize
) {
1663 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_8
;
1666 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_16
;
1669 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_32
;
1672 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_64
;
1675 return VFR_RETURN_FATAL_ERROR
;
1678 return VFR_RETURN_SUCCESS
;
1682 CVfrDataStorage::GetNameVarStoreInfo (
1683 OUT EFI_VARSTORE_INFO
*Info
,
1688 return VFR_RETURN_FATAL_ERROR
;
1691 if (mCurrVarStorageNode
== NULL
) {
1692 return VFR_RETURN_GET_NVVARSTORE_ERROR
;
1695 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[Index
];
1697 return VFR_RETURN_SUCCESS
;
1701 CVfrDataStorage::BufferVarStoreRequestElementAdd (
1703 IN EFI_VARSTORE_INFO
&Info
1706 INT8 NewReqElt
[128] = {'\0',};
1707 INT8
*OldReqElt
= NULL
;
1708 SVfrVarStorageNode
*pNode
= NULL
;
1709 EFI_IFR_TYPE_VALUE Value
;
1711 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1712 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1717 if (pNode
== NULL
) {
1718 return VFR_RETURN_UNDEFINED
;
1721 gCVfrBufferConfig
.Open ();
1723 if (gCVfrBufferConfig
.Write ('a', StoreName
, NULL
, EFI_IFR_TYPE_NUM_SIZE_8
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
) != 0) {
1724 return VFR_RETURN_FATAL_ERROR
;
1726 gCVfrBufferConfig
.Close ();
1728 return VFR_RETURN_SUCCESS
;
1731 SVfrDefaultStoreNode::SVfrDefaultStoreNode (
1732 IN EFI_IFR_DEFAULTSTORE
*ObjBinAddr
,
1734 IN EFI_STRING_ID DefaultStoreNameId
,
1738 mObjBinAddr
= ObjBinAddr
;
1740 if (RefName
!= NULL
) {
1741 mRefName
= new INT8
[strlen (RefName
) + 1];
1742 strcpy (mRefName
, RefName
);
1748 mDefaultId
= DefaultId
;
1749 mDefaultStoreNameId
= DefaultStoreNameId
;
1752 SVfrDefaultStoreNode::~SVfrDefaultStoreNode (
1756 if (mRefName
!= NULL
) {
1761 CVfrDefaultStore::CVfrDefaultStore (
1765 mDefaultStoreList
= NULL
;
1768 CVfrDefaultStore::~CVfrDefaultStore (
1772 SVfrDefaultStoreNode
*pTmp
= NULL
;
1774 while (mDefaultStoreList
!= NULL
) {
1775 pTmp
= mDefaultStoreList
;
1776 mDefaultStoreList
= mDefaultStoreList
->mNext
;
1782 CVfrDefaultStore::RegisterDefaultStore (
1783 IN CHAR8
*ObjBinAddr
,
1785 IN EFI_STRING_ID DefaultStoreNameId
,
1789 SVfrDefaultStoreNode
*pNode
= NULL
;
1791 if (RefName
== NULL
) {
1792 return VFR_RETURN_FATAL_ERROR
;
1795 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1796 if (strcmp (pNode
->mRefName
, RefName
) == 0) {
1797 return VFR_RETURN_REDEFINED
;
1801 if ((pNode
= new SVfrDefaultStoreNode ((EFI_IFR_DEFAULTSTORE
*)ObjBinAddr
, RefName
, DefaultStoreNameId
, DefaultId
)) == NULL
) {
1802 return VFR_RETURN_OUT_FOR_RESOURCES
;
1805 pNode
->mNext
= mDefaultStoreList
;
1806 mDefaultStoreList
= pNode
;
1808 return VFR_RETURN_SUCCESS
;
1812 * assign new reference name or new default store name id only if
1813 * the original is invalid
1816 CVfrDefaultStore::ReRegisterDefaultStoreById (
1817 IN UINT16 DefaultId
,
1819 IN EFI_STRING_ID DefaultStoreNameId
1822 SVfrDefaultStoreNode
*pNode
= NULL
;
1824 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1825 if (pNode
->mDefaultId
== DefaultId
) {
1830 if (pNode
== NULL
) {
1831 return VFR_RETURN_UNDEFINED
;
1833 if (pNode
->mDefaultStoreNameId
== EFI_STRING_ID_INVALID
) {
1834 pNode
->mDefaultStoreNameId
= DefaultStoreNameId
;
1835 if (pNode
->mObjBinAddr
!= NULL
) {
1836 pNode
->mObjBinAddr
->DefaultName
= DefaultStoreNameId
;
1839 return VFR_RETURN_REDEFINED
;
1842 if (RefName
!= NULL
) {
1843 delete pNode
->mRefName
;
1844 pNode
->mRefName
= new INT8
[strlen (RefName
) + 1];
1845 if (pNode
->mRefName
!= NULL
) {
1846 strcpy (pNode
->mRefName
, RefName
);
1851 return VFR_RETURN_SUCCESS
;
1855 CVfrDefaultStore::DefaultIdRegistered (
1859 SVfrDefaultStoreNode
*pNode
= NULL
;
1861 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1862 if (pNode
->mDefaultId
== DefaultId
) {
1871 CVfrDefaultStore::GetDefaultId (
1873 OUT UINT16
*DefaultId
1876 SVfrDefaultStoreNode
*pTmp
= NULL
;
1878 if (DefaultId
== NULL
) {
1879 return VFR_RETURN_FATAL_ERROR
;
1882 for (pTmp
= mDefaultStoreList
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
1883 if (strcmp (pTmp
->mRefName
, RefName
) == 0) {
1884 *DefaultId
= pTmp
->mDefaultId
;
1885 return VFR_RETURN_SUCCESS
;
1889 return VFR_RETURN_UNDEFINED
;
1894 AltCfgItemPrintToBuffer (
1896 IN EFI_VARSTORE_INFO Info
,
1898 IN EFI_IFR_TYPE_VALUE Value
1902 UINT8
*BufChar
= NULL
;
1905 if (NewAltCfg
!= NULL
) {
1908 "&OFFSET=%x&WIDTH=%x&VALUE=",
1909 Info
.mInfo
.mVarOffset
,
1915 case EFI_IFR_TYPE_NUM_SIZE_8
:
1916 Count
= sprintf (NewAltCfg
, "%x", Value
.u8
);
1919 case EFI_IFR_TYPE_NUM_SIZE_16
:
1920 Count
= sprintf (NewAltCfg
, "%x", Value
.u16
);
1923 case EFI_IFR_TYPE_NUM_SIZE_32
:
1924 Count
= sprintf (NewAltCfg
, "%x", Value
.u32
);
1927 case EFI_IFR_TYPE_NUM_SIZE_64
:
1928 Count
= sprintf (NewAltCfg
, "%x", Value
.u64
);
1931 case EFI_IFR_TYPE_BOOLEAN
:
1932 Count
= sprintf (NewAltCfg
, "%x", Value
.b
);
1935 case EFI_IFR_TYPE_TIME
:
1937 Count
= sprintf (NewAltCfg
, "%x", *((UINT32
*)(&Value
.time
)));
1940 BufChar
= (UINT8
*)&Value
.time
;
1941 for (Index
= 0; Index
< sizeof(EFI_HII_TIME
); Index
++) {
1942 Count
= sprintf (NewAltCfg
, "%02x", (UINT8
)BufChar
[Index
]);
1947 case EFI_IFR_TYPE_DATE
:
1949 Count
= sprintf (NewAltCfg
, "%x", *((UINT32
*)(&Value
.date
)));
1952 BufChar
= (UINT8
*)&Value
.date
;
1953 for (Index
= 0; Index
< sizeof(EFI_HII_DATE
); Index
++) {
1954 Count
= sprintf (NewAltCfg
, "%02x", (UINT8
)BufChar
[Index
]);
1959 case EFI_IFR_TYPE_STRING
:
1960 Count
= sprintf (NewAltCfg
, "%x", Value
.string
);
1963 case EFI_IFR_TYPE_OTHER
:
1964 return VFR_RETURN_UNSUPPORTED
;
1968 return VFR_RETURN_FATAL_ERROR
;
1972 CVfrDefaultStore::BufferVarStoreAltConfigAdd (
1973 IN EFI_VARSTORE_ID DefaultId
,
1974 IN EFI_VARSTORE_INFO
&Info
,
1975 IN INT8
*VarStoreName
,
1977 IN EFI_IFR_TYPE_VALUE Value
1980 SVfrDefaultStoreNode
*pNode
= NULL
;
1981 INT8 NewAltCfg
[2 * 2 * sizeof (UINT16
) + 1] = {0,};
1983 if (VarStoreName
== NULL
) {
1984 return VFR_RETURN_FATAL_ERROR
;
1987 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1988 if (pNode
->mDefaultId
== DefaultId
) {
1993 if (pNode
== NULL
) {
1994 return VFR_RETURN_UNDEFINED
;
1997 gCVfrBufferConfig
.Open ();
1999 sprintf (NewAltCfg
, "%04x", pNode
->mDefaultId
);
2000 if ((gCVfrBufferConfig
.Select(VarStoreName
) == 0) &&
2001 (gCVfrBufferConfig
.Select(VarStoreName
, NewAltCfg
) != 0)) {
2002 if (gCVfrBufferConfig
.Write ('i', VarStoreName
, NewAltCfg
, Type
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
) != 0) {
2007 if (gCVfrBufferConfig
.Write ('a', VarStoreName
, NULL
, Type
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
) != 0) {
2011 gCVfrBufferConfig
.Close ();
2013 return VFR_RETURN_SUCCESS
;
2016 gCVfrBufferConfig
.Close ();
2017 return VFR_RETURN_FATAL_ERROR
;
2020 SVfrRuleNode::SVfrRuleNode (
2025 if (RuleName
!= NULL
) {
2026 mRuleName
= new INT8
[strlen (RuleName
) + 1];
2027 strcpy (mRuleName
, RuleName
);
2036 SVfrRuleNode::~SVfrRuleNode (
2040 if (mRuleName
!= NULL
) {
2045 CVfrRulesDB::CVfrRulesDB ()
2048 mFreeRuleId
= EFI_VARSTORE_ID_START
;
2051 CVfrRulesDB::~CVfrRulesDB ()
2053 SVfrRuleNode
*pNode
;
2055 while(mRuleList
!= NULL
) {
2057 mRuleList
= mRuleList
->mNext
;
2063 CVfrRulesDB::RegisterRule (
2069 if (RuleName
== NULL
) {
2073 if ((pNew
= new SVfrRuleNode (RuleName
, mFreeRuleId
)) == NULL
) {
2079 pNew
->mNext
= mRuleList
;
2084 CVfrRulesDB::GetRuleId (
2088 SVfrRuleNode
*pNode
;
2090 if (RuleName
== NULL
) {
2091 return EFI_RULE_ID_INVALID
;
2094 for (pNode
= mRuleList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2095 if (strcmp (pNode
->mRuleName
, RuleName
) == 0) {
2096 return pNode
->mRuleId
;
2100 return EFI_RULE_ID_INVALID
;
2103 CVfrRulesDB gCVfrRulesDB
;
2105 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2109 mVarStoreId
= EFI_VARSTORE_ID_INVALID
;
2110 mInfo
.mVarName
= EFI_STRING_ID_INVALID
;
2111 mInfo
.mVarOffset
= EFI_VAROFFSET_INVALID
;
2112 mVarType
= EFI_IFR_TYPE_OTHER
;
2116 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2117 IN EFI_VARSTORE_INFO
&Info
2120 mVarStoreId
= Info
.mVarStoreId
;
2121 mInfo
.mVarName
= Info
.mInfo
.mVarName
;
2122 mInfo
.mVarOffset
= Info
.mInfo
.mVarOffset
;
2123 mVarType
= Info
.mVarType
;
2124 mVarTotalSize
= Info
.mVarTotalSize
;
2128 EFI_VARSTORE_INFO::operator == (
2129 IN EFI_VARSTORE_INFO
*Info
2132 if ((mVarStoreId
== Info
->mVarStoreId
) &&
2133 (mInfo
.mVarName
== Info
->mInfo
.mVarName
) &&
2134 (mInfo
.mVarOffset
== Info
->mInfo
.mVarOffset
) &&
2135 (mVarType
== Info
->mVarType
) &&
2136 (mVarTotalSize
== Info
->mVarTotalSize
)) {
2143 static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo
;
2146 CVfrQuestionDB::GetFreeQuestionId (
2150 UINT32 Index
, Mask
, Offset
;
2152 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2153 if (mFreeQIdBitMap
[Index
] != 0xFFFFFFFF) {
2158 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
2159 if ((mFreeQIdBitMap
[Index
] & Mask
) == 0) {
2160 mFreeQIdBitMap
[Index
] |= Mask
;
2161 return (EFI_QUESTION_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
2165 return EFI_QUESTION_ID_INVALID
;
2169 CVfrQuestionDB::ChekQuestionIdFree (
2170 IN EFI_QUESTION_ID QId
2173 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2174 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2176 return (mFreeQIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
2180 CVfrQuestionDB::MarkQuestionIdUsed (
2181 IN EFI_QUESTION_ID QId
2184 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2185 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2187 mFreeQIdBitMap
[Index
] |= (0x80000000 >> Offset
);
2191 CVfrQuestionDB::MarkQuestionIdUnused (
2192 IN EFI_QUESTION_ID QId
2195 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2196 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2198 mFreeQIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
2201 SVfrQuestionNode::SVfrQuestionNode (
2209 mQuestionId
= EFI_QUESTION_ID_INVALID
;
2214 mName
= new INT8
[strlen ("$DEFAULT") + 1];
2215 strcpy (mName
, "$DEFAULT");
2217 mName
= new INT8
[strlen (Name
) + 1];
2218 strcpy (mName
, Name
);
2221 if (VarIdStr
!= NULL
) {
2222 mVarIdStr
= new INT8
[strlen (VarIdStr
) + 1];
2223 strcpy (mVarIdStr
, VarIdStr
);
2225 mVarIdStr
= new INT8
[strlen ("$") + 1];
2226 strcpy (mVarIdStr
, "$");
2230 SVfrQuestionNode::~SVfrQuestionNode (
2234 if (mName
!= NULL
) {
2238 if (mVarIdStr
!= NULL
) {
2243 CVfrQuestionDB::CVfrQuestionDB ()
2247 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2248 mFreeQIdBitMap
[Index
] = 0;
2251 // Question ID 0 is reserved.
2252 mFreeQIdBitMap
[0] = 0x80000000;
2253 mQuestionList
= NULL
;
2256 CVfrQuestionDB::~CVfrQuestionDB ()
2258 SVfrQuestionNode
*pNode
;
2260 while (mQuestionList
!= NULL
) {
2261 pNode
= mQuestionList
;
2262 mQuestionList
= mQuestionList
->mNext
;
2268 CVfrQuestionDB::RegisterQuestion (
2271 IN OUT EFI_QUESTION_ID
&QuestionId
2274 SVfrQuestionNode
*pNode
= NULL
;
2276 if ((Name
!= NULL
) && (FindQuestion(Name
) == VFR_RETURN_SUCCESS
)) {
2277 return VFR_RETURN_REDEFINED
;
2280 if ((pNode
= new SVfrQuestionNode (Name
, VarIdStr
)) == NULL
) {
2281 return VFR_RETURN_OUT_FOR_RESOURCES
;
2284 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2285 QuestionId
= GetFreeQuestionId ();
2287 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2289 return VFR_RETURN_QUESTIONID_REDEFINED
;
2291 MarkQuestionIdUsed (QuestionId
);
2293 pNode
->mQuestionId
= QuestionId
;
2295 pNode
->mNext
= mQuestionList
;
2296 mQuestionList
= pNode
;
2298 gCFormPkg
.DoPendingAssign (VarIdStr
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2300 return VFR_RETURN_SUCCESS
;
2304 CVfrQuestionDB::RegisterOldDateQuestion (
2306 IN INT8
*MonthVarId
,
2308 IN OUT EFI_QUESTION_ID
&QuestionId
2311 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2314 if ((YearVarId
== NULL
) || (MonthVarId
== NULL
) || (DayVarId
== NULL
)) {
2318 if ((pNode
[0] = new SVfrQuestionNode (NULL
, YearVarId
, DATE_YEAR_BITMASK
)) == NULL
) {
2321 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MonthVarId
, DATE_MONTH_BITMASK
)) == NULL
) {
2324 if ((pNode
[2] = new SVfrQuestionNode (NULL
, DayVarId
, DATE_DAY_BITMASK
)) == NULL
) {
2328 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2329 QuestionId
= GetFreeQuestionId ();
2331 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2334 MarkQuestionIdUsed (QuestionId
);
2337 pNode
[0]->mQuestionId
= QuestionId
;
2338 pNode
[1]->mQuestionId
= QuestionId
;
2339 pNode
[2]->mQuestionId
= QuestionId
;
2340 pNode
[0]->mNext
= pNode
[1];
2341 pNode
[1]->mNext
= pNode
[2];
2342 pNode
[2]->mNext
= mQuestionList
;
2343 mQuestionList
= pNode
[0];
2345 gCFormPkg
.DoPendingAssign (YearVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2346 gCFormPkg
.DoPendingAssign (MonthVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2347 gCFormPkg
.DoPendingAssign (DayVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2352 for (Index
= 0; Index
< 3; Index
++) {
2353 if (pNode
[Index
] != NULL
) {
2354 delete pNode
[Index
];
2357 QuestionId
= EFI_QUESTION_ID_INVALID
;
2361 CVfrQuestionDB::RegisterNewDateQuestion (
2364 IN OUT EFI_QUESTION_ID
&QuestionId
2367 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2369 INT8
*VarIdStr
[3] = {NULL
, };
2372 if (BaseVarId
== NULL
) {
2376 Len
= strlen (BaseVarId
);
2378 VarIdStr
[0] = new INT8
[Len
+ strlen (".Year") + 1];
2379 if (VarIdStr
[0] != NULL
) {
2380 strcpy (VarIdStr
[0], BaseVarId
);
2381 strcat (VarIdStr
[0], ".Year");
2383 VarIdStr
[1] = new INT8
[Len
+ strlen (".Month") + 1];
2384 if (VarIdStr
[1] != NULL
) {
2385 strcpy (VarIdStr
[1], BaseVarId
);
2386 strcat (VarIdStr
[1], ".Month");
2388 VarIdStr
[2] = new INT8
[Len
+ strlen (".Day") + 1];
2389 if (VarIdStr
[2] != NULL
) {
2390 strcpy (VarIdStr
[2], BaseVarId
);
2391 strcat (VarIdStr
[2], ".Day");
2394 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], DATE_YEAR_BITMASK
)) == NULL
) {
2397 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], DATE_MONTH_BITMASK
)) == NULL
) {
2400 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], DATE_DAY_BITMASK
)) == NULL
) {
2404 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2405 QuestionId
= GetFreeQuestionId ();
2407 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2410 MarkQuestionIdUsed (QuestionId
);
2413 pNode
[0]->mQuestionId
= QuestionId
;
2414 pNode
[1]->mQuestionId
= QuestionId
;
2415 pNode
[2]->mQuestionId
= QuestionId
;
2416 pNode
[0]->mNext
= pNode
[1];
2417 pNode
[1]->mNext
= pNode
[2];
2418 pNode
[2]->mNext
= mQuestionList
;
2419 mQuestionList
= pNode
[0];
2421 for (Index
= 0; Index
< 3; Index
++) {
2422 if (VarIdStr
[Index
] != NULL
) {
2423 delete VarIdStr
[Index
];
2427 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2428 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2429 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2434 for (Index
= 0; Index
< 3; Index
++) {
2435 if (pNode
[Index
] != NULL
) {
2436 delete pNode
[Index
];
2439 if (VarIdStr
[Index
] != NULL
) {
2440 delete VarIdStr
[Index
];
2446 CVfrQuestionDB::RegisterOldTimeQuestion (
2448 IN INT8
*MinuteVarId
,
2449 IN INT8
*SecondVarId
,
2450 IN OUT EFI_QUESTION_ID
&QuestionId
2453 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2456 if ((HourVarId
== NULL
) || (MinuteVarId
== NULL
) || (SecondVarId
== NULL
)) {
2460 if ((pNode
[0] = new SVfrQuestionNode (NULL
, HourVarId
, TIME_HOUR_BITMASK
)) == NULL
) {
2463 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MinuteVarId
, TIME_MINUTE_BITMASK
)) == NULL
) {
2466 if ((pNode
[2] = new SVfrQuestionNode (NULL
, SecondVarId
, TIME_SECOND_BITMASK
)) == NULL
) {
2470 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2471 QuestionId
= GetFreeQuestionId ();
2473 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2476 MarkQuestionIdUsed (QuestionId
);
2479 pNode
[0]->mQuestionId
= QuestionId
;
2480 pNode
[1]->mQuestionId
= QuestionId
;
2481 pNode
[2]->mQuestionId
= QuestionId
;
2482 pNode
[0]->mNext
= pNode
[1];
2483 pNode
[1]->mNext
= pNode
[2];
2484 pNode
[2]->mNext
= mQuestionList
;
2485 mQuestionList
= pNode
[0];
2487 gCFormPkg
.DoPendingAssign (HourVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2488 gCFormPkg
.DoPendingAssign (MinuteVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2489 gCFormPkg
.DoPendingAssign (SecondVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2494 for (Index
= 0; Index
< 3; Index
++) {
2495 if (pNode
[Index
] != NULL
) {
2496 delete pNode
[Index
];
2499 QuestionId
= EFI_QUESTION_ID_INVALID
;
2503 CVfrQuestionDB::RegisterNewTimeQuestion (
2506 IN OUT EFI_QUESTION_ID
&QuestionId
2509 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2511 INT8
*VarIdStr
[3] = {NULL
, };
2514 if (BaseVarId
== NULL
) {
2518 Len
= strlen (BaseVarId
);
2520 VarIdStr
[0] = new INT8
[Len
+ strlen (".Hour") + 1];
2521 if (VarIdStr
[0] != NULL
) {
2522 strcpy (VarIdStr
[0], BaseVarId
);
2523 strcat (VarIdStr
[0], ".Hour");
2525 VarIdStr
[1] = new INT8
[Len
+ strlen (".Minute") + 1];
2526 if (VarIdStr
[1] != NULL
) {
2527 strcpy (VarIdStr
[1], BaseVarId
);
2528 strcat (VarIdStr
[1], ".Minute");
2530 VarIdStr
[2] = new INT8
[Len
+ strlen (".Second") + 1];
2531 if (VarIdStr
[2] != NULL
) {
2532 strcpy (VarIdStr
[2], BaseVarId
);
2533 strcat (VarIdStr
[2], ".Second");
2536 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], TIME_HOUR_BITMASK
)) == NULL
) {
2539 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], TIME_MINUTE_BITMASK
)) == NULL
) {
2542 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], TIME_SECOND_BITMASK
)) == NULL
) {
2546 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2547 QuestionId
= GetFreeQuestionId ();
2549 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2552 MarkQuestionIdUsed (QuestionId
);
2555 pNode
[0]->mQuestionId
= QuestionId
;
2556 pNode
[1]->mQuestionId
= QuestionId
;
2557 pNode
[2]->mQuestionId
= QuestionId
;
2558 pNode
[0]->mNext
= pNode
[1];
2559 pNode
[1]->mNext
= pNode
[2];
2560 pNode
[2]->mNext
= mQuestionList
;
2561 mQuestionList
= pNode
[0];
2563 for (Index
= 0; Index
< 3; Index
++) {
2564 if (VarIdStr
[Index
] != NULL
) {
2565 delete VarIdStr
[Index
];
2569 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2570 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2571 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2576 for (Index
= 0; Index
< 3; Index
++) {
2577 if (pNode
[Index
] != NULL
) {
2578 delete pNode
[Index
];
2581 if (VarIdStr
[Index
] != NULL
) {
2582 delete VarIdStr
[Index
];
2588 CVfrQuestionDB::UpdateQuestionId (
2589 IN EFI_QUESTION_ID QId
,
2590 IN EFI_QUESTION_ID NewQId
2593 SVfrQuestionNode
*pNode
= NULL
;
2595 if (ChekQuestionIdFree (NewQId
) == FALSE
) {
2596 return VFR_RETURN_REDEFINED
;
2599 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2600 if (pNode
->mQuestionId
== QId
) {
2605 if (pNode
== NULL
) {
2606 return VFR_RETURN_UNDEFINED
;
2609 MarkQuestionIdUnused (QId
);
2610 pNode
->mQuestionId
= NewQId
;
2611 MarkQuestionIdUsed (NewQId
);
2613 gCFormPkg
.DoPendingAssign (pNode
->mVarIdStr
, (VOID
*)&NewQId
, sizeof(EFI_QUESTION_ID
));
2615 return VFR_RETURN_SUCCESS
;
2619 CVfrQuestionDB::GetQuestionId (
2622 OUT EFI_QUESTION_ID
&QuestionId
,
2626 SVfrQuestionNode
*pNode
;
2628 QuestionId
= EFI_QUESTION_ID_INVALID
;
2629 BitMask
= 0x00000000;
2631 if ((Name
== NULL
) && (VarIdStr
== NULL
)) {
2635 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2637 if (strcmp (pNode
->mName
, Name
) != 0) {
2642 if (VarIdStr
!= NULL
) {
2643 if (strcmp (pNode
->mVarIdStr
, VarIdStr
) != 0) {
2648 QuestionId
= pNode
->mQuestionId
;
2649 BitMask
= pNode
->mBitMask
;
2657 CVfrQuestionDB::FindQuestion (
2658 IN EFI_QUESTION_ID QuestionId
2661 SVfrQuestionNode
*pNode
;
2663 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2664 return VFR_RETURN_INVALID_PARAMETER
;
2667 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2668 if (pNode
->mQuestionId
== QuestionId
) {
2669 return VFR_RETURN_SUCCESS
;
2673 return VFR_RETURN_UNDEFINED
;
2677 CVfrQuestionDB::FindQuestion (
2681 SVfrQuestionNode
*pNode
;
2684 return VFR_RETURN_FATAL_ERROR
;
2687 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2688 if (strcmp (pNode
->mName
, Name
) == 0) {
2689 return VFR_RETURN_SUCCESS
;
2693 return VFR_RETURN_UNDEFINED
;