2 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
3 This program and the accompanying materials
4 are licensed and made available under the terms and conditions of the BSD License
5 which accompanies this distribution. The full text of the license may be found at
6 http://opensource.org/licenses/bsd-license.php
8 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
9 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
20 #include "VfrUtilityLib.h"
21 #include "VfrFormPkg.h"
24 CVfrBinaryOutput::WriteLine (
34 if ((pFile
== NULL
) || (LineHeader
== NULL
) || (BlkBuf
== NULL
)) {
38 for (Index
= 0; Index
< BlkSize
; Index
++) {
39 if ((Index
% LineBytes
) == 0) {
40 fprintf (pFile
, "\n%s", LineHeader
);
42 fprintf (pFile
, "0x%02X, ", (UINT8
)BlkBuf
[Index
]);
47 CVfrBinaryOutput::WriteEnd (
57 if ((BlkSize
== 0) || (pFile
== NULL
) || (LineHeader
== NULL
) || (BlkBuf
== NULL
)) {
61 for (Index
= 0; Index
< BlkSize
- 1; Index
++) {
62 if ((Index
% LineBytes
) == 0) {
63 fprintf (pFile
, "\n%s", LineHeader
);
65 fprintf (pFile
, "0x%02X, ", (UINT8
)BlkBuf
[Index
]);
68 if ((Index
% LineBytes
) == 0) {
69 fprintf (pFile
, "\n%s", LineHeader
);
71 fprintf (pFile
, "0x%02X\n", (UINT8
)BlkBuf
[Index
]);
74 SConfigInfo::SConfigInfo (
78 IN EFI_IFR_TYPE_VALUE Value
83 mWidth
= (UINT16
)Width
;
84 mValue
= new UINT8
[mWidth
];
90 case EFI_IFR_TYPE_NUM_SIZE_8
:
91 memcpy (mValue
, &Value
.u8
, mWidth
);
93 case EFI_IFR_TYPE_NUM_SIZE_16
:
94 memcpy (mValue
, &Value
.u16
, mWidth
);
96 case EFI_IFR_TYPE_NUM_SIZE_32
:
97 memcpy (mValue
, &Value
.u32
, mWidth
);
99 case EFI_IFR_TYPE_NUM_SIZE_64
:
100 memcpy (mValue
, &Value
.u64
, mWidth
);
102 case EFI_IFR_TYPE_BOOLEAN
:
103 memcpy (mValue
, &Value
.b
, mWidth
);
105 case EFI_IFR_TYPE_TIME
:
106 memcpy (mValue
, &Value
.time
, mWidth
);
108 case EFI_IFR_TYPE_DATE
:
109 memcpy (mValue
, &Value
.date
, mWidth
);
111 case EFI_IFR_TYPE_STRING
:
112 memcpy (mValue
, &Value
.string
, mWidth
);
114 case EFI_IFR_TYPE_OTHER
:
119 SConfigInfo::~SConfigInfo (
123 BUFFER_SAFE_FREE (mValue
);
126 SConfigItem::SConfigItem (
137 if ((mName
= new INT8
[strlen (Name
) + 1]) != NULL
) {
138 strcpy (mName
, Name
);
143 if ((mId
= new INT8
[strlen (Id
) + 1]) != NULL
) {
149 SConfigItem::SConfigItem (
155 IN EFI_IFR_TYPE_VALUE Value
164 if ((mName
= new INT8
[strlen (Name
) + 1]) != NULL
) {
165 strcpy (mName
, Name
);
170 if ((mId
= new INT8
[strlen (Id
) + 1]) != NULL
) {
175 mInfoStrList
= new SConfigInfo(Type
, Offset
, Width
, Value
);
178 SConfigItem::~SConfigItem (
184 BUFFER_SAFE_FREE (mName
);
185 BUFFER_SAFE_FREE (mId
);
186 while (mInfoStrList
!= NULL
) {
188 mInfoStrList
= mInfoStrList
->mNext
;
190 BUFFER_SAFE_FREE (Info
);
195 CVfrBufferConfig::Register (
202 if (Select (Name
) == 0) {
206 if ((pNew
= new SConfigItem (Name
, Id
)) == NULL
) {
209 if (mItemListHead
== NULL
) {
210 mItemListHead
= pNew
;
211 mItemListTail
= pNew
;
213 mItemListTail
->mNext
= pNew
;
214 mItemListTail
= pNew
;
222 CVfrBufferConfig::Open (
226 mItemListPos
= mItemListHead
;
230 CVfrBufferConfig::Eof(
234 return (mItemListPos
== NULL
) ? TRUE
: FALSE
;
238 CVfrBufferConfig::Select (
246 mItemListPos
= mItemListHead
;
249 for (p
= mItemListHead
; p
!= NULL
; p
= p
->mNext
) {
250 if (strcmp (p
->mName
, Name
) != 0) {
255 if (p
->mId
== NULL
|| strcmp (p
->mId
, Id
) != 0) {
258 } else if (p
->mId
!= NULL
) {
271 CVfrBufferConfig::Write (
278 IN EFI_IFR_TYPE_VALUE Value
285 if ((Ret
= Select (Name
)) != 0) {
291 if (Select (Name
, Id
) != 0) {
292 if ((pItem
= new SConfigItem (Name
, Id
, Type
, Offset
, Width
, Value
)) == NULL
) {
295 if (mItemListHead
== NULL
) {
296 mItemListHead
= pItem
;
297 mItemListTail
= pItem
;
299 mItemListTail
->mNext
= pItem
;
300 mItemListTail
= pItem
;
302 mItemListPos
= pItem
;
304 // tranverse the list to find out if there's already the value for the same offset
305 for (pInfo
= mItemListPos
->mInfoStrList
; pInfo
!= NULL
; pInfo
= pInfo
->mNext
) {
306 if (pInfo
->mOffset
== Offset
) {
307 // check if the value and width are the same; return error if not
308 if ((Id
!= NULL
) && (pInfo
->mWidth
!= Width
|| memcmp(pInfo
->mValue
, &Value
, Width
) != 0)) {
309 return VFR_RETURN_DEFAULT_VALUE_REDEFINED
;
314 if((pInfo
= new SConfigInfo (Type
, Offset
, Width
, Value
)) == NULL
) {
317 pInfo
->mNext
= mItemListPos
->mInfoStrList
;
318 mItemListPos
->mInfoStrList
= pInfo
;
323 if (mItemListHead
== mItemListPos
) {
324 mItemListHead
= mItemListPos
->mNext
;
329 for (pItem
= mItemListHead
; pItem
->mNext
!= mItemListPos
; pItem
= pItem
->mNext
)
332 pItem
->mNext
= mItemListPos
->mNext
;
333 if (mItemListTail
== mItemListPos
) {
334 mItemListTail
= pItem
;
337 mItemListPos
= pItem
->mNext
;
340 case 'i' : // set info
341 if (mItemListPos
->mId
!= NULL
) {
342 delete mItemListPos
->mId
;
344 mItemListPos
->mId
= NULL
;
346 if ((mItemListPos
->mId
= new INT8
[strlen (Id
) + 1]) == NULL
) {
349 strcpy (mItemListPos
->mId
, Id
);
362 CVfrBufferConfig::ReadId (
367 if (mInfoStrItemListPos
== NULL
) {
368 return 1; // end read or some error occur
372 *Name
= new INT8 (strlen (mInfoStrItemListPos
->mName
+ 1));
373 strcpy (*Name
, mInfoStrItemListPos
->mName
);
376 *Id
= new INT8 (strlen (mInfoStrItemListPos
->mId
+ 1));
377 strcpy (*Id
, mInfoStrItemListPos
->mId
);
384 CVfrBufferConfig::ReadInfo (
387 IN OUT UINT32
&Number
,
399 if ((ret
= Select (Name
)) != 0) {
404 if (mInfoStrItemListPos
== NULL
) {
405 return 1; // end read or some error occur
408 p
= mInfoStrItemListPos
->mInfoStrList
;
409 for (idx
= 0; (idx
< Index
) && (p
!= NULL
); idx
++) {
416 if (Offset
!= NULL
) {
426 while (num
< Number
) {
427 if (Offset
!= NULL
) {
428 strcat (Offset
, p
->mOffset
);
431 strcat (Width
, p
->mWidth
);
434 strcat (Value
, p
->mValue
);
438 if ((p
= p
->mNext
) == NULL
) {
448 CVfrBufferConfig::ReadNext (
452 if (mItemListPos
!= NULL
) {
453 mItemListPos
= mItemListPos
->mNext
;
459 CVfrBufferConfig::Close (
466 #define BYTES_PRE_LINE 0x10
469 CVfrBufferConfig::OutputCFile (
474 CVfrBinaryOutput Output
;
483 for (Item
= mItemListHead
; Item
!= NULL
; Item
= Item
->mNext
) {
484 if (Item
->mId
!= NULL
|| Item
->mInfoStrList
== NULL
) {
487 fprintf (pFile
, "\nunsigned char %s%sBlockName[] = {", BaseName
, Item
->mName
);
489 TotalLen
= sizeof (UINT32
);
490 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
491 TotalLen
+= sizeof (UINT16
) * 2;
493 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&TotalLen
, sizeof (UINT32
));
495 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
496 fprintf (pFile
, "\n");
497 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&Info
->mOffset
, sizeof (UINT16
));
498 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&Info
->mWidth
, sizeof (UINT16
));
500 fprintf (pFile
, "\n};\n");
503 for (Item
= mItemListHead
; Item
!= NULL
; Item
= Item
->mNext
) {
504 if (Item
->mId
!= NULL
&& Item
->mInfoStrList
!= NULL
) {
505 fprintf (pFile
, "\nunsigned char %s%sDefault%s[] = {", BaseName
, Item
->mName
, Item
->mId
);
507 TotalLen
= sizeof (UINT32
);
508 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
509 TotalLen
+= Info
->mWidth
+ sizeof (UINT16
) * 2;
511 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&TotalLen
, sizeof (UINT32
));
513 for (Info
= Item
->mInfoStrList
; Info
!= NULL
; Info
= Info
->mNext
) {
514 fprintf (pFile
, "\n");
515 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&Info
->mOffset
, sizeof (UINT16
));
516 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)&Info
->mWidth
, sizeof (UINT16
));
517 if (Info
->mNext
== NULL
) {
518 Output
.WriteEnd (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)Info
->mValue
, Info
->mWidth
);
520 Output
.WriteLine (pFile
, BYTES_PRE_LINE
, " ", (INT8
*)Info
->mValue
, Info
->mWidth
);
523 fprintf (pFile
, "\n};\n");
528 CVfrBufferConfig::CVfrBufferConfig (
532 mItemListHead
= NULL
;
533 mItemListTail
= NULL
;
537 CVfrBufferConfig::~CVfrBufferConfig (
543 while (mItemListHead
!= NULL
) {
545 mItemListHead
= mItemListHead
->mNext
;
549 mItemListHead
= NULL
;
550 mItemListTail
= NULL
;
554 CVfrBufferConfig gCVfrBufferConfig
;
561 } gInternalTypesTable
[] = {
562 {"UINT64", EFI_IFR_TYPE_NUM_SIZE_64
, sizeof (UINT64
), sizeof (UINT64
)},
563 {"UINT32", EFI_IFR_TYPE_NUM_SIZE_32
, sizeof (UINT32
), sizeof (UINT32
)},
564 {"UINT16", EFI_IFR_TYPE_NUM_SIZE_16
, sizeof (UINT16
), sizeof (UINT16
)},
565 {"UINT8", EFI_IFR_TYPE_NUM_SIZE_8
, sizeof (UINT8
), sizeof (UINT8
)},
566 {"BOOLEAN", EFI_IFR_TYPE_BOOLEAN
, sizeof (BOOLEAN
), sizeof (BOOLEAN
)},
567 {"EFI_HII_DATE", EFI_IFR_TYPE_DATE
, sizeof (EFI_HII_DATE
), sizeof (UINT16
)},
568 {"EFI_STRING_ID", EFI_IFR_TYPE_STRING
, sizeof (EFI_STRING_ID
),sizeof (EFI_STRING_ID
)},
569 {"EFI_HII_TIME", EFI_IFR_TYPE_TIME
, sizeof (EFI_HII_TIME
), sizeof (UINT8
)},
570 {NULL
, EFI_IFR_TYPE_OTHER
, 0, 0}
581 if (TypeName
== NULL
) {
585 for (Index
= 0; gInternalTypesTable
[Index
].mTypeName
!= NULL
; Index
++) {
586 if (strcmp (TypeName
, gInternalTypesTable
[Index
].mTypeName
) == 0) {
603 while (*Str
&& *Str
== ' ') {
606 while (*Str
&& *Str
== '0') {
609 if (*Str
&& (*Str
== 'x' || *Str
== 'X')) {
626 Str
= TrimHex (Str
, &IsHex
);
627 for (Value
= 0; (c
= *Str
) != '\0'; Str
++) {
629 // BUG: does not handle overflow here
631 (IsHex
== TRUE
) ? (Value
<<= 4) : (Value
*= 10);
633 if ((IsHex
== TRUE
) && (c
>= 'a') && (c
<= 'f')) {
634 Value
+= (c
- 'a' + 10);
636 if ((IsHex
== TRUE
) && (c
>= 'A') && (c
<= 'F')) {
637 Value
+= (c
- 'A' + 10);
639 if (c
>= '0' && c
<= '9') {
648 CVfrVarDataTypeDB::RegisterNewType (
652 New
->mNext
= mDataTypeList
;
657 CVfrVarDataTypeDB::ExtractStructTypeName (
663 return VFR_RETURN_FATAL_ERROR
;
666 while((*VarStr
!= '\0') && (*VarStr
!= '.')) {
672 if (*VarStr
== '.') {
676 return VFR_RETURN_SUCCESS
;
680 CVfrVarDataTypeDB::ExtractFieldNameAndArrary (
687 INT8 ArrayStr
[MAX_NAME_LEN
+ 1];
689 ArrayIdx
= INVALID_ARRAY_INDEX
;
692 return VFR_RETURN_FATAL_ERROR
;
695 while((*VarStr
!= '\0') &&
709 return VFR_RETURN_SUCCESS
;
712 for (Idx
= 0; (Idx
< MAX_NAME_LEN
) && (*VarStr
!= '\0') && (*VarStr
!= ']'); VarStr
++, Idx
++) {
713 ArrayStr
[Idx
] = *VarStr
;
715 ArrayStr
[Idx
] = '\0';
717 if ((*VarStr
!= ']') && (ArrayStr
[0] == '\0')) {
718 return VFR_RETURN_DATA_STRING_ERROR
;
720 ArrayIdx
= _STR2U32 (ArrayStr
);
721 if (*VarStr
== ']') {
724 return VFR_RETURN_SUCCESS
;
726 return VFR_RETURN_DATA_STRING_ERROR
;
729 return VFR_RETURN_SUCCESS
;
733 CVfrVarDataTypeDB::GetTypeField (
735 IN SVfrDataType
*Type
,
736 OUT SVfrDataField
*&Field
739 SVfrDataField
*pField
= NULL
;
741 if ((FName
== NULL
) && (Type
== NULL
)) {
742 return VFR_RETURN_FATAL_ERROR
;
745 for (pField
= Type
->mMembers
; pField
!= NULL
; pField
= pField
->mNext
) {
746 if (strcmp (pField
->mFieldName
, FName
) == 0) {
748 return VFR_RETURN_SUCCESS
;
752 return VFR_RETURN_UNDEFINED
;
756 CVfrVarDataTypeDB::GetFieldOffset (
757 IN SVfrDataField
*Field
,
763 return VFR_RETURN_FATAL_ERROR
;
766 if ((ArrayIdx
!= INVALID_ARRAY_INDEX
) && ((Field
->mArrayNum
== 0) || (Field
->mArrayNum
<= ArrayIdx
))) {
767 return VFR_RETURN_ERROR_ARRARY_NUM
;
770 Offset
= Field
->mOffset
+ Field
->mFieldType
->mTotalSize
* ((ArrayIdx
== INVALID_ARRAY_INDEX
) ? 0 : ArrayIdx
);
771 return VFR_RETURN_SUCCESS
;
775 CVfrVarDataTypeDB::GetFieldWidth (
776 IN SVfrDataField
*Field
783 return Field
->mFieldType
->mType
;
787 CVfrVarDataTypeDB::GetFieldSize (
788 IN SVfrDataField
*Field
,
793 return VFR_RETURN_FATAL_ERROR
;
796 if ((ArrayIdx
== INVALID_ARRAY_INDEX
) && (Field
->mArrayNum
!= 0)) {
797 return Field
->mFieldType
->mTotalSize
* Field
->mArrayNum
;
799 return Field
->mFieldType
->mTotalSize
;
804 CVfrVarDataTypeDB::InternalTypesListInit (
808 SVfrDataType
*New
= NULL
;
811 for (Index
= 0; gInternalTypesTable
[Index
].mTypeName
!= NULL
; Index
++) {
812 New
= new SVfrDataType
;
814 strcpy (New
->mTypeName
, gInternalTypesTable
[Index
].mTypeName
);
815 New
->mType
= gInternalTypesTable
[Index
].mType
;
816 New
->mAlign
= gInternalTypesTable
[Index
].mAlign
;
817 New
->mTotalSize
= gInternalTypesTable
[Index
].mSize
;
818 if (strcmp (gInternalTypesTable
[Index
].mTypeName
, "EFI_HII_DATE") == 0) {
819 SVfrDataField
*pYearField
= new SVfrDataField
;
820 SVfrDataField
*pMonthField
= new SVfrDataField
;
821 SVfrDataField
*pDayField
= new SVfrDataField
;
823 strcpy (pYearField
->mFieldName
, "Year");
824 GetDataType ("UINT8", &pYearField
->mFieldType
);
825 pYearField
->mOffset
= 0;
826 pYearField
->mNext
= pMonthField
;
827 pYearField
->mArrayNum
= 0;
829 strcpy (pMonthField
->mFieldName
, "Month");
830 GetDataType ("UINT8", &pMonthField
->mFieldType
);
831 pMonthField
->mOffset
= 1;
832 pMonthField
->mNext
= pDayField
;
833 pMonthField
->mArrayNum
= 0;
835 strcpy (pDayField
->mFieldName
, "Day");
836 GetDataType ("UINT8", &pDayField
->mFieldType
);
837 pDayField
->mOffset
= 2;
838 pDayField
->mNext
= NULL
;
839 pDayField
->mArrayNum
= 0;
841 New
->mMembers
= pYearField
;
842 } else if (strcmp (gInternalTypesTable
[Index
].mTypeName
, "EFI_HII_TIME") == 0) {
843 SVfrDataField
*pHoursField
= new SVfrDataField
;
844 SVfrDataField
*pMinutesField
= new SVfrDataField
;
845 SVfrDataField
*pSecondsField
= new SVfrDataField
;
847 strcpy (pHoursField
->mFieldName
, "Hours");
848 GetDataType ("UINT8", &pHoursField
->mFieldType
);
849 pHoursField
->mOffset
= 0;
850 pHoursField
->mNext
= pMinutesField
;
851 pHoursField
->mArrayNum
= 0;
853 strcpy (pMinutesField
->mFieldName
, "Minutes");
854 GetDataType ("UINT8", &pMinutesField
->mFieldType
);
855 pMinutesField
->mOffset
= 1;
856 pMinutesField
->mNext
= pSecondsField
;
857 pMinutesField
->mArrayNum
= 0;
859 strcpy (pSecondsField
->mFieldName
, "Seconds");
860 GetDataType ("UINT8", &pSecondsField
->mFieldType
);
861 pSecondsField
->mOffset
= 2;
862 pSecondsField
->mNext
= NULL
;
863 pSecondsField
->mArrayNum
= 0;
865 New
->mMembers
= pHoursField
;
867 New
->mMembers
= NULL
;
870 RegisterNewType (New
);
876 CVfrVarDataTypeDB::CVfrVarDataTypeDB (
880 mDataTypeList
= NULL
;
882 mCurrDataField
= NULL
;
883 mPackAlign
= DEFAULT_PACK_ALIGN
;
886 InternalTypesListInit ();
889 CVfrVarDataTypeDB::~CVfrVarDataTypeDB (
894 SVfrDataField
*pField
;
895 SVfrPackStackNode
*pPack
;
897 if (mNewDataType
!= NULL
) {
901 while (mDataTypeList
!= NULL
) {
902 pType
= mDataTypeList
;
903 mDataTypeList
= mDataTypeList
->mNext
;
904 while(pType
->mMembers
!= NULL
) {
905 pField
= pType
->mMembers
;
906 pType
->mMembers
= pType
->mMembers
->mNext
;
912 while (mPackStack
!= NULL
) {
914 mPackStack
= mPackStack
->mNext
;
920 CVfrVarDataTypeDB::Pack (
928 INT8 Msg
[64] = {0, };
930 if (Action
& VFR_PACK_SHOW
) {
931 sprintf (Msg
, "value of pragma pack(show) == %d", mPackAlign
);
932 gCVfrErrorHandle
.PrintMsg (LineNum
, "", "Warning", Msg
);
935 if (Action
& VFR_PACK_PUSH
) {
936 SVfrPackStackNode
*pNew
= NULL
;
938 if ((pNew
= new SVfrPackStackNode (Identifier
, mPackAlign
)) == NULL
) {
939 return VFR_RETURN_FATAL_ERROR
;
941 pNew
->mNext
= mPackStack
;
945 if (Action
& VFR_PACK_POP
) {
946 SVfrPackStackNode
*pNode
= NULL
;
948 if (mPackStack
== NULL
) {
949 gCVfrErrorHandle
.PrintMsg (LineNum
, "", "Warning", "#pragma pack(pop...) : more pops than pushes");
952 for (pNode
= mPackStack
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
953 if (pNode
->Match (Identifier
) == TRUE
) {
954 mPackAlign
= pNode
->mNumber
;
955 mPackStack
= pNode
->mNext
;
960 if (Action
& VFR_PACK_ASSIGN
) {
961 PackAlign
= (Number
> 1) ? Number
+ Number
% 2 : Number
;
962 if ((PackAlign
== 0) || (PackAlign
> 16)) {
963 gCVfrErrorHandle
.PrintMsg (LineNum
, "", "Warning", "expected pragma parameter to be '1', '2', '4', '8', or '16'");
965 mPackAlign
= PackAlign
;
969 return VFR_RETURN_SUCCESS
;
973 CVfrVarDataTypeDB::DeclareDataTypeBegin (
977 SVfrDataType
*pNewType
= NULL
;
979 pNewType
= new SVfrDataType
;
980 pNewType
->mTypeName
[0] = '\0';
981 pNewType
->mType
= EFI_IFR_TYPE_OTHER
;
982 pNewType
->mAlign
= DEFAULT_ALIGN
;
983 pNewType
->mTotalSize
= 0;
984 pNewType
->mMembers
= NULL
;
985 pNewType
->mNext
= NULL
;
987 mNewDataType
= pNewType
;
991 CVfrVarDataTypeDB::SetNewTypeName (
997 if (mNewDataType
== NULL
) {
998 return VFR_RETURN_ERROR_SKIPED
;
1000 if (TypeName
== NULL
) {
1001 return VFR_RETURN_FATAL_ERROR
;
1003 if (strlen(TypeName
) >= MAX_NAME_LEN
) {
1004 return VFR_RETURN_INVALID_PARAMETER
;
1007 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1008 if (strcmp(pType
->mTypeName
, TypeName
) == 0) {
1009 return VFR_RETURN_REDEFINED
;
1013 strcpy(mNewDataType
->mTypeName
, TypeName
);
1014 return VFR_RETURN_SUCCESS
;
1018 CVfrVarDataTypeDB::DataTypeAddField (
1024 SVfrDataField
*pNewField
= NULL
;
1025 SVfrDataType
*pFieldType
= NULL
;
1026 SVfrDataField
*pTmp
;
1029 CHECK_ERROR_RETURN (GetDataType (TypeName
, &pFieldType
), VFR_RETURN_SUCCESS
);
1031 if (strlen (FieldName
) >= MAX_NAME_LEN
) {
1032 return VFR_RETURN_INVALID_PARAMETER
;
1035 for (pTmp
= mNewDataType
->mMembers
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
1036 if (strcmp (pTmp
->mFieldName
, FieldName
) == 0) {
1037 return VFR_RETURN_REDEFINED
;
1041 Align
= MIN (mPackAlign
, pFieldType
->mAlign
);
1043 if ((pNewField
= new SVfrDataField
) == NULL
) {
1044 return VFR_RETURN_OUT_FOR_RESOURCES
;
1046 strcpy (pNewField
->mFieldName
, FieldName
);
1047 pNewField
->mFieldType
= pFieldType
;
1048 pNewField
->mArrayNum
= ArrayNum
;
1049 if ((mNewDataType
->mTotalSize
% Align
) == 0) {
1050 pNewField
->mOffset
= mNewDataType
->mTotalSize
;
1052 pNewField
->mOffset
= mNewDataType
->mTotalSize
+ ALIGN_STUFF(mNewDataType
->mTotalSize
, Align
);
1054 if (mNewDataType
->mMembers
== NULL
) {
1055 mNewDataType
->mMembers
= pNewField
;
1056 pNewField
->mNext
= NULL
;
1058 for (pTmp
= mNewDataType
->mMembers
; pTmp
->mNext
!= NULL
; pTmp
= pTmp
->mNext
)
1060 pTmp
->mNext
= pNewField
;
1061 pNewField
->mNext
= NULL
;
1064 mNewDataType
->mAlign
= MIN (mPackAlign
, MAX (pFieldType
->mAlign
, mNewDataType
->mAlign
));
1065 mNewDataType
->mTotalSize
= pNewField
->mOffset
+ (pNewField
->mFieldType
->mTotalSize
) * ((ArrayNum
== 0) ? 1 : ArrayNum
);
1067 return VFR_RETURN_SUCCESS
;
1071 CVfrVarDataTypeDB::DeclareDataTypeEnd (
1075 if (mNewDataType
->mTypeName
[0] == '\0') {
1079 if ((mNewDataType
->mTotalSize
% mNewDataType
->mAlign
) !=0) {
1080 mNewDataType
->mTotalSize
+= ALIGN_STUFF (mNewDataType
->mTotalSize
, mNewDataType
->mAlign
);
1083 RegisterNewType (mNewDataType
);
1084 mNewDataType
= NULL
;
1088 CVfrVarDataTypeDB::GetDataType (
1090 OUT SVfrDataType
**DataType
1094 SVfrDataType
*pDataType
= NULL
;
1096 if (TypeName
== NULL
) {
1097 return VFR_RETURN_ERROR_SKIPED
;
1100 if (DataType
== NULL
) {
1101 return VFR_RETURN_FATAL_ERROR
;
1106 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1107 if (strcmp (TypeName
, pDataType
->mTypeName
) == 0) {
1108 *DataType
= pDataType
;
1109 return VFR_RETURN_SUCCESS
;
1113 return VFR_RETURN_UNDEFINED
;
1117 CVfrVarDataTypeDB::GetDataTypeSize (
1122 SVfrDataType
*pDataType
= NULL
;
1125 return VFR_RETURN_FATAL_ERROR
;
1129 DataType
= DataType
& 0x0F;
1132 // For user defined data type, the size can't be got by this function.
1134 if (DataType
== EFI_IFR_TYPE_OTHER
) {
1135 return VFR_RETURN_SUCCESS
;
1138 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1139 if (DataType
== pDataType
->mType
) {
1140 *Size
= pDataType
->mTotalSize
;
1141 return VFR_RETURN_SUCCESS
;
1145 return VFR_RETURN_UNDEFINED
;
1149 CVfrVarDataTypeDB::GetDataTypeSize (
1154 SVfrDataType
*pDataType
= NULL
;
1157 return VFR_RETURN_FATAL_ERROR
;
1162 for (pDataType
= mDataTypeList
; pDataType
!= NULL
; pDataType
= pDataType
->mNext
) {
1163 if (strcmp (TypeName
, pDataType
->mTypeName
) == 0) {
1164 *Size
= pDataType
->mTotalSize
;
1165 return VFR_RETURN_SUCCESS
;
1169 return VFR_RETURN_UNDEFINED
;
1173 CVfrVarDataTypeDB::GetDataFieldInfo (
1180 INT8 TName
[MAX_NAME_LEN
], FName
[MAX_NAME_LEN
];
1181 UINT32 ArrayIdx
, Tmp
;
1182 SVfrDataType
*pType
= NULL
;
1183 SVfrDataField
*pField
= NULL
;
1186 Type
= EFI_IFR_TYPE_OTHER
;
1189 CHECK_ERROR_RETURN (ExtractStructTypeName (VarStr
, TName
), VFR_RETURN_SUCCESS
);
1190 CHECK_ERROR_RETURN (GetDataType (TName
, &pType
), VFR_RETURN_SUCCESS
);
1193 // if it is not struct data type
1195 Type
= pType
->mType
;
1196 Size
= pType
->mTotalSize
;
1198 while (*VarStr
!= '\0') {
1199 CHECK_ERROR_RETURN(ExtractFieldNameAndArrary(VarStr
, FName
, ArrayIdx
), VFR_RETURN_SUCCESS
);
1200 CHECK_ERROR_RETURN(GetTypeField (FName
, pType
, pField
), VFR_RETURN_SUCCESS
);
1201 pType
= pField
->mFieldType
;
1202 CHECK_ERROR_RETURN(GetFieldOffset (pField
, ArrayIdx
, Tmp
), VFR_RETURN_SUCCESS
);
1204 Type
= GetFieldWidth (pField
);
1205 Size
= GetFieldSize (pField
, ArrayIdx
);
1207 return VFR_RETURN_SUCCESS
;
1211 CVfrVarDataTypeDB::GetUserDefinedTypeNameList (
1212 OUT INT8
***NameList
,
1213 OUT UINT32
*ListSize
1217 SVfrDataType
*pType
;
1219 if ((NameList
== NULL
) || (ListSize
== NULL
)) {
1220 return VFR_RETURN_FATAL_ERROR
;
1226 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1227 if (_IS_INTERNAL_TYPE(pType
->mTypeName
) == FALSE
) {
1232 if (*ListSize
== 0) {
1233 return VFR_RETURN_SUCCESS
;
1236 if ((*NameList
= new INT8
*[*ListSize
]) == NULL
) {
1238 return VFR_RETURN_OUT_FOR_RESOURCES
;
1241 for (Index
= 0, pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
, Index
++) {
1242 if (_IS_INTERNAL_TYPE(pType
->mTypeName
) == FALSE
) {
1243 (*NameList
)[Index
] = pType
->mTypeName
;
1246 return VFR_RETURN_SUCCESS
;
1250 CVfrVarDataTypeDB::IsTypeNameDefined (
1254 SVfrDataType
*pType
;
1256 if (TypeName
== NULL
) {
1260 for (pType
= mDataTypeList
; pType
!= NULL
; pType
= pType
->mNext
) {
1261 if (strcmp (pType
->mTypeName
, TypeName
) == 0) {
1269 #ifdef CVFR_VARDATATYPEDB_DEBUG
1271 CVfrVarDataTypeDB::ParserDB (
1275 SVfrDataType
*pTNode
;
1276 SVfrDataField
*pFNode
;
1278 printf ("***************************************************************\n");
1279 printf ("\t\tmPackAlign = %x\n", mPackAlign
);
1280 for (pTNode
= mDataTypeList
; pTNode
!= NULL
; pTNode
= pTNode
->mNext
) {
1281 printf ("\t\tstruct %s : mAlign [%x] mTotalSize [%x]\n\n", pTNode
->mTypeName
, pTNode
->mAlign
, pTNode
->mTotalSize
);
1282 printf ("\t\tstruct %s {\n", pTNode
->mTypeName
);
1283 for (pFNode
= pTNode
->mMembers
; pFNode
!= NULL
; pFNode
= pFNode
->mNext
) {
1284 printf ("\t\t\t%s\t%s\n", pFNode
->mFieldType
->mTypeName
, pFNode
->mFieldName
);
1286 printf ("\t\t};\n");
1287 printf ("---------------------------------------------------------------\n");
1289 printf ("***************************************************************\n");
1293 SVfrVarStorageNode::SVfrVarStorageNode (
1296 IN EFI_VARSTORE_ID VarStoreId
,
1297 IN EFI_STRING_ID VarName
,
1304 memset (&Guid
, 0, sizeof (EFI_GUID
));
1306 if (StoreName
!= NULL
) {
1307 mVarStoreName
= new INT8
[strlen(StoreName
) + 1];
1308 strcpy (mVarStoreName
, StoreName
);
1310 mVarStoreName
= NULL
;
1313 mVarStoreId
= VarStoreId
;
1314 mVarStoreType
= EFI_VFR_VARSTORE_EFI
;
1315 mStorageInfo
.mEfiVar
.mEfiVarName
= VarName
;
1316 mStorageInfo
.mEfiVar
.mEfiVarSize
= VarSize
;
1319 SVfrVarStorageNode::SVfrVarStorageNode (
1322 IN EFI_VARSTORE_ID VarStoreId
,
1323 IN SVfrDataType
*DataType
1329 memset (&Guid
, 0, sizeof (EFI_GUID
));
1331 if (StoreName
!= NULL
) {
1332 mVarStoreName
= new INT8
[strlen(StoreName
) + 1];
1333 strcpy (mVarStoreName
, StoreName
);
1335 mVarStoreName
= NULL
;
1338 mVarStoreId
= VarStoreId
;
1339 mVarStoreType
= EFI_VFR_VARSTORE_BUFFER
;
1340 mStorageInfo
.mDataType
= DataType
;
1343 SVfrVarStorageNode::SVfrVarStorageNode (
1345 IN EFI_VARSTORE_ID VarStoreId
1348 if (StoreName
!= NULL
) {
1349 mVarStoreName
= new INT8
[strlen(StoreName
) + 1];
1350 strcpy (mVarStoreName
, StoreName
);
1352 mVarStoreName
= NULL
;
1355 mVarStoreId
= VarStoreId
;
1356 mVarStoreType
= EFI_VFR_VARSTORE_NAME
;
1357 mStorageInfo
.mNameSpace
.mNameTable
= new EFI_VARSTORE_ID
[DEFAULT_NAME_TABLE_ITEMS
];
1358 mStorageInfo
.mNameSpace
.mTableSize
= 0;
1361 SVfrVarStorageNode::~SVfrVarStorageNode (
1365 if (mVarStoreName
!= NULL
) {
1366 delete mVarStoreName
;
1369 if (mVarStoreType
== EFI_VFR_VARSTORE_NAME
) {
1370 delete mStorageInfo
.mNameSpace
.mNameTable
;
1374 CVfrDataStorage::CVfrDataStorage (
1380 for (Index
= 0; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1381 mFreeVarStoreIdBitMap
[Index
] = 0;
1384 // Question ID 0 is reserved.
1385 mFreeVarStoreIdBitMap
[0] = 0x80000000;
1387 mBufferVarStoreList
= NULL
;
1388 mEfiVarStoreList
= NULL
;
1389 mNameVarStoreList
= NULL
;
1390 mCurrVarStorageNode
= NULL
;
1391 mNewVarStorageNode
= NULL
;
1394 CVfrDataStorage::~CVfrDataStorage (
1398 SVfrVarStorageNode
*pNode
;
1400 while (mBufferVarStoreList
!= NULL
) {
1401 pNode
= mBufferVarStoreList
;
1402 mBufferVarStoreList
= mBufferVarStoreList
->mNext
;
1405 while (mEfiVarStoreList
!= NULL
) {
1406 pNode
= mEfiVarStoreList
;
1407 mEfiVarStoreList
= mEfiVarStoreList
->mNext
;
1410 while (mNameVarStoreList
!= NULL
) {
1411 pNode
= mNameVarStoreList
;
1412 mNameVarStoreList
= mNameVarStoreList
->mNext
;
1415 if (mNewVarStorageNode
!= NULL
) {
1416 delete mNewVarStorageNode
;
1421 CVfrDataStorage::GetFreeVarStoreId (
1425 UINT32 Index
, Mask
, Offset
;
1427 for (Index
= 0; Index
< EFI_FREE_VARSTORE_ID_BITMAP_SIZE
; Index
++) {
1428 if (mFreeVarStoreIdBitMap
[Index
] != 0xFFFFFFFF) {
1433 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
1434 if ((mFreeVarStoreIdBitMap
[Index
] & Mask
) == 0) {
1435 mFreeVarStoreIdBitMap
[Index
] |= Mask
;
1436 return (EFI_VARSTORE_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
1440 return EFI_VARSTORE_ID_INVALID
;
1444 CVfrDataStorage::ChekVarStoreIdFree (
1445 IN EFI_VARSTORE_ID VarStoreId
1448 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1449 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1451 return (mFreeVarStoreIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
1455 CVfrDataStorage::MarkVarStoreIdUsed (
1456 IN EFI_VARSTORE_ID VarStoreId
1459 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1460 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1462 mFreeVarStoreIdBitMap
[Index
] |= (0x80000000 >> Offset
);
1466 CVfrDataStorage::MarkVarStoreIdUnused (
1467 IN EFI_VARSTORE_ID VarStoreId
1470 UINT32 Index
= (VarStoreId
/ EFI_BITS_PER_UINT32
);
1471 UINT32 Offset
= (VarStoreId
% EFI_BITS_PER_UINT32
);
1473 mFreeVarStoreIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
1477 CVfrDataStorage::DeclareNameVarStoreBegin (
1481 SVfrVarStorageNode
*pNode
= NULL
;
1482 EFI_VARSTORE_ID VarStoreId
;
1484 if (StoreName
== NULL
) {
1485 return VFR_RETURN_FATAL_ERROR
;
1488 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1489 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1490 return VFR_RETURN_REDEFINED
;
1494 VarStoreId
= GetFreeVarStoreId ();
1495 if ((pNode
= new SVfrVarStorageNode (StoreName
, VarStoreId
)) == NULL
) {
1496 return VFR_RETURN_UNDEFINED
;
1499 mNewVarStorageNode
= pNode
;
1501 return VFR_RETURN_SUCCESS
;
1505 CVfrDataStorage::NameTableAddItem (
1506 IN EFI_STRING_ID Item
1509 EFI_VARSTORE_ID
*NewTable
, *OldTable
;
1512 OldTable
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
;
1513 TableSize
= mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
;
1515 if ((TableSize
!= 0) && ((TableSize
% DEFAULT_NAME_TABLE_ITEMS
) == 0)) {
1516 if ((NewTable
= new EFI_VARSTORE_ID
[TableSize
+ DEFAULT_NAME_TABLE_ITEMS
]) == NULL
) {
1517 return VFR_RETURN_OUT_FOR_RESOURCES
;
1519 memcpy (NewTable
, OldTable
, TableSize
);
1520 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
= NewTable
;
1523 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[TableSize
++] = Item
;
1524 mNewVarStorageNode
->mStorageInfo
.mNameSpace
.mTableSize
= TableSize
;
1526 return VFR_RETURN_SUCCESS
;
1530 CVfrDataStorage::DeclareNameVarStoreEnd (
1534 mNewVarStorageNode
->mGuid
= *Guid
;
1535 mNewVarStorageNode
->mNext
= mNameVarStoreList
;
1536 mNameVarStoreList
= mNewVarStorageNode
;
1538 mNewVarStorageNode
= NULL
;
1540 return VFR_RETURN_SUCCESS
;
1544 CVfrDataStorage::DeclareEfiVarStore (
1547 IN EFI_STRING_ID NameStrId
,
1551 SVfrVarStorageNode
*pNode
;
1552 EFI_VARSTORE_ID VarStoreId
;
1554 if ((StoreName
== NULL
) || (Guid
== NULL
)) {
1555 return VFR_RETURN_FATAL_ERROR
;
1558 if (VarSize
> sizeof (UINT64
)) {
1559 return VFR_RETURN_EFIVARSTORE_SIZE_ERROR
;
1562 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1563 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1564 return VFR_RETURN_REDEFINED
;
1568 VarStoreId
= GetFreeVarStoreId ();
1569 if ((pNode
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, NameStrId
, VarSize
)) == NULL
) {
1570 return VFR_RETURN_OUT_FOR_RESOURCES
;
1573 pNode
->mNext
= mNameVarStoreList
;
1574 mNameVarStoreList
= pNode
;
1576 return VFR_RETURN_SUCCESS
;
1580 CVfrDataStorage::DeclareBufferVarStore (
1583 IN CVfrVarDataTypeDB
*DataTypeDB
,
1585 IN EFI_VARSTORE_ID VarStoreId
1588 SVfrVarStorageNode
*pNew
= NULL
;
1589 SVfrDataType
*pDataType
= NULL
;
1591 if ((StoreName
== NULL
) || (Guid
== NULL
) || (DataTypeDB
== NULL
)) {
1592 return VFR_RETURN_FATAL_ERROR
;
1595 CHECK_ERROR_RETURN(DataTypeDB
->GetDataType (TypeName
, &pDataType
), VFR_RETURN_SUCCESS
);
1597 if (VarStoreId
== EFI_VARSTORE_ID_INVALID
) {
1598 VarStoreId
= GetFreeVarStoreId ();
1600 if (ChekVarStoreIdFree (VarStoreId
) == FALSE
) {
1601 return VFR_RETURN_VARSTOREID_REDEFINED
;
1603 MarkVarStoreIdUsed (VarStoreId
);
1606 if ((pNew
= new SVfrVarStorageNode (Guid
, StoreName
, VarStoreId
, pDataType
)) == NULL
) {
1607 return VFR_RETURN_OUT_FOR_RESOURCES
;
1610 pNew
->mNext
= mBufferVarStoreList
;
1611 mBufferVarStoreList
= pNew
;
1613 if (gCVfrBufferConfig
.Register(StoreName
) != 0) {
1614 return VFR_RETURN_FATAL_ERROR
;
1617 return VFR_RETURN_SUCCESS
;
1621 CVfrDataStorage::GetVarStoreId (
1623 OUT EFI_VARSTORE_ID
*VarStoreId
1626 SVfrVarStorageNode
*pNode
;
1628 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1629 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1630 mCurrVarStorageNode
= pNode
;
1631 *VarStoreId
= pNode
->mVarStoreId
;
1632 return VFR_RETURN_SUCCESS
;
1636 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1637 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1638 mCurrVarStorageNode
= pNode
;
1639 *VarStoreId
= pNode
->mVarStoreId
;
1640 return VFR_RETURN_SUCCESS
;
1644 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1645 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1646 mCurrVarStorageNode
= pNode
;
1647 *VarStoreId
= pNode
->mVarStoreId
;
1648 return VFR_RETURN_SUCCESS
;
1652 mCurrVarStorageNode
= NULL
;
1653 *VarStoreId
= EFI_VARSTORE_ID_INVALID
;
1654 return VFR_RETURN_UNDEFINED
;
1658 CVfrDataStorage::GetBufferVarStoreDataTypeName (
1660 OUT INT8
**DataTypeName
1663 SVfrVarStorageNode
*pNode
;
1665 if ((StoreName
== NULL
) || (DataTypeName
== NULL
)) {
1666 return VFR_RETURN_FATAL_ERROR
;
1669 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1670 if (strcmp (pNode
->mVarStoreName
, StoreName
) == 0) {
1675 if (pNode
== NULL
) {
1676 return VFR_RETURN_UNDEFINED
;
1679 if (pNode
->mStorageInfo
.mDataType
== NULL
) {
1680 return VFR_RETURN_FATAL_ERROR
;
1683 *DataTypeName
= pNode
->mStorageInfo
.mDataType
->mTypeName
;
1684 return VFR_RETURN_SUCCESS
;
1688 CVfrDataStorage::GetVarStoreType (
1690 OUT EFI_VFR_VARSTORE_TYPE
&VarStoreType
1693 SVfrVarStorageNode
*pNode
;
1695 if (StoreName
== NULL
) {
1696 return VFR_RETURN_FATAL_ERROR
;
1699 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1700 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1701 VarStoreType
= pNode
->mVarStoreType
;
1702 return VFR_RETURN_SUCCESS
;
1706 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1707 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1708 VarStoreType
= pNode
->mVarStoreType
;
1709 return VFR_RETURN_SUCCESS
;
1713 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1714 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1715 VarStoreType
= pNode
->mVarStoreType
;
1716 return VFR_RETURN_SUCCESS
;
1720 VarStoreType
= EFI_VFR_VARSTORE_INVALID
;
1721 return VFR_RETURN_UNDEFINED
;
1724 EFI_VFR_VARSTORE_TYPE
1725 CVfrDataStorage::GetVarStoreType (
1726 IN EFI_VARSTORE_ID VarStoreId
1729 SVfrVarStorageNode
*pNode
;
1730 EFI_VFR_VARSTORE_TYPE VarStoreType
;
1732 VarStoreType
= EFI_VFR_VARSTORE_INVALID
;
1734 if (VarStoreId
== EFI_VARSTORE_ID_INVALID
) {
1735 return VarStoreType
;
1738 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1739 if (pNode
->mVarStoreId
== VarStoreId
) {
1740 VarStoreType
= pNode
->mVarStoreType
;
1741 return VarStoreType
;
1745 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1746 if (pNode
->mVarStoreId
== VarStoreId
) {
1747 VarStoreType
= pNode
->mVarStoreType
;
1748 return VarStoreType
;
1752 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1753 if (pNode
->mVarStoreId
== VarStoreId
) {
1754 VarStoreType
= pNode
->mVarStoreType
;
1755 return VarStoreType
;
1759 return VarStoreType
;
1763 CVfrDataStorage::GetVarStoreName (
1764 IN EFI_VARSTORE_ID VarStoreId
,
1765 OUT INT8
**VarStoreName
1768 SVfrVarStorageNode
*pNode
;
1770 if (VarStoreName
== NULL
) {
1771 return VFR_RETURN_FATAL_ERROR
;
1774 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1775 if (pNode
->mVarStoreId
== VarStoreId
) {
1776 *VarStoreName
= pNode
->mVarStoreName
;
1777 return VFR_RETURN_SUCCESS
;
1781 for (pNode
= mEfiVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1782 if (pNode
->mVarStoreId
== VarStoreId
) {
1783 *VarStoreName
= pNode
->mVarStoreName
;
1784 return VFR_RETURN_SUCCESS
;
1788 for (pNode
= mNameVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1789 if (pNode
->mVarStoreId
== VarStoreId
) {
1790 *VarStoreName
= pNode
->mVarStoreName
;
1791 return VFR_RETURN_SUCCESS
;
1795 *VarStoreName
= NULL
;
1796 return VFR_RETURN_UNDEFINED
;
1800 CVfrDataStorage::GetEfiVarStoreInfo (
1801 IN OUT EFI_VARSTORE_INFO
*Info
1805 return VFR_RETURN_FATAL_ERROR
;
1808 if (mCurrVarStorageNode
== NULL
) {
1809 return VFR_RETURN_GET_EFIVARSTORE_ERROR
;
1812 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarName
;
1813 Info
->mVarTotalSize
= mCurrVarStorageNode
->mStorageInfo
.mEfiVar
.mEfiVarSize
;
1814 switch (Info
->mVarTotalSize
) {
1816 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_8
;
1819 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_16
;
1822 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_32
;
1825 Info
->mVarType
= EFI_IFR_TYPE_NUM_SIZE_64
;
1828 return VFR_RETURN_FATAL_ERROR
;
1831 return VFR_RETURN_SUCCESS
;
1835 CVfrDataStorage::GetNameVarStoreInfo (
1836 OUT EFI_VARSTORE_INFO
*Info
,
1841 return VFR_RETURN_FATAL_ERROR
;
1844 if (mCurrVarStorageNode
== NULL
) {
1845 return VFR_RETURN_GET_NVVARSTORE_ERROR
;
1848 Info
->mInfo
.mVarName
= mCurrVarStorageNode
->mStorageInfo
.mNameSpace
.mNameTable
[Index
];
1850 return VFR_RETURN_SUCCESS
;
1854 CVfrDataStorage::BufferVarStoreRequestElementAdd (
1856 IN EFI_VARSTORE_INFO
&Info
1859 INT8 NewReqElt
[128] = {'\0',};
1860 INT8
*OldReqElt
= NULL
;
1861 SVfrVarStorageNode
*pNode
= NULL
;
1862 EFI_IFR_TYPE_VALUE Value
= {0};
1864 for (pNode
= mBufferVarStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1865 if (strcmp (pNode
->mVarStoreName
, StoreName
) == NULL
) {
1870 if (pNode
== NULL
) {
1871 return VFR_RETURN_UNDEFINED
;
1874 gCVfrBufferConfig
.Open ();
1876 if (gCVfrBufferConfig
.Write ('a', StoreName
, NULL
, EFI_IFR_TYPE_NUM_SIZE_8
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
) != 0) {
1877 return VFR_RETURN_FATAL_ERROR
;
1879 gCVfrBufferConfig
.Close ();
1881 return VFR_RETURN_SUCCESS
;
1884 SVfrDefaultStoreNode::SVfrDefaultStoreNode (
1885 IN EFI_IFR_DEFAULTSTORE
*ObjBinAddr
,
1887 IN EFI_STRING_ID DefaultStoreNameId
,
1891 mObjBinAddr
= ObjBinAddr
;
1893 if (RefName
!= NULL
) {
1894 mRefName
= new INT8
[strlen (RefName
) + 1];
1895 strcpy (mRefName
, RefName
);
1901 mDefaultId
= DefaultId
;
1902 mDefaultStoreNameId
= DefaultStoreNameId
;
1905 SVfrDefaultStoreNode::~SVfrDefaultStoreNode (
1909 if (mRefName
!= NULL
) {
1914 CVfrDefaultStore::CVfrDefaultStore (
1918 mDefaultStoreList
= NULL
;
1921 CVfrDefaultStore::~CVfrDefaultStore (
1925 SVfrDefaultStoreNode
*pTmp
= NULL
;
1927 while (mDefaultStoreList
!= NULL
) {
1928 pTmp
= mDefaultStoreList
;
1929 mDefaultStoreList
= mDefaultStoreList
->mNext
;
1935 CVfrDefaultStore::RegisterDefaultStore (
1936 IN CHAR8
*ObjBinAddr
,
1938 IN EFI_STRING_ID DefaultStoreNameId
,
1942 SVfrDefaultStoreNode
*pNode
= NULL
;
1944 if (RefName
== NULL
) {
1945 return VFR_RETURN_FATAL_ERROR
;
1948 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1949 if (strcmp (pNode
->mRefName
, RefName
) == 0) {
1950 return VFR_RETURN_REDEFINED
;
1954 if ((pNode
= new SVfrDefaultStoreNode ((EFI_IFR_DEFAULTSTORE
*)ObjBinAddr
, RefName
, DefaultStoreNameId
, DefaultId
)) == NULL
) {
1955 return VFR_RETURN_OUT_FOR_RESOURCES
;
1958 pNode
->mNext
= mDefaultStoreList
;
1959 mDefaultStoreList
= pNode
;
1961 return VFR_RETURN_SUCCESS
;
1965 * assign new reference name or new default store name id only if
1966 * the original is invalid
1969 CVfrDefaultStore::ReRegisterDefaultStoreById (
1970 IN UINT16 DefaultId
,
1972 IN EFI_STRING_ID DefaultStoreNameId
1975 SVfrDefaultStoreNode
*pNode
= NULL
;
1977 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
1978 if (pNode
->mDefaultId
== DefaultId
) {
1983 if (pNode
== NULL
) {
1984 return VFR_RETURN_UNDEFINED
;
1986 if (pNode
->mDefaultStoreNameId
== EFI_STRING_ID_INVALID
) {
1987 pNode
->mDefaultStoreNameId
= DefaultStoreNameId
;
1988 if (pNode
->mObjBinAddr
!= NULL
) {
1989 pNode
->mObjBinAddr
->DefaultName
= DefaultStoreNameId
;
1992 return VFR_RETURN_REDEFINED
;
1995 if (RefName
!= NULL
) {
1996 delete pNode
->mRefName
;
1997 pNode
->mRefName
= new INT8
[strlen (RefName
) + 1];
1998 if (pNode
->mRefName
!= NULL
) {
1999 strcpy (pNode
->mRefName
, RefName
);
2004 return VFR_RETURN_SUCCESS
;
2008 CVfrDefaultStore::DefaultIdRegistered (
2012 SVfrDefaultStoreNode
*pNode
= NULL
;
2014 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2015 if (pNode
->mDefaultId
== DefaultId
) {
2024 CVfrDefaultStore::GetDefaultId (
2026 OUT UINT16
*DefaultId
2029 SVfrDefaultStoreNode
*pTmp
= NULL
;
2031 if (DefaultId
== NULL
) {
2032 return VFR_RETURN_FATAL_ERROR
;
2035 for (pTmp
= mDefaultStoreList
; pTmp
!= NULL
; pTmp
= pTmp
->mNext
) {
2036 if (strcmp (pTmp
->mRefName
, RefName
) == 0) {
2037 *DefaultId
= pTmp
->mDefaultId
;
2038 return VFR_RETURN_SUCCESS
;
2042 return VFR_RETURN_UNDEFINED
;
2047 AltCfgItemPrintToBuffer (
2049 IN EFI_VARSTORE_INFO Info
,
2051 IN EFI_IFR_TYPE_VALUE Value
2055 UINT8
*BufChar
= NULL
;
2058 if (NewAltCfg
!= NULL
) {
2061 "&OFFSET=%x&WIDTH=%x&VALUE=",
2062 Info
.mInfo
.mVarOffset
,
2068 case EFI_IFR_TYPE_NUM_SIZE_8
:
2069 Count
= sprintf (NewAltCfg
, "%x", Value
.u8
);
2072 case EFI_IFR_TYPE_NUM_SIZE_16
:
2073 Count
= sprintf (NewAltCfg
, "%x", Value
.u16
);
2076 case EFI_IFR_TYPE_NUM_SIZE_32
:
2077 Count
= sprintf (NewAltCfg
, "%x", Value
.u32
);
2080 case EFI_IFR_TYPE_NUM_SIZE_64
:
2081 Count
= sprintf (NewAltCfg
, "%x", Value
.u64
);
2084 case EFI_IFR_TYPE_BOOLEAN
:
2085 Count
= sprintf (NewAltCfg
, "%x", Value
.b
);
2088 case EFI_IFR_TYPE_TIME
:
2090 Count
= sprintf (NewAltCfg
, "%x", *((UINT32
*)(&Value
.time
)));
2093 BufChar
= (UINT8
*)&Value
.time
;
2094 for (Index
= 0; Index
< sizeof(EFI_HII_TIME
); Index
++) {
2095 Count
= sprintf (NewAltCfg
, "%02x", (UINT8
)BufChar
[Index
]);
2100 case EFI_IFR_TYPE_DATE
:
2102 Count
= sprintf (NewAltCfg
, "%x", *((UINT32
*)(&Value
.date
)));
2105 BufChar
= (UINT8
*)&Value
.date
;
2106 for (Index
= 0; Index
< sizeof(EFI_HII_DATE
); Index
++) {
2107 Count
= sprintf (NewAltCfg
, "%02x", (UINT8
)BufChar
[Index
]);
2112 case EFI_IFR_TYPE_STRING
:
2113 Count
= sprintf (NewAltCfg
, "%x", Value
.string
);
2116 case EFI_IFR_TYPE_OTHER
:
2117 return VFR_RETURN_UNSUPPORTED
;
2121 return VFR_RETURN_FATAL_ERROR
;
2125 CVfrDefaultStore::BufferVarStoreAltConfigAdd (
2126 IN EFI_VARSTORE_ID DefaultId
,
2127 IN EFI_VARSTORE_INFO
&Info
,
2128 IN INT8
*VarStoreName
,
2130 IN EFI_IFR_TYPE_VALUE Value
2133 SVfrDefaultStoreNode
*pNode
= NULL
;
2134 INT8 NewAltCfg
[2 * 2 * sizeof (UINT16
) + 1] = {0,};
2135 INTN Returnvalue
= 0;
2137 if (VarStoreName
== NULL
) {
2138 return VFR_RETURN_FATAL_ERROR
;
2141 for (pNode
= mDefaultStoreList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2142 if (pNode
->mDefaultId
== DefaultId
) {
2147 if (pNode
== NULL
) {
2148 return VFR_RETURN_UNDEFINED
;
2151 gCVfrBufferConfig
.Open ();
2153 sprintf (NewAltCfg
, "%04x", pNode
->mDefaultId
);
2154 if ((Returnvalue
= gCVfrBufferConfig
.Select(VarStoreName
)) == 0) {
2155 if ((Returnvalue
= gCVfrBufferConfig
.Write ('a', VarStoreName
, NewAltCfg
, Type
, Info
.mInfo
.mVarOffset
, Info
.mVarTotalSize
, Value
)) != 0) {
2160 gCVfrBufferConfig
.Close ();
2162 return VFR_RETURN_SUCCESS
;
2165 gCVfrBufferConfig
.Close ();
2166 return (EFI_VFR_RETURN_CODE
)Returnvalue
;
2169 SVfrRuleNode::SVfrRuleNode (
2174 if (RuleName
!= NULL
) {
2175 mRuleName
= new INT8
[strlen (RuleName
) + 1];
2176 strcpy (mRuleName
, RuleName
);
2185 SVfrRuleNode::~SVfrRuleNode (
2189 if (mRuleName
!= NULL
) {
2194 CVfrRulesDB::CVfrRulesDB ()
2197 mFreeRuleId
= EFI_VARSTORE_ID_START
;
2200 CVfrRulesDB::~CVfrRulesDB ()
2202 SVfrRuleNode
*pNode
;
2204 while(mRuleList
!= NULL
) {
2206 mRuleList
= mRuleList
->mNext
;
2212 CVfrRulesDB::RegisterRule (
2218 if (RuleName
== NULL
) {
2222 if ((pNew
= new SVfrRuleNode (RuleName
, mFreeRuleId
)) == NULL
) {
2228 pNew
->mNext
= mRuleList
;
2233 CVfrRulesDB::GetRuleId (
2237 SVfrRuleNode
*pNode
;
2239 if (RuleName
== NULL
) {
2240 return EFI_RULE_ID_INVALID
;
2243 for (pNode
= mRuleList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2244 if (strcmp (pNode
->mRuleName
, RuleName
) == 0) {
2245 return pNode
->mRuleId
;
2249 return EFI_RULE_ID_INVALID
;
2252 CVfrRulesDB gCVfrRulesDB
;
2254 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2258 mVarStoreId
= EFI_VARSTORE_ID_INVALID
;
2259 mInfo
.mVarName
= EFI_STRING_ID_INVALID
;
2260 mInfo
.mVarOffset
= EFI_VAROFFSET_INVALID
;
2261 mVarType
= EFI_IFR_TYPE_OTHER
;
2265 EFI_VARSTORE_INFO::EFI_VARSTORE_INFO (
2266 IN EFI_VARSTORE_INFO
&Info
2269 mVarStoreId
= Info
.mVarStoreId
;
2270 mInfo
.mVarName
= Info
.mInfo
.mVarName
;
2271 mInfo
.mVarOffset
= Info
.mInfo
.mVarOffset
;
2272 mVarType
= Info
.mVarType
;
2273 mVarTotalSize
= Info
.mVarTotalSize
;
2277 EFI_VARSTORE_INFO::operator == (
2278 IN EFI_VARSTORE_INFO
*Info
2281 if ((mVarStoreId
== Info
->mVarStoreId
) &&
2282 (mInfo
.mVarName
== Info
->mInfo
.mVarName
) &&
2283 (mInfo
.mVarOffset
== Info
->mInfo
.mVarOffset
) &&
2284 (mVarType
== Info
->mVarType
) &&
2285 (mVarTotalSize
== Info
->mVarTotalSize
)) {
2292 static EFI_VARSTORE_INFO gEfiInvalidVarStoreInfo
;
2295 CVfrQuestionDB::GetFreeQuestionId (
2299 UINT32 Index
, Mask
, Offset
;
2301 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2302 if (mFreeQIdBitMap
[Index
] != 0xFFFFFFFF) {
2307 for (Offset
= 0, Mask
= 0x80000000; Mask
!= 0; Mask
>>= 1, Offset
++) {
2308 if ((mFreeQIdBitMap
[Index
] & Mask
) == 0) {
2309 mFreeQIdBitMap
[Index
] |= Mask
;
2310 return (EFI_QUESTION_ID
)((Index
<< EFI_BITS_SHIFT_PER_UINT32
) + Offset
);
2314 return EFI_QUESTION_ID_INVALID
;
2318 CVfrQuestionDB::ChekQuestionIdFree (
2319 IN EFI_QUESTION_ID QId
2322 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2323 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2325 return (mFreeQIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
2329 CVfrQuestionDB::MarkQuestionIdUsed (
2330 IN EFI_QUESTION_ID QId
2333 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2334 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2336 mFreeQIdBitMap
[Index
] |= (0x80000000 >> Offset
);
2340 CVfrQuestionDB::MarkQuestionIdUnused (
2341 IN EFI_QUESTION_ID QId
2344 UINT32 Index
= (QId
/ EFI_BITS_PER_UINT32
);
2345 UINT32 Offset
= (QId
% EFI_BITS_PER_UINT32
);
2347 mFreeQIdBitMap
[Index
] &= ~(0x80000000 >> Offset
);
2350 SVfrQuestionNode::SVfrQuestionNode (
2358 mQuestionId
= EFI_QUESTION_ID_INVALID
;
2363 mName
= new INT8
[strlen ("$DEFAULT") + 1];
2364 strcpy (mName
, "$DEFAULT");
2366 mName
= new INT8
[strlen (Name
) + 1];
2367 strcpy (mName
, Name
);
2370 if (VarIdStr
!= NULL
) {
2371 mVarIdStr
= new INT8
[strlen (VarIdStr
) + 1];
2372 strcpy (mVarIdStr
, VarIdStr
);
2374 mVarIdStr
= new INT8
[strlen ("$") + 1];
2375 strcpy (mVarIdStr
, "$");
2379 SVfrQuestionNode::~SVfrQuestionNode (
2383 if (mName
!= NULL
) {
2387 if (mVarIdStr
!= NULL
) {
2392 CVfrQuestionDB::CVfrQuestionDB ()
2396 for (Index
= 0; Index
< EFI_FREE_QUESTION_ID_BITMAP_SIZE
; Index
++) {
2397 mFreeQIdBitMap
[Index
] = 0;
2400 // Question ID 0 is reserved.
2401 mFreeQIdBitMap
[0] = 0x80000000;
2402 mQuestionList
= NULL
;
2405 CVfrQuestionDB::~CVfrQuestionDB ()
2407 SVfrQuestionNode
*pNode
;
2409 while (mQuestionList
!= NULL
) {
2410 pNode
= mQuestionList
;
2411 mQuestionList
= mQuestionList
->mNext
;
2417 CVfrQuestionDB::RegisterQuestion (
2420 IN OUT EFI_QUESTION_ID
&QuestionId
2423 SVfrQuestionNode
*pNode
= NULL
;
2425 if ((Name
!= NULL
) && (FindQuestion(Name
) == VFR_RETURN_SUCCESS
)) {
2426 return VFR_RETURN_REDEFINED
;
2429 if ((pNode
= new SVfrQuestionNode (Name
, VarIdStr
)) == NULL
) {
2430 return VFR_RETURN_OUT_FOR_RESOURCES
;
2433 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2434 QuestionId
= GetFreeQuestionId ();
2436 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2438 return VFR_RETURN_QUESTIONID_REDEFINED
;
2440 MarkQuestionIdUsed (QuestionId
);
2442 pNode
->mQuestionId
= QuestionId
;
2444 pNode
->mNext
= mQuestionList
;
2445 mQuestionList
= pNode
;
2447 gCFormPkg
.DoPendingAssign (VarIdStr
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2449 return VFR_RETURN_SUCCESS
;
2453 CVfrQuestionDB::RegisterOldDateQuestion (
2455 IN INT8
*MonthVarId
,
2457 IN OUT EFI_QUESTION_ID
&QuestionId
2460 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2463 if ((YearVarId
== NULL
) || (MonthVarId
== NULL
) || (DayVarId
== NULL
)) {
2467 if ((pNode
[0] = new SVfrQuestionNode (NULL
, YearVarId
, DATE_YEAR_BITMASK
)) == NULL
) {
2470 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MonthVarId
, DATE_MONTH_BITMASK
)) == NULL
) {
2473 if ((pNode
[2] = new SVfrQuestionNode (NULL
, DayVarId
, DATE_DAY_BITMASK
)) == NULL
) {
2477 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2478 QuestionId
= GetFreeQuestionId ();
2480 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2483 MarkQuestionIdUsed (QuestionId
);
2486 pNode
[0]->mQuestionId
= QuestionId
;
2487 pNode
[1]->mQuestionId
= QuestionId
;
2488 pNode
[2]->mQuestionId
= QuestionId
;
2489 pNode
[0]->mNext
= pNode
[1];
2490 pNode
[1]->mNext
= pNode
[2];
2491 pNode
[2]->mNext
= mQuestionList
;
2492 mQuestionList
= pNode
[0];
2494 gCFormPkg
.DoPendingAssign (YearVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2495 gCFormPkg
.DoPendingAssign (MonthVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2496 gCFormPkg
.DoPendingAssign (DayVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2501 for (Index
= 0; Index
< 3; Index
++) {
2502 if (pNode
[Index
] != NULL
) {
2503 delete pNode
[Index
];
2506 QuestionId
= EFI_QUESTION_ID_INVALID
;
2510 CVfrQuestionDB::RegisterNewDateQuestion (
2513 IN OUT EFI_QUESTION_ID
&QuestionId
2516 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2518 INT8
*VarIdStr
[3] = {NULL
, };
2521 if (BaseVarId
== NULL
) {
2525 Len
= strlen (BaseVarId
);
2527 VarIdStr
[0] = new INT8
[Len
+ strlen (".Year") + 1];
2528 if (VarIdStr
[0] != NULL
) {
2529 strcpy (VarIdStr
[0], BaseVarId
);
2530 strcat (VarIdStr
[0], ".Year");
2532 VarIdStr
[1] = new INT8
[Len
+ strlen (".Month") + 1];
2533 if (VarIdStr
[1] != NULL
) {
2534 strcpy (VarIdStr
[1], BaseVarId
);
2535 strcat (VarIdStr
[1], ".Month");
2537 VarIdStr
[2] = new INT8
[Len
+ strlen (".Day") + 1];
2538 if (VarIdStr
[2] != NULL
) {
2539 strcpy (VarIdStr
[2], BaseVarId
);
2540 strcat (VarIdStr
[2], ".Day");
2543 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], DATE_YEAR_BITMASK
)) == NULL
) {
2546 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], DATE_MONTH_BITMASK
)) == NULL
) {
2549 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], DATE_DAY_BITMASK
)) == NULL
) {
2553 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2554 QuestionId
= GetFreeQuestionId ();
2556 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2559 MarkQuestionIdUsed (QuestionId
);
2562 pNode
[0]->mQuestionId
= QuestionId
;
2563 pNode
[1]->mQuestionId
= QuestionId
;
2564 pNode
[2]->mQuestionId
= QuestionId
;
2565 pNode
[0]->mNext
= pNode
[1];
2566 pNode
[1]->mNext
= pNode
[2];
2567 pNode
[2]->mNext
= mQuestionList
;
2568 mQuestionList
= pNode
[0];
2570 for (Index
= 0; Index
< 3; Index
++) {
2571 if (VarIdStr
[Index
] != NULL
) {
2572 delete VarIdStr
[Index
];
2576 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2577 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2578 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2583 for (Index
= 0; Index
< 3; Index
++) {
2584 if (pNode
[Index
] != NULL
) {
2585 delete pNode
[Index
];
2588 if (VarIdStr
[Index
] != NULL
) {
2589 delete VarIdStr
[Index
];
2595 CVfrQuestionDB::RegisterOldTimeQuestion (
2597 IN INT8
*MinuteVarId
,
2598 IN INT8
*SecondVarId
,
2599 IN OUT EFI_QUESTION_ID
&QuestionId
2602 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2605 if ((HourVarId
== NULL
) || (MinuteVarId
== NULL
) || (SecondVarId
== NULL
)) {
2609 if ((pNode
[0] = new SVfrQuestionNode (NULL
, HourVarId
, TIME_HOUR_BITMASK
)) == NULL
) {
2612 if ((pNode
[1] = new SVfrQuestionNode (NULL
, MinuteVarId
, TIME_MINUTE_BITMASK
)) == NULL
) {
2615 if ((pNode
[2] = new SVfrQuestionNode (NULL
, SecondVarId
, TIME_SECOND_BITMASK
)) == NULL
) {
2619 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2620 QuestionId
= GetFreeQuestionId ();
2622 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2625 MarkQuestionIdUsed (QuestionId
);
2628 pNode
[0]->mQuestionId
= QuestionId
;
2629 pNode
[1]->mQuestionId
= QuestionId
;
2630 pNode
[2]->mQuestionId
= QuestionId
;
2631 pNode
[0]->mNext
= pNode
[1];
2632 pNode
[1]->mNext
= pNode
[2];
2633 pNode
[2]->mNext
= mQuestionList
;
2634 mQuestionList
= pNode
[0];
2636 gCFormPkg
.DoPendingAssign (HourVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2637 gCFormPkg
.DoPendingAssign (MinuteVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2638 gCFormPkg
.DoPendingAssign (SecondVarId
, (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2643 for (Index
= 0; Index
< 3; Index
++) {
2644 if (pNode
[Index
] != NULL
) {
2645 delete pNode
[Index
];
2648 QuestionId
= EFI_QUESTION_ID_INVALID
;
2652 CVfrQuestionDB::RegisterNewTimeQuestion (
2655 IN OUT EFI_QUESTION_ID
&QuestionId
2658 SVfrQuestionNode
*pNode
[3] = {NULL
, };
2660 INT8
*VarIdStr
[3] = {NULL
, };
2663 if (BaseVarId
== NULL
) {
2667 Len
= strlen (BaseVarId
);
2669 VarIdStr
[0] = new INT8
[Len
+ strlen (".Hour") + 1];
2670 if (VarIdStr
[0] != NULL
) {
2671 strcpy (VarIdStr
[0], BaseVarId
);
2672 strcat (VarIdStr
[0], ".Hour");
2674 VarIdStr
[1] = new INT8
[Len
+ strlen (".Minute") + 1];
2675 if (VarIdStr
[1] != NULL
) {
2676 strcpy (VarIdStr
[1], BaseVarId
);
2677 strcat (VarIdStr
[1], ".Minute");
2679 VarIdStr
[2] = new INT8
[Len
+ strlen (".Second") + 1];
2680 if (VarIdStr
[2] != NULL
) {
2681 strcpy (VarIdStr
[2], BaseVarId
);
2682 strcat (VarIdStr
[2], ".Second");
2685 if ((pNode
[0] = new SVfrQuestionNode (Name
, VarIdStr
[0], TIME_HOUR_BITMASK
)) == NULL
) {
2688 if ((pNode
[1] = new SVfrQuestionNode (Name
, VarIdStr
[1], TIME_MINUTE_BITMASK
)) == NULL
) {
2691 if ((pNode
[2] = new SVfrQuestionNode (Name
, VarIdStr
[2], TIME_SECOND_BITMASK
)) == NULL
) {
2695 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2696 QuestionId
= GetFreeQuestionId ();
2698 if (ChekQuestionIdFree (QuestionId
) == FALSE
) {
2701 MarkQuestionIdUsed (QuestionId
);
2704 pNode
[0]->mQuestionId
= QuestionId
;
2705 pNode
[1]->mQuestionId
= QuestionId
;
2706 pNode
[2]->mQuestionId
= QuestionId
;
2707 pNode
[0]->mNext
= pNode
[1];
2708 pNode
[1]->mNext
= pNode
[2];
2709 pNode
[2]->mNext
= mQuestionList
;
2710 mQuestionList
= pNode
[0];
2712 for (Index
= 0; Index
< 3; Index
++) {
2713 if (VarIdStr
[Index
] != NULL
) {
2714 delete VarIdStr
[Index
];
2718 gCFormPkg
.DoPendingAssign (VarIdStr
[0], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2719 gCFormPkg
.DoPendingAssign (VarIdStr
[1], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2720 gCFormPkg
.DoPendingAssign (VarIdStr
[2], (VOID
*)&QuestionId
, sizeof(EFI_QUESTION_ID
));
2725 for (Index
= 0; Index
< 3; Index
++) {
2726 if (pNode
[Index
] != NULL
) {
2727 delete pNode
[Index
];
2730 if (VarIdStr
[Index
] != NULL
) {
2731 delete VarIdStr
[Index
];
2737 CVfrQuestionDB::UpdateQuestionId (
2738 IN EFI_QUESTION_ID QId
,
2739 IN EFI_QUESTION_ID NewQId
2742 SVfrQuestionNode
*pNode
= NULL
;
2744 if (ChekQuestionIdFree (NewQId
) == FALSE
) {
2745 return VFR_RETURN_REDEFINED
;
2748 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2749 if (pNode
->mQuestionId
== QId
) {
2754 if (pNode
== NULL
) {
2755 return VFR_RETURN_UNDEFINED
;
2758 MarkQuestionIdUnused (QId
);
2759 pNode
->mQuestionId
= NewQId
;
2760 MarkQuestionIdUsed (NewQId
);
2762 gCFormPkg
.DoPendingAssign (pNode
->mVarIdStr
, (VOID
*)&NewQId
, sizeof(EFI_QUESTION_ID
));
2764 return VFR_RETURN_SUCCESS
;
2768 CVfrQuestionDB::GetQuestionId (
2771 OUT EFI_QUESTION_ID
&QuestionId
,
2775 SVfrQuestionNode
*pNode
;
2777 QuestionId
= EFI_QUESTION_ID_INVALID
;
2778 BitMask
= 0x00000000;
2780 if ((Name
== NULL
) && (VarIdStr
== NULL
)) {
2784 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2786 if (strcmp (pNode
->mName
, Name
) != 0) {
2791 if (VarIdStr
!= NULL
) {
2792 if (strcmp (pNode
->mVarIdStr
, VarIdStr
) != 0) {
2797 QuestionId
= pNode
->mQuestionId
;
2798 BitMask
= pNode
->mBitMask
;
2806 CVfrQuestionDB::FindQuestion (
2807 IN EFI_QUESTION_ID QuestionId
2810 SVfrQuestionNode
*pNode
;
2812 if (QuestionId
== EFI_QUESTION_ID_INVALID
) {
2813 return VFR_RETURN_INVALID_PARAMETER
;
2816 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2817 if (pNode
->mQuestionId
== QuestionId
) {
2818 return VFR_RETURN_SUCCESS
;
2822 return VFR_RETURN_UNDEFINED
;
2826 CVfrQuestionDB::FindQuestion (
2830 SVfrQuestionNode
*pNode
;
2833 return VFR_RETURN_FATAL_ERROR
;
2836 for (pNode
= mQuestionList
; pNode
!= NULL
; pNode
= pNode
->mNext
) {
2837 if (strcmp (pNode
->mName
, Name
) == 0) {
2838 return VFR_RETURN_SUCCESS
;
2842 return VFR_RETURN_UNDEFINED
;