3 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
22 #include "VfrUtilityLib.h"
23 #include "VfrFormPkg.h"
26 CVfrBinaryOutput::WriteLine (
36 if ((pFile
== NULL
) || (LineHeader
== NULL
) || (BlkBuf
== NULL
)) {
40 for (Index
= 0; Index
< BlkSize
; Index
++) {
41 if ((Index
% LineBytes
) == 0) {
42 fprintf (pFile
, "\n%s", LineHeader
);
44 fprintf (pFile
, "0x%02X, ", (UINT8
)BlkBuf
[Index
]);
49 CVfrBinaryOutput::WriteEnd (
59 if ((BlkSize
== 0) || (pFile
== NULL
) || (LineHeader
== NULL
) || (BlkBuf
== NULL
)) {
63 for (Index
= 0; Index
< BlkSize
- 1; Index
++) {
64 if ((Index
% LineBytes
) == 0) {
65 fprintf (pFile
, "\n%s", LineHeader
);
67 fprintf (pFile
, "0x%02X, ", (UINT8
)BlkBuf
[Index
]);
70 if ((Index
% LineBytes
) == 0) {
71 fprintf (pFile
, "\n%s", LineHeader
);
73 fprintf (pFile
, "0x%02X\n", (UINT8
)BlkBuf
[Index
]);
76 SConfigInfo::SConfigInfo (
80 IN EFI_IFR_TYPE_VALUE Value
84 mWidth
= (UINT16
)Width
;
85 mValue
= new UINT8
[mWidth
];
91 case EFI_IFR_TYPE_NUM_SIZE_8
:
92 memcpy (mValue
, &Value
.u8
, mWidth
);
94 case EFI_IFR_TYPE_NUM_SIZE_16
:
95 memcpy (mValue
, &Value
.u16
, mWidth
);
97 case EFI_IFR_TYPE_NUM_SIZE_32
:
98 memcpy (mValue
, &Value
.u32
, mWidth
);
100 case EFI_IFR_TYPE_NUM_SIZE_64
:
101 memcpy (mValue
, &Value
.u64
, mWidth
);
103 case EFI_IFR_TYPE_BOOLEAN
:
104 memcpy (mValue
, &Value
.b
, mWidth
);
106 case EFI_IFR_TYPE_TIME
:
107 memcpy (mValue
, &Value
.time
, mWidth
);
109 case EFI_IFR_TYPE_DATE
:
110 memcpy (mValue
, &Value
.date
, mWidth
);
112 case EFI_IFR_TYPE_STRING
:
113 memcpy (mValue
, &Value
.string
, mWidth
);
115 case EFI_IFR_TYPE_OTHER
:
120 SConfigInfo::~SConfigInfo (
124 BUFFER_SAFE_FREE (mValue
);
127 SConfigItem::SConfigItem (
138 if ((mId
= new INT8
[strlen (Id
) + 1]) != NULL
) {
144 if ((mInfo
= new INT8
[strlen (Info
) + 1]) != NULL
) {
145 strcpy (mInfo
, Info
);
150 SConfigItem::SConfigItem (
156 IN EFI_IFR_TYPE_VALUE Value
165 if ((mId
= new INT8
[strlen (Id
) + 1]) != NULL
) {
171 if ((mInfo
= new INT8
[strlen (Info
) + 1]) != NULL
) {
172 strcpy (mInfo
, Info
);
176 mInfoStrList
= new SConfigInfo(Type
, Offset
, Width
, Value
);
179 SConfigItem::~SConfigItem (
185 BUFFER_SAFE_FREE (mId
);
186 BUFFER_SAFE_FREE (mInfo
);
187 while (mInfoStrList
!= NULL
) {
189 mInfoStrList
= mInfoStrList
->mNext
;
191 BUFFER_SAFE_FREE (Info
);
196 CVfrBufferConfig::Register (
203 if (Select (Id
) == 0) {
207 if ((pNew
= new SConfigItem (Id
, Info
)) == NULL
) {
210 if (mItemListHead
== NULL
) {
211 mItemListHead
= pNew
;
212 mItemListTail
= pNew
;
214 mItemListTail
->mNext
= pNew
;
215 mItemListTail
= pNew
;
223 CVfrBufferConfig::Open (
227 mItemListPos
= mItemListHead
;
231 CVfrBufferConfig::Eof(
235 return (mItemListPos
== NULL
) ? TRUE
: FALSE
;
239 CVfrBufferConfig::Select (
247 mItemListPos
= mItemListHead
;
250 for (p
= mItemListHead
; p
!= NULL
; p
= p
->mNext
) {
251 if (strcmp (p
->mId
, Id
) != 0) {
255 if ((p
->mInfo
!= NULL
) && (Info
!= NULL
)) {
256 if (strcmp (p
->mInfo
, Info
) != 0) {
270 CVfrBufferConfig::Write (
277 IN EFI_IFR_TYPE_VALUE Value
286 if (Select (Id
) == 0) {
287 if((pInfo
= new SConfigInfo (Type
, Offset
, Width
, Value
)) == NULL
) {
290 pInfo
->mNext
= mItemListPos
->mInfoStrList
;
291 mItemListPos
->mInfoStrList
= pInfo
;
293 if ((pItem
= new SConfigItem (Id
, Info
, Type
, Offset
, Width
, Value
)) == NULL
) {
296 if (mItemListHead
== NULL
) {
297 mItemListHead
= pItem
;
298 mItemListTail
= pItem
;
300 mItemListTail
->mNext
= pItem
;
301 mItemListTail
= pItem
;
303 mItemListPos
= pItem
;
308 if ((Ret
= Select (Id
)) != 0) {
312 if (mItemListHead
== mItemListPos
) {
313 mItemListHead
= mItemListPos
->mNext
;
318 for (pItem
= mItemListHead
; pItem
->mNext
!= mItemListPos
; pItem
= pItem
->mNext
)
321 pItem
->mNext
= mItemListPos
->mNext
;
322 if (mItemListTail
== mItemListPos
) {
323 mItemListTail
= pItem
;
326 mItemListPos
= pItem
->mNext
;
329 case 'i' : // set info
330 if ((Ret
= Select (Id
)) != 0) {
333 if (mItemListPos
->mInfo
!= NULL
) {
334 delete mItemListPos
->mInfo
;
336 mItemListPos
->mInfo
= NULL
;
338 if ((mItemListPos
->mInfo
= new INT8
[strlen (Info
) + 1]) == NULL
) {
341 strcpy (mItemListPos
->mInfo
, Info
);
354 CVfrBufferConfig::ReadId (
359 if (mInfoStrItemListPos
== NULL
) {
360 return 1; // end read or some error occur
364 *Id
= new INT8 (strlen (mInfoStrItemListPos
->mId
+ 1));
365 strcpy (*Id
, mInfoStrItemListPos
->mId
);
368 *Info
= new INT8 (strlen (mInfoStrItemListPos
->mInfo
+ 1));
369 strcpy (*Info
, mInfoStrItemListPos
->mInfo
);
376 CVfrBufferConfig::ReadInfo (
379 IN OUT UINT32
&Number
,
391 if ((ret
= Select (Id
)) != 0) {
396 if (mInfoStrItemListPos
== NULL
) {
397 return 1; // end read or some error occur
400 p
= mInfoStrItemListPos
->mInfoStrList
;
401 for (idx
= 0; (idx
< Index
) && (p
!= NULL
); idx
++) {
408 if (Offset
!= NULL
) {
418 while (num
< Number
) {
419 if (Offset
!= NULL
) {
420 strcat (Offset
, p
->mOffset
);
423 strcat (Width
, p
->mWidth
);
426 strcat (Value
, p
->mValue
);
430 if ((p
= p
->mNext
) == NULL
) {
440 CVfrBufferConfig::ReadNext (
444 if (mItemListPos
!= NULL
) {
445 mItemListPos
= mItemListPos
->mNext
;
451 CVfrBufferConfig::Close (
458 #define BYTES_PRE_LINE 0x10
461 CVfrBufferConfig::OutputCFile (
466 CVfrBinaryOutput Output
;
475 for (Item
= mItemListHead
; Item
!= NULL
; Item
= Item
->mNext
) {
476 if (Item
->mInfoStrList
!= NULL
) {
477 fprintf (pFile
, "\nunsigned char %s%sDefault%04x[] = {", BaseName
, Item
->mId
, Item
->mInfo
);
479 TotalLen
= sizeof (UINT32
);
480 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
481 TotalLen
+= Info
->mWidth
+ sizeof (UINT16
) * 2;
483 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&TotalLen
, sizeof (UINT32
));
485 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
486 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&Info
->mOffset
, sizeof (UINT16
));
487 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&Info
->mWidth
, sizeof (UINT16
));
488 if (Info
->mNext
== NULL
) {
489 Output
.WriteEnd (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)Info
->mValue
, Info
->mWidth
);
491 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)Info
->mValue
, Info
->mWidth
);
493 fprintf (pFile
, "\n");
495 fprintf (pFile
, "};\n");
500 CVfrBufferConfig::CVfrBufferConfig (
504 mItemListHead
= NULL
;
505 mItemListTail
= NULL
;
509 CVfrBufferConfig::~CVfrBufferConfig (
515 while (mItemListHead
!= NULL
) {
517 mItemListHead
= mItemListHead
->mNext
;
521 mItemListHead
= NULL
;
522 mItemListTail
= NULL
;
526 CVfrBufferConfig gCVfrBufferConfig
;
533 } gInternalTypesTable
[] = {
534 {"UINT64", EFI_IFR_TYPE_NUM_SIZE_64
, sizeof (UINT64
), sizeof (UINT64
)},
535 {"UINT32", EFI_IFR_TYPE_NUM_SIZE_32
, sizeof (UINT32
), sizeof (UINT32
)},
536 {"UINT16", EFI_IFR_TYPE_NUM_SIZE_16
, sizeof (UINT16
), sizeof (UINT16
)},
537 {"UINT8", EFI_IFR_TYPE_NUM_SIZE_8
, sizeof (UINT8
), sizeof (UINT8
)},
538 {"BOOLEAN", EFI_IFR_TYPE_BOOLEAN
, sizeof (BOOLEAN
), sizeof (BOOLEAN
)},
539 {"EFI_HII_DATE", EFI_IFR_TYPE_DATE
, sizeof (EFI_HII_DATE
), sizeof (UINT8
)},
540 {"EFI_STRING_ID", EFI_IFR_TYPE_STRING
, sizeof (EFI_STRING_ID
),sizeof (EFI_STRING_ID
)},
541 {"EFI_HII_TIME", EFI_IFR_TYPE_TIME
, sizeof (EFI_HII_TIME
), sizeof (UINT8
)},
542 {NULL
, EFI_IFR_TYPE_OTHER
, 0, 0}
553 if (TypeName
== NULL
) {
557 for (Index
= 0; gInternalTypesTable
[Index
].mTypeName
!= NULL
; Index
++) {
558 if (strcmp (TypeName
, gInternalTypesTable
[Index
].mTypeName
) == 0) {
575 while (*Str
&& *Str
== ' ') {
578 while (*Str
&& *Str
== '0') {
581 if (*Str
&& (*Str
== 'x' || *Str
== 'X')) {
598 Str
= TrimHex (Str
, &IsHex
);
599 for (Value
= 0; (c
= *Str
) != '\0'; Str
++) {
601 // BUG: does not handle overflow here
603 (IsHex
== TRUE
) ? (Value
<<= 4) : (Value
*= 10);
605 if ((IsHex
== TRUE
) && (c
>= 'a') && (c
<= 'f')) {
606 Value
+= (c
- 'a' + 10);
608 if ((IsHex
== TRUE
) && (c
>= 'A') && (c
<= 'F')) {
609 Value
+= (c
- 'A' + 10);
611 if (c
>= '0' && c
<= '9') {
620 CVfrVarDataTypeDB::RegisterNewType (
624 New
->mNext
= mDataTypeList
;
629 CVfrVarDataTypeDB::ExtractStructTypeName (
635 return VFR_RETURN_FATAL_ERROR
;
638 while((*VarStr
!= '\0') && (*VarStr
!= '.')) {
644 if (*VarStr
== '.') {
648 return VFR_RETURN_SUCCESS
;
652 CVfrVarDataTypeDB::ExtractFieldNameAndArrary (
659 INT8 ArrayStr
[MAX_NAME_LEN
+ 1];
661 ArrayIdx
= INVALID_ARRAY_INDEX
;
664 return VFR_RETURN_FATAL_ERROR
;
667 while((*VarStr
!= '\0') &&
681 return VFR_RETURN_SUCCESS
;
684 for (Idx
= 0; (Idx
< MAX_NAME_LEN
) && (*VarStr
!= '\0') && (*VarStr
!= ']'); VarStr
++, Idx
++) {
685 ArrayStr
[Idx
] = *VarStr
;
687 ArrayStr
[Idx
] = '\0';
689 if ((*VarStr
!= ']') && (ArrayStr
[0] == '\0')) {
690 return VFR_RETURN_DATA_STRING_ERROR
;
692 ArrayIdx
= _STR2U32 (ArrayStr
);
693 if (*VarStr
== ']') {
696 return VFR_RETURN_SUCCESS
;
698 return VFR_RETURN_DATA_STRING_ERROR
;
701 return VFR_RETURN_SUCCESS
;
705 CVfrVarDataTypeDB::GetTypeField (
707 IN SVfrDataType
*Type
,
708 OUT SVfrDataField
*&Field
711 SVfrDataField
*pField
= NULL
;
713 if ((FName
== NULL
) && (Type
== NULL
)) {
714 return VFR_RETURN_FATAL_ERROR
;
717 for (pField
= Type
->mMembers
; pField
!= NULL
; pField
= pField
->mNext
) {
718 if (strcmp (pField
->mFieldName
, FName
) == 0) {
720 return VFR_RETURN_SUCCESS
;
724 return VFR_RETURN_UNDEFINED
;
728 CVfrVarDataTypeDB::GetFieldOffset (
729 IN SVfrDataField
*Field
,
735 return VFR_RETURN_FATAL_ERROR
;
738 if ((ArrayIdx
!= INVALID_ARRAY_INDEX
) && ((Field
->mArrayNum
== 0) || (Field
->mArrayNum
<= ArrayIdx
))) {
739 return VFR_RETURN_ERROR_ARRARY_NUM
;
742 Offset
= Field
->mOffset
+ Field
->mFieldType
->mTotalSize
* ((ArrayIdx
== INVALID_ARRAY_INDEX
) ? 0 : ArrayIdx
);
743 return VFR_RETURN_SUCCESS
;
747 CVfrVarDataTypeDB::GetFieldWidth (
748 IN SVfrDataField
*Field
755 return Field
->mFieldType
->mType
;
759 CVfrVarDataTypeDB::GetFieldSize (
760 IN SVfrDataField
*Field
,
765 return VFR_RETURN_FATAL_ERROR
;
768 if ((ArrayIdx
== INVALID_ARRAY_INDEX
) && (Field
->mArrayNum
!= 0)) {
769 return Field
->mFieldType
->mTotalSize
* Field
->mArrayNum
;
771 return Field
->mFieldType
->mTotalSize
;
776 CVfrVarDataTypeDB::InternalTypesListInit (
780 SVfrDataType
*New
= NULL
;
783 for (Index
= 0; gInternalTypesTable
[Index
].mTypeName
!= NULL
; Index
++) {
784 New
= new SVfrDataType
;
786 strcpy (New
->mTypeName
, gInternalTypesTable
[Index
].mTypeName
);
787 New
->mType
= gInternalTypesTable
[Index
].mType
;
788 New
->mAlign
= gInternalTypesTable
[Index
].mAlign
;
789 New
->mTotalSize
= gInternalTypesTable
[Index
].mSize
;
790 if (strcmp (gInternalTypesTable
[Index
].mTypeName
, "EFI_HII_DATE") == 0) {
791 SVfrDataField
*pYearField
= new SVfrDataField
;
792 SVfrDataField
*pMonthField
= new SVfrDataField
;
793 SVfrDataField
*pDayField
= new SVfrDataField
;
795 strcpy (pYearField
->mFieldName
, "Year");
796 GetDataType ("UINT8", &pYearField
->mFieldType
);
797 pYearField
->mOffset
= 0;
798 pYearField
->mNext
= pMonthField
;
799 pYearField
->mArrayNum
= 0;
801 strcpy (pMonthField
->mFieldName
, "Month");
802 GetDataType ("UINT8", &pMonthField
->mFieldType
);
803 pMonthField
->mOffset
= 1;
804 pMonthField
->mNext
= pDayField
;
805 pMonthField
->mArrayNum
= 0;
807 strcpy (pDayField
->mFieldName
, "Day");
808 GetDataType ("UINT8", &pDayField
->mFieldType
);
809 pDayField
->mOffset
= 2;
810 pDayField
->mNext
= NULL
;
811 pDayField
->mArrayNum
= 0;
813 New
->mMembers
= pYearField
;
814 } else if (strcmp (gInternalTypesTable
[Index
].mTypeName
, "EFI_HII_TIME") == 0) {
815 SVfrDataField
*pHoursField
= new SVfrDataField
;
816 SVfrDataField
*pMinutesField
= new SVfrDataField
;
817 SVfrDataField
*pSecondsField
= new SVfrDataField
;
819 strcpy (pHoursField
->mFieldName
, "Hours");
820 GetDataType ("UINT8", &pHoursField
->mFieldType
);
821 pHoursField
->mOffset
= 0;
822 pHoursField
->mNext
= pMinutesField
;
823 pHoursField
->mArrayNum
= 0;
825 strcpy (pMinutesField
->mFieldName
, "Minutes");
826 GetDataType ("UINT8", &pMinutesField
->mFieldType
);
827 pMinutesField
->mOffset
= 1;
828 pMinutesField
->mNext
= pSecondsField
;
829 pMinutesField
->mArrayNum
= 0;
831 strcpy (pSecondsField
->mFieldName
, "Seconds");
832 GetDataType ("UINT8", &pSecondsField
->mFieldType
);
833 pSecondsField
->mOffset
= 2;
834 pSecondsField
->mNext
= NULL
;
835 pSecondsField
->mArrayNum
= 0;
837 New
->mMembers
= pHoursField
;
839 New
->mMembers
= NULL
;
842 RegisterNewType (New
);
848 CVfrVarDataTypeDB::CVfrVarDataTypeDB (
852 mDataTypeList
= NULL
;
854 mCurrDataField
= NULL
;
855 mPackAlign
= DEFAULT_PACK_ALIGN
;
857 InternalTypesListInit ();
860 CVfrVarDataTypeDB::~CVfrVarDataTypeDB (
865 SVfrDataField
*pField
;
867 if (mNewDataType
!= NULL
) {
871 while (mDataTypeList
!= NULL
) {
872 pType
= mDataTypeList
;
873 mDataTypeList
= mDataTypeList
->mNext
;
874 while(pType
->mMembers
!= NULL
) {
875 pField
= pType
->mMembers
;
876 pType
->mMembers
= pType
->mMembers
->mNext
;
885 CVfrVarDataTypeDB::Pack (
890 return VFR_RETURN_INVALID_PARAMETER
;
891 } else if (Align
> 1) {
892 mPackAlign
= Align
+ Align
% 2;
897 return VFR_RETURN_SUCCESS
;
901 CVfrVarDataTypeDB::UnPack (
905 mPackAlign
= DEFAULT_PACK_ALIGN
;
909 CVfrVarDataTypeDB::DeclareDataTypeBegin (
913 SVfrDataType
*pNewType
= NULL
;
915 pNewType
= new SVfrDataType
;
916 pNewType
->mTypeName
[0] = '\0';
917 pNewType
->mType
= EFI_IFR_TYPE_OTHER
;
918 pNewType
->mAlign
= DEFAULT_ALIGN
;
919 pNewType
->mTotalSize
= 0;
920 pNewType
->mMembers
= NULL
;
921 pNewType
->mNext
= NULL
;
923 mNewDataType
= pNewType
;
927 CVfrVarDataTypeDB::SetNewTypeName (
933 if (mNewDataType
== NULL
) {
934 return VFR_RETURN_ERROR_SKIPED
;
936 if (TypeName
== NULL
) {
937 return VFR_RETURN_FATAL_ERROR
;
939 if (strlen(TypeName
) >= MAX_NAME_LEN
) {
940 return VFR_RETURN_INVALID_PARAMETER
;
943 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
944 if (strcmp(pType
->mTypeName
, TypeName
) == 0) {
945 return VFR_RETURN_REDEFINED
;
949 strcpy(mNewDataType
->mTypeName
, TypeName
);
950 return VFR_RETURN_SUCCESS
;
954 CVfrVarDataTypeDB::DataTypeAddField (
960 SVfrDataField
*pNewField
= NULL
;
961 SVfrDataType
*pFieldType
= NULL
;
965 CHECK_ERROR_RETURN (GetDataType (TypeName
, &pFieldType
), VFR_RETURN_SUCCESS
);
967 if (strlen (FieldName
) >= MAX_NAME_LEN
) {
968 return VFR_RETURN_INVALID_PARAMETER
;
971 for (pTmp
= mNewDataType
->mMembers
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
972 if (strcmp (pTmp
->mFieldName
, FieldName
) == 0) {
973 return VFR_RETURN_REDEFINED
;
977 Align
= MIN (mPackAlign
, pFieldType
->mAlign
);
979 if ((pNewField
= new SVfrDataField
) == NULL
) {
980 return VFR_RETURN_OUT_FOR_RESOURCES
;
982 strcpy (pNewField
->mFieldName
, FieldName
);
983 pNewField
->mFieldType
= pFieldType
;
984 pNewField
->mArrayNum
= ArrayNum
;
985 if ((mNewDataType
->mTotalSize
% Align
) == 0) {
986 pNewField
->mOffset
= mNewDataType
->mTotalSize
;
988 pNewField
->mOffset
= mNewDataType
->mTotalSize
+ ALIGN_STUFF(mNewDataType
->mTotalSize
, Align
);
990 if (mNewDataType
->mMembers
== NULL
) {
991 mNewDataType
->mMembers
= pNewField
;
992 pNewField
->mNext
= NULL
;
994 for (pTmp
= mNewDataType
->mMembers
; pTmp
->mNext
!= NULL
; pTmp
= pTmp
->mNext
)
996 pTmp
->mNext
= pNewField
;
997 pNewField
->mNext
= NULL
;
1000 mNewDataType
->mAlign
= MIN (mPackAlign
, MAX (pFieldType
->mAlign
, mNewDataType
->mAlign
));
1001 mNewDataType
->mTotalSize
= pNewField
->mOffset
+ (pNewField
->mFieldType
->mTotalSize
) * ((ArrayNum
== 0) ? 1 : ArrayNum
);
1003 return VFR_RETURN_SUCCESS
;
1007 CVfrVarDataTypeDB::DeclareDataTypeEnd (
1011 if (mNewDataType
->mTypeName
[0] == '\0') {
1015 if ((mNewDataType
->mTotalSize
% mNewDataType
->mAlign
) !=0) {
1016 mNewDataType
->mTotalSize
+= ALIGN_STUFF (mNewDataType
->mTotalSize
, mNewDataType
->mAlign
);
1019 RegisterNewType (mNewDataType
);
1020 mNewDataType
= NULL
;
1024 CVfrVarDataTypeDB::GetDataType (
1026 OUT SVfrDataType
**DataType
1030 SVfrDataType
*pDataType
= NULL
;
1032 if (TypeName
== NULL
) {
1033 return VFR_RETURN_ERROR_SKIPED
;
1036 if (DataType
== NULL
) {
1037 return VFR_RETURN_FATAL_ERROR
;
1042 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1043 if (strcmp (TypeName
, pDataType
->mTypeName
) == 0) {
1044 *DataType
= pDataType
;
1045 return VFR_RETURN_SUCCESS
;
1049 return VFR_RETURN_UNDEFINED
;
1053 CVfrVarDataTypeDB::GetDataTypeSize (
1058 SVfrDataType
*pDataType
= NULL
;
1061 return VFR_RETURN_FATAL_ERROR
;
1066 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1067 if (strcmp (TypeName
, pDataType
->mTypeName
) == 0) {
1068 *Size
= pDataType
->mTotalSize
;
1069 return VFR_RETURN_SUCCESS
;
1073 return VFR_RETURN_UNDEFINED
;
1077 CVfrVarDataTypeDB::GetDataFieldInfo (
1084 INT8 TName
[MAX_NAME_LEN
], FName
[MAX_NAME_LEN
];
1085 UINT32 ArrayIdx
, Tmp
;
1086 SVfrDataType
*pType
= NULL
;
1087 SVfrDataField
*pField
= NULL
;
1090 Type
= EFI_IFR_TYPE_OTHER
;
1093 CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr
, TName
), VFR_RETURN_SUCCESS
);
1094 CHECK_ERROR_RETURN (GetDataType (TName
, &pType
), VFR_RETURN_SUCCESS
);
1097 // if it is not struct data type
1099 Type
= pType
->mType
;
1100 Size
= pType
->mTotalSize
;
1102 while (*VarStr
!= '\0') {
1103 CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr
, FName
, ArrayIdx
), VFR_RETURN_SUCCESS
);
1104 CHECK_ERROR_RETURN(GetTypeField (FName
, pType
, pField
), VFR_RETURN_SUCCESS
);
1105 pType
= pField
->mFieldType
;
1106 CHECK_ERROR_RETURN(GetFieldOffset (pField
, ArrayIdx
, Tmp
), VFR_RETURN_SUCCESS
);
1108 Type
= GetFieldWidth (pField
);
1109 Size
= GetFieldSize (pField
, ArrayIdx
);
1111 return VFR_RETURN_SUCCESS
;
1115 CVfrVarDataTypeDB::GetUserDefinedTypeNameList (
1116 OUT INT8
***NameList
,
1117 OUT UINT32
*ListSize
1121 SVfrDataType
*pType
;
1123 if ((NameList
== NULL
) || (ListSize
== NULL
)) {
1124 return VFR_RETURN_FATAL_ERROR
;
1130 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1131 if (_IS_INTERNAL_TYPE(pType
->mTypeName
) == FALSE
) {
1136 if (*ListSize
== 0) {
1137 return VFR_RETURN_SUCCESS
;
1140 if ((*NameList
= new INT8
*[*ListSize
]) == NULL
) {
1142 return VFR_RETURN_OUT_FOR_RESOURCES
;
1145 for (Index
= 0, pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
, Index
++) {
1146 if (_IS_INTERNAL_TYPE(pType
->mTypeName
) == FALSE
) {
1147 (*NameList
)[Index
] = pType
->mTypeName
;
1150 return VFR_RETURN_SUCCESS
;
1154 CVfrVarDataTypeDB::IsTypeNameDefined (
1158 SVfrDataType
*pType
;
1160 if (TypeName
== NULL
) {
1164 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1165 if (strcmp (pType
->mTypeName
, TypeName
) == 0) {
1173 #ifdef CVFR_VARDATATYPEDB_DEBUG
1175 CVfrVarDataTypeDB::ParserDB (
1179 SVfrDataType
*pTNode
;
1180 SVfrDataField
*pFNode
;
1182 printf ("***************************************************************\n");
1183 printf ("\t\tmPackAlign = %x\n", mPackAlign
);
1184 for (pTNode
= mDataTypeList
; pTNode
!= NULL
; pTNode
= pTNode
->mNext
) {
1185 printf ("\t\tstruct %s : mAlign [%x] mTotalSize [%x]\n\n", pTNode
->mTypeName
, pTNode
->mAlign
, pTNode
->mTotalSize
);
1186 printf ("\t\tstruct %s {\n", pTNode
->mTypeName
);
1187 for (pFNode
= pTNode
->mMembers
; pFNode
!= NULL
; pFNode
= pFNode
->mNext
) {
1188 printf ("\t\t\t%s\t%s\n", pFNode
->mFieldType
->mTypeName
, pFNode
->mFieldName
);
1190 printf ("\t\t};\n");
1191 printf ("---------------------------------------------------------------\n");
1193 printf ("***************************************************************\n");
1197 SVfrVarStorageNode::SVfrVarStorageNode (
1200 IN EFI_VARSTORE_ID VarStoreId
,
1201 IN EFI_STRING_ID VarName
,
1208 memset (&Guid
, 0, sizeof (EFI_GUID
));
1210 if (StoreName
!= NULL
) {
1211 mVarStoreName
= new INT8
[strlen(StoreName
) + 1];
1212 strcpy (mVarStoreName
, StoreName
);
1214 mVarStoreName
= NULL
;
1217 mVarStoreId
= VarStoreId
;
1218 mVarStoreType
= EFI_VFR_VARSTORE_EFI
;
1219 mStorageInfo
.mEfiVar
.mEfiVarName
= VarName
;
1220 mStorageInfo
.mEfiVar
.mEfiVarSize
= VarSize
;
1223 SVfrVarStorageNode::SVfrVarStorageNode (
1226 IN EFI_VARSTORE_ID VarStoreId
,
1227 IN SVfrDataType
*DataType
1233 memset (&Guid
, 0, sizeof (EFI_GUID
));
1235 if (StoreName
!= NULL
) {
1236 mVarStoreName
= new INT8
[strlen(StoreName
) + 1];
1237 strcpy (mVarStoreName
, StoreName
);
1239 mVarStoreName
= NULL
;
1242 mVarStoreId
= VarStoreId
;
1243 mVarStoreType
= EFI_VFR_VARSTORE_BUFFER
;
1244 mStorageInfo
.mDataType
= DataType
;
1247 SVfrVarStorageNode::SVfrVarStorageNode (
1249 IN EFI_VARSTORE_ID VarStoreId
1252 if (StoreName
!= NULL
) {
1253 mVarStoreName
= new INT8
[strlen(StoreName
) + 1];
1254 strcpy (mVarStoreName
, StoreName
);
1256 mVarStoreName
= NULL
;
1259 mVarStoreId
= VarStoreId
;
1260 mVarStoreType
= EFI_VFR_VARSTORE_NAME
;
1261 mStorageInfo
.mNameSpace
.mNameTable
= new EFI_VARSTORE_ID
[DEFAULT_NAME_TABLE_ITEMS
];
1262 mStorageInfo
.mNameSpace
.mTableSize
= 0;
1265 SVfrVarStorageNode::~SVfrVarStorageNode (
1269 if (mVarStoreName
!= NULL
) {
1270 delete mVarStoreName
;
1273 if (mVarStoreType
== EFI_VFR_VARSTORE_NAME
) {
1274 delete mStorageInfo
.mNameSpace
.mNameTable
;
1278 CVfrDataStorage::CVfrDataStorage (
1284 for (Index
= 0; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1285 mFreeVarStoreIdBitMap
[Index
] = 0;
1288 // Question ID 0 is reserved.
1289 mFreeVarStoreIdBitMap
[0] = 0x80000000;
1291 mBufferVarStoreList
= NULL
;
1292 mEfiVarStoreList
= NULL
;
1293 mNameVarStoreList
= NULL
;
1294 mCurrVarStorageNode
= NULL
;
1295 mNewVarStorageNode
= NULL
;
1298 CVfrDataStorage::~CVfrDataStorage (
1302 SVfrVarStorageNode
*pNode
;
1304 while (mBufferVarStoreList
!= NULL
) {
1305 pNode
= mBufferVarStoreList
;
1306 mBufferVarStoreList
= mBufferVarStoreList
->mNext
;
1309 while (mEfiVarStoreList
!= NULL
) {
1310 pNode
= mEfiVarStoreList
;
1311 mEfiVarStoreList
= mEfiVarStoreList
->mNext
;
1314 while (mNameVarStoreList
!= NULL
) {
1315 pNode
= mNameVarStoreList
;
1316 mNameVarStoreList
= mNameVarStoreList
->mNext
;
1319 if (mNewVarStorageNode
!= NULL
) {
1320 delete mNewVarStorageNode
;
1325 CVfrDataStorage::GetFreeVarStoreId (
1329 UINT32 Index
, Mask
, Offset
;
1331 for (Index
= 0; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1332 if (mFreeVarStoreIdBitMap
[Index
] != 0xFFFFFFFF) {
1337 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
1338 if ((mFreeVarStoreIdBitMap
[Index
] & Mask
) == 0) {
1339 mFreeVarStoreIdBitMap
[Index
] |= Mask
;
1340 return (EFI_VARSTORE_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
1344 return EFI_VARSTORE_ID_INVALID
;
1348 CVfrDataStorage::ChekVarStoreIdFree (
1349 IN EFI_VARSTORE_ID VarStoreId
1352 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1353 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1355 return (mFreeVarStoreIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
1359 CVfrDataStorage::MarkVarStoreIdUsed (
1360 IN EFI_VARSTORE_ID VarStoreId
1363 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1364 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1366 mFreeVarStoreIdBitMap
[Index
] |= (0x80000000 >> Offset
);
1370 CVfrDataStorage::MarkVarStoreIdUnused (
1371 IN EFI_VARSTORE_ID VarStoreId
1374 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1375 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1377 mFreeVarStoreIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
1381 CVfrDataStorage::DeclareNameVarStoreBegin (
1385 SVfrVarStorageNode
*pNode
= NULL
;
1386 EFI_VARSTORE_ID VarStoreId
;
1388 if (StoreName
== NULL
) {
1389 return VFR_RETURN_FATAL_ERROR
;
1392 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1393 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1394 return VFR_RETURN_REDEFINED
;
1398 VarStoreId
= GetFreeVarStoreId ();
1399 if ((pNode
= new SVfrVarStorageNode (StoreName
, VarStoreId
)) == NULL
) {
1400 return VFR_RETURN_UNDEFINED
;
1403 mNewVarStorageNode
= pNode
;
1405 return VFR_RETURN_SUCCESS
;
1409 CVfrDataStorage::NameTableAddItem (
1410 IN EFI_STRING_ID Item
1413 EFI_VARSTORE_ID
*NewTable
, *OldTable
;
1416 OldTable
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
;
1417 TableSize
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
;
1419 if ((TableSize
!= 0) && ((TableSize
% DEFAULT_NAME_TABLE_ITEMS
) == 0)) {
1420 if ((NewTable
= new EFI_VARSTORE_ID
[TableSize
+ DEFAULT_NAME_TABLE_ITEMS
]) == NULL
) {
1421 return VFR_RETURN_OUT_FOR_RESOURCES
;
1423 memcpy (NewTable
, OldTable
, TableSize
);
1424 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
= NewTable
;
1427 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[TableSize
++] = Item
;
1428 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
= TableSize
;
1430 return VFR_RETURN_SUCCESS
;
1434 CVfrDataStorage::DeclareNameVarStoreEnd (
1438 mNewVarStorageNode
->mGuid
= *Guid
;
1439 mNewVarStorageNode
->mNext
= mNameVarStoreList
;
1440 mNameVarStoreList
= mNewVarStorageNode
;
1442 mNewVarStorageNode
= NULL
;
1444 return VFR_RETURN_SUCCESS
;
1448 CVfrDataStorage::DeclareEfiVarStore (
1451 IN EFI_STRING_ID NameStrId
,
1455 SVfrVarStorageNode
*pNode
;
1456 EFI_VARSTORE_ID VarStoreId
;
1458 if ((StoreName
== NULL
) || (Guid
== NULL
)) {
1459 return VFR_RETURN_FATAL_ERROR
;
1462 if (VarSize
> sizeof (UINT64
)) {
1463 return VFR_RETURN_EFIVARSTORE_SIZE_ERROR
;
1466 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1467 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1468 return VFR_RETURN_REDEFINED
;
1472 VarStoreId
= GetFreeVarStoreId ();
1473 if ((pNode
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, NameStrId
, VarSize
)) == NULL
) {
1474 return VFR_RETURN_OUT_FOR_RESOURCES
;
1477 pNode
->mNext
= mNameVarStoreList
;
1478 mNameVarStoreList
= pNode
;
1480 return VFR_RETURN_SUCCESS
;
1484 CVfrDataStorage::DeclareBufferVarStore (
1487 IN CVfrVarDataTypeDB
*DataTypeDB
,
1489 IN EFI_VARSTORE_ID VarStoreId
1492 SVfrVarStorageNode
*pNew
= NULL
;
1493 SVfrDataType
*pDataType
= NULL
;
1495 if ((StoreName
== NULL
) || (Guid
== NULL
) || (DataTypeDB
== NULL
)) {
1496 return VFR_RETURN_FATAL_ERROR
;
1499 CHECK_ERROR_RETURN(DataTypeDB
->GetDataType (TypeName
, &pDataType
), VFR_RETURN_SUCCESS
);
1501 if (VarStoreId
== EFI_VARSTORE_ID_INVALID
) {
1502 VarStoreId
= GetFreeVarStoreId ();
1504 if (ChekVarStoreIdFree (VarStoreId
) == FALSE
) {
1505 return VFR_RETURN_VARSTOREID_REDEFINED
;
1507 MarkVarStoreIdUsed (VarStoreId
);
1510 if ((pNew
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, pDataType
)) == NULL
) {
1511 return VFR_RETURN_OUT_FOR_RESOURCES
;
1514 pNew
->mNext
= mBufferVarStoreList
;
1515 mBufferVarStoreList
= pNew
;
1517 if (gCVfrBufferConfig
.Register(StoreName
) != 0) {
1518 return VFR_RETURN_FATAL_ERROR
;
1521 return VFR_RETURN_SUCCESS
;
1525 CVfrDataStorage::GetVarStoreId (
1527 OUT EFI_VARSTORE_ID
*VarStoreId
1530 SVfrVarStorageNode
*pNode
;
1532 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1533 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1534 mCurrVarStorageNode
= pNode
;
1535 *VarStoreId
= pNode
->mVarStoreId
;
1536 return VFR_RETURN_SUCCESS
;
1540 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1541 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1542 mCurrVarStorageNode
= pNode
;
1543 *VarStoreId
= pNode
->mVarStoreId
;
1544 return VFR_RETURN_SUCCESS
;
1548 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1549 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1550 mCurrVarStorageNode
= pNode
;
1551 *VarStoreId
= pNode
->mVarStoreId
;
1552 return VFR_RETURN_SUCCESS
;
1556 mCurrVarStorageNode
= NULL
;
1557 *VarStoreId
= EFI_VARSTORE_ID_INVALID
;
1558 return VFR_RETURN_UNDEFINED
;
1562 CVfrDataStorage::GetBufferVarStoreDataTypeName (
1564 OUT INT8
**DataTypeName
1567 SVfrVarStorageNode
*pNode
;
1569 if ((StoreName
== NULL
) || (DataTypeName
== NULL
)) {
1570 return VFR_RETURN_FATAL_ERROR
;
1573 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1574 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1579 if (pNode
== NULL
) {
1580 return VFR_RETURN_UNDEFINED
;
1583 if (pNode
->mStorageInfo
.mDataType
== NULL
) {
1584 return VFR_RETURN_FATAL_ERROR
;
1587 *DataTypeName
= pNode
->mStorageInfo
.mDataType
->mTypeName
;
1588 return VFR_RETURN_SUCCESS
;
1592 CVfrDataStorage::GetVarStoreType (
1594 OUT EFI_VFR_VARSTORE_TYPE
&VarStoreType
1597 SVfrVarStorageNode
*pNode
;
1599 if (StoreName
== NULL
) {
1600 return VFR_RETURN_FATAL_ERROR
;
1603 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1604 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1605 VarStoreType
= pNode
->mVarStoreType
;
1606 return VFR_RETURN_SUCCESS
;
1610 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1611 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1612 VarStoreType
= pNode
->mVarStoreType
;
1613 return VFR_RETURN_SUCCESS
;
1617 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1618 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1619 VarStoreType
= pNode
->mVarStoreType
;
1620 return VFR_RETURN_SUCCESS
;
1624 VarStoreType
= EFI_VFR_VARSTORE_INVALID
;
1625 return VFR_RETURN_UNDEFINED
;
1629 CVfrDataStorage::GetVarStoreName (
1630 IN EFI_VARSTORE_ID VarStoreId
,
1631 OUT INT8
**VarStoreName
1634 SVfrVarStorageNode
*pNode
;
1636 if (VarStoreName
== NULL
) {
1637 return VFR_RETURN_FATAL_ERROR
;
1640 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1641 if (pNode
->mVarStoreId
== VarStoreId
) {
1642 *VarStoreName
= pNode
->mVarStoreName
;
1643 return VFR_RETURN_SUCCESS
;
1647 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1648 if (pNode
->mVarStoreId
== VarStoreId
) {
1649 *VarStoreName
= pNode
->mVarStoreName
;
1650 return VFR_RETURN_SUCCESS
;
1654 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1655 if (pNode
->mVarStoreId
== VarStoreId
) {
1656 *VarStoreName
= pNode
->mVarStoreName
;
1657 return VFR_RETURN_SUCCESS
;
1661 *VarStoreName
= NULL
;
1662 return VFR_RETURN_UNDEFINED
;
1666 CVfrDataStorage::GetEfiVarStoreInfo (
1667 IN OUT EFI_VARSTORE_INFO
*Info
1671 return VFR_RETURN_FATAL_ERROR
;
1674 if (mCurrVarStorageNode
== NULL
) {
1675 return VFR_RETURN_GET_EFIVARSTORE_ERROR
;
1678 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarName
;
1679 Info
->mVarTotalSize
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarSize
;
1680 switch (Info
->mVarTotalSize
) {
1682 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_8
;
1685 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_16
;
1688 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_32
;
1691 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_64
;
1694 return VFR_RETURN_FATAL_ERROR
;
1697 return VFR_RETURN_SUCCESS
;
1701 CVfrDataStorage::GetNameVarStoreInfo (
1702 OUT EFI_VARSTORE_INFO
*Info
,
1707 return VFR_RETURN_FATAL_ERROR
;
1710 if (mCurrVarStorageNode
== NULL
) {
1711 return VFR_RETURN_GET_NVVARSTORE_ERROR
;
1714 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[Index
];
1716 return VFR_RETURN_SUCCESS
;
1720 CVfrDataStorage::BufferVarStoreRequestElementAdd (
1722 IN EFI_VARSTORE_INFO
&Info
1725 INT8 NewReqElt
[128] = {'\0',};
1726 INT8
*OldReqElt
= NULL
;
1727 SVfrVarStorageNode
*pNode
= NULL
;
1728 EFI_IFR_TYPE_VALUE Value
;
1730 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1731 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1736 if (pNode
== NULL
) {
1737 return VFR_RETURN_UNDEFINED
;
1740 gCVfrBufferConfig
.Open ();
1742 if (gCVfrBufferConfig
.Write ('a', StoreName
, NULL
, EFI_IFR_TYPE_NUM_SIZE_8
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
) != 0) {
1743 return VFR_RETURN_FATAL_ERROR
;
1745 gCVfrBufferConfig
.Close ();
1747 return VFR_RETURN_SUCCESS
;
1750 SVfrDefaultStoreNode::SVfrDefaultStoreNode (
1751 IN EFI_IFR_DEFAULTSTORE
*ObjBinAddr
,
1753 IN EFI_STRING_ID DefaultStoreNameId
,
1757 mObjBinAddr
= ObjBinAddr
;
1759 if (RefName
!= NULL
) {
1760 mRefName
= new INT8
[strlen (RefName
) + 1];
1761 strcpy (mRefName
, RefName
);
1767 mDefaultId
= DefaultId
;
1768 mDefaultStoreNameId
= DefaultStoreNameId
;
1771 SVfrDefaultStoreNode::~SVfrDefaultStoreNode (
1775 if (mRefName
!= NULL
) {
1780 CVfrDefaultStore::CVfrDefaultStore (
1784 mDefaultStoreList
= NULL
;
1787 CVfrDefaultStore::~CVfrDefaultStore (
1791 SVfrDefaultStoreNode
*pTmp
= NULL
;
1793 while (mDefaultStoreList
!= NULL
) {
1794 pTmp
= mDefaultStoreList
;
1795 mDefaultStoreList
= mDefaultStoreList
->mNext
;
1801 CVfrDefaultStore::RegisterDefaultStore (
1802 IN CHAR8
*ObjBinAddr
,
1804 IN EFI_STRING_ID DefaultStoreNameId
,
1808 SVfrDefaultStoreNode
*pNode
= NULL
;
1810 if (RefName
== NULL
) {
1811 return VFR_RETURN_FATAL_ERROR
;
1814 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1815 if (strcmp (pNode
->mRefName
, RefName
) == 0) {
1816 return VFR_RETURN_REDEFINED
;
1820 if ((pNode
= new SVfrDefaultStoreNode ((EFI_IFR_DEFAULTSTORE
*)ObjBinAddr
, RefName
, DefaultStoreNameId
, DefaultId
)) == NULL
) {
1821 return VFR_RETURN_OUT_FOR_RESOURCES
;
1824 pNode
->mNext
= mDefaultStoreList
;
1825 mDefaultStoreList
= pNode
;
1827 return VFR_RETURN_SUCCESS
;
1831 * assign new reference name or new default store name id only if
1832 * the original is invalid
1835 CVfrDefaultStore::ReRegisterDefaultStoreById (
1836 IN UINT16 DefaultId
,
1838 IN EFI_STRING_ID DefaultStoreNameId
1841 SVfrDefaultStoreNode
*pNode
= NULL
;
1843 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1844 if (pNode
->mDefaultId
== DefaultId
) {
1849 if (pNode
== NULL
) {
1850 return VFR_RETURN_UNDEFINED
;
1852 if (pNode
->mDefaultStoreNameId
== EFI_STRING_ID_INVALID
) {
1853 pNode
->mDefaultStoreNameId
= DefaultStoreNameId
;
1854 if (pNode
->mObjBinAddr
!= NULL
) {
1855 pNode
->mObjBinAddr
->DefaultName
= DefaultStoreNameId
;
1858 return VFR_RETURN_REDEFINED
;
1861 if (RefName
!= NULL
) {
1862 delete pNode
->mRefName
;
1863 pNode
->mRefName
= new INT8
[strlen (RefName
) + 1];
1864 if (pNode
->mRefName
!= NULL
) {
1865 strcpy (pNode
->mRefName
, RefName
);
1870 return VFR_RETURN_SUCCESS
;
1874 CVfrDefaultStore::DefaultIdRegistered (
1878 SVfrDefaultStoreNode
*pNode
= NULL
;
1880 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1881 if (pNode
->mDefaultId
== DefaultId
) {
1890 CVfrDefaultStore::GetDefaultId (
1892 OUT UINT16
*DefaultId
1895 SVfrDefaultStoreNode
*pTmp
= NULL
;
1897 if (DefaultId
== NULL
) {
1898 return VFR_RETURN_FATAL_ERROR
;
1901 for (pTmp
= mDefaultStoreList
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
1902 if (strcmp (pTmp
->mRefName
, RefName
) == 0) {
1903 *DefaultId
= pTmp
->mDefaultId
;
1904 return VFR_RETURN_SUCCESS
;
1908 return VFR_RETURN_UNDEFINED
;
1913 AltCfgItemPrintToBuffer (
1915 IN EFI_VARSTORE_INFO Info
,
1917 IN EFI_IFR_TYPE_VALUE Value
1921 UINT8
*BufChar
= NULL
;
1924 if (NewAltCfg
!= NULL
) {
1927 "&OFFSET=%x&WIDTH=%x&VALUE=",
1928 Info
.mInfo
.mVarOffset
,
1934 case EFI_IFR_TYPE_NUM_SIZE_8
:
1935 Count
= sprintf (NewAltCfg
, "%x", Value
.u8
);
1938 case EFI_IFR_TYPE_NUM_SIZE_16
:
1939 Count
= sprintf (NewAltCfg
, "%x", Value
.u16
);
1942 case EFI_IFR_TYPE_NUM_SIZE_32
:
1943 Count
= sprintf (NewAltCfg
, "%x", Value
.u32
);
1946 case EFI_IFR_TYPE_NUM_SIZE_64
:
1947 Count
= sprintf (NewAltCfg
, "%x", Value
.u64
);
1950 case EFI_IFR_TYPE_BOOLEAN
:
1951 Count
= sprintf (NewAltCfg
, "%x", Value
.b
);
1954 case EFI_IFR_TYPE_TIME
:
1956 Count
= sprintf (NewAltCfg
, "%x", *((UINT32
*)(&Value
.time
)));
1959 BufChar
= (UINT8
*)&Value
.time
;
1960 for (Index
= 0; Index
< sizeof(EFI_HII_TIME
); Index
++) {
1961 Count
= sprintf (NewAltCfg
, "%02x", (UINT8
)BufChar
[Index
]);
1966 case EFI_IFR_TYPE_DATE
:
1968 Count
= sprintf (NewAltCfg
, "%x", *((UINT32
*)(&Value
.date
)));
1971 BufChar
= (UINT8
*)&Value
.date
;
1972 for (Index
= 0; Index
< sizeof(EFI_HII_DATE
); Index
++) {
1973 Count
= sprintf (NewAltCfg
, "%02x", (UINT8
)BufChar
[Index
]);
1978 case EFI_IFR_TYPE_STRING
:
1979 Count
= sprintf (NewAltCfg
, "%x", Value
.string
);
1982 case EFI_IFR_TYPE_OTHER
:
1983 return VFR_RETURN_UNSUPPORTED
;
1987 return VFR_RETURN_FATAL_ERROR
;
1991 CVfrDefaultStore::BufferVarStoreAltConfigAdd (
1992 IN EFI_VARSTORE_ID DefaultId
,
1993 IN EFI_VARSTORE_INFO
&Info
,
1994 IN INT8
*VarStoreName
,
1996 IN EFI_IFR_TYPE_VALUE Value
1999 SVfrDefaultStoreNode
*pNode
= NULL
;
2000 INT8 NewAltCfg
[2 * 2 * sizeof (UINT16
) + 1] = {0,};
2002 if (VarStoreName
== NULL
) {
2003 return VFR_RETURN_FATAL_ERROR
;
2006 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2007 if (pNode
->mDefaultId
== DefaultId
) {
2012 if (pNode
== NULL
) {
2013 return VFR_RETURN_UNDEFINED
;
2016 gCVfrBufferConfig
.Open ();
2018 sprintf (NewAltCfg
, "%04x", pNode
->mDefaultId
);
2019 if ((gCVfrBufferConfig
.Select(VarStoreName
) == 0) &&
2020 (gCVfrBufferConfig
.Select(VarStoreName
, NewAltCfg
) != 0)) {
2021 if (gCVfrBufferConfig
.Write ('i', VarStoreName
, NewAltCfg
, Type
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
) != 0) {
2026 if (gCVfrBufferConfig
.Write ('a', VarStoreName
, NULL
, Type
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
) != 0) {
2030 gCVfrBufferConfig
.Close ();
2032 return VFR_RETURN_SUCCESS
;
2035 gCVfrBufferConfig
.Close ();
2036 return VFR_RETURN_FATAL_ERROR
;
2039 SVfrRuleNode::SVfrRuleNode (
2044 if (RuleName
!= NULL
) {
2045 mRuleName
= new INT8
[strlen (RuleName
) + 1];
2046 strcpy (mRuleName
, RuleName
);
2055 SVfrRuleNode::~SVfrRuleNode (
2059 if (mRuleName
!= NULL
) {
2064 CVfrRulesDB::CVfrRulesDB ()
2067 mFreeRuleId
= EFI_VARSTORE_ID_START
;
2070 CVfrRulesDB::~CVfrRulesDB ()
2072 SVfrRuleNode
*pNode
;
2074 while(mRuleList
!= NULL
) {
2076 mRuleList
= mRuleList
->mNext
;
2082 CVfrRulesDB::RegisterRule (
2088 if (RuleName
== NULL
) {
2092 if ((pNew
= new SVfrRuleNode (RuleName
, mFreeRuleId
)) == NULL
) {
2098 pNew
->mNext
= mRuleList
;
2103 CVfrRulesDB::GetRuleId (
2107 SVfrRuleNode
*pNode
;
2109 if (RuleName
== NULL
) {
2110 return EFI_RULE_ID_INVALID
;
2113 for (pNode
= mRuleList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2114 if (strcmp (pNode
->mRuleName
, RuleName
) == 0) {
2115 return pNode
->mRuleId
;
2119 return EFI_RULE_ID_INVALID
;
2122 CVfrRulesDB gCVfrRulesDB
;
2124 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2128 mVarStoreId
= EFI_VARSTORE_ID_INVALID
;
2129 mInfo
.mVarName
= EFI_STRING_ID_INVALID
;
2130 mInfo
.mVarOffset
= EFI_VAROFFSET_INVALID
;
2131 mVarType
= EFI_IFR_TYPE_OTHER
;
2135 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2136 IN EFI_VARSTORE_INFO
&Info
2139 mVarStoreId
= Info
.mVarStoreId
;
2140 mInfo
.mVarName
= Info
.mInfo
.mVarName
;
2141 mInfo
.mVarOffset
= Info
.mInfo
.mVarOffset
;
2142 mVarType
= Info
.mVarType
;
2143 mVarTotalSize
= Info
.mVarTotalSize
;
2147 EFI_VARSTORE_INFO::operator == (
2148 IN EFI_VARSTORE_INFO
*Info
2151 if ((mVarStoreId
== Info
->mVarStoreId
) &&
2152 (mInfo
.mVarName
== Info
->mInfo
.mVarName
) &&
2153 (mInfo
.mVarOffset
== Info
->mInfo
.mVarOffset
) &&
2154 (mVarType
== Info
->mVarType
) &&
2155 (mVarTotalSize
== Info
->mVarTotalSize
)) {
2162 static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo
;
2165 CVfrQuestionDB::GetFreeQuestionId (
2169 UINT32 Index
, Mask
, Offset
;
2171 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2172 if (mFreeQIdBitMap
[Index
] != 0xFFFFFFFF) {
2177 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
2178 if ((mFreeQIdBitMap
[Index
] & Mask
) == 0) {
2179 mFreeQIdBitMap
[Index
] |= Mask
;
2180 return (EFI_QUESTION_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
2184 return EFI_QUESTION_ID_INVALID
;
2188 CVfrQuestionDB::ChekQuestionIdFree (
2189 IN EFI_QUESTION_ID QId
2192 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2193 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2195 return (mFreeQIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
2199 CVfrQuestionDB::MarkQuestionIdUsed (
2200 IN EFI_QUESTION_ID QId
2203 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2204 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2206 mFreeQIdBitMap
[Index
] |= (0x80000000 >> Offset
);
2210 CVfrQuestionDB::MarkQuestionIdUnused (
2211 IN EFI_QUESTION_ID QId
2214 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2215 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2217 mFreeQIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
2220 SVfrQuestionNode::SVfrQuestionNode (
2228 mQuestionId
= EFI_QUESTION_ID_INVALID
;
2233 mName
= new INT8
[strlen ("$DEFAULT") + 1];
2234 strcpy (mName
, "$DEFAULT");
2236 mName
= new INT8
[strlen (Name
) + 1];
2237 strcpy (mName
, Name
);
2240 if (VarIdStr
!= NULL
) {
2241 mVarIdStr
= new INT8
[strlen (VarIdStr
) + 1];
2242 strcpy (mVarIdStr
, VarIdStr
);
2244 mVarIdStr
= new INT8
[strlen ("$") + 1];
2245 strcpy (mVarIdStr
, "$");
2249 SVfrQuestionNode::~SVfrQuestionNode (
2253 if (mName
!= NULL
) {
2257 if (mVarIdStr
!= NULL
) {
2262 CVfrQuestionDB::CVfrQuestionDB ()
2266 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2267 mFreeQIdBitMap
[Index
] = 0;
2270 // Question ID 0 is reserved.
2271 mFreeQIdBitMap
[0] = 0x80000000;
2272 mQuestionList
= NULL
;
2275 CVfrQuestionDB::~CVfrQuestionDB ()
2277 SVfrQuestionNode
*pNode
;
2279 while (mQuestionList
!= NULL
) {
2280 pNode
= mQuestionList
;
2281 mQuestionList
= mQuestionList
->mNext
;
2287 CVfrQuestionDB::RegisterQuestion (
2290 IN OUT EFI_QUESTION_ID
&QuestionId
2293 SVfrQuestionNode
*pNode
= NULL
;
2295 if ((Name
!= NULL
) && (FindQuestion(Name
) == VFR_RETURN_SUCCESS
)) {
2296 return VFR_RETURN_REDEFINED
;
2299 if ((pNode
= new SVfrQuestionNode (Name
, VarIdStr
)) == NULL
) {
2300 return VFR_RETURN_OUT_FOR_RESOURCES
;
2303 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2304 QuestionId
= GetFreeQuestionId ();
2306 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2308 return VFR_RETURN_QUESTIONID_REDEFINED
;
2310 MarkQuestionIdUsed (QuestionId
);
2312 pNode
->mQuestionId
= QuestionId
;
2314 pNode
->mNext
= mQuestionList
;
2315 mQuestionList
= pNode
;
2317 gCFormPkg
.DoPendingAssign (VarIdStr
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2319 return VFR_RETURN_SUCCESS
;
2323 CVfrQuestionDB::RegisterOldDateQuestion (
2325 IN INT8
*MonthVarId
,
2327 IN OUT EFI_QUESTION_ID
&QuestionId
2330 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2333 if ((YearVarId
== NULL
) || (MonthVarId
== NULL
) || (DayVarId
== NULL
)) {
2337 if ((pNode
[0] = new SVfrQuestionNode (NULL
, YearVarId
, DATE_YEAR_BITMASK
)) == NULL
) {
2340 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MonthVarId
, DATE_MONTH_BITMASK
)) == NULL
) {
2343 if ((pNode
[2] = new SVfrQuestionNode (NULL
, DayVarId
, DATE_DAY_BITMASK
)) == NULL
) {
2347 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2348 QuestionId
= GetFreeQuestionId ();
2350 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2353 MarkQuestionIdUsed (QuestionId
);
2356 pNode
[0]->mQuestionId
= QuestionId
;
2357 pNode
[1]->mQuestionId
= QuestionId
;
2358 pNode
[2]->mQuestionId
= QuestionId
;
2359 pNode
[0]->mNext
= pNode
[1];
2360 pNode
[1]->mNext
= pNode
[2];
2361 pNode
[2]->mNext
= mQuestionList
;
2362 mQuestionList
= pNode
[0];
2364 gCFormPkg
.DoPendingAssign (YearVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2365 gCFormPkg
.DoPendingAssign (MonthVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2366 gCFormPkg
.DoPendingAssign (DayVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2371 for (Index
= 0; Index
< 3; Index
++) {
2372 if (pNode
[Index
] != NULL
) {
2373 delete pNode
[Index
];
2376 QuestionId
= EFI_QUESTION_ID_INVALID
;
2380 CVfrQuestionDB::RegisterNewDateQuestion (
2383 IN OUT EFI_QUESTION_ID
&QuestionId
2386 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2388 INT8
*VarIdStr
[3] = {NULL
, };
2391 if (BaseVarId
== NULL
) {
2395 Len
= strlen (BaseVarId
);
2397 VarIdStr
[0] = new INT8
[Len
+ strlen (".Year") + 1];
2398 if (VarIdStr
[0] != NULL
) {
2399 strcpy (VarIdStr
[0], BaseVarId
);
2400 strcat (VarIdStr
[0], ".Year");
2402 VarIdStr
[1] = new INT8
[Len
+ strlen (".Month") + 1];
2403 if (VarIdStr
[1] != NULL
) {
2404 strcpy (VarIdStr
[1], BaseVarId
);
2405 strcat (VarIdStr
[1], ".Month");
2407 VarIdStr
[2] = new INT8
[Len
+ strlen (".Day") + 1];
2408 if (VarIdStr
[2] != NULL
) {
2409 strcpy (VarIdStr
[2], BaseVarId
);
2410 strcat (VarIdStr
[2], ".Day");
2413 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], DATE_YEAR_BITMASK
)) == NULL
) {
2416 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], DATE_MONTH_BITMASK
)) == NULL
) {
2419 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], DATE_DAY_BITMASK
)) == NULL
) {
2423 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2424 QuestionId
= GetFreeQuestionId ();
2426 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2429 MarkQuestionIdUsed (QuestionId
);
2432 pNode
[0]->mQuestionId
= QuestionId
;
2433 pNode
[1]->mQuestionId
= QuestionId
;
2434 pNode
[2]->mQuestionId
= QuestionId
;
2435 pNode
[0]->mNext
= pNode
[1];
2436 pNode
[1]->mNext
= pNode
[2];
2437 pNode
[2]->mNext
= mQuestionList
;
2438 mQuestionList
= pNode
[0];
2440 for (Index
= 0; Index
< 3; Index
++) {
2441 if (VarIdStr
[Index
] != NULL
) {
2442 delete VarIdStr
[Index
];
2446 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2447 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2448 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2453 for (Index
= 0; Index
< 3; Index
++) {
2454 if (pNode
[Index
] != NULL
) {
2455 delete pNode
[Index
];
2458 if (VarIdStr
[Index
] != NULL
) {
2459 delete VarIdStr
[Index
];
2465 CVfrQuestionDB::RegisterOldTimeQuestion (
2467 IN INT8
*MinuteVarId
,
2468 IN INT8
*SecondVarId
,
2469 IN OUT EFI_QUESTION_ID
&QuestionId
2472 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2475 if ((HourVarId
== NULL
) || (MinuteVarId
== NULL
) || (SecondVarId
== NULL
)) {
2479 if ((pNode
[0] = new SVfrQuestionNode (NULL
, HourVarId
, TIME_HOUR_BITMASK
)) == NULL
) {
2482 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MinuteVarId
, TIME_MINUTE_BITMASK
)) == NULL
) {
2485 if ((pNode
[2] = new SVfrQuestionNode (NULL
, SecondVarId
, TIME_SECOND_BITMASK
)) == NULL
) {
2489 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2490 QuestionId
= GetFreeQuestionId ();
2492 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2495 MarkQuestionIdUsed (QuestionId
);
2498 pNode
[0]->mQuestionId
= QuestionId
;
2499 pNode
[1]->mQuestionId
= QuestionId
;
2500 pNode
[2]->mQuestionId
= QuestionId
;
2501 pNode
[0]->mNext
= pNode
[1];
2502 pNode
[1]->mNext
= pNode
[2];
2503 pNode
[2]->mNext
= mQuestionList
;
2504 mQuestionList
= pNode
[0];
2506 gCFormPkg
.DoPendingAssign (HourVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2507 gCFormPkg
.DoPendingAssign (MinuteVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2508 gCFormPkg
.DoPendingAssign (SecondVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2513 for (Index
= 0; Index
< 3; Index
++) {
2514 if (pNode
[Index
] != NULL
) {
2515 delete pNode
[Index
];
2518 QuestionId
= EFI_QUESTION_ID_INVALID
;
2522 CVfrQuestionDB::RegisterNewTimeQuestion (
2525 IN OUT EFI_QUESTION_ID
&QuestionId
2528 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2530 INT8
*VarIdStr
[3] = {NULL
, };
2533 if (BaseVarId
== NULL
) {
2537 Len
= strlen (BaseVarId
);
2539 VarIdStr
[0] = new INT8
[Len
+ strlen (".Hour") + 1];
2540 if (VarIdStr
[0] != NULL
) {
2541 strcpy (VarIdStr
[0], BaseVarId
);
2542 strcat (VarIdStr
[0], ".Hour");
2544 VarIdStr
[1] = new INT8
[Len
+ strlen (".Minute") + 1];
2545 if (VarIdStr
[1] != NULL
) {
2546 strcpy (VarIdStr
[1], BaseVarId
);
2547 strcat (VarIdStr
[1], ".Minute");
2549 VarIdStr
[2] = new INT8
[Len
+ strlen (".Second") + 1];
2550 if (VarIdStr
[2] != NULL
) {
2551 strcpy (VarIdStr
[2], BaseVarId
);
2552 strcat (VarIdStr
[2], ".Second");
2555 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], TIME_HOUR_BITMASK
)) == NULL
) {
2558 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], TIME_MINUTE_BITMASK
)) == NULL
) {
2561 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], TIME_SECOND_BITMASK
)) == NULL
) {
2565 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2566 QuestionId
= GetFreeQuestionId ();
2568 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2571 MarkQuestionIdUsed (QuestionId
);
2574 pNode
[0]->mQuestionId
= QuestionId
;
2575 pNode
[1]->mQuestionId
= QuestionId
;
2576 pNode
[2]->mQuestionId
= QuestionId
;
2577 pNode
[0]->mNext
= pNode
[1];
2578 pNode
[1]->mNext
= pNode
[2];
2579 pNode
[2]->mNext
= mQuestionList
;
2580 mQuestionList
= pNode
[0];
2582 for (Index
= 0; Index
< 3; Index
++) {
2583 if (VarIdStr
[Index
] != NULL
) {
2584 delete VarIdStr
[Index
];
2588 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2589 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2590 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2595 for (Index
= 0; Index
< 3; Index
++) {
2596 if (pNode
[Index
] != NULL
) {
2597 delete pNode
[Index
];
2600 if (VarIdStr
[Index
] != NULL
) {
2601 delete VarIdStr
[Index
];
2607 CVfrQuestionDB::UpdateQuestionId (
2608 IN EFI_QUESTION_ID QId
,
2609 IN EFI_QUESTION_ID NewQId
2612 SVfrQuestionNode
*pNode
= NULL
;
2614 if (ChekQuestionIdFree (NewQId
) == FALSE
) {
2615 return VFR_RETURN_REDEFINED
;
2618 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2619 if (pNode
->mQuestionId
== QId
) {
2624 if (pNode
== NULL
) {
2625 return VFR_RETURN_UNDEFINED
;
2628 MarkQuestionIdUnused (QId
);
2629 pNode
->mQuestionId
= NewQId
;
2630 MarkQuestionIdUsed (NewQId
);
2632 gCFormPkg
.DoPendingAssign (pNode
->mVarIdStr
, (VOID
*)&NewQId
, sizeof(EFI_QUESTION_ID
));
2634 return VFR_RETURN_SUCCESS
;
2638 CVfrQuestionDB::GetQuestionId (
2641 OUT EFI_QUESTION_ID
&QuestionId
,
2645 SVfrQuestionNode
*pNode
;
2647 QuestionId
= EFI_QUESTION_ID_INVALID
;
2648 BitMask
= 0x00000000;
2650 if ((Name
== NULL
) && (VarIdStr
== NULL
)) {
2654 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2656 if (strcmp (pNode
->mName
, Name
) != 0) {
2661 if (VarIdStr
!= NULL
) {
2662 if (strcmp (pNode
->mVarIdStr
, VarIdStr
) != 0) {
2667 QuestionId
= pNode
->mQuestionId
;
2668 BitMask
= pNode
->mBitMask
;
2676 CVfrQuestionDB::FindQuestion (
2677 IN EFI_QUESTION_ID QuestionId
2680 SVfrQuestionNode
*pNode
;
2682 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2683 return VFR_RETURN_INVALID_PARAMETER
;
2686 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2687 if (pNode
->mQuestionId
== QuestionId
) {
2688 return VFR_RETURN_SUCCESS
;
2692 return VFR_RETURN_UNDEFINED
;
2696 CVfrQuestionDB::FindQuestion (
2700 SVfrQuestionNode
*pNode
;
2703 return VFR_RETURN_FATAL_ERROR
;
2706 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2707 if (strcmp (pNode
->mName
, Name
) == 0) {
2708 return VFR_RETURN_SUCCESS
;
2712 return VFR_RETURN_UNDEFINED
;