3 The definition of CFormPkg's member function
5 Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
10 #ifndef _EFIIFRCLASS_H_
11 #define _EFIIFRCLASS_H_
16 #include "VfrUtilityLib.h"
18 #define NO_QST_REFED "no question refered"
26 * The functions below are used for flags setting
28 static inline BOOLEAN
_FLAGS_ZERO (
35 static inline VOID
_FLAG_CLEAR (
43 static inline UINT8
_FLAG_TEST_AND_CLEAR (
48 UINT8 Ret
= Flags
& Mask
;
53 static inline UINT8
_IS_EQUAL (
58 return Flags
== Value
;
62 * The definition of CIfrBin
69 struct SPendingAssign
{
70 CHAR8
*mKey
; // key ! unique
76 struct SPendingAssign
*mNext
;
78 SPendingAssign (IN CHAR8
*, IN VOID
*, IN UINT32
, IN UINT32
, IN CONST CHAR8
*);
81 VOID
SetAddrAndLen (IN VOID
*, IN UINT32
);
82 VOID
AssignValue (IN VOID
*, IN UINT32
);
83 CHAR8
* GetKey (VOID
);
86 SPendingAssign (IN CONST SPendingAssign
&); // Prevent copy-construction
87 SPendingAssign
& operator= (IN CONST SPendingAssign
&); // Prevent assignment
94 struct SBufferNode
*mNext
;
98 BOOLEAN CompatibleMode
;
99 EFI_GUID
*OverrideClassGuid
;
100 } INPUT_INFO_TO_SYNTAX
;
105 SBufferNode
*mBufferNodeQueueHead
;
106 SBufferNode
*mBufferNodeQueueTail
;
107 SBufferNode
*mCurrBufferNode
;
109 SBufferNode
*mReadBufferNode
;
110 UINT32 mReadBufferOffset
;
114 VOID
_WRITE_PKG_LINE (IN
FILE *, IN UINT32
, IN CONST CHAR8
*, IN CHAR8
*, IN UINT32
);
115 VOID
_WRITE_PKG_END (IN
FILE *, IN UINT32
, IN CONST CHAR8
*, IN CHAR8
*, IN UINT32
);
116 SBufferNode
* GetBinBufferNodeForAddr (IN CHAR8
*);
117 SBufferNode
* CreateNewNode ();
118 SBufferNode
* GetNodeBefore (IN SBufferNode
*);
119 EFI_VFR_RETURN_CODE
InsertNodeBefore (IN SBufferNode
*, IN SBufferNode
*);
122 SPendingAssign
*PendingAssignList
;
125 CFormPkg (IN UINT32 BufferSize
= 4096);
128 CHAR8
* IfrBinBufferGet (IN UINT32
);
129 inline UINT32
GetPkgLength (VOID
);
132 UINT32
Read (IN CHAR8
*, IN UINT32
);
135 EFI_VFR_RETURN_CODE
BuildPkgHdr (OUT EFI_HII_PACKAGE_HEADER
**);
136 EFI_VFR_RETURN_CODE
BuildPkg (IN
FILE *, IN PACKAGE_DATA
*PkgData
= NULL
);
137 EFI_VFR_RETURN_CODE
BuildPkg (OUT PACKAGE_DATA
&);
138 EFI_VFR_RETURN_CODE
GenCFile (IN CHAR8
*, IN
FILE *, IN PACKAGE_DATA
*PkgData
= NULL
);
141 CFormPkg (IN CONST CFormPkg
&); // Prevent copy-construction
142 CFormPkg
& operator= (IN CONST CFormPkg
&); // Prevent assignment
145 EFI_VFR_RETURN_CODE
AssignPending (IN CHAR8
*, IN VOID
*, IN UINT32
, IN UINT32
, IN CONST CHAR8
*Msg
= NULL
);
146 VOID
DoPendingAssign (IN CHAR8
*, IN VOID
*, IN UINT32
);
147 bool HavePendingUnassigned (VOID
);
148 VOID
PendingAssignPrintAll (VOID
);
149 EFI_VFR_RETURN_CODE
DeclarePendingQuestion (
150 IN CVfrVarDataTypeDB
&lCVfrVarDataTypeDB
,
151 IN CVfrDataStorage
&lCVfrDataStorage
,
152 IN CVfrQuestionDB
&lCVfrQuestionDB
,
153 IN EFI_GUID
*LocalFormSetGuid
,
155 OUT CHAR8
**InsertOpcodeAddr
157 EFI_VFR_RETURN_CODE
AdjustDynamicInsertOpcode (
158 IN CHAR8
*LastFormEndAddr
,
159 IN CHAR8
*InsertOpcodeAddr
,
160 IN BOOLEAN CreateOpcodeAfterParsingVfr
162 CHAR8
* GetBufAddrBaseOnOffset (
167 extern CFormPkg gCFormPkg
;
168 extern CVfrStringDB gCVfrStringDB
;
169 extern UINT32 gAdjustOpcodeOffset
;
170 extern BOOLEAN gNeedAdjustOpcode
;
184 #define EFI_IFR_RECORDINFO_IDX_INVALUD 0xFFFFFF
185 #define EFI_IFR_RECORDINFO_IDX_START 0x0
186 #define EFI_HII_MAX_SUPPORT_DEFAULT_TYPE 0x08
188 struct QuestionDefaultRecord
{
189 BOOLEAN mIsDefaultIdExist
[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE
]; // Record the default id in mAllDefaultIdArray[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE]
190 // whether exists in current question.
192 SIfrRecord
*mDefaultValueRecord
; // Point to the default value record in RecordList which has smallest default Id.
193 // (for checkbox it may be NULL, because the dedault value is always true when the flag is set.)
195 BOOLEAN mIsDefaultOpcode
; // whether the default value with smallest default id is given by default opcode.
196 // (for oneof and checkbox default info may be given by flag.)
198 UINT16 mDefaultNumber
; // The default number of this question.
201 class CIfrRecordInfoDB
{
205 SIfrRecord
*mIfrRecordListHead
;
206 SIfrRecord
*mIfrRecordListTail
;
207 UINT8 mAllDefaultTypeCount
;
208 UINT16 mAllDefaultIdArray
[EFI_HII_MAX_SUPPORT_DEFAULT_TYPE
];
210 SIfrRecord
* GetRecordInfoFromIdx (IN UINT32
);
211 BOOLEAN
CheckQuestionOpCode (IN UINT8
);
212 BOOLEAN
CheckIdOpCode (IN UINT8
);
213 EFI_QUESTION_ID
GetOpcodeQuestionId (IN EFI_IFR_OP_HEADER
*);
215 CIfrRecordInfoDB (VOID
);
216 ~CIfrRecordInfoDB (VOID
);
218 inline VOID
TurnOn (VOID
) {
222 inline VOID
TurnOff (VOID
) {
226 SIfrRecord
* GetRecordInfoFromOffset (IN UINT32
);
227 VOID
IfrAdjustOffsetForRecord (VOID
);
228 BOOLEAN
IfrAdjustDynamicOpcodeInRecords (IN BOOLEAN
);
230 UINT32
IfrRecordRegister (IN UINT32
, IN CHAR8
*, IN UINT8
, IN UINT32
);
231 VOID
IfrRecordInfoUpdate (IN UINT32
, IN UINT32
, IN CHAR8
*, IN UINT8
, IN UINT32
);
232 VOID
IfrRecordOutput (IN
FILE *, IN UINT32 LineNo
);
233 VOID
IfrRecordOutput (OUT PACKAGE_DATA
&);
234 EFI_VFR_RETURN_CODE
IfrRecordAdjust (VOID
);
235 VOID
IfrUpdateRecordInfoForDynamicOpcode (IN BOOLEAN
);
236 VOID
IfrCheckAddDefaultRecord (IN BOOLEAN
, IN BOOLEAN
);
237 VOID
IfrGetDefaultStoreInfo ();
238 VOID
IfrCreateDefaultRecord (IN UINT8 Size
,IN UINT16 DefaultId
,IN UINT8 Type
,IN UINT32 LineNo
,IN EFI_IFR_TYPE_VALUE Value
);
239 VOID
IfrCreateDefaultForQuestion (IN SIfrRecord
*, IN QuestionDefaultRecord
*);
240 VOID
IfrParseDefaulInfoInQuestion (IN SIfrRecord
*, OUT QuestionDefaultRecord
*);
241 VOID
IfrAddDefaultToBufferConfig (IN UINT16
, IN SIfrRecord
*,IN EFI_IFR_TYPE_VALUE
);
244 CIfrRecordInfoDB (IN CONST CIfrRecordInfoDB
&); // Prevent copy-construction
245 CIfrRecordInfoDB
& operator= (IN CONST CIfrRecordInfoDB
&); // Prevent assignment
248 extern CIfrRecordInfoDB gCIfrRecordInfoDB
;
251 * The definition of CIfrObj
253 extern BOOLEAN gCreateOp
;
266 CIfrObj (IN UINT8 OpCode
, OUT CHAR8
**IfrObj
= NULL
, IN UINT8 ObjBinLen
= 0, IN BOOLEAN DelayEmit
= FALSE
);
267 virtual ~CIfrObj(VOID
);
269 VOID
_EMIT_PENDING_OBJ (VOID
);
271 inline VOID
SetLineNo (IN UINT32 LineNo
) {
276 inline T
* GetObjBinAddr (VOID
) {
277 return reinterpret_cast<T
*>(mObjBinBuf
);
280 inline UINT32
GetObjBinOffset (VOID
) {
284 inline UINT8
GetObjBinLen (VOID
) {
288 inline bool ExpendObjBin (IN UINT8 Size
) {
289 if ((mDelayEmit
== TRUE
) && ((mObjBinLen
+ Size
) > mObjBinLen
)) {
290 mObjBinLen
= mObjBinLen
+ Size
;
297 inline bool ShrinkObjBin (IN UINT8 Size
) {
298 if ((mDelayEmit
== TRUE
) && (mObjBinLen
> Size
)) {
308 * The definition of CIfrOpHeader
312 EFI_IFR_OP_HEADER
*mHeader
;
315 CIfrOpHeader (IN UINT8 OpCode
, IN VOID
*StartAddr
, IN UINT8 Length
= 0);
316 CIfrOpHeader (IN CIfrOpHeader
&);
317 CIfrOpHeader
& operator=(IN CONST CIfrOpHeader
&);
319 VOID
IncLength (UINT8 Size
) {
320 if ((mHeader
->Length
+ Size
) > mHeader
->Length
) {
321 mHeader
->Length
= mHeader
->Length
+ Size
;
325 VOID
DecLength (UINT8 Size
) {
326 if (mHeader
->Length
>= Size
) {
327 mHeader
->Length
-= Size
;
332 return mHeader
->Length
;
336 return mHeader
->Scope
;
339 VOID
SetScope (IN UINT8 Scope
) {
340 mHeader
->Scope
= Scope
;
343 VOID
UpdateHeader (IN EFI_IFR_OP_HEADER
*Header
) {
348 return mHeader
->OpCode
;
352 extern UINT8 gScopeCount
;
355 * The definition of CIfrStatementHeader
357 class CIfrStatementHeader
{
359 EFI_IFR_STATEMENT_HEADER
*mHeader
;
362 CIfrStatementHeader (
363 IN EFI_IFR_STATEMENT_HEADER
*StartAddr
364 ) : mHeader ((EFI_IFR_STATEMENT_HEADER
*)StartAddr
) {
366 mHeader
->Help
= EFI_STRING_ID_INVALID
;
367 mHeader
->Prompt
= EFI_STRING_ID_INVALID
;
370 EFI_IFR_STATEMENT_HEADER
*GetStatementHeader () {
374 VOID
SetPrompt (IN EFI_STRING_ID Prompt
) {
375 mHeader
->Prompt
= Prompt
;
378 VOID
SetHelp (IN EFI_STRING_ID Help
) {
379 mHeader
->Help
= Help
;
384 * The definition of CIfrQuestionHeader
386 #define EFI_IFR_QUESTION_FLAG_DEFAULT 0
388 class CIfrQuestionHeader
: public CIfrStatementHeader
{
390 EFI_IFR_QUESTION_HEADER
*mHeader
;
392 EFI_IFR_STATEMENT_HEADER
* QH2SH (EFI_IFR_QUESTION_HEADER
*Qheader
) {
393 return &(Qheader
)->Header
;
397 EFI_QUESTION_ID
QUESTION_ID (VOID
) {
398 return mHeader
->QuestionId
;
401 EFI_VARSTORE_ID
VARSTORE_ID (VOID
) {
402 return mHeader
->VarStoreId
;
405 VOID
VARSTORE_INFO (OUT EFI_VARSTORE_INFO
*Info
) {
407 Info
->mVarStoreId
= mHeader
->VarStoreId
;
408 memmove (&Info
->mVarStoreId
, &mHeader
->VarStoreInfo
, sizeof (Info
->mVarStoreId
));
413 return mHeader
->Flags
;
418 IN EFI_IFR_QUESTION_HEADER
*StartAddr
,
419 IN UINT8 Flags
= EFI_IFR_QUESTION_FLAG_DEFAULT
420 ) : CIfrStatementHeader (QH2SH(StartAddr
)) {
422 mHeader
->QuestionId
= EFI_QUESTION_ID_INVALID
;
423 mHeader
->VarStoreId
= EFI_VARSTORE_ID_INVALID
;
424 mHeader
->VarStoreInfo
.VarName
= EFI_STRING_ID_INVALID
;
425 mHeader
->VarStoreInfo
.VarOffset
= EFI_VAROFFSET_INVALID
;
426 mHeader
->Flags
= Flags
;
429 VOID
SetQuestionId (IN EFI_QUESTION_ID QuestionId
) {
430 mHeader
->QuestionId
= QuestionId
;
433 VOID
SetVarStoreInfo (IN EFI_VARSTORE_INFO
*Info
) {
434 mHeader
->VarStoreId
= Info
->mVarStoreId
;
435 mHeader
->VarStoreInfo
.VarName
= Info
->mInfo
.mVarName
;
436 mHeader
->VarStoreInfo
.VarOffset
= Info
->mInfo
.mVarOffset
;
439 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 Flags
) {
440 if (_FLAG_TEST_AND_CLEAR (Flags
, EFI_IFR_FLAG_READ_ONLY
)) {
441 mHeader
->Flags
|= EFI_IFR_FLAG_READ_ONLY
;
444 _FLAG_CLEAR (Flags
, 0x02);
446 if (_FLAG_TEST_AND_CLEAR (Flags
, EFI_IFR_FLAG_CALLBACK
)) {
447 mHeader
->Flags
|= EFI_IFR_FLAG_CALLBACK
;
451 // ignore NVAccessFlag
453 _FLAG_CLEAR (Flags
, 0x08);
455 if (_FLAG_TEST_AND_CLEAR (Flags
, EFI_IFR_FLAG_RESET_REQUIRED
)) {
456 mHeader
->Flags
|= EFI_IFR_FLAG_RESET_REQUIRED
;
459 if (_FLAG_TEST_AND_CLEAR (Flags
, EFI_IFR_FLAG_RECONNECT_REQUIRED
)) {
460 mHeader
->Flags
|= EFI_IFR_FLAG_RECONNECT_REQUIRED
;
464 // Set LateCheck Flag to compatible for framework flag
465 // but it uses 0x20 as its flag, if in the future UEFI may take this flag
467 if (_FLAG_TEST_AND_CLEAR (Flags
, 0x20)) {
468 mHeader
->Flags
|= 0x20;
471 if (_FLAG_TEST_AND_CLEAR (Flags
, EFI_IFR_FLAG_OPTIONS_ONLY
)) {
472 mHeader
->Flags
|= EFI_IFR_FLAG_OPTIONS_ONLY
;
475 return _FLAGS_ZERO (Flags
) ? VFR_RETURN_SUCCESS
: VFR_RETURN_FLAGS_UNSUPPORTED
;
478 VOID
UpdateCIfrQuestionHeader (IN EFI_IFR_QUESTION_HEADER
*Header
) {
484 * The definition of CIfrMinMaxStepData
486 class CIfrMinMaxStepData
{
488 MINMAXSTEP_DATA
*mMinMaxStepData
;
493 CIfrMinMaxStepData (MINMAXSTEP_DATA
*DataAddr
, BOOLEAN NumericOpcode
=FALSE
) : mMinMaxStepData (DataAddr
) {
494 mMinMaxStepData
->u64
.MinValue
= 0;
495 mMinMaxStepData
->u64
.MaxValue
= 0;
496 mMinMaxStepData
->u64
.Step
= 0;
498 IsNumeric
= NumericOpcode
;
501 VOID
SetMinMaxStepData (IN UINT64 MinValue
, IN UINT64 MaxValue
, IN UINT64 Step
) {
503 mMinMaxStepData
->u64
.MinValue
= MinValue
;
504 mMinMaxStepData
->u64
.MaxValue
= MaxValue
;
507 if (MinValue
< mMinMaxStepData
->u64
.MinValue
) {
508 mMinMaxStepData
->u64
.MinValue
= MinValue
;
510 if (MaxValue
> mMinMaxStepData
->u64
.MaxValue
) {
511 mMinMaxStepData
->u64
.MaxValue
= MaxValue
;
514 mMinMaxStepData
->u64
.Step
= Step
;
517 VOID
SetMinMaxStepData (IN UINT32 MinValue
, IN UINT32 MaxValue
, IN UINT32 Step
) {
519 mMinMaxStepData
->u32
.MinValue
= MinValue
;
520 mMinMaxStepData
->u32
.MaxValue
= MaxValue
;
523 if (MinValue
< mMinMaxStepData
->u32
.MinValue
) {
524 mMinMaxStepData
->u32
.MinValue
= MinValue
;
526 if (MaxValue
> mMinMaxStepData
->u32
.MaxValue
) {
527 mMinMaxStepData
->u32
.MaxValue
= MaxValue
;
530 mMinMaxStepData
->u32
.Step
= Step
;
533 VOID
SetMinMaxStepData (IN UINT16 MinValue
, IN UINT16 MaxValue
, IN UINT16 Step
) {
535 mMinMaxStepData
->u16
.MinValue
= MinValue
;
536 mMinMaxStepData
->u16
.MaxValue
= MaxValue
;
539 if (MinValue
< mMinMaxStepData
->u16
.MinValue
) {
540 mMinMaxStepData
->u16
.MinValue
= MinValue
;
542 if (MaxValue
> mMinMaxStepData
->u16
.MaxValue
) {
543 mMinMaxStepData
->u16
.MaxValue
= MaxValue
;
546 mMinMaxStepData
->u16
.Step
= Step
;
549 VOID
SetMinMaxStepData (IN UINT8 MinValue
, IN UINT8 MaxValue
, IN UINT8 Step
) {
551 mMinMaxStepData
->u8
.MinValue
= MinValue
;
552 mMinMaxStepData
->u8
.MaxValue
= MaxValue
;
555 if (MinValue
< mMinMaxStepData
->u8
.MinValue
) {
556 mMinMaxStepData
->u8
.MinValue
= MinValue
;
558 if (MaxValue
> mMinMaxStepData
->u8
.MaxValue
) {
559 mMinMaxStepData
->u8
.MaxValue
= MaxValue
;
562 mMinMaxStepData
->u8
.Step
= Step
;
565 UINT64
GetMinData (UINT8 VarType
, BOOLEAN IsBitVar
) {
568 MinValue
= mMinMaxStepData
->u32
.MinValue
;
572 case EFI_IFR_TYPE_NUM_SIZE_64
:
573 MinValue
= mMinMaxStepData
->u64
.MinValue
;
575 case EFI_IFR_TYPE_NUM_SIZE_32
:
576 MinValue
= (UINT64
) mMinMaxStepData
->u32
.MinValue
;
578 case EFI_IFR_TYPE_NUM_SIZE_16
:
579 MinValue
= (UINT64
) mMinMaxStepData
->u16
.MinValue
;
581 case EFI_IFR_TYPE_NUM_SIZE_8
:
582 MinValue
= (UINT64
) mMinMaxStepData
->u8
.MinValue
;
590 UINT64
GetMaxData (UINT8 VarType
, BOOLEAN IsBitVar
) {
593 MaxValue
= mMinMaxStepData
->u32
.MaxValue
;
597 case EFI_IFR_TYPE_NUM_SIZE_64
:
598 MaxValue
= mMinMaxStepData
->u64
.MaxValue
;
600 case EFI_IFR_TYPE_NUM_SIZE_32
:
601 MaxValue
= (UINT64
) mMinMaxStepData
->u32
.MaxValue
;
603 case EFI_IFR_TYPE_NUM_SIZE_16
:
604 MaxValue
= (UINT64
) mMinMaxStepData
->u16
.MaxValue
;
606 case EFI_IFR_TYPE_NUM_SIZE_8
:
607 MaxValue
= (UINT64
) mMinMaxStepData
->u8
.MaxValue
;
615 UINT64
GetStepData (UINT8 VarType
, BOOLEAN IsBitVar
) {
618 MaxValue
= mMinMaxStepData
->u32
.Step
;
622 case EFI_IFR_TYPE_NUM_SIZE_64
:
623 MaxValue
= mMinMaxStepData
->u64
.Step
;
625 case EFI_IFR_TYPE_NUM_SIZE_32
:
626 MaxValue
= (UINT64
) mMinMaxStepData
->u32
.Step
;
628 case EFI_IFR_TYPE_NUM_SIZE_16
:
629 MaxValue
= (UINT64
) mMinMaxStepData
->u16
.Step
;
631 case EFI_IFR_TYPE_NUM_SIZE_8
:
632 MaxValue
= (UINT64
) mMinMaxStepData
->u8
.Step
;
640 BOOLEAN
IsNumericOpcode () {
644 VOID
UpdateCIfrMinMaxStepData (IN MINMAXSTEP_DATA
*MinMaxStepData
) {
645 mMinMaxStepData
= MinMaxStepData
;
649 static CIfrQuestionHeader
*gCurrentQuestion
= NULL
;
650 static CIfrMinMaxStepData
*gCurrentMinMaxData
= NULL
;
651 static BOOLEAN gIsOrderedList
= FALSE
;
652 static BOOLEAN gIsStringOp
= FALSE
;
655 * The definition of all of the UEFI IFR Objects
657 class CIfrFormSet
: public CIfrObj
, public CIfrOpHeader
{
659 EFI_IFR_FORM_SET
*mFormSet
;
660 EFI_GUID
*mClassGuid
;
663 CIfrFormSet (UINT8 Size
) : CIfrObj (EFI_IFR_FORM_SET_OP
, (CHAR8
**)NULL
, Size
),
664 CIfrOpHeader (EFI_IFR_FORM_SET_OP
, &(GetObjBinAddr
<EFI_IFR_FORM_SET
>())->Header
, Size
), mFormSet(GetObjBinAddr
<EFI_IFR_FORM_SET
>()) {
665 mFormSet
->Help
= EFI_STRING_ID_INVALID
;
666 mFormSet
->FormSetTitle
= EFI_STRING_ID_INVALID
;
668 memset (&mFormSet
->Guid
, 0, sizeof (EFI_GUID
));
669 mClassGuid
= (EFI_GUID
*) (mFormSet
+ 1);
672 VOID
SetGuid (IN EFI_GUID
*Guid
) {
673 memmove (&mFormSet
->Guid
, Guid
, sizeof (EFI_GUID
));
676 VOID
SetFormSetTitle (IN EFI_STRING_ID FormSetTitle
) {
677 mFormSet
->FormSetTitle
= FormSetTitle
;
680 VOID
SetHelp (IN EFI_STRING_ID Help
) {
681 mFormSet
->Help
= Help
;
684 VOID
SetClassGuid (IN EFI_GUID
*Guid
) {
685 memmove (&(mClassGuid
[mFormSet
->Flags
++]), Guid
, sizeof (EFI_GUID
));
689 return mFormSet
->Flags
;
693 class CIfrEnd
: public CIfrObj
, public CIfrOpHeader
{
695 CIfrEnd () : CIfrObj (EFI_IFR_END_OP
),
696 CIfrOpHeader (EFI_IFR_END_OP
, &(GetObjBinAddr
<EFI_IFR_END
>())->Header
) {}
699 class CIfrDefaultStore
: public CIfrObj
, public CIfrOpHeader
{
701 EFI_IFR_DEFAULTSTORE
*mDefaultStore
;
704 CIfrDefaultStore () : CIfrObj (EFI_IFR_DEFAULTSTORE_OP
),
705 CIfrOpHeader (EFI_IFR_DEFAULTSTORE_OP
, &(GetObjBinAddr
<EFI_IFR_DEFAULTSTORE
>())->Header
), mDefaultStore(GetObjBinAddr
<EFI_IFR_DEFAULTSTORE
>()) {
706 mDefaultStore
->DefaultId
= EFI_VARSTORE_ID_INVALID
;
707 mDefaultStore
->DefaultName
= EFI_STRING_ID_INVALID
;
710 VOID
SetDefaultName (IN EFI_STRING_ID DefaultName
) {
711 mDefaultStore
->DefaultName
= DefaultName
;
714 VOID
SetDefaultId (IN UINT16 DefaultId
) {
715 mDefaultStore
->DefaultId
= DefaultId
;
719 #define EFI_FORM_ID_MAX 0xFFFF
720 #define EFI_FREE_FORM_ID_BITMAP_SIZE ((EFI_FORM_ID_MAX + 1) / EFI_BITS_PER_UINT32)
724 STATIC UINT32 FormIdBitMap
[EFI_FREE_FORM_ID_BITMAP_SIZE
];
726 STATIC BOOLEAN
ChekFormIdFree (IN EFI_FORM_ID FormId
) {
727 UINT32 Index
= (FormId
/ EFI_BITS_PER_UINT32
);
728 UINT32 Offset
= (FormId
% EFI_BITS_PER_UINT32
);
730 return (FormIdBitMap
[Index
] & (0x80000000 >> Offset
)) == 0;
733 STATIC VOID
MarkFormIdUsed (IN EFI_FORM_ID FormId
) {
734 UINT32 Index
= (FormId
/ EFI_BITS_PER_UINT32
);
735 UINT32 Offset
= (FormId
% EFI_BITS_PER_UINT32
);
737 FormIdBitMap
[Index
] |= (0x80000000 >> Offset
);
741 class CIfrForm
: public CIfrObj
, public CIfrOpHeader
{
746 CIfrForm () : CIfrObj (EFI_IFR_FORM_OP
),
747 CIfrOpHeader (EFI_IFR_FORM_OP
, &(GetObjBinAddr
<EFI_IFR_FORM
>())->Header
), mForm(GetObjBinAddr
<EFI_IFR_FORM
>()) {
749 mForm
->FormTitle
= EFI_STRING_ID_INVALID
;
752 EFI_VFR_RETURN_CODE
SetFormId (IN EFI_FORM_ID FormId
) {
755 // FormId can't be 0.
757 return VFR_RETURN_INVALID_PARAMETER
;
759 if (CIfrFormId::ChekFormIdFree (FormId
) == FALSE
) {
760 return VFR_RETURN_FORMID_REDEFINED
;
762 mForm
->FormId
= FormId
;
763 CIfrFormId::MarkFormIdUsed (FormId
);
764 return VFR_RETURN_SUCCESS
;
767 VOID
SetFormTitle (IN EFI_STRING_ID FormTitle
) {
768 mForm
->FormTitle
= FormTitle
;
772 class CIfrFormMap
: public CIfrObj
, public CIfrOpHeader
{
774 EFI_IFR_FORM_MAP
*mFormMap
;
775 EFI_IFR_FORM_MAP_METHOD
*mMethodMap
;
778 CIfrFormMap () : CIfrObj (EFI_IFR_FORM_MAP_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_FORM_MAP
), TRUE
),
779 CIfrOpHeader (EFI_IFR_FORM_MAP_OP
, &(GetObjBinAddr
<EFI_IFR_FORM_MAP
>())->Header
), mFormMap(GetObjBinAddr
<EFI_IFR_FORM_MAP
>()) {
780 mFormMap
->FormId
= 0;
781 mMethodMap
= (EFI_IFR_FORM_MAP_METHOD
*) (mFormMap
+ 1);
784 EFI_VFR_RETURN_CODE
SetFormId (IN EFI_FORM_ID FormId
) {
787 // FormId can't be 0.
789 return VFR_RETURN_INVALID_PARAMETER
;
791 if (CIfrFormId::ChekFormIdFree (FormId
) == FALSE
) {
792 return VFR_RETURN_FORMID_REDEFINED
;
794 mFormMap
->FormId
= FormId
;
795 CIfrFormId::MarkFormIdUsed (FormId
);
796 return VFR_RETURN_SUCCESS
;
799 VOID
SetFormMapMethod (IN EFI_STRING_ID MethodTitle
, IN EFI_GUID
*MethodGuid
) {
800 if (ExpendObjBin (sizeof (EFI_IFR_FORM_MAP_METHOD
))) {
801 IncLength (sizeof (EFI_IFR_FORM_MAP_METHOD
));
803 mMethodMap
->MethodTitle
= MethodTitle
;
804 memmove (&(mMethodMap
->MethodIdentifier
), MethodGuid
, sizeof (EFI_GUID
));
810 class CIfrVarStore
: public CIfrObj
, public CIfrOpHeader
{
812 EFI_IFR_VARSTORE
*mVarStore
;
815 CIfrVarStore () : CIfrObj (EFI_IFR_VARSTORE_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_VARSTORE
), TRUE
),
816 CIfrOpHeader (EFI_IFR_VARSTORE_OP
, &(GetObjBinAddr
<EFI_IFR_VARSTORE
>())->Header
), mVarStore(GetObjBinAddr
<EFI_IFR_VARSTORE
>()) {
817 mVarStore
->VarStoreId
= EFI_VARSTORE_ID_INVALID
;
819 memset (&mVarStore
->Guid
, 0, sizeof (EFI_GUID
));
820 mVarStore
->Name
[0] = '\0';
823 VOID
SetGuid (IN EFI_GUID
*Guid
) {
824 memmove (&mVarStore
->Guid
, Guid
, sizeof (EFI_GUID
));
827 VOID
SetVarStoreId (IN EFI_VARSTORE_ID VarStoreId
) {
828 mVarStore
->VarStoreId
= VarStoreId
;
831 VOID
SetSize (IN UINT16 Size
) {
832 mVarStore
->Size
= Size
;
835 VOID
SetName (IN CHAR8
*Name
) {
839 Len
= (UINT8
) strlen (Name
);
841 if (ExpendObjBin (Len
) == TRUE
) {
843 strcpy ((CHAR8
*)(mVarStore
->Name
), Name
);
850 class CIfrVarStoreEfi
: public CIfrObj
, public CIfrOpHeader
{
852 EFI_IFR_VARSTORE_EFI
*mVarStoreEfi
;
855 CIfrVarStoreEfi () : CIfrObj (EFI_IFR_VARSTORE_EFI_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_VARSTORE_EFI
), TRUE
),
856 CIfrOpHeader (EFI_IFR_VARSTORE_EFI_OP
, &(GetObjBinAddr
<EFI_IFR_VARSTORE_EFI
>())->Header
), mVarStoreEfi(GetObjBinAddr
<EFI_IFR_VARSTORE_EFI
>()) {
857 mVarStoreEfi
->VarStoreId
= EFI_VAROFFSET_INVALID
;
858 mVarStoreEfi
->Size
= 0;
859 memset (&mVarStoreEfi
->Guid
, 0, sizeof (EFI_GUID
));
860 mVarStoreEfi
->Name
[0] = '\0';
863 VOID
SetGuid (IN EFI_GUID
*Guid
) {
864 memmove (&mVarStoreEfi
->Guid
, Guid
, sizeof (EFI_GUID
));
867 VOID
SetVarStoreId (IN UINT16 VarStoreId
) {
868 mVarStoreEfi
->VarStoreId
= VarStoreId
;
871 VOID
SetAttributes (IN UINT32 Attributes
) {
872 mVarStoreEfi
->Attributes
= Attributes
;
874 VOID
SetSize (IN UINT16 Size
) {
875 mVarStoreEfi
->Size
= Size
;
878 VOID
SetName (IN CHAR8
*Name
) {
882 Len
= (UINT8
) strlen (Name
);
884 if (ExpendObjBin (Len
) == TRUE
) {
886 strcpy ((CHAR8
*)(mVarStoreEfi
->Name
), Name
);
892 VOID
SetBinaryLength (IN UINT16 Size
) {
895 Len
= sizeof (EFI_IFR_VARSTORE_EFI
);
897 ExpendObjBin(Size
- Len
);
898 IncLength(Size
- Len
);
900 ShrinkObjBin(Len
- Size
);
901 DecLength(Len
- Size
);
906 class CIfrVarStoreNameValue
: public CIfrObj
, public CIfrOpHeader
{
908 EFI_IFR_VARSTORE_NAME_VALUE
*mVarStoreNameValue
;
911 CIfrVarStoreNameValue () : CIfrObj (EFI_IFR_VARSTORE_NAME_VALUE_OP
),
912 CIfrOpHeader (EFI_IFR_VARSTORE_NAME_VALUE_OP
, &(GetObjBinAddr
<EFI_IFR_VARSTORE_NAME_VALUE
>())->Header
), mVarStoreNameValue(GetObjBinAddr
<EFI_IFR_VARSTORE_NAME_VALUE
>()) {
913 mVarStoreNameValue
->VarStoreId
= EFI_VAROFFSET_INVALID
;
914 memset (&mVarStoreNameValue
->Guid
, 0, sizeof (EFI_GUID
));
917 VOID
SetGuid (IN EFI_GUID
*Guid
) {
918 memmove (&mVarStoreNameValue
->Guid
, Guid
, sizeof (EFI_GUID
));
921 VOID
SetVarStoreId (IN UINT16 VarStoreId
) {
922 mVarStoreNameValue
->VarStoreId
= VarStoreId
;
926 class CIfrImage
: public CIfrObj
, public CIfrOpHeader
{
928 EFI_IFR_IMAGE
*mImage
;
931 CIfrImage () : CIfrObj (EFI_IFR_IMAGE_OP
),
932 CIfrOpHeader (EFI_IFR_IMAGE_OP
, &(GetObjBinAddr
<EFI_IFR_IMAGE
>())->Header
), mImage(GetObjBinAddr
<EFI_IFR_IMAGE
>()) {
933 mImage
->Id
= EFI_IMAGE_ID_INVALID
;
936 VOID
SetImageId (IN EFI_IMAGE_ID ImageId
) {
937 mImage
->Id
= ImageId
;
941 class CIfrModal
: public CIfrObj
, public CIfrOpHeader
{
943 CIfrModal () : CIfrObj (EFI_IFR_MODAL_TAG_OP
),
944 CIfrOpHeader (EFI_IFR_MODAL_TAG_OP
, &(GetObjBinAddr
<EFI_IFR_MODAL_TAG
>())->Header
) {
949 class CIfrLocked
: public CIfrObj
, public CIfrOpHeader
{
951 CIfrLocked () : CIfrObj (EFI_IFR_LOCKED_OP
),
952 CIfrOpHeader (EFI_IFR_LOCKED_OP
, &(GetObjBinAddr
<EFI_IFR_LOCKED
>())->Header
) {}
955 class CIfrRule
: public CIfrObj
, public CIfrOpHeader
{
960 CIfrRule () : CIfrObj (EFI_IFR_RULE_OP
),
961 CIfrOpHeader (EFI_IFR_RULE_OP
, &(GetObjBinAddr
<EFI_IFR_RULE
>())->Header
), mRule(GetObjBinAddr
<EFI_IFR_RULE
>()) {
962 mRule
->RuleId
= EFI_RULE_ID_INVALID
;
965 VOID
SetRuleId (IN UINT8 RuleId
) {
966 mRule
->RuleId
= RuleId
;
970 static EFI_IFR_TYPE_VALUE gZeroEfiIfrTypeValue
= {0, };
972 class CIfrDefault
: public CIfrObj
, public CIfrOpHeader
{
974 EFI_IFR_DEFAULT
*mDefault
;
979 IN UINT16 DefaultId
= EFI_HII_DEFAULT_CLASS_STANDARD
,
980 IN UINT8 Type
= EFI_IFR_TYPE_OTHER
,
981 IN EFI_IFR_TYPE_VALUE Value
= gZeroEfiIfrTypeValue
982 ) : CIfrObj (EFI_IFR_DEFAULT_OP
, (CHAR8
**)NULL
, Size
),
983 CIfrOpHeader (EFI_IFR_DEFAULT_OP
, &(GetObjBinAddr
<EFI_IFR_DEFAULT
>())->Header
, Size
), mDefault(GetObjBinAddr
<EFI_IFR_DEFAULT
>()) {
984 mDefault
->Type
= Type
;
985 mDefault
->DefaultId
= DefaultId
;
986 memmove (&(mDefault
->Value
), &Value
, Size
- OFFSET_OF (EFI_IFR_DEFAULT
, Value
));
989 VOID
SetDefaultId (IN UINT16 DefaultId
) {
990 mDefault
->DefaultId
= DefaultId
;
993 VOID
SetType (IN UINT8 Type
) {
994 mDefault
->Type
= Type
;
997 VOID
SetValue (IN EFI_IFR_TYPE_VALUE Value
) {
998 memmove (&mDefault
->Value
, &Value
, mDefault
->Header
.Length
- OFFSET_OF (EFI_IFR_DEFAULT
, Value
));
1002 class CIfrDefault2
: public CIfrObj
, public CIfrOpHeader
{
1004 EFI_IFR_DEFAULT_2
*mDefault
;
1008 IN UINT16 DefaultId
= EFI_HII_DEFAULT_CLASS_STANDARD
,
1009 IN UINT8 Type
= EFI_IFR_TYPE_OTHER
1010 ) : CIfrObj (EFI_IFR_DEFAULT_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_DEFAULT_2
)),
1011 CIfrOpHeader (EFI_IFR_DEFAULT_OP
, &(GetObjBinAddr
<EFI_IFR_DEFAULT_2
>())->Header
, sizeof (EFI_IFR_DEFAULT_2
)), mDefault(GetObjBinAddr
<EFI_IFR_DEFAULT_2
>()) {
1012 mDefault
->Type
= Type
;
1013 mDefault
->DefaultId
= DefaultId
;
1016 VOID
SetDefaultId (IN UINT16 DefaultId
) {
1017 mDefault
->DefaultId
= DefaultId
;
1020 VOID
SetType (IN UINT8 Type
) {
1021 mDefault
->Type
= Type
;
1025 class CIfrValue
: public CIfrObj
, public CIfrOpHeader
{
1027 CIfrValue () : CIfrObj (EFI_IFR_VALUE_OP
),
1028 CIfrOpHeader (EFI_IFR_VALUE_OP
, &(GetObjBinAddr
<EFI_IFR_VALUE
>())->Header
) {}
1032 class CIfrRead
: public CIfrObj
, public CIfrOpHeader
{
1034 CIfrRead () : CIfrObj (EFI_IFR_READ_OP
),
1035 CIfrOpHeader (EFI_IFR_READ_OP
, &(GetObjBinAddr
<EFI_IFR_READ
>())->Header
) {}
1039 class CIfrWrite
: public CIfrObj
, public CIfrOpHeader
{
1041 CIfrWrite () : CIfrObj (EFI_IFR_WRITE_OP
),
1042 CIfrOpHeader (EFI_IFR_WRITE_OP
, &(GetObjBinAddr
<EFI_IFR_WRITE
>())->Header
) {}
1046 class CIfrGet
: public CIfrObj
, public CIfrOpHeader
{
1053 ) : CIfrObj (EFI_IFR_GET_OP
),
1054 CIfrOpHeader (EFI_IFR_GET_OP
, &(GetObjBinAddr
<EFI_IFR_GET
>())->Header
), mGet(GetObjBinAddr
<EFI_IFR_GET
>()) {
1058 VOID
SetVarInfo (IN EFI_VARSTORE_INFO
*Info
) {
1059 mGet
->VarStoreId
= Info
->mVarStoreId
;
1060 mGet
->VarStoreInfo
.VarName
= Info
->mInfo
.mVarName
;
1061 mGet
->VarStoreInfo
.VarOffset
= Info
->mInfo
.mVarOffset
;
1062 mGet
->VarStoreType
= Info
->mVarType
;
1066 class CIfrSet
: public CIfrObj
, public CIfrOpHeader
{
1073 ) : CIfrObj (EFI_IFR_SET_OP
),
1074 CIfrOpHeader (EFI_IFR_SET_OP
, &(GetObjBinAddr
<EFI_IFR_SET
>())->Header
), mSet(GetObjBinAddr
<EFI_IFR_SET
>()) {
1078 VOID
SetVarInfo (IN EFI_VARSTORE_INFO
*Info
) {
1079 mSet
->VarStoreId
= Info
->mVarStoreId
;
1080 mSet
->VarStoreInfo
.VarName
= Info
->mInfo
.mVarName
;
1081 mSet
->VarStoreInfo
.VarOffset
= Info
->mInfo
.mVarOffset
;
1082 mSet
->VarStoreType
= Info
->mVarType
;
1086 class CIfrSubtitle
: public CIfrObj
, public CIfrOpHeader
, public CIfrStatementHeader
{
1088 EFI_IFR_SUBTITLE
*mSubtitle
;
1091 CIfrSubtitle () : CIfrObj (EFI_IFR_SUBTITLE_OP
),
1092 CIfrOpHeader (EFI_IFR_SUBTITLE_OP
, &(GetObjBinAddr
<EFI_IFR_SUBTITLE
>())->Header
),
1093 CIfrStatementHeader (&(GetObjBinAddr
<EFI_IFR_SUBTITLE
>())->Statement
), mSubtitle(GetObjBinAddr
<EFI_IFR_SUBTITLE
>()) {
1094 mSubtitle
->Flags
= 0;
1097 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 LFlags
) {
1098 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_IFR_FLAGS_HORIZONTAL
)) {
1099 mSubtitle
->Flags
|= EFI_IFR_FLAGS_HORIZONTAL
;
1102 return _FLAGS_ZERO (LFlags
) ? VFR_RETURN_SUCCESS
: VFR_RETURN_FLAGS_UNSUPPORTED
;
1106 class CIfrText
: public CIfrObj
, public CIfrOpHeader
, public CIfrStatementHeader
{
1108 EFI_IFR_TEXT
*mText
;
1111 CIfrText () : CIfrObj (EFI_IFR_TEXT_OP
),
1112 CIfrOpHeader (EFI_IFR_TEXT_OP
, &(GetObjBinAddr
<EFI_IFR_TEXT
>())->Header
),
1113 CIfrStatementHeader (&(GetObjBinAddr
<EFI_IFR_TEXT
>())->Statement
), mText(GetObjBinAddr
<EFI_IFR_TEXT
>()) {
1114 mText
->TextTwo
= EFI_STRING_ID_INVALID
;
1117 VOID
SetTextTwo (IN EFI_STRING_ID StringId
) {
1118 mText
->TextTwo
= StringId
;
1122 class CIfrRef
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1127 CIfrRef () : CIfrObj (EFI_IFR_REF_OP
),
1128 CIfrOpHeader (EFI_IFR_REF_OP
, &(GetObjBinAddr
<EFI_IFR_REF
>())->Header
),
1129 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_REF
>())->Question
), mRef(GetObjBinAddr
<EFI_IFR_REF
>()) {
1133 VOID
SetFormId (IN EFI_FORM_ID FormId
) {
1134 mRef
->FormId
= FormId
;
1138 class CIfrRef2
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1140 EFI_IFR_REF2
*mRef2
;
1143 CIfrRef2 () : CIfrObj (EFI_IFR_REF_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_REF2
)),
1144 CIfrOpHeader (EFI_IFR_REF_OP
, &(GetObjBinAddr
<EFI_IFR_REF2
>())->Header
, sizeof (EFI_IFR_REF2
)),
1145 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_REF2
>())->Question
), mRef2(GetObjBinAddr
<EFI_IFR_REF2
>()) {
1147 mRef2
->QuestionId
= EFI_QUESTION_ID_INVALID
;
1150 VOID
SetFormId (IN EFI_FORM_ID FormId
) {
1151 mRef2
->FormId
= FormId
;
1154 VOID
SetQuestionId (IN EFI_QUESTION_ID QuestionId
) {
1155 mRef2
->QuestionId
= QuestionId
;
1159 class CIfrRef3
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1161 EFI_IFR_REF3
*mRef3
;
1164 CIfrRef3 () : CIfrObj (EFI_IFR_REF_OP
, (CHAR8
**)NULL
, sizeof(EFI_IFR_REF3
)),
1165 CIfrOpHeader (EFI_IFR_REF_OP
, &(GetObjBinAddr
<EFI_IFR_REF3
>())->Header
, sizeof (EFI_IFR_REF3
)),
1166 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_REF3
>())->Question
), mRef3(GetObjBinAddr
<EFI_IFR_REF3
>()) {
1168 mRef3
->QuestionId
= EFI_QUESTION_ID_INVALID
;
1169 memset (&mRef3
->FormSetId
, 0, sizeof (EFI_GUID
));
1172 VOID
SetFormId (IN EFI_FORM_ID FormId
) {
1173 mRef3
->FormId
= FormId
;
1176 VOID
SetQuestionId (IN EFI_QUESTION_ID QuestionId
) {
1177 mRef3
->QuestionId
= QuestionId
;
1180 VOID
SetFormSetId (IN EFI_GUID FormSetId
) {
1181 mRef3
->FormSetId
= FormSetId
;
1185 class CIfrRef4
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1187 EFI_IFR_REF4
*mRef4
;
1190 CIfrRef4 () : CIfrObj (EFI_IFR_REF_OP
, (CHAR8
**)NULL
, sizeof(EFI_IFR_REF4
)),
1191 CIfrOpHeader (EFI_IFR_REF_OP
, &(GetObjBinAddr
<EFI_IFR_REF4
>())->Header
, sizeof(EFI_IFR_REF4
)),
1192 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_REF4
>())->Question
), mRef4(GetObjBinAddr
<EFI_IFR_REF4
>()) {
1194 mRef4
->QuestionId
= EFI_QUESTION_ID_INVALID
;
1195 memset (&mRef4
->FormSetId
, 0, sizeof (EFI_GUID
));
1196 mRef4
->DevicePath
= EFI_STRING_ID_INVALID
;
1199 VOID
SetFormId (IN EFI_FORM_ID FormId
) {
1200 mRef4
->FormId
= FormId
;
1203 VOID
SetQuestionId (IN EFI_QUESTION_ID QuestionId
) {
1204 mRef4
->QuestionId
= QuestionId
;
1207 VOID
SetFormSetId (IN EFI_GUID FormSetId
) {
1208 mRef4
->FormSetId
= FormSetId
;
1211 VOID
SetDevicePath (IN EFI_STRING_ID DevicePath
) {
1212 mRef4
->DevicePath
= DevicePath
;
1216 class CIfrRef5
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1218 CIfrRef5 () : CIfrObj (EFI_IFR_REF_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_REF5
)),
1219 CIfrOpHeader (EFI_IFR_REF_OP
, &(GetObjBinAddr
<EFI_IFR_REF5
>())->Header
, sizeof (EFI_IFR_REF5
)),
1220 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_REF5
>())->Question
) {
1224 class CIfrResetButton
: public CIfrObj
, public CIfrOpHeader
, public CIfrStatementHeader
{
1226 EFI_IFR_RESET_BUTTON
*mResetButton
;
1229 CIfrResetButton () : CIfrObj (EFI_IFR_RESET_BUTTON_OP
),
1230 CIfrOpHeader (EFI_IFR_RESET_BUTTON_OP
, &(GetObjBinAddr
<EFI_IFR_RESET_BUTTON
>())->Header
),
1231 CIfrStatementHeader (&(GetObjBinAddr
<EFI_IFR_RESET_BUTTON
>())->Statement
), mResetButton(GetObjBinAddr
<EFI_IFR_RESET_BUTTON
>()) {
1232 mResetButton
->DefaultId
= EFI_HII_DEFAULT_CLASS_STANDARD
;
1235 VOID
SetDefaultId (IN UINT16 DefaultId
) {
1236 mResetButton
->DefaultId
= DefaultId
;
1240 class CIfrCheckBox
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1242 EFI_IFR_CHECKBOX
*mCheckBox
;
1245 CIfrCheckBox () : CIfrObj (EFI_IFR_CHECKBOX_OP
),
1246 CIfrOpHeader (EFI_IFR_CHECKBOX_OP
, &(GetObjBinAddr
<EFI_IFR_CHECKBOX
>())->Header
),
1247 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_CHECKBOX
>())->Question
), mCheckBox(GetObjBinAddr
<EFI_IFR_CHECKBOX
>()) {
1248 mCheckBox
->Flags
= 0;
1249 gCurrentQuestion
= this;
1253 gCurrentQuestion
= NULL
;
1256 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 HFlags
, UINT8 LFlags
) {
1257 EFI_VFR_RETURN_CODE Ret
;
1259 Ret
= CIfrQuestionHeader::SetFlags (HFlags
);
1260 if (Ret
!= VFR_RETURN_SUCCESS
) {
1264 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_IFR_CHECKBOX_DEFAULT
)) {
1265 mCheckBox
->Flags
|= EFI_IFR_CHECKBOX_DEFAULT
;
1268 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_IFR_CHECKBOX_DEFAULT_MFG
)) {
1269 mCheckBox
->Flags
|= EFI_IFR_CHECKBOX_DEFAULT_MFG
;
1272 return _FLAGS_ZERO (LFlags
) ? VFR_RETURN_SUCCESS
: VFR_RETURN_FLAGS_UNSUPPORTED
;
1275 UINT8
GetFlags (VOID
) {
1276 return mCheckBox
->Flags
;
1280 class CIfrAction
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1282 EFI_IFR_ACTION
*mAction
;
1285 CIfrAction () : CIfrObj (EFI_IFR_ACTION_OP
),
1286 CIfrOpHeader (EFI_IFR_ACTION_OP
, &(GetObjBinAddr
<EFI_IFR_ACTION
>())->Header
),
1287 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_ACTION
>())->Question
), mAction(GetObjBinAddr
<EFI_IFR_ACTION
>()) {
1288 mAction
->QuestionConfig
= EFI_STRING_ID_INVALID
;
1291 VOID
SetQuestionConfig (IN EFI_STRING_ID QuestionConfig
) {
1292 mAction
->QuestionConfig
= QuestionConfig
;
1296 class CIfrDate
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1298 EFI_IFR_DATE
*mDate
;
1301 CIfrDate () : CIfrObj (EFI_IFR_DATE_OP
),
1302 CIfrOpHeader (EFI_IFR_DATE_OP
, &(GetObjBinAddr
<EFI_IFR_DATE
>())->Header
),
1303 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_DATE
>())->Question
), mDate(GetObjBinAddr
<EFI_IFR_DATE
>()) {
1307 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 HFlags
, IN UINT8 LFlags
) {
1308 EFI_VFR_RETURN_CODE Ret
;
1310 Ret
= CIfrQuestionHeader::SetFlags (HFlags
);
1311 if (Ret
!= VFR_RETURN_SUCCESS
) {
1315 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_QF_DATE_YEAR_SUPPRESS
)) {
1316 mDate
->Flags
|= EFI_QF_DATE_YEAR_SUPPRESS
;
1319 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_QF_DATE_MONTH_SUPPRESS
)) {
1320 mDate
->Flags
|= EFI_QF_DATE_MONTH_SUPPRESS
;
1323 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_QF_DATE_DAY_SUPPRESS
)) {
1324 mDate
->Flags
|= EFI_QF_DATE_DAY_SUPPRESS
;
1327 if (_FLAG_TEST_AND_CLEAR (LFlags
, QF_DATE_STORAGE_NORMAL
)) {
1328 mDate
->Flags
|= QF_DATE_STORAGE_NORMAL
;
1329 } else if (_FLAG_TEST_AND_CLEAR (LFlags
, QF_DATE_STORAGE_TIME
)) {
1330 mDate
->Flags
|= QF_DATE_STORAGE_TIME
;
1331 } else if (_FLAG_TEST_AND_CLEAR (LFlags
, QF_DATE_STORAGE_WAKEUP
)) {
1332 mDate
->Flags
|= QF_DATE_STORAGE_WAKEUP
;
1335 return _FLAGS_ZERO (LFlags
) ? VFR_RETURN_SUCCESS
: VFR_RETURN_FLAGS_UNSUPPORTED
;
1339 class CIfrNumeric
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
, public CIfrMinMaxStepData
{
1341 EFI_IFR_NUMERIC
*mNumeric
;
1344 CIfrNumeric () : CIfrObj (EFI_IFR_NUMERIC_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_NUMERIC
), TRUE
),
1345 CIfrOpHeader (EFI_IFR_NUMERIC_OP
, &(GetObjBinAddr
<EFI_IFR_NUMERIC
>())->Header
),
1346 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_NUMERIC
>())->Question
),
1347 CIfrMinMaxStepData (&(GetObjBinAddr
<EFI_IFR_NUMERIC
>())->data
, TRUE
), mNumeric(GetObjBinAddr
<EFI_IFR_NUMERIC
>()) {
1348 mNumeric
->Flags
= EFI_IFR_NUMERIC_SIZE_1
| EFI_IFR_DISPLAY_UINT_DEC
;
1349 gCurrentQuestion
= this;
1350 gCurrentMinMaxData
= this;
1354 gCurrentQuestion
= NULL
;
1355 gCurrentMinMaxData
= NULL
;
1358 VOID
ShrinkBinSize (IN UINT16 Size
) {
1360 // Update the buffer size which is truly be used later.
1366 // Allocate buffer in gCFormPkg.
1368 _EMIT_PENDING_OBJ();
1371 // Update the buffer pointer used by other class.
1373 mNumeric
= GetObjBinAddr
<EFI_IFR_NUMERIC
>();
1374 UpdateHeader (&mNumeric
->Header
);
1375 UpdateCIfrQuestionHeader(&mNumeric
->Question
);
1376 UpdateCIfrMinMaxStepData(&mNumeric
->data
);
1379 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 HFlags
, IN UINT8 LFlags
, BOOLEAN DisplaySettingsSpecified
= FALSE
) {
1380 EFI_VFR_RETURN_CODE Ret
;
1382 Ret
= CIfrQuestionHeader::SetFlags (HFlags
);
1383 if (Ret
!= VFR_RETURN_SUCCESS
) {
1387 if (DisplaySettingsSpecified
== FALSE
) {
1388 mNumeric
->Flags
= LFlags
| EFI_IFR_DISPLAY_UINT_DEC
;
1390 mNumeric
->Flags
= LFlags
;
1392 return VFR_RETURN_SUCCESS
;
1395 EFI_VFR_RETURN_CODE
SetFlagsForBitField (IN UINT8 HFlags
, IN UINT8 LFlags
, BOOLEAN DisplaySettingsSpecified
= FALSE
) {
1396 EFI_VFR_RETURN_CODE Ret
;
1398 Ret
= CIfrQuestionHeader::SetFlags (HFlags
);
1399 if (Ret
!= VFR_RETURN_SUCCESS
) {
1403 if (DisplaySettingsSpecified
== FALSE
) {
1404 mNumeric
->Flags
= LFlags
| EDKII_IFR_DISPLAY_UINT_DEC_BIT
;
1406 mNumeric
->Flags
= LFlags
;
1408 return VFR_RETURN_SUCCESS
;
1411 UINT8
GetNumericFlags () {
1412 return mNumeric
->Flags
;
1416 class CIfrOneOf
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
, public CIfrMinMaxStepData
{
1418 EFI_IFR_ONE_OF
*mOneOf
;
1421 CIfrOneOf () : CIfrObj (EFI_IFR_ONE_OF_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_ONE_OF
), TRUE
),
1422 CIfrOpHeader (EFI_IFR_ONE_OF_OP
, &(GetObjBinAddr
<EFI_IFR_ONE_OF
>())->Header
),
1423 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_ONE_OF
>())->Question
),
1424 CIfrMinMaxStepData (&(GetObjBinAddr
<EFI_IFR_ONE_OF
>())->data
), mOneOf(GetObjBinAddr
<EFI_IFR_ONE_OF
>()) {
1426 gCurrentQuestion
= this;
1427 gCurrentMinMaxData
= this;
1431 gCurrentQuestion
= NULL
;
1432 gCurrentMinMaxData
= NULL
;
1435 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 HFlags
, IN UINT8 LFlags
) {
1436 EFI_VFR_RETURN_CODE Ret
;
1438 Ret
= CIfrQuestionHeader::SetFlags (HFlags
);
1439 if (Ret
!= VFR_RETURN_SUCCESS
) {
1443 if (LFlags
& EFI_IFR_DISPLAY
) {
1444 mOneOf
->Flags
= LFlags
;
1446 mOneOf
->Flags
= LFlags
| EFI_IFR_DISPLAY_UINT_DEC
;
1448 return VFR_RETURN_SUCCESS
;
1451 EFI_VFR_RETURN_CODE
SetFlagsForBitField (IN UINT8 HFlags
, IN UINT8 LFlags
) {
1452 EFI_VFR_RETURN_CODE Ret
;
1454 Ret
= CIfrQuestionHeader::SetFlags (HFlags
);
1455 if (Ret
!= VFR_RETURN_SUCCESS
) {
1459 if (LFlags
& EFI_IFR_DISPLAY
) {
1460 mOneOf
->Flags
= LFlags
;
1462 mOneOf
->Flags
= LFlags
| EDKII_IFR_DISPLAY_UINT_DEC_BIT
;
1464 return VFR_RETURN_SUCCESS
;
1467 VOID
ShrinkBinSize (IN UINT16 Size
) {
1469 // Update the buffer size which is truly be used later.
1475 // Allocate buffer in gCFormPkg.
1477 _EMIT_PENDING_OBJ();
1480 // Update the buffer pointer used by other class.
1482 mOneOf
= GetObjBinAddr
<EFI_IFR_ONE_OF
>();
1483 UpdateHeader (&mOneOf
->Header
);
1484 UpdateCIfrQuestionHeader(&mOneOf
->Question
);
1485 UpdateCIfrMinMaxStepData(&mOneOf
->data
);
1489 class CIfrString
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1491 EFI_IFR_STRING
*mString
;
1494 CIfrString () : CIfrObj (EFI_IFR_STRING_OP
),
1495 CIfrOpHeader (EFI_IFR_STRING_OP
, &(GetObjBinAddr
<EFI_IFR_STRING
>())->Header
),
1496 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_STRING
>())->Question
), mString(GetObjBinAddr
<EFI_IFR_STRING
>()) {
1498 mString
->MinSize
= 0;
1499 mString
->MaxSize
= 0;
1500 gCurrentQuestion
= this;
1504 gCurrentQuestion
= NULL
;
1507 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 HFlags
, IN UINT8 LFlags
) {
1508 EFI_VFR_RETURN_CODE Ret
;
1510 Ret
= CIfrQuestionHeader::SetFlags (HFlags
);
1511 if (Ret
!= VFR_RETURN_SUCCESS
) {
1515 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_IFR_STRING_MULTI_LINE
)) {
1516 mString
->Flags
|= EFI_IFR_STRING_MULTI_LINE
;
1519 return _FLAGS_ZERO (LFlags
) ? VFR_RETURN_SUCCESS
: VFR_RETURN_FLAGS_UNSUPPORTED
;
1522 VOID
SetMinSize (IN UINT8 Flags
) {
1523 mString
->MinSize
= Flags
;
1526 VOID
SetMaxSize (IN UINT8 MaxSize
) {
1527 mString
->MaxSize
= MaxSize
;
1531 class CIfrPassword
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1533 EFI_IFR_PASSWORD
*mPassword
;
1536 CIfrPassword () : CIfrObj (EFI_IFR_PASSWORD_OP
),
1537 CIfrOpHeader (EFI_IFR_PASSWORD_OP
, &(GetObjBinAddr
<EFI_IFR_PASSWORD
>())->Header
),
1538 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_PASSWORD
>())->Question
), mPassword(GetObjBinAddr
<EFI_IFR_PASSWORD
>()) {
1539 mPassword
->MinSize
= 0;
1540 mPassword
->MaxSize
= 0;
1541 gCurrentQuestion
= this;
1545 gCurrentQuestion
= NULL
;
1548 VOID
SetMinSize (IN UINT16 MinSize
) {
1549 mPassword
->MinSize
= MinSize
;
1552 VOID
SetMaxSize (IN UINT16 MaxSize
) {
1553 mPassword
->MaxSize
= MaxSize
;
1557 class CIfrOrderedList
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1559 EFI_IFR_ORDERED_LIST
*mOrderedList
;
1562 CIfrOrderedList () : CIfrObj (EFI_IFR_ORDERED_LIST_OP
),
1563 CIfrOpHeader (EFI_IFR_ORDERED_LIST_OP
, &(GetObjBinAddr
<EFI_IFR_ORDERED_LIST
>())->Header
),
1564 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_ORDERED_LIST
>())->Question
), mOrderedList(GetObjBinAddr
<EFI_IFR_ORDERED_LIST
>()) {
1565 mOrderedList
->MaxContainers
= 0;
1566 mOrderedList
->Flags
= 0;
1567 gCurrentQuestion
= this;
1570 ~CIfrOrderedList () {
1571 gCurrentQuestion
= NULL
;
1574 VOID
SetMaxContainers (IN UINT8 MaxContainers
) {
1575 mOrderedList
->MaxContainers
= MaxContainers
;
1578 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 HFlags
, IN UINT8 LFlags
) {
1579 EFI_VFR_RETURN_CODE Ret
;
1581 Ret
= CIfrQuestionHeader::SetFlags (HFlags
);
1582 if (Ret
!= VFR_RETURN_SUCCESS
) {
1586 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_IFR_UNIQUE_SET
)) {
1587 mOrderedList
->Flags
|= EFI_IFR_UNIQUE_SET
;
1590 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_IFR_NO_EMPTY_SET
)) {
1591 mOrderedList
->Flags
|= EFI_IFR_NO_EMPTY_SET
;
1594 return _FLAGS_ZERO (LFlags
) ? VFR_RETURN_SUCCESS
: VFR_RETURN_FLAGS_UNSUPPORTED
;
1598 class CIfrTime
: public CIfrObj
, public CIfrOpHeader
, public CIfrQuestionHeader
{
1600 EFI_IFR_TIME
*mTime
;
1603 CIfrTime () : CIfrObj (EFI_IFR_TIME_OP
),
1604 CIfrOpHeader (EFI_IFR_TIME_OP
, &(GetObjBinAddr
<EFI_IFR_TIME
>())->Header
),
1605 CIfrQuestionHeader (&(GetObjBinAddr
<EFI_IFR_TIME
>())->Question
), mTime(GetObjBinAddr
<EFI_IFR_TIME
>()) {
1609 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 HFlags
, IN UINT8 LFlags
) {
1610 EFI_VFR_RETURN_CODE Ret
;
1612 Ret
= CIfrQuestionHeader::SetFlags (HFlags
);
1613 if (Ret
!= VFR_RETURN_SUCCESS
) {
1617 if (_FLAG_TEST_AND_CLEAR (LFlags
, QF_TIME_HOUR_SUPPRESS
)) {
1618 mTime
->Flags
|= QF_TIME_HOUR_SUPPRESS
;
1621 if (_FLAG_TEST_AND_CLEAR (LFlags
, QF_TIME_MINUTE_SUPPRESS
)) {
1622 mTime
->Flags
|= QF_TIME_MINUTE_SUPPRESS
;
1625 if (_FLAG_TEST_AND_CLEAR (LFlags
, QF_TIME_SECOND_SUPPRESS
)) {
1626 mTime
->Flags
|= QF_TIME_SECOND_SUPPRESS
;
1629 if (_FLAG_TEST_AND_CLEAR (LFlags
, QF_TIME_STORAGE_NORMAL
)) {
1630 mTime
->Flags
|= QF_TIME_STORAGE_NORMAL
;
1631 } else if (_FLAG_TEST_AND_CLEAR (LFlags
, QF_TIME_STORAGE_TIME
)) {
1632 mTime
->Flags
|= QF_TIME_STORAGE_TIME
;
1633 } else if (_FLAG_TEST_AND_CLEAR (LFlags
, QF_TIME_STORAGE_WAKEUP
)) {
1634 mTime
->Flags
|= QF_TIME_STORAGE_WAKEUP
;
1637 return _FLAGS_ZERO (LFlags
) ? VFR_RETURN_SUCCESS
: VFR_RETURN_FLAGS_UNSUPPORTED
;
1641 class CIfrDisableIf
: public CIfrObj
, public CIfrOpHeader
{
1643 CIfrDisableIf () : CIfrObj (EFI_IFR_DISABLE_IF_OP
),
1644 CIfrOpHeader (EFI_IFR_DISABLE_IF_OP
, &(GetObjBinAddr
<EFI_IFR_DISABLE_IF
>())->Header
) {}
1647 class CIfrSuppressIf
: public CIfrObj
, public CIfrOpHeader
{
1649 CIfrSuppressIf () : CIfrObj (EFI_IFR_SUPPRESS_IF_OP
),
1650 CIfrOpHeader (EFI_IFR_SUPPRESS_IF_OP
, &(GetObjBinAddr
<EFI_IFR_SUPPRESS_IF
>())->Header
) {}
1653 class CIfrGrayOutIf
: public CIfrObj
, public CIfrOpHeader
{
1655 CIfrGrayOutIf () : CIfrObj (EFI_IFR_GRAY_OUT_IF_OP
),
1656 CIfrOpHeader (EFI_IFR_GRAY_OUT_IF_OP
, &(GetObjBinAddr
<EFI_IFR_GRAY_OUT_IF
>())->Header
) {}
1659 class CIfrInconsistentIf
: public CIfrObj
, public CIfrOpHeader
{
1661 EFI_IFR_INCONSISTENT_IF
*mInconsistentIf
;
1664 CIfrInconsistentIf () : CIfrObj (EFI_IFR_INCONSISTENT_IF_OP
),
1665 CIfrOpHeader (EFI_IFR_INCONSISTENT_IF_OP
, &(GetObjBinAddr
<EFI_IFR_INCONSISTENT_IF
>())->Header
), mInconsistentIf(GetObjBinAddr
<EFI_IFR_INCONSISTENT_IF
>()) {
1666 mInconsistentIf
->Error
= EFI_STRING_ID_INVALID
;
1669 VOID
SetError (IN EFI_STRING_ID Error
) {
1670 mInconsistentIf
->Error
= Error
;
1674 class CIfrWarningIf
: public CIfrObj
, public CIfrOpHeader
{
1676 EFI_IFR_WARNING_IF
*mWarningIf
;
1679 CIfrWarningIf () : CIfrObj (EFI_IFR_WARNING_IF_OP
),
1680 CIfrOpHeader (EFI_IFR_WARNING_IF_OP
, &(GetObjBinAddr
<EFI_IFR_WARNING_IF
>())->Header
), mWarningIf(GetObjBinAddr
<EFI_IFR_WARNING_IF
>()) {
1681 mWarningIf
->Warning
= EFI_STRING_ID_INVALID
;
1682 mWarningIf
->TimeOut
= 0;
1685 VOID
SetWarning (IN EFI_STRING_ID Warning
) {
1686 mWarningIf
->Warning
= Warning
;
1689 VOID
SetTimeOut (IN UINT8 TimeOut
) {
1690 mWarningIf
->TimeOut
= TimeOut
;
1694 class CIfrNoSubmitIf
: public CIfrObj
, public CIfrOpHeader
{
1696 EFI_IFR_NO_SUBMIT_IF
*mNoSubmitIf
;
1699 CIfrNoSubmitIf () : CIfrObj (EFI_IFR_NO_SUBMIT_IF_OP
),
1700 CIfrOpHeader (EFI_IFR_NO_SUBMIT_IF_OP
, &(GetObjBinAddr
<EFI_IFR_NO_SUBMIT_IF
>())->Header
), mNoSubmitIf(GetObjBinAddr
<EFI_IFR_NO_SUBMIT_IF
>()) {
1701 mNoSubmitIf
->Error
= EFI_STRING_ID_INVALID
;
1704 VOID
SetError (IN EFI_STRING_ID Error
) {
1705 mNoSubmitIf
->Error
= Error
;
1709 class CIfrRefresh
: public CIfrObj
, public CIfrOpHeader
{
1711 EFI_IFR_REFRESH
*mRefresh
;
1714 CIfrRefresh () : CIfrObj (EFI_IFR_REFRESH_OP
),
1715 CIfrOpHeader (EFI_IFR_REFRESH_OP
, &(GetObjBinAddr
<EFI_IFR_REFRESH
>())->Header
), mRefresh(GetObjBinAddr
<EFI_IFR_REFRESH
>()) {
1716 mRefresh
->RefreshInterval
= 0;
1719 VOID
SetRefreshInterval (IN UINT8 RefreshInterval
) {
1720 mRefresh
->RefreshInterval
= RefreshInterval
;
1724 class CIfrRefreshId
: public CIfrObj
, public CIfrOpHeader
{
1726 EFI_IFR_REFRESH_ID
*mRefreshId
;
1729 CIfrRefreshId () : CIfrObj (EFI_IFR_REFRESH_ID_OP
),
1730 CIfrOpHeader (EFI_IFR_REFRESH_ID_OP
, &(GetObjBinAddr
<EFI_IFR_REFRESH_ID
>())->Header
), mRefreshId(GetObjBinAddr
<EFI_IFR_REFRESH_ID
>()) {
1731 memset (&mRefreshId
->RefreshEventGroupId
, 0, sizeof (EFI_GUID
));
1734 VOID
SetRefreshEventGroutId (IN EFI_GUID
*RefreshEventGroupId
) {
1735 memmove (&mRefreshId
->RefreshEventGroupId
, RefreshEventGroupId
, sizeof (EFI_GUID
));
1739 class CIfrVarStoreDevice
: public CIfrObj
, public CIfrOpHeader
{
1741 EFI_IFR_VARSTORE_DEVICE
*mVarStoreDevice
;
1744 CIfrVarStoreDevice () : CIfrObj (EFI_IFR_VARSTORE_DEVICE_OP
),
1745 CIfrOpHeader (EFI_IFR_VARSTORE_DEVICE_OP
, &(GetObjBinAddr
<EFI_IFR_VARSTORE_DEVICE
>())->Header
), mVarStoreDevice(GetObjBinAddr
<EFI_IFR_VARSTORE_DEVICE
>()) {
1746 mVarStoreDevice
->DevicePath
= EFI_STRING_ID_INVALID
;
1749 VOID
SetDevicePath (IN EFI_STRING_ID DevicePath
) {
1750 mVarStoreDevice
->DevicePath
= DevicePath
;
1754 class CIfrOneOfOption
: public CIfrObj
, public CIfrOpHeader
{
1756 EFI_IFR_ONE_OF_OPTION
*mOneOfOption
;
1759 CIfrOneOfOption (UINT8 Size
) : CIfrObj (EFI_IFR_ONE_OF_OPTION_OP
, (CHAR8
**)NULL
, Size
),
1760 CIfrOpHeader (EFI_IFR_ONE_OF_OPTION_OP
, &(GetObjBinAddr
<EFI_IFR_ONE_OF_OPTION
>())->Header
, Size
), mOneOfOption(GetObjBinAddr
<EFI_IFR_ONE_OF_OPTION
>()) {
1761 mOneOfOption
->Flags
= 0;
1762 mOneOfOption
->Option
= EFI_STRING_ID_INVALID
;
1763 mOneOfOption
->Type
= EFI_IFR_TYPE_OTHER
;
1764 memset (&mOneOfOption
->Value
, 0, Size
- OFFSET_OF (EFI_IFR_ONE_OF_OPTION
, Value
));
1767 VOID
SetOption (IN EFI_STRING_ID Option
) {
1768 mOneOfOption
->Option
= Option
;
1771 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 LFlags
) {
1772 mOneOfOption
->Flags
= 0;
1773 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_IFR_OPTION_DEFAULT
)) {
1774 mOneOfOption
->Flags
|= EFI_IFR_OPTION_DEFAULT
;
1777 if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_IFR_OPTION_DEFAULT_MFG
)) {
1778 mOneOfOption
->Flags
|= EFI_IFR_OPTION_DEFAULT_MFG
;
1781 if (_IS_EQUAL (LFlags
, EFI_IFR_TYPE_NUM_SIZE_8
)) {
1782 _FLAG_CLEAR (LFlags
, EFI_IFR_TYPE_NUM_SIZE_8
);
1783 mOneOfOption
->Flags
|= EFI_IFR_TYPE_NUM_SIZE_8
;
1784 } else if (_IS_EQUAL (LFlags
, EFI_IFR_TYPE_NUM_SIZE_16
)) {
1785 _FLAG_CLEAR (LFlags
, EFI_IFR_TYPE_NUM_SIZE_16
);
1786 mOneOfOption
->Flags
|= EFI_IFR_TYPE_NUM_SIZE_16
;
1787 } else if (_IS_EQUAL (LFlags
, EFI_IFR_TYPE_NUM_SIZE_32
)) {
1788 _FLAG_CLEAR (LFlags
, EFI_IFR_TYPE_NUM_SIZE_32
);
1789 mOneOfOption
->Flags
|= EFI_IFR_TYPE_NUM_SIZE_32
;
1790 } else if (_IS_EQUAL (LFlags
, EFI_IFR_TYPE_NUM_SIZE_64
)) {
1791 _FLAG_CLEAR (LFlags
, EFI_IFR_TYPE_NUM_SIZE_64
);
1792 mOneOfOption
->Flags
|= EFI_IFR_TYPE_NUM_SIZE_64
;
1793 } else if (_IS_EQUAL (LFlags
, EFI_IFR_TYPE_BOOLEAN
)) {
1794 _FLAG_CLEAR (LFlags
, EFI_IFR_TYPE_BOOLEAN
);
1795 mOneOfOption
->Flags
|= EFI_IFR_TYPE_BOOLEAN
;
1796 } else if (_IS_EQUAL (LFlags
, EFI_IFR_TYPE_TIME
)) {
1797 _FLAG_CLEAR (LFlags
, EFI_IFR_TYPE_TIME
);
1798 mOneOfOption
->Flags
|= EFI_IFR_TYPE_TIME
;
1799 } else if (_IS_EQUAL (LFlags
, EFI_IFR_TYPE_DATE
)) {
1800 _FLAG_CLEAR (LFlags
, EFI_IFR_TYPE_DATE
);
1801 mOneOfOption
->Flags
|= EFI_IFR_TYPE_DATE
;
1802 } else if (_IS_EQUAL (LFlags
, EFI_IFR_TYPE_STRING
)) {
1803 _FLAG_CLEAR (LFlags
, EFI_IFR_TYPE_STRING
);
1804 mOneOfOption
->Flags
|= EFI_IFR_TYPE_STRING
;
1805 } else if (_IS_EQUAL (LFlags
, EFI_IFR_TYPE_OTHER
)) {
1806 _FLAG_CLEAR (LFlags
, EFI_IFR_TYPE_OTHER
);
1807 mOneOfOption
->Flags
|= EFI_IFR_TYPE_OTHER
;
1810 return _FLAGS_ZERO (LFlags
) ? VFR_RETURN_SUCCESS
: VFR_RETURN_FLAGS_UNSUPPORTED
;
1813 VOID
SetType (IN UINT8 Type
) {
1814 mOneOfOption
->Type
= Type
;
1817 VOID
SetValue (IN EFI_IFR_TYPE_VALUE Value
) {
1818 memmove (&mOneOfOption
->Value
, &Value
, mOneOfOption
->Header
.Length
- OFFSET_OF (EFI_IFR_ONE_OF_OPTION
, Value
));
1821 UINT8
GetFlags (VOID
) {
1822 return mOneOfOption
->Flags
;
1826 static EFI_GUID IfrTianoGuid
= EFI_IFR_TIANO_GUID
;
1827 static EFI_GUID IfrFrameworkGuid
= EFI_IFR_FRAMEWORK_GUID
;
1829 class CIfrClass
: public CIfrObj
, public CIfrOpHeader
{
1831 EFI_IFR_GUID_CLASS
*mClass
;
1834 CIfrClass () : CIfrObj (EFI_IFR_GUID_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_GUID_CLASS
)),
1835 CIfrOpHeader (EFI_IFR_GUID_OP
, &(GetObjBinAddr
<EFI_IFR_GUID_CLASS
>())->Header
, sizeof (EFI_IFR_GUID_CLASS
)), mClass(GetObjBinAddr
<EFI_IFR_GUID_CLASS
>()) {
1836 mClass
->ExtendOpCode
= EFI_IFR_EXTEND_OP_CLASS
;
1837 mClass
->Guid
= IfrTianoGuid
;
1838 mClass
->Class
= EFI_NON_DEVICE_CLASS
;
1841 VOID
SetClass (IN UINT16 Class
) {
1842 mClass
->Class
= Class
;
1846 class CIfrSubClass
: public CIfrObj
, public CIfrOpHeader
{
1848 EFI_IFR_GUID_SUBCLASS
*mSubClass
;
1851 CIfrSubClass () : CIfrObj (EFI_IFR_GUID_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_GUID_SUBCLASS
)),
1852 CIfrOpHeader (EFI_IFR_GUID_OP
, &(GetObjBinAddr
<EFI_IFR_GUID_SUBCLASS
>())->Header
, sizeof (EFI_IFR_GUID_SUBCLASS
)), mSubClass(GetObjBinAddr
<EFI_IFR_GUID_SUBCLASS
>()) {
1853 mSubClass
->ExtendOpCode
= EFI_IFR_EXTEND_OP_SUBCLASS
;
1854 mSubClass
->Guid
= IfrTianoGuid
;
1855 mSubClass
->SubClass
= EFI_SETUP_APPLICATION_SUBCLASS
;
1858 VOID
SetSubClass (IN UINT16 SubClass
) {
1859 mSubClass
->SubClass
= SubClass
;
1863 class CIfrLabel
: public CIfrObj
, public CIfrOpHeader
{
1865 EFI_IFR_GUID_LABEL
*mLabel
;
1868 CIfrLabel () : CIfrObj (EFI_IFR_GUID_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_GUID_LABEL
)),
1869 CIfrOpHeader (EFI_IFR_GUID_OP
, &(GetObjBinAddr
<EFI_IFR_GUID_LABEL
>())->Header
, sizeof (EFI_IFR_GUID_LABEL
)), mLabel(GetObjBinAddr
<EFI_IFR_GUID_LABEL
>()) {
1870 mLabel
->ExtendOpCode
= EFI_IFR_EXTEND_OP_LABEL
;
1871 mLabel
->Guid
= IfrTianoGuid
;
1874 VOID
SetNumber (IN UINT16 Number
) {
1875 mLabel
->Number
= Number
;
1879 class CIfrBanner
: public CIfrObj
, public CIfrOpHeader
{
1881 EFI_IFR_GUID_BANNER
*mBanner
;
1884 CIfrBanner () : CIfrObj (EFI_IFR_GUID_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_GUID_BANNER
)),
1885 CIfrOpHeader (EFI_IFR_GUID_OP
, &(GetObjBinAddr
<EFI_IFR_GUID_BANNER
>())->Header
, sizeof (EFI_IFR_GUID_BANNER
)), mBanner(GetObjBinAddr
<EFI_IFR_GUID_BANNER
>()) {
1886 mBanner
->ExtendOpCode
= EFI_IFR_EXTEND_OP_BANNER
;
1887 mBanner
->Guid
= IfrTianoGuid
;
1890 VOID
SetTitle (IN EFI_STRING_ID StringId
) {
1891 mBanner
->Title
= StringId
;
1894 VOID
SetLine (IN UINT16 Line
) {
1895 mBanner
->LineNumber
= Line
;
1898 VOID
SetAlign (IN UINT8 Align
) {
1899 mBanner
->Alignment
= Align
;
1903 class CIfrOptionKey
: public CIfrObj
, public CIfrOpHeader
{
1905 EFI_IFR_GUID_OPTIONKEY
*mOptionKey
;
1909 IN EFI_QUESTION_ID QuestionId
,
1910 IN EFI_IFR_TYPE_VALUE
&OptionValue
,
1911 IN EFI_QUESTION_ID KeyValue
1912 ) : CIfrObj (EFI_IFR_GUID_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_GUID_OPTIONKEY
)),
1913 CIfrOpHeader (EFI_IFR_GUID_OP
, &(GetObjBinAddr
<EFI_IFR_GUID_OPTIONKEY
>())->Header
, sizeof (EFI_IFR_GUID_OPTIONKEY
)), mOptionKey(GetObjBinAddr
<EFI_IFR_GUID_OPTIONKEY
>()) {
1914 mOptionKey
->ExtendOpCode
= EFI_IFR_EXTEND_OP_OPTIONKEY
;
1915 mOptionKey
->Guid
= IfrFrameworkGuid
;
1916 mOptionKey
->QuestionId
= QuestionId
;
1917 mOptionKey
->OptionValue
= OptionValue
;
1918 mOptionKey
->KeyValue
= KeyValue
;
1922 class CIfrVarEqName
: public CIfrObj
, public CIfrOpHeader
{
1924 EFI_IFR_GUID_VAREQNAME
*mVarEqName
;
1928 IN EFI_QUESTION_ID QuestionId
,
1929 IN EFI_STRING_ID NameId
1930 ) : CIfrObj (EFI_IFR_GUID_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_GUID_VAREQNAME
)),
1931 CIfrOpHeader (EFI_IFR_GUID_OP
, &(GetObjBinAddr
<EFI_IFR_GUID_VAREQNAME
>())->Header
, sizeof (EFI_IFR_GUID_VAREQNAME
)), mVarEqName(GetObjBinAddr
<EFI_IFR_GUID_VAREQNAME
>()) {
1932 mVarEqName
->ExtendOpCode
= EFI_IFR_EXTEND_OP_VAREQNAME
;
1933 mVarEqName
->Guid
= IfrFrameworkGuid
;
1934 mVarEqName
->QuestionId
= QuestionId
;
1935 mVarEqName
->NameId
= NameId
;
1939 class CIfrTimeout
: public CIfrObj
, public CIfrOpHeader
{
1941 EFI_IFR_GUID_TIMEOUT
*mTimeout
;
1944 CIfrTimeout (IN UINT16 Timeout
= 0) : CIfrObj (EFI_IFR_GUID_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_GUID_TIMEOUT
)),
1945 CIfrOpHeader (EFI_IFR_GUID_OP
, &(GetObjBinAddr
<EFI_IFR_GUID_TIMEOUT
>())->Header
, sizeof (EFI_IFR_GUID_TIMEOUT
)), mTimeout(GetObjBinAddr
<EFI_IFR_GUID_TIMEOUT
>()) {
1946 mTimeout
->ExtendOpCode
= EFI_IFR_EXTEND_OP_TIMEOUT
;
1947 mTimeout
->Guid
= IfrTianoGuid
;
1948 mTimeout
->TimeOut
= Timeout
;
1951 VOID
SetTimeout (IN UINT16 Timeout
) {
1952 mTimeout
->TimeOut
= Timeout
;
1956 class CIfrGuid
: public CIfrObj
, public CIfrOpHeader
{
1958 EFI_IFR_GUID
*mGuid
;
1961 CIfrGuid (UINT8 Size
) : CIfrObj (EFI_IFR_GUID_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_GUID
)+Size
),
1962 CIfrOpHeader (EFI_IFR_GUID_OP
, &(GetObjBinAddr
<EFI_IFR_GUID
>())->Header
, sizeof (EFI_IFR_GUID
)+Size
), mGuid(GetObjBinAddr
<EFI_IFR_GUID
>()) {
1963 memset (&mGuid
->Guid
, 0, sizeof (EFI_GUID
));
1966 VOID
SetGuid (IN EFI_GUID
*Guid
) {
1967 memmove (&mGuid
->Guid
, Guid
, sizeof (EFI_GUID
));
1970 VOID
SetData (IN UINT8
* DataBuff
, IN UINT8 Size
) {
1971 memmove ((UINT8
*)mGuid
+ sizeof (EFI_IFR_GUID
), DataBuff
, Size
);
1975 class CIfrDup
: public CIfrObj
, public CIfrOpHeader
{
1979 ) : CIfrObj (EFI_IFR_DUP_OP
),
1980 CIfrOpHeader (EFI_IFR_DUP_OP
, &(GetObjBinAddr
<EFI_IFR_DUP
>())->Header
) {
1985 class CIfrEqIdId
: public CIfrObj
, public CIfrOpHeader
{
1987 EFI_IFR_EQ_ID_ID
*mEqIdId
;
1992 ) : CIfrObj (EFI_IFR_EQ_ID_ID_OP
),
1993 CIfrOpHeader (EFI_IFR_EQ_ID_ID_OP
, &(GetObjBinAddr
<EFI_IFR_EQ_ID_ID
>())->Header
), mEqIdId(GetObjBinAddr
<EFI_IFR_EQ_ID_ID
>()) {
1995 mEqIdId
->QuestionId1
= EFI_QUESTION_ID_INVALID
;
1996 mEqIdId
->QuestionId2
= EFI_QUESTION_ID_INVALID
;
1999 VOID
SetQuestionId1 (
2000 IN EFI_QUESTION_ID QuestionId
,
2004 if (QuestionId
!= EFI_QUESTION_ID_INVALID
) {
2005 mEqIdId
->QuestionId1
= QuestionId
;
2007 gCFormPkg
.AssignPending (VarIdStr
, (VOID
*)(&mEqIdId
->QuestionId1
), sizeof (EFI_QUESTION_ID
), LineNo
, NO_QST_REFED
);
2011 VOID
SetQuestionId2 (
2012 IN EFI_QUESTION_ID QuestionId
,
2016 if (QuestionId
!= EFI_QUESTION_ID_INVALID
) {
2017 mEqIdId
->QuestionId2
= QuestionId
;
2019 gCFormPkg
.AssignPending (VarIdStr
, (VOID
*)(&mEqIdId
->QuestionId2
), sizeof (EFI_QUESTION_ID
), LineNo
, NO_QST_REFED
);
2024 class CIfrEqIdVal
: public CIfrObj
, public CIfrOpHeader
{
2026 EFI_IFR_EQ_ID_VAL
*mEqIdVal
;
2031 ) : CIfrObj (EFI_IFR_EQ_ID_VAL_OP
),
2032 CIfrOpHeader (EFI_IFR_EQ_ID_VAL_OP
, &(GetObjBinAddr
<EFI_IFR_EQ_ID_VAL
>())->Header
), mEqIdVal(GetObjBinAddr
<EFI_IFR_EQ_ID_VAL
>()) {
2034 mEqIdVal
->QuestionId
= EFI_QUESTION_ID_INVALID
;
2037 VOID
SetQuestionId (
2038 IN EFI_QUESTION_ID QuestionId
,
2042 if (QuestionId
!= EFI_QUESTION_ID_INVALID
) {
2043 mEqIdVal
->QuestionId
= QuestionId
;
2045 gCFormPkg
.AssignPending (VarIdStr
, (VOID
*)(&mEqIdVal
->QuestionId
), sizeof (EFI_QUESTION_ID
), LineNo
, NO_QST_REFED
);
2049 VOID
SetValue (IN UINT16 Value
) {
2050 mEqIdVal
->Value
= Value
;
2054 class CIfrEqIdList
: public CIfrObj
, public CIfrOpHeader
{
2056 EFI_IFR_EQ_ID_VAL_LIST
*mEqIdVList
;
2061 ) : CIfrObj (EFI_IFR_EQ_ID_VAL_LIST_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_EQ_ID_VAL_LIST
), TRUE
),
2062 CIfrOpHeader (EFI_IFR_EQ_ID_VAL_LIST_OP
, &(GetObjBinAddr
<EFI_IFR_EQ_ID_VAL_LIST
>())->Header
), mEqIdVList(GetObjBinAddr
<EFI_IFR_EQ_ID_VAL_LIST
>()) {
2064 mEqIdVList
->QuestionId
= EFI_QUESTION_ID_INVALID
;
2065 mEqIdVList
->ListLength
= 0;
2066 mEqIdVList
->ValueList
[0] = 0;
2069 VOID
UpdateIfrBuffer (
2071 _EMIT_PENDING_OBJ();
2072 mEqIdVList
= GetObjBinAddr
<EFI_IFR_EQ_ID_VAL_LIST
>();
2073 UpdateHeader (&mEqIdVList
->Header
);
2076 VOID
SetQuestionId (
2077 IN EFI_QUESTION_ID QuestionId
,
2081 if (QuestionId
!= EFI_QUESTION_ID_INVALID
) {
2082 mEqIdVList
->QuestionId
= QuestionId
;
2084 gCFormPkg
.AssignPending (VarIdStr
, (VOID
*)(&mEqIdVList
->QuestionId
), sizeof (EFI_QUESTION_ID
), LineNo
, NO_QST_REFED
);
2088 VOID
SetListLength (IN UINT16 ListLength
) {
2089 mEqIdVList
->ListLength
= ListLength
;
2092 VOID
SetValueList (IN UINT16 Index
, IN UINT16 Value
) {
2094 mEqIdVList
->ValueList
[0] = Value
;
2098 if (ExpendObjBin (sizeof (UINT16
)) ==TRUE
) {
2099 IncLength (sizeof (UINT16
));
2100 mEqIdVList
->ValueList
[Index
] = Value
;
2105 class CIfrQuestionRef1
: public CIfrObj
, public CIfrOpHeader
{
2107 EFI_IFR_QUESTION_REF1
*mQuestionRef1
;
2112 ) : CIfrObj (EFI_IFR_QUESTION_REF1_OP
),
2113 CIfrOpHeader (EFI_IFR_QUESTION_REF1_OP
, &(GetObjBinAddr
<EFI_IFR_QUESTION_REF1
>())->Header
), mQuestionRef1(GetObjBinAddr
<EFI_IFR_QUESTION_REF1
>()) {
2115 mQuestionRef1
->QuestionId
= EFI_QUESTION_ID_INVALID
;
2118 VOID
SetQuestionId (
2119 IN EFI_QUESTION_ID QuestionId
,
2123 if (QuestionId
!= EFI_QUESTION_ID_INVALID
) {
2124 mQuestionRef1
->QuestionId
= QuestionId
;
2126 gCFormPkg
.AssignPending (VarIdStr
, (VOID
*)(&mQuestionRef1
->QuestionId
), sizeof (EFI_QUESTION_ID
), LineNo
, NO_QST_REFED
);
2131 class CIfrQuestionRef2
: public CIfrObj
, public CIfrOpHeader
{
2135 ) : CIfrObj (EFI_IFR_QUESTION_REF2_OP
),
2136 CIfrOpHeader (EFI_IFR_QUESTION_REF2_OP
, &(GetObjBinAddr
<EFI_IFR_QUESTION_REF2
>())->Header
) {
2141 class CIfrQuestionRef3
: public CIfrObj
, public CIfrOpHeader
{
2145 ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP
),
2146 CIfrOpHeader (EFI_IFR_QUESTION_REF3_OP
, &(GetObjBinAddr
<EFI_IFR_QUESTION_REF3
>())->Header
) {
2151 class CIfrQuestionRef3_2
: public CIfrObj
, public CIfrOpHeader
{
2153 EFI_IFR_QUESTION_REF3_2
*mQuestionRef3_2
;
2156 CIfrQuestionRef3_2 (
2158 ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_QUESTION_REF3_2
)),
2159 CIfrOpHeader (EFI_IFR_QUESTION_REF3_OP
, &(GetObjBinAddr
<EFI_IFR_QUESTION_REF3_2
>())->Header
, sizeof (EFI_IFR_QUESTION_REF3_2
)), mQuestionRef3_2(GetObjBinAddr
<EFI_IFR_QUESTION_REF3_2
>()) {
2161 mQuestionRef3_2
->DevicePath
= EFI_STRING_ID_INVALID
;
2164 VOID
SetDevicePath (IN EFI_STRING_ID DevicePath
) {
2165 mQuestionRef3_2
->DevicePath
= DevicePath
;
2169 class CIfrQuestionRef3_3
: public CIfrObj
, public CIfrOpHeader
{
2171 EFI_IFR_QUESTION_REF3_3
*mQuestionRef3_3
;
2174 CIfrQuestionRef3_3 (
2176 ) : CIfrObj (EFI_IFR_QUESTION_REF3_OP
, (CHAR8
**)NULL
, sizeof (EFI_IFR_QUESTION_REF3_3
)),
2177 CIfrOpHeader (EFI_IFR_QUESTION_REF3_OP
, &(GetObjBinAddr
<EFI_IFR_QUESTION_REF3_3
>())->Header
, sizeof (EFI_IFR_QUESTION_REF3_3
)), mQuestionRef3_3(GetObjBinAddr
<EFI_IFR_QUESTION_REF3_3
>()) {
2179 mQuestionRef3_3
->DevicePath
= EFI_STRING_ID_INVALID
;
2180 memset (&mQuestionRef3_3
->Guid
, 0, sizeof (EFI_GUID
));
2183 VOID
SetDevicePath (IN EFI_STRING_ID DevicePath
) {
2184 mQuestionRef3_3
->DevicePath
= DevicePath
;
2187 VOID
SetGuid (IN EFI_GUID
*Guid
) {
2188 mQuestionRef3_3
->Guid
= *Guid
;
2192 class CIfrRuleRef
: public CIfrObj
, public CIfrOpHeader
{
2194 EFI_IFR_RULE_REF
*mRuleRef
;
2199 ) : CIfrObj (EFI_IFR_RULE_REF_OP
),
2200 CIfrOpHeader (EFI_IFR_RULE_REF_OP
, &(GetObjBinAddr
<EFI_IFR_RULE_REF
>())->Header
), mRuleRef(GetObjBinAddr
<EFI_IFR_RULE_REF
>()) {
2202 mRuleRef
->RuleId
= EFI_RULE_ID_INVALID
;
2205 VOID
SetRuleId (IN UINT8 RuleId
) {
2206 mRuleRef
->RuleId
= RuleId
;
2210 class CIfrStringRef1
: public CIfrObj
, public CIfrOpHeader
{
2212 EFI_IFR_STRING_REF1
*mStringRef1
;
2217 ) : CIfrObj (EFI_IFR_STRING_REF1_OP
),
2218 CIfrOpHeader (EFI_IFR_STRING_REF1_OP
, &(GetObjBinAddr
<EFI_IFR_STRING_REF1
>())->Header
), mStringRef1(GetObjBinAddr
<EFI_IFR_STRING_REF1
>()) {
2220 mStringRef1
->StringId
= EFI_STRING_ID_INVALID
;
2223 VOID
SetStringId (IN EFI_STRING_ID StringId
) {
2224 mStringRef1
->StringId
= StringId
;
2228 class CIfrStringRef2
: public CIfrObj
, public CIfrOpHeader
{
2232 ) : CIfrObj (EFI_IFR_STRING_REF2_OP
),
2233 CIfrOpHeader (EFI_IFR_STRING_REF2_OP
, &(GetObjBinAddr
<EFI_IFR_STRING_REF2
>())->Header
) {
2238 class CIfrThis
: public CIfrObj
, public CIfrOpHeader
{
2242 ) : CIfrObj (EFI_IFR_THIS_OP
),
2243 CIfrOpHeader (EFI_IFR_THIS_OP
, &(GetObjBinAddr
<EFI_IFR_THIS
>())->Header
) {
2248 class CIfrSecurity
: public CIfrObj
, public CIfrOpHeader
{
2250 EFI_IFR_SECURITY
*mSecurity
;
2255 ) : CIfrObj (EFI_IFR_SECURITY_OP
),
2256 CIfrOpHeader (EFI_IFR_SECURITY_OP
, &(GetObjBinAddr
<EFI_IFR_SECURITY
>())->Header
), mSecurity(GetObjBinAddr
<EFI_IFR_SECURITY
>()) {
2258 memset (&mSecurity
->Permissions
, 0, sizeof (EFI_GUID
));
2261 VOID
SetPermissions (IN EFI_GUID
*Permissions
) {
2262 memmove (&mSecurity
->Permissions
, Permissions
, sizeof (EFI_GUID
));
2266 class CIfrUint8
: public CIfrObj
, public CIfrOpHeader
{
2268 EFI_IFR_UINT8
*mUint8
;
2273 ) : CIfrObj (EFI_IFR_UINT8_OP
),
2274 CIfrOpHeader (EFI_IFR_UINT8_OP
, &(GetObjBinAddr
<EFI_IFR_UINT8
>())->Header
), mUint8(GetObjBinAddr
<EFI_IFR_UINT8
>()) {
2278 VOID
SetValue (IN UINT8 Value
) {
2279 mUint8
->Value
= Value
;
2283 class CIfrUint16
: public CIfrObj
, public CIfrOpHeader
{
2285 EFI_IFR_UINT16
*mUint16
;
2290 ) : CIfrObj (EFI_IFR_UINT16_OP
),
2291 CIfrOpHeader (EFI_IFR_UINT16_OP
, &(GetObjBinAddr
<EFI_IFR_UINT16
>())->Header
), mUint16(GetObjBinAddr
<EFI_IFR_UINT16
>()) {
2295 VOID
SetValue (IN UINT16 Value
) {
2296 mUint16
->Value
= Value
;
2300 class CIfrUint32
: public CIfrObj
, public CIfrOpHeader
{
2302 EFI_IFR_UINT32
*mUint32
;
2307 ) : CIfrObj (EFI_IFR_UINT32_OP
),
2308 CIfrOpHeader (EFI_IFR_UINT32_OP
, &(GetObjBinAddr
<EFI_IFR_UINT32
>())->Header
), mUint32(GetObjBinAddr
<EFI_IFR_UINT32
>()) {
2312 VOID
SetValue (IN UINT32 Value
) {
2313 mUint32
->Value
= Value
;
2317 class CIfrUint64
: public CIfrObj
, public CIfrOpHeader
{
2319 EFI_IFR_UINT64
*mUint64
;
2324 ) : CIfrObj (EFI_IFR_UINT64_OP
),
2325 CIfrOpHeader (EFI_IFR_UINT64_OP
, &(GetObjBinAddr
<EFI_IFR_UINT64
>())->Header
), mUint64(GetObjBinAddr
<EFI_IFR_UINT64
>()) {
2329 VOID
SetValue (IN UINT64 Value
) {
2330 mUint64
->Value
= Value
;
2334 class CIfrTrue
: public CIfrObj
, public CIfrOpHeader
{
2338 ) : CIfrObj (EFI_IFR_TRUE_OP
),
2339 CIfrOpHeader (EFI_IFR_TRUE_OP
, &(GetObjBinAddr
<EFI_IFR_TRUE
>())->Header
) {
2344 class CIfrFalse
: public CIfrObj
, public CIfrOpHeader
{
2348 ) : CIfrObj (EFI_IFR_FALSE_OP
),
2349 CIfrOpHeader (EFI_IFR_FALSE_OP
, &(GetObjBinAddr
<EFI_IFR_FALSE
>())->Header
) {
2354 class CIfrOne
: public CIfrObj
, public CIfrOpHeader
{
2358 ) : CIfrObj (EFI_IFR_ONE_OP
),
2359 CIfrOpHeader (EFI_IFR_ONE_OP
, &(GetObjBinAddr
<EFI_IFR_ONE
>())->Header
) {
2364 class CIfrOnes
: public CIfrObj
, public CIfrOpHeader
{
2368 ) : CIfrObj (EFI_IFR_ONES_OP
),
2369 CIfrOpHeader (EFI_IFR_ONES_OP
, &(GetObjBinAddr
<EFI_IFR_ONES
>())->Header
) {
2374 class CIfrZero
: public CIfrObj
, public CIfrOpHeader
{
2378 ) : CIfrObj (EFI_IFR_ZERO_OP
),
2379 CIfrOpHeader (EFI_IFR_ZERO_OP
, &(GetObjBinAddr
<EFI_IFR_ZERO
>())->Header
) {
2384 class CIfrUndefined
: public CIfrObj
, public CIfrOpHeader
{
2388 ) : CIfrObj (EFI_IFR_UNDEFINED_OP
),
2389 CIfrOpHeader (EFI_IFR_UNDEFINED_OP
, &(GetObjBinAddr
<EFI_IFR_UNDEFINED
>())->Header
) {
2394 class CIfrVersion
: public CIfrObj
, public CIfrOpHeader
{
2398 ) : CIfrObj (EFI_IFR_VERSION_OP
),
2399 CIfrOpHeader (EFI_IFR_VERSION_OP
, &(GetObjBinAddr
<EFI_IFR_VERSION
>())->Header
) {
2404 class CIfrLength
: public CIfrObj
, public CIfrOpHeader
{
2408 ) : CIfrObj (EFI_IFR_LENGTH_OP
),
2409 CIfrOpHeader (EFI_IFR_LENGTH_OP
, &(GetObjBinAddr
<EFI_IFR_LENGTH
>())->Header
) {
2414 class CIfrNot
: public CIfrObj
, public CIfrOpHeader
{
2418 ) : CIfrObj (EFI_IFR_NOT_OP
),
2419 CIfrOpHeader (EFI_IFR_NOT_OP
, &(GetObjBinAddr
<EFI_IFR_NOT
>())->Header
) {
2424 class CIfrBitWiseNot
: public CIfrObj
, public CIfrOpHeader
{
2428 ) : CIfrObj (EFI_IFR_BITWISE_NOT_OP
),
2429 CIfrOpHeader (EFI_IFR_BITWISE_NOT_OP
, &(GetObjBinAddr
<EFI_IFR_BITWISE_NOT
>())->Header
) {
2434 class CIfrToBoolean
: public CIfrObj
, public CIfrOpHeader
{
2438 ) : CIfrObj (EFI_IFR_TO_BOOLEAN_OP
),
2439 CIfrOpHeader (EFI_IFR_TO_BOOLEAN_OP
, &(GetObjBinAddr
<EFI_IFR_TO_BOOLEAN
>())->Header
) {
2444 class CIfrToString
: public CIfrObj
, public CIfrOpHeader
{
2446 EFI_IFR_TO_STRING
*mToString
;
2451 ) : CIfrObj (EFI_IFR_TO_STRING_OP
),
2452 CIfrOpHeader (EFI_IFR_TO_STRING_OP
, &(GetObjBinAddr
<EFI_IFR_TO_STRING
>())->Header
), mToString(GetObjBinAddr
<EFI_IFR_TO_STRING
>()) {
2456 VOID
SetFormat (IN UINT8 Format
) {
2457 mToString
->Format
= Format
;
2461 class CIfrToUint
: public CIfrObj
, public CIfrOpHeader
{
2465 ) : CIfrObj (EFI_IFR_TO_UINT_OP
),
2466 CIfrOpHeader (EFI_IFR_TO_UINT_OP
, &(GetObjBinAddr
<EFI_IFR_TO_UINT
>())->Header
) {
2471 class CIfrToUpper
: public CIfrObj
, public CIfrOpHeader
{
2475 ) : CIfrObj (EFI_IFR_TO_UPPER_OP
),
2476 CIfrOpHeader (EFI_IFR_TO_UPPER_OP
, &(GetObjBinAddr
<EFI_IFR_TO_UPPER
>())->Header
) {
2481 class CIfrToLower
: public CIfrObj
, public CIfrOpHeader
{
2485 ) : CIfrObj (EFI_IFR_TO_LOWER_OP
),
2486 CIfrOpHeader (EFI_IFR_TO_LOWER_OP
, &(GetObjBinAddr
<EFI_IFR_TO_LOWER
>())->Header
) {
2491 class CIfrAdd
: public CIfrObj
, public CIfrOpHeader
{
2495 ) : CIfrObj (EFI_IFR_ADD_OP
),
2496 CIfrOpHeader (EFI_IFR_ADD_OP
, &(GetObjBinAddr
<EFI_IFR_ADD
>())->Header
) {
2501 class CIfrBitWiseAnd
: public CIfrObj
, public CIfrOpHeader
{
2505 ) : CIfrObj (EFI_IFR_BITWISE_AND_OP
),
2506 CIfrOpHeader (EFI_IFR_BITWISE_AND_OP
, &(GetObjBinAddr
<EFI_IFR_BITWISE_AND
>())->Header
) {
2511 class CIfrBitWiseOr
: public CIfrObj
, public CIfrOpHeader
{
2515 ) : CIfrObj (EFI_IFR_BITWISE_OR_OP
),
2516 CIfrOpHeader (EFI_IFR_BITWISE_OR_OP
, &(GetObjBinAddr
<EFI_IFR_BITWISE_OR
>())->Header
) {
2521 class CIfrAnd
: public CIfrObj
, public CIfrOpHeader
{
2525 ) : CIfrObj (EFI_IFR_AND_OP
),
2526 CIfrOpHeader (EFI_IFR_AND_OP
, &(GetObjBinAddr
<EFI_IFR_AND
>())->Header
) {
2531 class CIfrCatenate
: public CIfrObj
, public CIfrOpHeader
{
2535 ) : CIfrObj (EFI_IFR_CATENATE_OP
),
2536 CIfrOpHeader (EFI_IFR_CATENATE_OP
, &(GetObjBinAddr
<EFI_IFR_CATENATE
>())->Header
) {
2541 class CIfrDivide
: public CIfrObj
, public CIfrOpHeader
{
2545 ) : CIfrObj (EFI_IFR_DIVIDE_OP
),
2546 CIfrOpHeader (EFI_IFR_DIVIDE_OP
, &(GetObjBinAddr
<EFI_IFR_DIVIDE
>())->Header
) {
2551 class CIfrEqual
: public CIfrObj
, public CIfrOpHeader
{
2555 ) : CIfrObj (EFI_IFR_EQUAL_OP
),
2556 CIfrOpHeader (EFI_IFR_EQUAL_OP
, &(GetObjBinAddr
<EFI_IFR_EQUAL
>())->Header
) {
2561 class CIfrGreaterEqual
: public CIfrObj
, public CIfrOpHeader
{
2565 ) : CIfrObj (EFI_IFR_GREATER_EQUAL_OP
),
2566 CIfrOpHeader (EFI_IFR_GREATER_EQUAL_OP
, &(GetObjBinAddr
<EFI_IFR_GREATER_EQUAL
>())->Header
) {
2571 class CIfrGreaterThan
: public CIfrObj
, public CIfrOpHeader
{
2575 ) : CIfrObj (EFI_IFR_GREATER_THAN_OP
),
2576 CIfrOpHeader (EFI_IFR_GREATER_THAN_OP
, &(GetObjBinAddr
<EFI_IFR_GREATER_THAN
>())->Header
) {
2581 class CIfrLessEqual
: public CIfrObj
, public CIfrOpHeader
{
2585 ) : CIfrObj (EFI_IFR_LESS_EQUAL_OP
),
2586 CIfrOpHeader (EFI_IFR_LESS_EQUAL_OP
, &(GetObjBinAddr
<EFI_IFR_LESS_EQUAL
>())->Header
) {
2591 class CIfrLessThan
: public CIfrObj
, public CIfrOpHeader
{
2595 ) : CIfrObj (EFI_IFR_LESS_THAN_OP
),
2596 CIfrOpHeader (EFI_IFR_LESS_THAN_OP
, &(GetObjBinAddr
<EFI_IFR_LESS_THAN
>())->Header
) {
2601 class CIfrMap
: public CIfrObj
, public CIfrOpHeader
{
2605 ) : CIfrObj (EFI_IFR_MAP_OP
),
2606 CIfrOpHeader (EFI_IFR_MAP_OP
, &(GetObjBinAddr
<EFI_IFR_MAP
>())->Header
) {
2611 class CIfrMatch
: public CIfrObj
, public CIfrOpHeader
{
2615 ) : CIfrObj (EFI_IFR_MATCH_OP
),
2616 CIfrOpHeader (EFI_IFR_MATCH_OP
, &(GetObjBinAddr
<EFI_IFR_MATCH
>())->Header
) {
2621 class CIfrMatch2
: public CIfrObj
, public CIfrOpHeader
{
2623 EFI_IFR_MATCH2
*mMatch2
;
2629 ) : CIfrObj (EFI_IFR_MATCH2_OP
),
2630 CIfrOpHeader (EFI_IFR_MATCH2_OP
, &(GetObjBinAddr
<EFI_IFR_MATCH2
>())->Header
), mMatch2(GetObjBinAddr
<EFI_IFR_MATCH2
>()) {
2632 memmove (&mMatch2
->SyntaxType
, Guid
, sizeof (EFI_GUID
));
2636 class CIfrMultiply
: public CIfrObj
, public CIfrOpHeader
{
2640 ) : CIfrObj (EFI_IFR_MULTIPLY_OP
),
2641 CIfrOpHeader (EFI_IFR_MULTIPLY_OP
, &(GetObjBinAddr
<EFI_IFR_MULTIPLY
>())->Header
) {
2646 class CIfrModulo
: public CIfrObj
, public CIfrOpHeader
{
2650 ) : CIfrObj (EFI_IFR_MODULO_OP
),
2651 CIfrOpHeader (EFI_IFR_MODULO_OP
, &(GetObjBinAddr
<EFI_IFR_MODULO
>())->Header
) {
2656 class CIfrNotEqual
: public CIfrObj
, public CIfrOpHeader
{
2660 ) : CIfrObj (EFI_IFR_NOT_EQUAL_OP
),
2661 CIfrOpHeader (EFI_IFR_NOT_EQUAL_OP
, &(GetObjBinAddr
<EFI_IFR_NOT_EQUAL
>())->Header
) {
2666 class CIfrOr
: public CIfrObj
, public CIfrOpHeader
{
2670 ) : CIfrObj (EFI_IFR_OR_OP
),
2671 CIfrOpHeader (EFI_IFR_OR_OP
, &(GetObjBinAddr
<EFI_IFR_OR
>())->Header
) {
2676 class CIfrShiftLeft
: public CIfrObj
, public CIfrOpHeader
{
2680 ) : CIfrObj (EFI_IFR_SHIFT_LEFT_OP
),
2681 CIfrOpHeader (EFI_IFR_SHIFT_LEFT_OP
, &(GetObjBinAddr
<EFI_IFR_SHIFT_LEFT
>())->Header
) {
2686 class CIfrShiftRight
: public CIfrObj
, public CIfrOpHeader
{
2690 ) : CIfrObj (EFI_IFR_SHIFT_RIGHT_OP
),
2691 CIfrOpHeader (EFI_IFR_SHIFT_RIGHT_OP
, &(GetObjBinAddr
<EFI_IFR_SHIFT_RIGHT
>())->Header
) {
2696 class CIfrSubtract
: public CIfrObj
, public CIfrOpHeader
{
2700 ) : CIfrObj (EFI_IFR_SUBTRACT_OP
),
2701 CIfrOpHeader (EFI_IFR_SUBTRACT_OP
, &(GetObjBinAddr
<EFI_IFR_SUBTRACT
>())->Header
) {
2706 class CIfrConditional
: public CIfrObj
, public CIfrOpHeader
{
2710 ) : CIfrObj (EFI_IFR_CONDITIONAL_OP
),
2711 CIfrOpHeader (EFI_IFR_CONDITIONAL_OP
, &(GetObjBinAddr
<EFI_IFR_CONDITIONAL
>())->Header
) {
2716 class CIfrFind
: public CIfrObj
, public CIfrOpHeader
{
2718 EFI_IFR_FIND
*mFind
;
2723 ) : CIfrObj (EFI_IFR_FIND_OP
),
2724 CIfrOpHeader (EFI_IFR_FIND_OP
, &(GetObjBinAddr
<EFI_IFR_FIND
>())->Header
), mFind(GetObjBinAddr
<EFI_IFR_FIND
>()) {
2728 VOID
SetFormat (IN UINT8 Format
) {
2729 mFind
->Format
= Format
;
2733 class CIfrMid
: public CIfrObj
, public CIfrOpHeader
{
2737 ) : CIfrObj (EFI_IFR_MID_OP
),
2738 CIfrOpHeader (EFI_IFR_MID_OP
, &(GetObjBinAddr
<EFI_IFR_MID
>())->Header
) {
2743 class CIfrToken
: public CIfrObj
, public CIfrOpHeader
{
2747 ) : CIfrObj (EFI_IFR_TOKEN_OP
),
2748 CIfrOpHeader (EFI_IFR_TOKEN_OP
, &(GetObjBinAddr
<EFI_IFR_TOKEN
>())->Header
) {
2753 class CIfrSpan
: public CIfrObj
, public CIfrOpHeader
{
2755 EFI_IFR_SPAN
*mSpan
;
2760 ) : CIfrObj (EFI_IFR_SPAN_OP
),
2761 CIfrOpHeader (EFI_IFR_SPAN_OP
, &(GetObjBinAddr
<EFI_IFR_SPAN
>())->Header
), mSpan(GetObjBinAddr
<EFI_IFR_SPAN
>()) {
2763 mSpan
->Flags
= EFI_IFR_FLAGS_FIRST_MATCHING
;
2766 EFI_VFR_RETURN_CODE
SetFlags (IN UINT8 LFlags
) {
2767 if (_IS_EQUAL (LFlags
, EFI_IFR_FLAGS_FIRST_MATCHING
)) {
2768 mSpan
->Flags
|= EFI_IFR_FLAGS_FIRST_MATCHING
;
2769 } else if (_FLAG_TEST_AND_CLEAR (LFlags
, EFI_IFR_FLAGS_FIRST_NON_MATCHING
)) {
2770 mSpan
->Flags
|= EFI_IFR_FLAGS_FIRST_NON_MATCHING
;
2773 return _FLAGS_ZERO (LFlags
) ? VFR_RETURN_SUCCESS
: VFR_RETURN_FLAGS_UNSUPPORTED
;